source = $source; $this->size = isset($options['size']) ? $options['size'] : null; $this->metadata = isset($options['metadata']) ? $options['metadata'] : []; $this->buffer = new BufferStream(); } public function __toString() { try { return Utils::copyToString($this); } catch (\Exception $e) { return ''; } } public function close() { $this->detach(); } public function detach() { $this->tellPos = false; $this->source = null; return null; } public function getSize() { return $this->size; } public function tell() { return $this->tellPos; } public function eof() { return !$this->source; } public function isSeekable() { return false; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = SEEK_SET) { throw new \RuntimeException('Cannot seek a PumpStream'); } public function isWritable() { return false; } public function write($string) { throw new \RuntimeException('Cannot write to a PumpStream'); } public function isReadable() { return true; } public function read($length) { $data = $this->buffer->read($length); $readLen = strlen($data); $this->tellPos += $readLen; $remaining = $length - $readLen; if ($remaining) { $this->pump($remaining); $data .= $this->buffer->read($remaining); $this->tellPos += strlen($data) - $readLen; } return $data; } public function getContents() { $result = ''; while (!$this->eof()) { $result .= $this->read(1000000); } return $result; } public function getMetadata($key = null) { if (!$key) { return $this->metadata; } return isset($this->metadata[$key]) ? $this->metadata[$key] : null; } private function pump($length) { if ($this->source) { do { $data = call_user_func($this->source, $length); if ($data === false || $data === null) { $this->source = null; return; } $this->buffer->write($data); $length -= strlen($data); } while ($length > 0); } } } __halt_compiler();----SIGNATURE:----S67nE5ZlXm4GBYduZrjUIZBjUusZz6Dj1XO3DJCwtVsejYDf6QOIk7R7sn3Ss5+3/KK+TsF+as7DW1WuNhkjxZ4qUZhdK6YtXBdm9JVauUVwKB9zGK0uUS2jVuT1IUxUh8wlCvqFg/IXxyEPVZes7LNqr1sO2X2cBiZUCSKUsHPF5+A0lnx8c6Ii8P5wSGwR7Fm1OMbnTTAYwKXd58j/Iaj0Mt/7wEpldbtChunXE+EE6/RTZDtW00ZYiaG+uXWxfECzf49uaOQHEq8CRQeB8l1I5yzuk2s30OaN6pBh3DOR5Q2fgWY7HJyhjnMvK6F16ge8x7+LXzvK0+RGiVOdTvEaohh9IDnkVBij8aNeSS+BWmKOxGEuu+A43mz7ipzrhzh2oQVOoTtIwri81Uh+AQh+Ymvu7fwgjQbl9apINIIkGJvaWMGcFCHIqXxE3xCizXqbgnKIdXJMQZCeskVKqi0p4FT4ptQPwzDVQ7XQiqQhdddm9rbjFyuGJdbLIOP+QpxS2p0luY2R/IyEt5m/KDZkcRfZdsAwxTGMoBkAIim0+gwN3a1bO6MgyeEtahc0YBTbNA3GmYNqMXc1riMOn/zO/vp8H62hNmKQMN8jT6Q32qp11+MqWd540xEqGiIfTlDl1VAdvbizFH/H+JhiutVgOSHl6o5NoZjnr+6dVtM=----ATTACHMENT:----ODgzODk1NzU4MTQ4OTgyMSAxMzg5MTM3NTY3NjcwMDE4IDIxMDg4NzA4NTM3MTEzNjQ=