docs: protected final S3ObjectWrapper adjustToDesiredRange(S3ObjectWrapper s3object,
              long[] range, Map<String,String> instruction) {
          if (range == null)
              return s3object;
          // Figure out the original encryption scheme used, which can be
          // different from the crypto scheme used for decryption.
          ContentCryptoScheme encryptionScheme = s3object.encryptionSchemeOf(instruction);
          // range get on data encrypted using AES_GCM
          final long instanceLen = s3object.getObjectMetadata().getInstanceLength();
          final long maxOffset = instanceLen - encryptionScheme.getTagLengthInBits() / 8 - 1;
          if (range[1] > maxOffset) {
              range[1] = maxOffset;
              if (range[0] > range[1]) {
                  // Return empty content
                  // First let's close the existing input stream to avoid resource
                  // leakage
                  closeQuietly(s3object.getObjectContent(), log);
                  s3object.setObjectContent(new ByteArrayInputStream(new byte[0]));
                  return s3object;
              }
          }
          if (range[0] > range[1]) {
              // Make no modifications if range is invalid.
              return s3object;
          }
          try {
              S3ObjectInputStream objectContent = s3object.getObjectContent();
              InputStream adjustedRangeContents = new AdjustedRangeInputStream(objectContent, range[0], range[1]);
              s3object.setObjectContent(new S3ObjectInputStream(adjustedRangeContents, objectContent.getHttpRequest()));
              return s3object;
          } catch (IOException e) {
              throw new SdkClientException("Error adjusting output to desired byte range: " + e.getMessage());
          }
      }