hunk.code_window:  */
   module.exports.app = (optionsArg = {}) => {
     validateConfig(optionsArg)
     const options = merge({}, defaultOptions, optionsArg)
     const providers = providerManager.getDefaultProviders()
     const searchProviders = providerManager.getSearchProviders()
     providerManager.addProviderOptions(options, grantConfig)
  
hunk.labels: keep keep keep keep add keep keep keep keep
hunk.after_edit:   // todo remove in next major and default to the safer getKey instead
     if (options.providerOptions.s3.getKey === defaultOptions.providerOptions.s3.getKey) process.emitWarning('The current default getKey implementation is not safe because it will cause files with the same name to be overwritten and should be avoided. Please use the environment variable COMPANION_S3_GETKEY_SAFE_BEHAVIOR=true (standalone) or provide your own getKey implementation instead')
  
hunk.file_path: packages/@uppy/companion/src/companion.js
hunk.type: add
file: <!DOCTYPE html>
  <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>Robodog playground</title>
    </head>
    <body>
      <style>
        html {
          background: #f1f1f1;
        }
        main {
          padding: 20px;
          font: 12pt sans-serif;
          background: white;
          width: 800px;
          margin: auto;
        }
        hr {
          border: 0;
          background-color: #111e33;
          height: 1px;
        }
        .hidden { display: none; }
        .error { color: red; }
        #logo { height: 1em; vertical-align: middle; }
      </style>
      <main>
        <h1>Robodog <img src="https://transloadit.edgly.net/assets/images/logo-small.svg" alt="Transloadit" id="logo"> playground</h1>
        <p>
          This page contains small examples for every API offered by the Robodog library. Please see the <a href="https://github.com/transloadit/uppy/tree/main/examples/transloadit">Github repository</a> for the source code.
  
        <hr>
        <h2>robodog.form()</h2>
  
        <p>
          The form API allows you to easily send files through Transloadit's encoding backend. When the user submits the form, any files are uploaded to Transloadit. The form data is then sent to your own backend, with additional data about the Transloadit Assemblies that were started.
  
        <form id="test-form" method="post" action="http://localhost:9967/test">
          <p><strong>leave a message</strong>
          <p>
            <label>name:
              <input type="text" name="name">
            </label>
          <p>
            <label>message: <br>
              <textarea name="message"></textarea>
            </label>
  
          <p>
            <label>
              attachments:
              <input type="file" name="files" multiple>
            </label>
            <div class="progress"></div>
  
          <p>
            <button type="submit">
              Upload
            </button>
  
            <span class="error"></span>
        </form>
  
        <hr>
        <h2>robodog.form() with dashboard</h2>
  
        <p>
          You can also use the Dashboard UI inside a plain old HTML form by specifying a <code>dashboard: '.target-css-selector'</code> option.
  
        <form id="dashboard-form" method="post" action="http://localhost:9967/test">
          <p><strong>leave a message</strong>
          <p>
            <label>name:
              <input type="text" name="name">
            </label>
          <p>
            <label>message: <br>
              <textarea name="message"></textarea>
            </label>
  
          <p>
            <label>
              attachments:
              <span class="dashboard"></span>
            </label>
  
          <p>
            <button type="submit">
              Upload
            </button>
  
            <span class="error"></span>
        </form>
  
        <hr>
        <h2>robodog.dashboard()</h2>
  
        <p>
          The <code>robodog.dashboard</code> API allows you to embed a Dashboard at any location. Users can continuously upload files through this UI, so please make sure this fits your use case!
  
        <p id="dashboard">
  
        <hr>
        <h2>robodog.pick()</h2>
  
        <p>
          This API is a one-shot upload UI using a modal overlay. Call the function and receive a Promise with upload results ✌️
  
        <p>
          <button onclick="openModal()">Open</button>
  
        <hr>
        <h2>robodog.upload()</h2>
        <p>
          An &lt;input type=file&gt; backed by <code>robodog.upload</code>:
  
        <p>
          <input type="file" multiple onchange="doUpload(event)">
  
        <p id="upload-result">
        <p id="upload-error" class="error">
      </main>
  
      <link href="uppy.min.css" rel="stylesheet">
      <script src="bundle.js"></script>
    </body>
  </html>
  