diff --git a/.github/workflows/bench_pr.yml b/.github/workflows/bench_pr.yml index 440a5f79..961f3520 100644 --- a/.github/workflows/bench_pr.yml +++ b/.github/workflows/bench_pr.yml @@ -13,13 +13,15 @@ jobs: go-version: 1.22 id: go - - name: Check out code + - name: Check out code uses: actions/checkout@v1 - name: Get dependencies - run: | + run: | + sudo apt-get update + sudo apt-get install -y pkg-config swig libcharls-dev libdcmtk-dev libopenjp2-7-dev go mod download - + - name: Benchmark against GITHUB_BASE_REF run: | go install golang.org/x/perf/cmd/benchstat@latest @@ -32,4 +34,4 @@ jobs: git log -1 --format="%H" go test -bench=. -benchmem -benchtime=10x -count=7 > $HOME/old.txt $GOBIN/benchstat $HOME/old.txt $HOME/new.txt - + diff --git a/.github/workflows/bench_push.yml b/.github/workflows/bench_push.yml index f3cc605f..a037a65c 100644 --- a/.github/workflows/bench_push.yml +++ b/.github/workflows/bench_push.yml @@ -13,13 +13,15 @@ jobs: go-version: 1.22 id: go - - name: Check out code + - name: Check out code uses: actions/checkout@v1 - name: Get dependencies - run: | + run: | + sudo apt-get update + sudo apt-get install -y pkg-config swig libcharls-dev libdcmtk-dev libopenjp2-7-dev go mod download - + - name: Benchmark (against HEAD~1) run: | go install golang.org/x/perf/cmd/benchstat@latest diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index bdd3fe4d..65d16df2 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -13,20 +13,22 @@ jobs: go-version: 1.22 id: go - - name: Check out code + - name: Check out code uses: actions/checkout@v1 - name: Get dependencies run: | + sudo apt-get update + sudo apt-get install -y pkg-config swig libcharls-dev libdcmtk-dev libopenjp2-7-dev go mod download - name: Build run: | make build-fast - + - name: Test run: | make test - + diff --git a/README.md b/README.md index 70bebd94..8ce33b67 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@

dicom

High Performance Golang DICOM Medical Image Parser

-

- +

+ - +

@@ -24,9 +24,15 @@ Some notable features: - [x] Enhanced testing and benchmarking support - [x] Modern, canonical Go. +### Compressed *Pixel Data* +#### JPEG, JPEG-LS and JPEG 2000 +Converting JPEG compressed *Pixel Data* to an uncompressed *Native Data* requires installing one or more additional C/C++ libraries. For information on which libraries are required, see the [DICOM Codecs for pixel data](https://github.com/suyashkumar/dicom/blob/main/pkg/codec/README.md). + +Compressing data into one of the JPEG formats is not currently supported. + ## Usage To use this in your golang project, import `github.com/suyashkumar/dicom`. This repository supports Go modules, and regularly tags releases using semantic versioning. Typical usage is straightforward: -```go +```go dataset, _ := dicom.ParseFile("testdata/1.dcm", nil) // See also: dicom.Parse which has a generic io.Reader API. @@ -54,7 +60,7 @@ wget -qO- "https://getbin.io/suyashkumar/dicom" | tar xvz ``` dicomutil -path myfile.dcm ``` -Note: for some DICOMs (with native pixel data) no automatic intensity scaling is applied yet (this is coming). You can apply this in your image viewer if needed (in Preview on mac, go to Tools->Adjust Color). +Note: for some DICOMs (with native pixel data) no automatic intensity scaling is applied yet (this is coming). You can apply this in your image viewer if needed (in Preview on mac, go to Tools->Adjust Color). ### Build manually @@ -62,7 +68,7 @@ To build manually, ensure you have `make` and `go` installed. Clone (or `go get` ```sh make ``` -Which will build the dicomutil binary and include it in a `build/` folder in your current working directory. +Which will build the dicomutil binary and include it in a `build/` folder in your current working directory. You can also built it using Go directly: @@ -71,21 +77,21 @@ go build -o dicomutil ./cmd/dicomutil ``` ## History -Here's a little more history on this repository for those who are interested! +Here's a little more history on this repository for those who are interested! ### v0 The v0 [suyashkumar/dicom](https://github.com/suyashkumar/dicom) started off as a hard fork of [go-dicom](https://github.com/gillesdemey/go-dicom) which was not being maintained actively anymore (with the [original author being supportive of my fork](https://www.reddit.com/r/golang/comments/bnu47l/high_performance_dicom_medical_image_parser_in/en9hp6h?utm_source=share&utm_medium=web2x&context=3)--thank you!). I worked on adding several new capabilities, bug fixes, and general maintainability refactors (like multiframe support, streaming parsing, updated APIs, low-level parsing bug fixes, and more). -That represents the __v0__ history of the repository. +That represents the __v0__ history of the repository. ### v1 -For __v1__ I rewrote and redesigned the core library essentially from scratch, and added several new features and bug fixes that only live in __v1__. The architecture and APIs are completely different, as is some of the underlying parser logic (to be more efficient and correct). Most of the core rewrite work happened at the [`s/1.0-rewrite`](https://github.com/suyashkumar/dicom/tree/s/1.0-rewrite) branch. +For __v1__ I rewrote and redesigned the core library essentially from scratch, and added several new features and bug fixes that only live in __v1__. The architecture and APIs are completely different, as is some of the underlying parser logic (to be more efficient and correct). Most of the core rewrite work happened at the [`s/1.0-rewrite`](https://github.com/suyashkumar/dicom/tree/s/1.0-rewrite) branch. ## Acknowledgements -* [Segmed](https://www.segmed.ai/) for their help with validation and other contributions to the library. +* [Segmed](https://www.segmed.ai/) for their help with validation and other contributions to the library. * Original [go-dicom](https://github.com/gillesdemey/go-dicom) * Grailbio [go-dicom](https://github.com/grailbio/go-dicom) -- commits from their fork were applied to ours * GradientHealth for supporting work I did on this while there [gradienthealth/dicom](https://github.com/gradienthealth/dicom) diff --git a/pkg/codec/README.md b/pkg/codec/README.md new file mode 100644 index 00000000..90f93dc7 --- /dev/null +++ b/pkg/codec/README.md @@ -0,0 +1,40 @@ +# Codec +DICOM codec for decoding JPEG/JPEG-LS/JPEG2000 images, with a focus on providing support for [suyashkumar/dicom](https://github.com/suyashkumar/dicom). + +### Prerequisites +To be able to decompress compressed DICOM pixel data, you first have to install the corresponding libraries, that are able to handle the format the data is encoded in: + +- LINUX +```bash +apt-get install pkg-config swig libcharls-dev libdcmtk-dev libopenjp2-7-dev +``` +- MACOS +```bash +brew install swig pkg-config +brew install dcmtk +brew install openjpeg +brew install team-charls/tap/charls +``` + +Generate the necessary C++ wrapper code to allow Go to bind to it. You need to do this each time the dependent *.h or *.cxx files change. +```bash +swig -go -cgo -c++ -intgosize 64 codec.i +``` + +## Usage +```go +import ( + "github.com/suyashkumar/dicom" + "github.com/suyashkumar/dicom/pkg/tag" + _ "github.com/suyashkumar/dicom/pkg/codec" +) + +func main() { + dataset, err := dicom.ParseFile("testdata/1.dcm", nil) + pixelDataElem, err := dataset.FindElementByTag(tag.PixelData) + pixelData := dicom.MustGetPixelDataInfo(pixelDataElem.Value) + encapsulatedFrame, err := pixelData.Frames[0].GetEncapsulatedFrame() + image, err = encapsulatedFrame.GetImage() + ... +} +``` diff --git a/pkg/codec/codec.cxx b/pkg/codec/codec.cxx new file mode 100644 index 00000000..5956b2de --- /dev/null +++ b/pkg/codec/codec.cxx @@ -0,0 +1,389 @@ +// Copyright (c) 2023 Segmed Inc. +#include "openjpeg.h" +#include "dcmtk/dcmjpeg/djcparam.h" +#include "dcmtk/dcmjpeg/djeijg8.h" +#include "dcmtk/dcmjpeg/djeijg12.h" +#include "dcmtk/dcmjpeg/djeijg16.h" +#include "dcmtk/dcmjpeg/djdijg8.h" +#include "dcmtk/dcmjpeg/djdijg12.h" +#include "dcmtk/dcmjpeg/djdijg16.h" +#include "charls/charls.h" +#include "codec.h" + +/** + * width: cols + * height: rows + * numcomps/samplesPerPixel: number of components/samples/planes (RGB-3/Grey-1) in the image + * prec/bitsAllocated: number of bits per component per pixel + * sgnd/pixelRepresentation: signed (1) / unsigned (0) + * planarConfiguration: color-by-plane (1) or color-by-pixel (0) +* */ +unsigned char * JPEGLS_Decode(unsigned char * dataSrc, size_t length, int bitsAllocated, int width, int height, int samplesPerPixel, int planarConfiguration, size_t * lenOut) +{ + charls::jpegls_decoder decoder; + decoder.source(dataSrc, length); + decoder.read_header(); + + const size_t size{static_cast(decoder.destination_size())}; + BYTE *newdata = new BYTE[decoder.destination_size()]; + + decoder.decode(newdata, size); + *lenOut = size; + return newdata; +} + +unsigned char * JPEG_Decode(unsigned char * dataSrc, size_t length, int bitsAllocated, int width, int height, int samplesPerPixel, int planarConfiguration, int ybr, size_t * lenOut) +{ + if (bitsAllocated == 8) + { + DJCodecParameter param( + ECC_lossyRGB, + ybr ? EDC_always : EDC_never, + EUC_never, + planarConfiguration ? EPC_colorByPlane : EPC_colorByPixel + ); + + int outSize = width*height*samplesPerPixel; + BYTE *outBuf = new BYTE[outSize]; + + DJDecompressIJG8Bit *decop = new DJDecompressIJG8Bit(param, ybr); + OFCondition check1 = decop->init(); + OFCondition check2 = decop->decode(dataSrc, length, outBuf, outSize, false); + delete decop; + + *lenOut = outSize; + return outBuf; + } + else if (bitsAllocated == 12) + { + DJCodecParameter param( + ECC_lossyRGB, + ybr ? EDC_always : EDC_never, + EUC_never, + planarConfiguration ? EPC_colorByPlane : EPC_colorByPixel + ); + + int outSize = width*height*samplesPerPixel*2; + BYTE *outBuf = new BYTE[outSize]; + + DJDecompressIJG12Bit *decop = new DJDecompressIJG12Bit(param, ybr); + OFCondition check1 = decop->init(); + OFCondition check2 = decop->decode(dataSrc, length, outBuf, outSize, false); + delete decop; + + *lenOut = outSize; + return outBuf; + } + else if (bitsAllocated == 16) + { + DJCodecParameter param( + ECC_lossyRGB, + ybr ? EDC_always : EDC_never, + EUC_never, + planarConfiguration ? EPC_colorByPlane : EPC_colorByPixel + ); + + int outSize = width*height*samplesPerPixel*2; + BYTE *outBuf = new BYTE[outSize]; + + DJDecompressIJG16Bit *decop = new DJDecompressIJG16Bit(param, ybr); + OFCondition check1 = decop->init(); + OFCondition check2 = decop->decode(dataSrc, length, outBuf, outSize, false); + delete decop; + + *lenOut = outSize; + return outBuf; + } + + return NULL; +} + +unsigned char * J2K_Decode(unsigned char * dataSrc, size_t length, int width, int height, size_t * lenOut) +{ + // WARNING: OpenJPEG is very picky when there is a trailing 00 at the end of the JPC + // so we need to make sure to remove it. + // Marker 0xffd9 EOI End of Image (JPEG 2000 EOC End of codestream) + // gdcmData/D_CLUNIE_CT1_J2KR.dcm contains a trailing 0xFF which apparently is ok... + // Ref: https://github.com/malaterre/GDCM/blob/master/Source/MediaStorageAndFileFormat/gdcmJPEG2000Codec.cxx#L637 + while( length > 0 && dataSrc[length-1] != 0xd9 ) + { + length--; + } + // what if 0xd9 is never found ? + if( !( length > 0 && dataSrc[length-1] == 0xd9 ) ) + { + return NULL; + } + // https://github.com/malaterre/GDCM/blob/master/Source/MediaStorageAndFileFormat/gdcmJPEG2000Codec.cxx#L656 + OPJ_CODEC_FORMAT decod_format; + const char jp2magic[] = "\x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A"; + if( memcmp( dataSrc, jp2magic, sizeof(jp2magic) ) == 0 ) + { + /* JPEG-2000 compressed image data ... sigh */ + fprintf(stderr, "J2K start like JPEG-2000 compressed image data instead of codestream" ); + decod_format = OPJ_CODEC_JP2; + } + else + { + /* JPEG-2000 codestream */ + decod_format = OPJ_CODEC_J2K; + } + opj_codec_t * l_codec = opj_create_decompress(decod_format); + + opj_input_memory_stream fsrc; + fsrc.dataSize = length; + fsrc.offset = 0; + fsrc.pData = dataSrc; + + opj_stream_t * l_stream = opj_stream_default_create(1); + if (!l_stream){ + return NULL; + } + opj_stream_set_read_function(l_stream, opj_input_memory_stream_read); + opj_stream_set_seek_function(l_stream, opj_input_memory_stream_seek); + opj_stream_set_skip_function(l_stream, opj_input_memory_stream_skip); + opj_stream_set_user_data(l_stream, &fsrc, NULL); + opj_stream_set_user_data_length(l_stream, fsrc.dataSize); + + opj_dparameters_t params; + opj_set_default_decoder_parameters(¶ms); + if (!opj_setup_decoder(l_codec, ¶ms)) { + fprintf(stderr, "ERROR -> opj_decompress: failed to setup the decoder\n"); + opj_stream_destroy(l_stream); + opj_destroy_codec(l_codec); + return NULL; + } + + opj_image_t *image; + if (!opj_read_header(l_stream, l_codec, &image)) { + fprintf(stderr, "ERROR -> j2k_to_image: failed to read the header\n"); + opj_stream_destroy(l_stream); + opj_destroy_codec(l_codec); + opj_image_destroy(image); + return NULL; + } + if (!opj_decode(l_codec, l_stream, image)) { + fprintf(stderr, "ERROR -> opj_decompress: failed to decode image!\n"); + opj_destroy_codec(l_codec); + opj_stream_destroy(l_stream); + opj_image_destroy(image); + return NULL; + } + + void *vOutBits = NULL; + OPJ_INT32 * ptr; + int adjustR, bitsAllocated; + adjustR = 0; + bitsAllocated = image->comps[0].prec; + if (bitsAllocated == 8) { + BYTE v; + BYTE *newdata = new BYTE[image->x1*image->y1*image->numcomps]; + for (unsigned int c=0; cnumcomps; c++) { + ptr = (OPJ_INT32 *)image->comps[c].data; + for (unsigned int i = 0; i< image->x1*image->y1; i++){ + v = (BYTE) (*ptr + adjustR); + ptr++; + newdata[i*image->numcomps + c] = v; + } + } + vOutBits = (void *) newdata; + } else { // 12 or 16 bits + OPJ_UINT16 v; + OPJ_UINT16 *newdata = new OPJ_UINT16[image->x1*image->y1*image->numcomps]; + for (unsigned int c=0; cnumcomps; c++) { + ptr = (OPJ_INT32 *)image->comps[c].data; + for (unsigned int i = 0; i< image->x1*image->y1; i++){ + v = (OPJ_UINT16) (*ptr + adjustR); + ptr++; + newdata[i*image->numcomps + c] = v; + } + } + vOutBits = (void *) newdata; + } + + *lenOut = image->x1*image->y1 * (bitsAllocated==8?1:2) * image->numcomps; + + opj_image_destroy(image); + opj_stream_destroy(l_stream); + opj_destroy_codec(l_codec); + + return (BYTE *) vOutBits; +} + +unsigned char * J2K_Encode(unsigned char * dataSrc, int bitsAllocated, int width, int height, int samplesPerPixel, int planarConfiguration, size_t * lenOut) +{ + opj_cparameters_t params; + opj_set_default_encoder_parameters(¶ms); + params.cod_format = OPJ_CODEC_J2K; + params.irreversible = 0; + params.tcp_numlayers = 1; + params.cp_disto_alloc = 1; + + opj_image_cmptparm_t *cmptparm = new opj_image_cmptparm_t[samplesPerPixel]; + + for (int i=0; ix0 = 0; + jp2_image->y0 = 0; + jp2_image->x1 = width; + jp2_image->y1 = height; + + //dump the source image into the components + if (samplesPerPixel == 1) + { + if (bitsAllocated == 8) + { + for (int p=0; pcomps[0].data[p] = dataSrc[p]; + } + else + { + //2-byte + for (int p=0; pcomps[0].data[p] = ((OPJ_UINT16 *)dataSrc)[p]; + } + } + else + { + //always 8-bit, to my understanding + + if (planarConfiguration == 0) //0 = R1G1B1 R2G2B2, 1 = R1R2R3..G1G2G3...B1B2B3... + { + for (int i=0; icomps[i].data[p] = dataSrc[p*samplesPerPixel + i]; + } + else + { + for (int i=0; icomps[i].data[p] = dataSrc[i*width*height + p]; + } + } + + opj_codec_t * codec = opj_create_compress(OPJ_CODEC_J2K); + opj_setup_encoder(codec, ¶ms, jp2_image); + + + opj_output_memory_stream streamInfo; + streamInfo.dataSize = 0; + + opj_stream_t * stream = opj_stream_default_create(0); + if (!stream){ + return NULL; + } + opj_stream_set_write_function(stream, opj_output_memory_stream_write); + opj_stream_set_seek_function(stream, opj_output_memory_stream_seek); + opj_stream_set_skip_function(stream, opj_output_memory_stream_skip); + opj_stream_set_user_data(stream, &streamInfo, NULL); + + opj_start_compress(codec, jp2_image, stream); + opj_encode(codec, stream); + opj_end_compress(codec, stream); + + delete []cmptparm; + + *lenOut = streamInfo.dataSize; + BYTE * vOutBits = (BYTE *) malloc(streamInfo.dataSize), *fillPtr = vOutBits; + for (std::vector::iterator i = streamInfo.chunks.begin(); i != streamInfo.chunks.end(); i++) + { + memcpy(fillPtr, i->data, i->dataLen); + delete i->data; + fillPtr += i->dataLen; + } + + opj_stream_destroy(stream); + opj_destroy_codec(codec); + opj_image_destroy(jp2_image); + + return (BYTE *) vOutBits; +} + +// https://groups.google.com/forum/#!topic/openjpeg/8cebr0u7JgY +OPJ_SIZE_T opj_input_memory_stream_read(void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) +{ + opj_input_memory_stream* l_stream = (opj_input_memory_stream*)p_user_data; + OPJ_SIZE_T l_nb_bytes_read = p_nb_bytes; + + if (l_stream->offset >= l_stream->dataSize) { + return (OPJ_SIZE_T)-1; + } + if (p_nb_bytes > (l_stream->dataSize - l_stream->offset)) { + l_nb_bytes_read = l_stream->dataSize - l_stream->offset; + } + memcpy(p_buffer, &(l_stream->pData[l_stream->offset]), l_nb_bytes_read); + l_stream->offset += l_nb_bytes_read; + return l_nb_bytes_read; +} + +OPJ_OFF_T opj_input_memory_stream_skip(OPJ_OFF_T p_nb_bytes, void * p_user_data) +{ + opj_input_memory_stream* l_stream = (opj_input_memory_stream*)p_user_data; + + if (p_nb_bytes < 0) { + return -1; + } + + l_stream->offset += (OPJ_SIZE_T)p_nb_bytes; + + return p_nb_bytes; +} + +OPJ_BOOL opj_input_memory_stream_seek(OPJ_OFF_T p_nb_bytes, void * p_user_data) +{ + opj_input_memory_stream* l_stream = (opj_input_memory_stream*)p_user_data; + + if (p_nb_bytes < 0) { + return OPJ_FALSE; + } + + l_stream->offset = (OPJ_SIZE_T)p_nb_bytes; + + return OPJ_TRUE; +} + + +// Writer adapted from above and made it up + +OPJ_BOOL opj_output_memory_stream_seek(OPJ_OFF_T p_nb_bytes, void * p_user_data) +{ + opj_output_memory_stream* stream = (opj_output_memory_stream*)p_user_data; + + return OPJ_TRUE; +} + +OPJ_OFF_T opj_output_memory_stream_skip(OPJ_OFF_T p_nb_bytes, void * p_user_data) +{ + opj_output_memory_stream* stream = (opj_output_memory_stream*)p_user_data; + + return p_nb_bytes; +} + +OPJ_SIZE_T opj_output_memory_stream_write(void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) +{ + opj_output_memory_stream* stream = (opj_output_memory_stream*)p_user_data; + + opj_output_memory_stream_chunk newChunk; + newChunk.dataLen = p_nb_bytes; + newChunk.data = new BYTE[p_nb_bytes]; + memcpy(newChunk.data, p_buffer, p_nb_bytes); + + stream->dataSize += p_nb_bytes; + + stream->chunks.push_back(newChunk); + + return p_nb_bytes; +} diff --git a/pkg/codec/codec.go b/pkg/codec/codec.go new file mode 100644 index 00000000..8d38a609 --- /dev/null +++ b/pkg/codec/codec.go @@ -0,0 +1,731 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 + * + * Do not make changes to this file unless you know what you are doing - modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +// source: codec.i + +package codec + +/* +#define intgo swig_intgo +typedef void *swig_voidp; + +#include +#include + + +typedef long long intgo; +typedef unsigned long long uintgo; + + + +typedef struct { char *p; intgo n; } _gostring_; +typedef struct { void* array; intgo len; intgo cap; } _goslice_; + + +typedef long long swig_type_1; +typedef long long swig_type_2; +typedef long long swig_type_3; +typedef long long swig_type_4; +typedef _gostring_ swig_type_5; +typedef _gostring_ swig_type_6; +typedef _gostring_ swig_type_7; +typedef long long swig_type_8; +typedef long long swig_type_9; +typedef long long swig_type_10; +typedef long long swig_type_11; +typedef long long swig_type_12; +typedef long long swig_type_13; +typedef long long swig_type_14; +extern void _wrap_Swig_free_codec_cffb419519a4d845(uintptr_t arg1); +extern uintptr_t _wrap_Swig_malloc_codec_cffb419519a4d845(swig_intgo arg1); +extern uintptr_t _wrap_new_StringVector__SWIG_0_codec_cffb419519a4d845(void); +extern uintptr_t _wrap_new_StringVector__SWIG_1_codec_cffb419519a4d845(swig_type_1 arg1); +extern uintptr_t _wrap_new_StringVector__SWIG_2_codec_cffb419519a4d845(uintptr_t arg1); +extern swig_type_2 _wrap_StringVector_size_codec_cffb419519a4d845(uintptr_t arg1); +extern swig_type_3 _wrap_StringVector_capacity_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_StringVector_reserve_codec_cffb419519a4d845(uintptr_t arg1, swig_type_4 arg2); +extern _Bool _wrap_StringVector_isEmpty_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_StringVector_clear_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_StringVector_add_codec_cffb419519a4d845(uintptr_t arg1, swig_type_5 arg2); +extern swig_type_6 _wrap_StringVector_get_codec_cffb419519a4d845(uintptr_t arg1, swig_intgo arg2); +extern void _wrap_StringVector_set_codec_cffb419519a4d845(uintptr_t arg1, swig_intgo arg2, swig_type_7 arg3); +extern void _wrap_delete_StringVector_codec_cffb419519a4d845(uintptr_t arg1); +extern uintptr_t _wrap_new_ByteVector__SWIG_0_codec_cffb419519a4d845(void); +extern uintptr_t _wrap_new_ByteVector__SWIG_1_codec_cffb419519a4d845(swig_type_8 arg1); +extern uintptr_t _wrap_new_ByteVector__SWIG_2_codec_cffb419519a4d845(uintptr_t arg1); +extern swig_type_9 _wrap_ByteVector_size_codec_cffb419519a4d845(uintptr_t arg1); +extern swig_type_10 _wrap_ByteVector_capacity_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_ByteVector_reserve_codec_cffb419519a4d845(uintptr_t arg1, swig_type_11 arg2); +extern _Bool _wrap_ByteVector_isEmpty_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_ByteVector_clear_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_ByteVector_add_codec_cffb419519a4d845(uintptr_t arg1, char arg2); +extern char _wrap_ByteVector_get_codec_cffb419519a4d845(uintptr_t arg1, swig_intgo arg2); +extern void _wrap_ByteVector_set_codec_cffb419519a4d845(uintptr_t arg1, swig_intgo arg2, char arg3); +extern void _wrap_delete_ByteVector_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_opj_input_memory_stream_pData_set_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2); +extern uintptr_t _wrap_opj_input_memory_stream_pData_get_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_opj_input_memory_stream_dataSize_set_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2); +extern uintptr_t _wrap_opj_input_memory_stream_dataSize_get_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_opj_input_memory_stream_offset_set_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2); +extern uintptr_t _wrap_opj_input_memory_stream_offset_get_codec_cffb419519a4d845(uintptr_t arg1); +extern uintptr_t _wrap_new_opj_input_memory_stream_codec_cffb419519a4d845(void); +extern void _wrap_delete_opj_input_memory_stream_codec_cffb419519a4d845(uintptr_t arg1); +extern uintptr_t _wrap_opj_input_memory_stream_seek_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2); +extern uintptr_t _wrap_opj_input_memory_stream_skip_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2); +extern uintptr_t _wrap_opj_input_memory_stream_read_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2, uintptr_t arg3); +extern void _wrap_opj_output_memory_stream_chunk_data_set_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2); +extern uintptr_t _wrap_opj_output_memory_stream_chunk_data_get_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_opj_output_memory_stream_chunk_dataLen_set_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2); +extern uintptr_t _wrap_opj_output_memory_stream_chunk_dataLen_get_codec_cffb419519a4d845(uintptr_t arg1); +extern uintptr_t _wrap_new_opj_output_memory_stream_chunk_codec_cffb419519a4d845(void); +extern void _wrap_delete_opj_output_memory_stream_chunk_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_opj_output_memory_stream_dataSize_set_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2); +extern uintptr_t _wrap_opj_output_memory_stream_dataSize_get_codec_cffb419519a4d845(uintptr_t arg1); +extern void _wrap_opj_output_memory_stream_chunks_set_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2); +extern uintptr_t _wrap_opj_output_memory_stream_chunks_get_codec_cffb419519a4d845(uintptr_t arg1); +extern uintptr_t _wrap_new_opj_output_memory_stream_codec_cffb419519a4d845(void); +extern void _wrap_delete_opj_output_memory_stream_codec_cffb419519a4d845(uintptr_t arg1); +extern uintptr_t _wrap_opj_output_memory_stream_seek_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2); +extern uintptr_t _wrap_opj_output_memory_stream_skip_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2); +extern uintptr_t _wrap_opj_output_memory_stream_write_codec_cffb419519a4d845(uintptr_t arg1, uintptr_t arg2, uintptr_t arg3); +extern swig_voidp _wrap_J2K_Decode_codec_cffb419519a4d845(swig_voidp arg1, swig_type_12 arg2, swig_intgo arg3, swig_intgo arg4, swig_voidp arg5); +extern swig_voidp _wrap_JPEG_Decode_codec_cffb419519a4d845(swig_voidp arg1, swig_type_13 arg2, swig_intgo arg3, swig_intgo arg4, swig_intgo arg5, swig_intgo arg6, swig_intgo arg7, swig_intgo arg8, swig_voidp arg9); +extern swig_voidp _wrap_JPEGLS_Decode_codec_cffb419519a4d845(swig_voidp arg1, swig_type_14 arg2, swig_intgo arg3, swig_intgo arg4, swig_intgo arg5, swig_intgo arg6, swig_intgo arg7, swig_voidp arg8); +extern swig_voidp _wrap_J2K_Encode_codec_cffb419519a4d845(swig_voidp arg1, swig_intgo arg2, swig_intgo arg3, swig_intgo arg4, swig_intgo arg5, swig_intgo arg6, swig_voidp arg7); +#undef intgo +*/ +import "C" + +import "unsafe" +import _ "runtime/cgo" +import "sync" + + +type _ unsafe.Pointer + + + +var Swig_escape_always_false bool +var Swig_escape_val interface{} + + +type _swig_fnptr *byte +type _swig_memberptr *byte + + +func getSwigcptr(v interface { Swigcptr() uintptr }) uintptr { + if v == nil { + return 0 + } + return v.Swigcptr() +} + + +type _ sync.Mutex + +//export cgo_panic__codec_cffb419519a4d845 +func cgo_panic__codec_cffb419519a4d845(p *byte) { + s := (*[1024]byte)(unsafe.Pointer(p))[:] + for i, b := range s { + if b == 0 { + panic(string(s[:i])) + } + } + panic(string(s)) +} + + +type swig_gostring struct { p uintptr; n int } +func swigCopyString(s string) string { + p := *(*swig_gostring)(unsafe.Pointer(&s)) + r := string((*[0x7fffffff]byte)(unsafe.Pointer(p.p))[:p.n]) + Swig_free(p.p) + return r +} + +func Swig_free(arg1 uintptr) { + _swig_i_0 := arg1 + C._wrap_Swig_free_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)) +} + +func Swig_malloc(arg1 int) (_swig_ret uintptr) { + var swig_r uintptr + _swig_i_0 := arg1 + swig_r = (uintptr)(C._wrap_Swig_malloc_codec_cffb419519a4d845(C.swig_intgo(_swig_i_0))) + return swig_r +} + +type SwigcptrStringVector uintptr + +func (p SwigcptrStringVector) Swigcptr() uintptr { + return (uintptr)(p) +} + +func (p SwigcptrStringVector) SwigIsStringVector() { +} + +func NewStringVector__SWIG_0() (_swig_ret StringVector) { + var swig_r StringVector + swig_r = (StringVector)(SwigcptrStringVector(C._wrap_new_StringVector__SWIG_0_codec_cffb419519a4d845())) + return swig_r +} + +func NewStringVector__SWIG_1(arg1 int64) (_swig_ret StringVector) { + var swig_r StringVector + _swig_i_0 := arg1 + swig_r = (StringVector)(SwigcptrStringVector(C._wrap_new_StringVector__SWIG_1_codec_cffb419519a4d845(C.swig_type_1(_swig_i_0)))) + return swig_r +} + +func NewStringVector__SWIG_2(arg1 StringVector) (_swig_ret StringVector) { + var swig_r StringVector + _swig_i_0 := getSwigcptr(arg1) + swig_r = (StringVector)(SwigcptrStringVector(C._wrap_new_StringVector__SWIG_2_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)))) + return swig_r +} + +func NewStringVector(a ...interface{}) StringVector { + argc := len(a) + if argc == 0 { + return NewStringVector__SWIG_0() + } + if argc == 1 { + if _, ok := a[0].(int64); !ok { + goto check_2 + } + return NewStringVector__SWIG_1(a[0].(int64)) + } +check_2: + if argc == 1 { + return NewStringVector__SWIG_2(a[0].(StringVector)) + } + panic("No match for overloaded function call") +} + +func (arg1 SwigcptrStringVector) Size() (_swig_ret int64) { + var swig_r int64 + _swig_i_0 := arg1 + swig_r = (int64)(C._wrap_StringVector_size_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0))) + return swig_r +} + +func (arg1 SwigcptrStringVector) Capacity() (_swig_ret int64) { + var swig_r int64 + _swig_i_0 := arg1 + swig_r = (int64)(C._wrap_StringVector_capacity_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0))) + return swig_r +} + +func (arg1 SwigcptrStringVector) Reserve(arg2 int64) { + _swig_i_0 := arg1 + _swig_i_1 := arg2 + C._wrap_StringVector_reserve_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.swig_type_4(_swig_i_1)) +} + +func (arg1 SwigcptrStringVector) IsEmpty() (_swig_ret bool) { + var swig_r bool + _swig_i_0 := arg1 + swig_r = (bool)(C._wrap_StringVector_isEmpty_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0))) + return swig_r +} + +func (arg1 SwigcptrStringVector) Clear() { + _swig_i_0 := arg1 + C._wrap_StringVector_clear_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)) +} + +func (arg1 SwigcptrStringVector) Add(arg2 string) { + _swig_i_0 := arg1 + _swig_i_1 := arg2 + C._wrap_StringVector_add_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), *(*C.swig_type_5)(unsafe.Pointer(&_swig_i_1))) + if Swig_escape_always_false { + Swig_escape_val = arg2 + } +} + +func (arg1 SwigcptrStringVector) Get(arg2 int) (_swig_ret string) { + var swig_r string + _swig_i_0 := arg1 + _swig_i_1 := arg2 + swig_r_p := C._wrap_StringVector_get_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.swig_intgo(_swig_i_1)) + swig_r = *(*string)(unsafe.Pointer(&swig_r_p)) + var swig_r_1 string + swig_r_1 = swigCopyString(swig_r) + return swig_r_1 +} + +func (arg1 SwigcptrStringVector) Set(arg2 int, arg3 string) { + _swig_i_0 := arg1 + _swig_i_1 := arg2 + _swig_i_2 := arg3 + C._wrap_StringVector_set_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.swig_intgo(_swig_i_1), *(*C.swig_type_7)(unsafe.Pointer(&_swig_i_2))) + if Swig_escape_always_false { + Swig_escape_val = arg3 + } +} + +func DeleteStringVector(arg1 StringVector) { + _swig_i_0 := getSwigcptr(arg1) + C._wrap_delete_StringVector_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)) +} + +type StringVector interface { + Swigcptr() uintptr + SwigIsStringVector() + Size() (_swig_ret int64) + Capacity() (_swig_ret int64) + Reserve(arg2 int64) + IsEmpty() (_swig_ret bool) + Clear() + Add(arg2 string) + Get(arg2 int) (_swig_ret string) + Set(arg2 int, arg3 string) +} + +type SwigcptrByteVector uintptr + +func (p SwigcptrByteVector) Swigcptr() uintptr { + return (uintptr)(p) +} + +func (p SwigcptrByteVector) SwigIsByteVector() { +} + +func NewByteVector__SWIG_0() (_swig_ret ByteVector) { + var swig_r ByteVector + swig_r = (ByteVector)(SwigcptrByteVector(C._wrap_new_ByteVector__SWIG_0_codec_cffb419519a4d845())) + return swig_r +} + +func NewByteVector__SWIG_1(arg1 int64) (_swig_ret ByteVector) { + var swig_r ByteVector + _swig_i_0 := arg1 + swig_r = (ByteVector)(SwigcptrByteVector(C._wrap_new_ByteVector__SWIG_1_codec_cffb419519a4d845(C.swig_type_8(_swig_i_0)))) + return swig_r +} + +func NewByteVector__SWIG_2(arg1 ByteVector) (_swig_ret ByteVector) { + var swig_r ByteVector + _swig_i_0 := getSwigcptr(arg1) + swig_r = (ByteVector)(SwigcptrByteVector(C._wrap_new_ByteVector__SWIG_2_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)))) + return swig_r +} + +func NewByteVector(a ...interface{}) ByteVector { + argc := len(a) + if argc == 0 { + return NewByteVector__SWIG_0() + } + if argc == 1 { + if _, ok := a[0].(int64); !ok { + goto check_2 + } + return NewByteVector__SWIG_1(a[0].(int64)) + } +check_2: + if argc == 1 { + return NewByteVector__SWIG_2(a[0].(ByteVector)) + } + panic("No match for overloaded function call") +} + +func (arg1 SwigcptrByteVector) Size() (_swig_ret int64) { + var swig_r int64 + _swig_i_0 := arg1 + swig_r = (int64)(C._wrap_ByteVector_size_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0))) + return swig_r +} + +func (arg1 SwigcptrByteVector) Capacity() (_swig_ret int64) { + var swig_r int64 + _swig_i_0 := arg1 + swig_r = (int64)(C._wrap_ByteVector_capacity_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0))) + return swig_r +} + +func (arg1 SwigcptrByteVector) Reserve(arg2 int64) { + _swig_i_0 := arg1 + _swig_i_1 := arg2 + C._wrap_ByteVector_reserve_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.swig_type_11(_swig_i_1)) +} + +func (arg1 SwigcptrByteVector) IsEmpty() (_swig_ret bool) { + var swig_r bool + _swig_i_0 := arg1 + swig_r = (bool)(C._wrap_ByteVector_isEmpty_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0))) + return swig_r +} + +func (arg1 SwigcptrByteVector) Clear() { + _swig_i_0 := arg1 + C._wrap_ByteVector_clear_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)) +} + +func (arg1 SwigcptrByteVector) Add(arg2 byte) { + _swig_i_0 := arg1 + _swig_i_1 := arg2 + C._wrap_ByteVector_add_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.char(_swig_i_1)) +} + +func (arg1 SwigcptrByteVector) Get(arg2 int) (_swig_ret byte) { + var swig_r byte + _swig_i_0 := arg1 + _swig_i_1 := arg2 + swig_r = (byte)(C._wrap_ByteVector_get_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.swig_intgo(_swig_i_1))) + return swig_r +} + +func (arg1 SwigcptrByteVector) Set(arg2 int, arg3 byte) { + _swig_i_0 := arg1 + _swig_i_1 := arg2 + _swig_i_2 := arg3 + C._wrap_ByteVector_set_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.swig_intgo(_swig_i_1), C.char(_swig_i_2)) +} + +func DeleteByteVector(arg1 ByteVector) { + _swig_i_0 := getSwigcptr(arg1) + C._wrap_delete_ByteVector_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)) +} + +type ByteVector interface { + Swigcptr() uintptr + SwigIsByteVector() + Size() (_swig_ret int64) + Capacity() (_swig_ret int64) + Reserve(arg2 int64) + IsEmpty() (_swig_ret bool) + Clear() + Add(arg2 byte) + Get(arg2 int) (_swig_ret byte) + Set(arg2 int, arg3 byte) +} + +type SwigcptrOpj_input_memory_stream uintptr + +func (p SwigcptrOpj_input_memory_stream) Swigcptr() uintptr { + return (uintptr)(p) +} + +func (p SwigcptrOpj_input_memory_stream) SwigIsOpj_input_memory_stream() { +} + +func (arg1 SwigcptrOpj_input_memory_stream) SetPData(arg2 OPJ_UINT8) { + _swig_i_0 := arg1 + _swig_i_1 := getSwigcptr(arg2) + C._wrap_opj_input_memory_stream_pData_set_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1)) +} + +func (arg1 SwigcptrOpj_input_memory_stream) GetPData() (_swig_ret OPJ_UINT8) { + var swig_r OPJ_UINT8 + _swig_i_0 := arg1 + swig_r = (OPJ_UINT8)(SwigcptrOPJ_UINT8(C._wrap_opj_input_memory_stream_pData_get_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)))) + return swig_r +} + +func (arg1 SwigcptrOpj_input_memory_stream) SetDataSize(arg2 OPJ_SIZE_T) { + _swig_i_0 := arg1 + _swig_i_1 := getSwigcptr(arg2) + C._wrap_opj_input_memory_stream_dataSize_set_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1)) +} + +func (arg1 SwigcptrOpj_input_memory_stream) GetDataSize() (_swig_ret OPJ_SIZE_T) { + var swig_r OPJ_SIZE_T + _swig_i_0 := arg1 + swig_r = (OPJ_SIZE_T)(SwigcptrOPJ_SIZE_T(C._wrap_opj_input_memory_stream_dataSize_get_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)))) + return swig_r +} + +func (arg1 SwigcptrOpj_input_memory_stream) SetOffset(arg2 OPJ_SIZE_T) { + _swig_i_0 := arg1 + _swig_i_1 := getSwigcptr(arg2) + C._wrap_opj_input_memory_stream_offset_set_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1)) +} + +func (arg1 SwigcptrOpj_input_memory_stream) GetOffset() (_swig_ret OPJ_SIZE_T) { + var swig_r OPJ_SIZE_T + _swig_i_0 := arg1 + swig_r = (OPJ_SIZE_T)(SwigcptrOPJ_SIZE_T(C._wrap_opj_input_memory_stream_offset_get_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)))) + return swig_r +} + +func NewOpj_input_memory_stream() (_swig_ret Opj_input_memory_stream) { + var swig_r Opj_input_memory_stream + swig_r = (Opj_input_memory_stream)(SwigcptrOpj_input_memory_stream(C._wrap_new_opj_input_memory_stream_codec_cffb419519a4d845())) + return swig_r +} + +func DeleteOpj_input_memory_stream(arg1 Opj_input_memory_stream) { + _swig_i_0 := getSwigcptr(arg1) + C._wrap_delete_opj_input_memory_stream_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)) +} + +type Opj_input_memory_stream interface { + Swigcptr() uintptr + SwigIsOpj_input_memory_stream() + SetPData(arg2 OPJ_UINT8) + GetPData() (_swig_ret OPJ_UINT8) + SetDataSize(arg2 OPJ_SIZE_T) + GetDataSize() (_swig_ret OPJ_SIZE_T) + SetOffset(arg2 OPJ_SIZE_T) + GetOffset() (_swig_ret OPJ_SIZE_T) +} + +func Opj_input_memory_stream_seek(arg1 OPJ_OFF_T, arg2 uintptr) (_swig_ret OPJ_BOOL) { + var swig_r OPJ_BOOL + _swig_i_0 := getSwigcptr(arg1) + _swig_i_1 := arg2 + swig_r = (OPJ_BOOL)(SwigcptrOPJ_BOOL(C._wrap_opj_input_memory_stream_seek_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1)))) + return swig_r +} + +func Opj_input_memory_stream_skip(arg1 OPJ_OFF_T, arg2 uintptr) (_swig_ret OPJ_OFF_T) { + var swig_r OPJ_OFF_T + _swig_i_0 := getSwigcptr(arg1) + _swig_i_1 := arg2 + swig_r = (OPJ_OFF_T)(SwigcptrOPJ_OFF_T(C._wrap_opj_input_memory_stream_skip_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1)))) + return swig_r +} + +func Opj_input_memory_stream_read(arg1 uintptr, arg2 OPJ_SIZE_T, arg3 uintptr) (_swig_ret OPJ_SIZE_T) { + var swig_r OPJ_SIZE_T + _swig_i_0 := arg1 + _swig_i_1 := getSwigcptr(arg2) + _swig_i_2 := arg3 + swig_r = (OPJ_SIZE_T)(SwigcptrOPJ_SIZE_T(C._wrap_opj_input_memory_stream_read_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1), C.uintptr_t(_swig_i_2)))) + return swig_r +} + +type SwigcptrOpj_output_memory_stream_chunk uintptr + +func (p SwigcptrOpj_output_memory_stream_chunk) Swigcptr() uintptr { + return (uintptr)(p) +} + +func (p SwigcptrOpj_output_memory_stream_chunk) SwigIsOpj_output_memory_stream_chunk() { +} + +func (arg1 SwigcptrOpj_output_memory_stream_chunk) SetData(arg2 OPJ_UINT8) { + _swig_i_0 := arg1 + _swig_i_1 := getSwigcptr(arg2) + C._wrap_opj_output_memory_stream_chunk_data_set_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1)) +} + +func (arg1 SwigcptrOpj_output_memory_stream_chunk) GetData() (_swig_ret OPJ_UINT8) { + var swig_r OPJ_UINT8 + _swig_i_0 := arg1 + swig_r = (OPJ_UINT8)(SwigcptrOPJ_UINT8(C._wrap_opj_output_memory_stream_chunk_data_get_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)))) + return swig_r +} + +func (arg1 SwigcptrOpj_output_memory_stream_chunk) SetDataLen(arg2 OPJ_SIZE_T) { + _swig_i_0 := arg1 + _swig_i_1 := getSwigcptr(arg2) + C._wrap_opj_output_memory_stream_chunk_dataLen_set_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1)) +} + +func (arg1 SwigcptrOpj_output_memory_stream_chunk) GetDataLen() (_swig_ret OPJ_SIZE_T) { + var swig_r OPJ_SIZE_T + _swig_i_0 := arg1 + swig_r = (OPJ_SIZE_T)(SwigcptrOPJ_SIZE_T(C._wrap_opj_output_memory_stream_chunk_dataLen_get_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)))) + return swig_r +} + +func NewOpj_output_memory_stream_chunk() (_swig_ret Opj_output_memory_stream_chunk) { + var swig_r Opj_output_memory_stream_chunk + swig_r = (Opj_output_memory_stream_chunk)(SwigcptrOpj_output_memory_stream_chunk(C._wrap_new_opj_output_memory_stream_chunk_codec_cffb419519a4d845())) + return swig_r +} + +func DeleteOpj_output_memory_stream_chunk(arg1 Opj_output_memory_stream_chunk) { + _swig_i_0 := getSwigcptr(arg1) + C._wrap_delete_opj_output_memory_stream_chunk_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)) +} + +type Opj_output_memory_stream_chunk interface { + Swigcptr() uintptr + SwigIsOpj_output_memory_stream_chunk() + SetData(arg2 OPJ_UINT8) + GetData() (_swig_ret OPJ_UINT8) + SetDataLen(arg2 OPJ_SIZE_T) + GetDataLen() (_swig_ret OPJ_SIZE_T) +} + +type SwigcptrOpj_output_memory_stream uintptr + +func (p SwigcptrOpj_output_memory_stream) Swigcptr() uintptr { + return (uintptr)(p) +} + +func (p SwigcptrOpj_output_memory_stream) SwigIsOpj_output_memory_stream() { +} + +func (arg1 SwigcptrOpj_output_memory_stream) SetDataSize(arg2 OPJ_SIZE_T) { + _swig_i_0 := arg1 + _swig_i_1 := getSwigcptr(arg2) + C._wrap_opj_output_memory_stream_dataSize_set_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1)) +} + +func (arg1 SwigcptrOpj_output_memory_stream) GetDataSize() (_swig_ret OPJ_SIZE_T) { + var swig_r OPJ_SIZE_T + _swig_i_0 := arg1 + swig_r = (OPJ_SIZE_T)(SwigcptrOPJ_SIZE_T(C._wrap_opj_output_memory_stream_dataSize_get_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)))) + return swig_r +} + +func (arg1 SwigcptrOpj_output_memory_stream) SetChunks(arg2 Std_vector_Sl_opj_output_memory_stream_chunk_Sg_) { + _swig_i_0 := arg1 + _swig_i_1 := getSwigcptr(arg2) + C._wrap_opj_output_memory_stream_chunks_set_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1)) +} + +func (arg1 SwigcptrOpj_output_memory_stream) GetChunks() (_swig_ret Std_vector_Sl_opj_output_memory_stream_chunk_Sg_) { + var swig_r Std_vector_Sl_opj_output_memory_stream_chunk_Sg_ + _swig_i_0 := arg1 + swig_r = (Std_vector_Sl_opj_output_memory_stream_chunk_Sg_)(SwigcptrStd_vector_Sl_opj_output_memory_stream_chunk_Sg_(C._wrap_opj_output_memory_stream_chunks_get_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)))) + return swig_r +} + +func NewOpj_output_memory_stream() (_swig_ret Opj_output_memory_stream) { + var swig_r Opj_output_memory_stream + swig_r = (Opj_output_memory_stream)(SwigcptrOpj_output_memory_stream(C._wrap_new_opj_output_memory_stream_codec_cffb419519a4d845())) + return swig_r +} + +func DeleteOpj_output_memory_stream(arg1 Opj_output_memory_stream) { + _swig_i_0 := getSwigcptr(arg1) + C._wrap_delete_opj_output_memory_stream_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0)) +} + +type Opj_output_memory_stream interface { + Swigcptr() uintptr + SwigIsOpj_output_memory_stream() + SetDataSize(arg2 OPJ_SIZE_T) + GetDataSize() (_swig_ret OPJ_SIZE_T) + SetChunks(arg2 Std_vector_Sl_opj_output_memory_stream_chunk_Sg_) + GetChunks() (_swig_ret Std_vector_Sl_opj_output_memory_stream_chunk_Sg_) +} + +func Opj_output_memory_stream_seek(arg1 OPJ_OFF_T, arg2 uintptr) (_swig_ret OPJ_BOOL) { + var swig_r OPJ_BOOL + _swig_i_0 := getSwigcptr(arg1) + _swig_i_1 := arg2 + swig_r = (OPJ_BOOL)(SwigcptrOPJ_BOOL(C._wrap_opj_output_memory_stream_seek_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1)))) + return swig_r +} + +func Opj_output_memory_stream_skip(arg1 OPJ_OFF_T, arg2 uintptr) (_swig_ret OPJ_OFF_T) { + var swig_r OPJ_OFF_T + _swig_i_0 := getSwigcptr(arg1) + _swig_i_1 := arg2 + swig_r = (OPJ_OFF_T)(SwigcptrOPJ_OFF_T(C._wrap_opj_output_memory_stream_skip_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1)))) + return swig_r +} + +func Opj_output_memory_stream_write(arg1 uintptr, arg2 OPJ_SIZE_T, arg3 uintptr) (_swig_ret OPJ_SIZE_T) { + var swig_r OPJ_SIZE_T + _swig_i_0 := arg1 + _swig_i_1 := getSwigcptr(arg2) + _swig_i_2 := arg3 + swig_r = (OPJ_SIZE_T)(SwigcptrOPJ_SIZE_T(C._wrap_opj_output_memory_stream_write_codec_cffb419519a4d845(C.uintptr_t(_swig_i_0), C.uintptr_t(_swig_i_1), C.uintptr_t(_swig_i_2)))) + return swig_r +} + +func J2K_Decode(arg1 *byte, arg2 int64, arg3 int, arg4 int, arg5 *int64) (_swig_ret *byte) { + var swig_r *byte + _swig_i_0 := arg1 + _swig_i_1 := arg2 + _swig_i_2 := arg3 + _swig_i_3 := arg4 + _swig_i_4 := arg5 + swig_r = (*byte)(C._wrap_J2K_Decode_codec_cffb419519a4d845(C.swig_voidp(_swig_i_0), C.swig_type_12(_swig_i_1), C.swig_intgo(_swig_i_2), C.swig_intgo(_swig_i_3), C.swig_voidp(_swig_i_4))) + return swig_r +} + +func JPEG_Decode(arg1 *byte, arg2 int64, arg3 int, arg4 int, arg5 int, arg6 int, arg7 int, arg8 int, arg9 *int64) (_swig_ret *byte) { + var swig_r *byte + _swig_i_0 := arg1 + _swig_i_1 := arg2 + _swig_i_2 := arg3 + _swig_i_3 := arg4 + _swig_i_4 := arg5 + _swig_i_5 := arg6 + _swig_i_6 := arg7 + _swig_i_7 := arg8 + _swig_i_8 := arg9 + swig_r = (*byte)(C._wrap_JPEG_Decode_codec_cffb419519a4d845(C.swig_voidp(_swig_i_0), C.swig_type_13(_swig_i_1), C.swig_intgo(_swig_i_2), C.swig_intgo(_swig_i_3), C.swig_intgo(_swig_i_4), C.swig_intgo(_swig_i_5), C.swig_intgo(_swig_i_6), C.swig_intgo(_swig_i_7), C.swig_voidp(_swig_i_8))) + return swig_r +} + +func JPEGLS_Decode(arg1 *byte, arg2 int64, arg3 int, arg4 int, arg5 int, arg6 int, arg7 int, arg8 *int64) (_swig_ret *byte) { + var swig_r *byte + _swig_i_0 := arg1 + _swig_i_1 := arg2 + _swig_i_2 := arg3 + _swig_i_3 := arg4 + _swig_i_4 := arg5 + _swig_i_5 := arg6 + _swig_i_6 := arg7 + _swig_i_7 := arg8 + swig_r = (*byte)(C._wrap_JPEGLS_Decode_codec_cffb419519a4d845(C.swig_voidp(_swig_i_0), C.swig_type_14(_swig_i_1), C.swig_intgo(_swig_i_2), C.swig_intgo(_swig_i_3), C.swig_intgo(_swig_i_4), C.swig_intgo(_swig_i_5), C.swig_intgo(_swig_i_6), C.swig_voidp(_swig_i_7))) + return swig_r +} + +func J2K_Encode(arg1 *byte, arg2 int, arg3 int, arg4 int, arg5 int, arg6 int, arg7 *int64) (_swig_ret *byte) { + var swig_r *byte + _swig_i_0 := arg1 + _swig_i_1 := arg2 + _swig_i_2 := arg3 + _swig_i_3 := arg4 + _swig_i_4 := arg5 + _swig_i_5 := arg6 + _swig_i_6 := arg7 + swig_r = (*byte)(C._wrap_J2K_Encode_codec_cffb419519a4d845(C.swig_voidp(_swig_i_0), C.swig_intgo(_swig_i_1), C.swig_intgo(_swig_i_2), C.swig_intgo(_swig_i_3), C.swig_intgo(_swig_i_4), C.swig_intgo(_swig_i_5), C.swig_voidp(_swig_i_6))) + return swig_r +} + + +type SwigcptrOPJ_UINT8 uintptr +type OPJ_UINT8 interface { + Swigcptr() uintptr; +} +func (p SwigcptrOPJ_UINT8) Swigcptr() uintptr { + return uintptr(p) +} + +type SwigcptrOPJ_OFF_T uintptr +type OPJ_OFF_T interface { + Swigcptr() uintptr; +} +func (p SwigcptrOPJ_OFF_T) Swigcptr() uintptr { + return uintptr(p) +} + +type SwigcptrStd_vector_Sl_opj_output_memory_stream_chunk_Sg_ uintptr +type Std_vector_Sl_opj_output_memory_stream_chunk_Sg_ interface { + Swigcptr() uintptr; +} +func (p SwigcptrStd_vector_Sl_opj_output_memory_stream_chunk_Sg_) Swigcptr() uintptr { + return uintptr(p) +} + +type SwigcptrOPJ_SIZE_T uintptr +type OPJ_SIZE_T interface { + Swigcptr() uintptr; +} +func (p SwigcptrOPJ_SIZE_T) Swigcptr() uintptr { + return uintptr(p) +} + +type SwigcptrOPJ_BOOL uintptr +type OPJ_BOOL interface { + Swigcptr() uintptr; +} +func (p SwigcptrOPJ_BOOL) Swigcptr() uintptr { + return uintptr(p) +} + diff --git a/pkg/codec/codec.h b/pkg/codec/codec.h new file mode 100644 index 00000000..73bb3822 --- /dev/null +++ b/pkg/codec/codec.h @@ -0,0 +1,32 @@ +// Copyright (c) 2023 Segmed Inc. +#include "openjpeg.h" +#include + +typedef unsigned char BYTE; +typedef struct +{ + OPJ_UINT8* pData; + OPJ_SIZE_T dataSize; + OPJ_SIZE_T offset; +} opj_input_memory_stream; + +OPJ_BOOL opj_input_memory_stream_seek(OPJ_OFF_T p_nb_bytes, void * p_user_data); +OPJ_OFF_T opj_input_memory_stream_skip(OPJ_OFF_T p_nb_bytes, void * p_user_data); +OPJ_SIZE_T opj_input_memory_stream_read(void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data); + +typedef struct +{ + OPJ_UINT8* data; + OPJ_SIZE_T dataLen; +} opj_output_memory_stream_chunk; + +typedef struct +{ + OPJ_SIZE_T dataSize; + std::vector chunks; +} opj_output_memory_stream; + +OPJ_BOOL opj_output_memory_stream_seek(OPJ_OFF_T p_nb_bytes, void * p_user_data); +OPJ_OFF_T opj_output_memory_stream_skip(OPJ_OFF_T p_nb_bytes, void * p_user_data); +OPJ_SIZE_T opj_output_memory_stream_write(void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data); + diff --git a/pkg/codec/codec.i b/pkg/codec/codec.i new file mode 100644 index 00000000..09b0ab75 --- /dev/null +++ b/pkg/codec/codec.i @@ -0,0 +1,21 @@ +%module codec +%{ +#include "codec.h" +#include "export.h" +%} + +%include +%include "std_string.i" +%include "std_vector.i" + +// This will create 2 wrapped types in Go called +// "StringVector" and "ByteVector" for their respective +// types. +namespace std { + %template(StringVector) vector; + %template(ByteVector) vector; +} + +%include "codec.h" +%include "export.h" + diff --git a/pkg/codec/codec_wrap.cxx b/pkg/codec/codec_wrap.cxx new file mode 100644 index 00000000..cc3e8ab9 --- /dev/null +++ b/pkg/codec/codec_wrap.cxx @@ -0,0 +1,1142 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (https://www.swig.org). + * Version 4.1.1 + * + * Do not make changes to this file unless you know what you are doing - modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +// source: codec.i + + +extern +#ifdef __cplusplus + "C" +#endif + void cgo_panic__codec_cffb419519a4d845(const char*); +static void _swig_gopanic(const char *p) { + cgo_panic__codec_cffb419519a4d845(p); +} + + + +#define SWIG_VERSION 0x040101 +#define SWIGGO +#define SWIGMODULE codec +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if defined(__GNUC__) +# if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + +/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ +#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) +# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 +#endif + +/* Intel's compiler complains if a variable which was never initialised is + * cast to void, which is a common idiom which we use to indicate that we + * are aware a variable isn't used. So we just silence that warning. + * See: https://github.com/swig/swig/issues/192 for more discussion. + */ +#ifdef __INTEL_COMPILER +# pragma warning disable 592 +#endif + + +#include +#include +#include +#include +#include + + + +typedef long long intgo; +typedef unsigned long long uintgo; + + +# if !defined(__clang__) && (defined(__i386__) || defined(__x86_64__)) +# define SWIGSTRUCTPACKED __attribute__((__packed__, __gcc_struct__)) +# else +# define SWIGSTRUCTPACKED __attribute__((__packed__)) +# endif + + + +typedef struct { char *p; intgo n; } _gostring_; +typedef struct { void* array; intgo len; intgo cap; } _goslice_; + + + +static _gostring_ Swig_AllocateString(const char *p, size_t l) { + _gostring_ ret; + ret.p = (char*)malloc(l); + memcpy(ret.p, p, l); + ret.n = l; + return ret; +} + + +#ifdef __cplusplus +#include +/* SwigValueWrapper is described in swig.swg */ +template class SwigValueWrapper { + struct SwigSmartPointer { + T *ptr; + SwigSmartPointer(T *p) : ptr(p) { } + ~SwigSmartPointer() { delete ptr; } + SwigSmartPointer& operator=(SwigSmartPointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + void reset(T *p) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = p; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigSmartPointer tmp(new T(t)); pointer = tmp; return *this; } +#if __cplusplus >=201103L + SwigValueWrapper& operator=(T&& t) { SwigSmartPointer tmp(new T(std::move(t))); pointer = tmp; return *this; } + operator T&&() const { return std::move(*pointer.ptr); } +#else + operator T&() const { return *pointer.ptr; } +#endif + T *operator&() const { return pointer.ptr; } + static void reset(SwigValueWrapper& t, T *p) { t.pointer.reset(p); } +}; + +/* + * SwigValueInit() is a generic initialisation solution as the following approach: + * + * T c_result = T(); + * + * doesn't compile for all types for example: + * + * unsigned int c_result = unsigned int(); + */ +template T SwigValueInit() { + return T(); +} + +#if __cplusplus >=201103L +# define SWIG_STD_MOVE(OBJ) std::move(OBJ) +#else +# define SWIG_STD_MOVE(OBJ) OBJ +#endif + +#endif + + +static void Swig_free(void* p) { + free(p); +} + +static void* Swig_malloc(int c) { + return malloc(c); +} + + +#include "codec.h" +#include "export.h" + + +#include + + +#include +#include + +SWIGINTERN std::vector< std::string >::const_reference std_vector_Sl_std_string_Sg__get(std::vector< std::string > *self,int i){ + int size = int(self->size()); + if (i>=0 && i *self,int i,std::vector< std::string >::value_type const &val){ + int size = int(self->size()); + if (i>=0 && i::const_reference std_vector_Sl_char_Sg__get(std::vector< char > *self,int i){ + int size = int(self->size()); + if (i>=0 && i *self,int i,std::vector< char >::value_type const &val){ + int size = int(self->size()); + if (i>=0 && i *_wrap_new_StringVector__SWIG_0_codec_cffb419519a4d845() { + std::vector< std::string > *result = 0 ; + std::vector< std::string > *_swig_go_result; + + + result = (std::vector< std::string > *)new std::vector< std::string >(); + *(std::vector< std::string > **)&_swig_go_result = (std::vector< std::string > *)result; + return _swig_go_result; +} + + +std::vector< std::string > *_wrap_new_StringVector__SWIG_1_codec_cffb419519a4d845(long long _swig_go_0) { + std::vector< std::string >::size_type arg1 ; + std::vector< std::string > *result = 0 ; + std::vector< std::string > *_swig_go_result; + + arg1 = (size_t)_swig_go_0; + + result = (std::vector< std::string > *)new std::vector< std::string >(arg1); + *(std::vector< std::string > **)&_swig_go_result = (std::vector< std::string > *)result; + return _swig_go_result; +} + + +std::vector< std::string > *_wrap_new_StringVector__SWIG_2_codec_cffb419519a4d845(std::vector< std::string > *_swig_go_0) { + std::vector< std::string > *arg1 = 0 ; + std::vector< std::string > *result = 0 ; + std::vector< std::string > *_swig_go_result; + + arg1 = *(std::vector< std::string > **)&_swig_go_0; + + result = (std::vector< std::string > *)new std::vector< std::string >((std::vector< std::string > const &)*arg1); + *(std::vector< std::string > **)&_swig_go_result = (std::vector< std::string > *)result; + return _swig_go_result; +} + + +long long _wrap_StringVector_size_codec_cffb419519a4d845(std::vector< std::string > *_swig_go_0) { + std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; + std::vector< std::string >::size_type result; + long long _swig_go_result; + + arg1 = *(std::vector< std::string > **)&_swig_go_0; + + result = ((std::vector< std::string > const *)arg1)->size(); + _swig_go_result = result; + return _swig_go_result; +} + + +long long _wrap_StringVector_capacity_codec_cffb419519a4d845(std::vector< std::string > *_swig_go_0) { + std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; + std::vector< std::string >::size_type result; + long long _swig_go_result; + + arg1 = *(std::vector< std::string > **)&_swig_go_0; + + result = ((std::vector< std::string > const *)arg1)->capacity(); + _swig_go_result = result; + return _swig_go_result; +} + + +void _wrap_StringVector_reserve_codec_cffb419519a4d845(std::vector< std::string > *_swig_go_0, long long _swig_go_1) { + std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; + std::vector< std::string >::size_type arg2 ; + + arg1 = *(std::vector< std::string > **)&_swig_go_0; + arg2 = (size_t)_swig_go_1; + + (arg1)->reserve(arg2); + +} + + +bool _wrap_StringVector_isEmpty_codec_cffb419519a4d845(std::vector< std::string > *_swig_go_0) { + std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; + bool result; + bool _swig_go_result; + + arg1 = *(std::vector< std::string > **)&_swig_go_0; + + result = (bool)((std::vector< std::string > const *)arg1)->empty(); + _swig_go_result = result; + return _swig_go_result; +} + + +void _wrap_StringVector_clear_codec_cffb419519a4d845(std::vector< std::string > *_swig_go_0) { + std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; + + arg1 = *(std::vector< std::string > **)&_swig_go_0; + + (arg1)->clear(); + +} + + +void _wrap_StringVector_add_codec_cffb419519a4d845(std::vector< std::string > *_swig_go_0, _gostring_ _swig_go_1) { + std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; + std::vector< std::string >::value_type *arg2 = 0 ; + + arg1 = *(std::vector< std::string > **)&_swig_go_0; + + std::vector< std::string >::value_type arg2_str(_swig_go_1.p, _swig_go_1.n); + arg2 = &arg2_str; + + + (arg1)->push_back((std::vector< std::string >::value_type const &)*arg2); + +} + + +_gostring_ _wrap_StringVector_get_codec_cffb419519a4d845(std::vector< std::string > *_swig_go_0, intgo _swig_go_1) { + std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; + int arg2 ; + std::vector< std::string >::value_type *result = 0 ; + _gostring_ _swig_go_result; + + arg1 = *(std::vector< std::string > **)&_swig_go_0; + arg2 = (int)_swig_go_1; + + try { + result = (std::vector< std::string >::value_type *) &std_vector_Sl_std_string_Sg__get(arg1,arg2); + } catch(std::out_of_range &_e) { + (void)_e; + _swig_gopanic("C++ std::out_of_range exception thrown"); + + } + _swig_go_result = Swig_AllocateString((*result).data(), (*result).length()); + return _swig_go_result; +} + + +void _wrap_StringVector_set_codec_cffb419519a4d845(std::vector< std::string > *_swig_go_0, intgo _swig_go_1, _gostring_ _swig_go_2) { + std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; + int arg2 ; + std::vector< std::string >::value_type *arg3 = 0 ; + + arg1 = *(std::vector< std::string > **)&_swig_go_0; + arg2 = (int)_swig_go_1; + + std::vector< std::string >::value_type arg3_str(_swig_go_2.p, _swig_go_2.n); + arg3 = &arg3_str; + + + try { + std_vector_Sl_std_string_Sg__set(arg1,arg2,(std::string const &)*arg3); + } catch(std::out_of_range &_e) { + (void)_e; + _swig_gopanic("C++ std::out_of_range exception thrown"); + + } + +} + + +void _wrap_delete_StringVector_codec_cffb419519a4d845(std::vector< std::string > *_swig_go_0) { + std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; + + arg1 = *(std::vector< std::string > **)&_swig_go_0; + + delete arg1; + +} + + +std::vector< char > *_wrap_new_ByteVector__SWIG_0_codec_cffb419519a4d845() { + std::vector< char > *result = 0 ; + std::vector< char > *_swig_go_result; + + + result = (std::vector< char > *)new std::vector< char >(); + *(std::vector< char > **)&_swig_go_result = (std::vector< char > *)result; + return _swig_go_result; +} + + +std::vector< char > *_wrap_new_ByteVector__SWIG_1_codec_cffb419519a4d845(long long _swig_go_0) { + std::vector< char >::size_type arg1 ; + std::vector< char > *result = 0 ; + std::vector< char > *_swig_go_result; + + arg1 = (size_t)_swig_go_0; + + result = (std::vector< char > *)new std::vector< char >(arg1); + *(std::vector< char > **)&_swig_go_result = (std::vector< char > *)result; + return _swig_go_result; +} + + +std::vector< char > *_wrap_new_ByteVector__SWIG_2_codec_cffb419519a4d845(std::vector< char > *_swig_go_0) { + std::vector< char > *arg1 = 0 ; + std::vector< char > *result = 0 ; + std::vector< char > *_swig_go_result; + + arg1 = *(std::vector< char > **)&_swig_go_0; + + result = (std::vector< char > *)new std::vector< char >((std::vector< char > const &)*arg1); + *(std::vector< char > **)&_swig_go_result = (std::vector< char > *)result; + return _swig_go_result; +} + + +long long _wrap_ByteVector_size_codec_cffb419519a4d845(std::vector< char > *_swig_go_0) { + std::vector< char > *arg1 = (std::vector< char > *) 0 ; + std::vector< char >::size_type result; + long long _swig_go_result; + + arg1 = *(std::vector< char > **)&_swig_go_0; + + result = ((std::vector< char > const *)arg1)->size(); + _swig_go_result = result; + return _swig_go_result; +} + + +long long _wrap_ByteVector_capacity_codec_cffb419519a4d845(std::vector< char > *_swig_go_0) { + std::vector< char > *arg1 = (std::vector< char > *) 0 ; + std::vector< char >::size_type result; + long long _swig_go_result; + + arg1 = *(std::vector< char > **)&_swig_go_0; + + result = ((std::vector< char > const *)arg1)->capacity(); + _swig_go_result = result; + return _swig_go_result; +} + + +void _wrap_ByteVector_reserve_codec_cffb419519a4d845(std::vector< char > *_swig_go_0, long long _swig_go_1) { + std::vector< char > *arg1 = (std::vector< char > *) 0 ; + std::vector< char >::size_type arg2 ; + + arg1 = *(std::vector< char > **)&_swig_go_0; + arg2 = (size_t)_swig_go_1; + + (arg1)->reserve(arg2); + +} + + +bool _wrap_ByteVector_isEmpty_codec_cffb419519a4d845(std::vector< char > *_swig_go_0) { + std::vector< char > *arg1 = (std::vector< char > *) 0 ; + bool result; + bool _swig_go_result; + + arg1 = *(std::vector< char > **)&_swig_go_0; + + result = (bool)((std::vector< char > const *)arg1)->empty(); + _swig_go_result = result; + return _swig_go_result; +} + + +void _wrap_ByteVector_clear_codec_cffb419519a4d845(std::vector< char > *_swig_go_0) { + std::vector< char > *arg1 = (std::vector< char > *) 0 ; + + arg1 = *(std::vector< char > **)&_swig_go_0; + + (arg1)->clear(); + +} + + +void _wrap_ByteVector_add_codec_cffb419519a4d845(std::vector< char > *_swig_go_0, char _swig_go_1) { + std::vector< char > *arg1 = (std::vector< char > *) 0 ; + std::vector< char >::value_type *arg2 = 0 ; + + arg1 = *(std::vector< char > **)&_swig_go_0; + arg2 = (std::vector< char >::value_type *)&_swig_go_1; + + (arg1)->push_back((std::vector< char >::value_type const &)*arg2); + +} + + +char _wrap_ByteVector_get_codec_cffb419519a4d845(std::vector< char > *_swig_go_0, intgo _swig_go_1) { + std::vector< char > *arg1 = (std::vector< char > *) 0 ; + int arg2 ; + std::vector< char >::value_type *result = 0 ; + char _swig_go_result; + + arg1 = *(std::vector< char > **)&_swig_go_0; + arg2 = (int)_swig_go_1; + + try { + result = (std::vector< char >::value_type *) &std_vector_Sl_char_Sg__get(arg1,arg2); + } catch(std::out_of_range &_e) { + (void)_e; + _swig_gopanic("C++ std::out_of_range exception thrown"); + + } + _swig_go_result = (char)*result; + return _swig_go_result; +} + + +void _wrap_ByteVector_set_codec_cffb419519a4d845(std::vector< char > *_swig_go_0, intgo _swig_go_1, char _swig_go_2) { + std::vector< char > *arg1 = (std::vector< char > *) 0 ; + int arg2 ; + std::vector< char >::value_type *arg3 = 0 ; + + arg1 = *(std::vector< char > **)&_swig_go_0; + arg2 = (int)_swig_go_1; + arg3 = (std::vector< char >::value_type *)&_swig_go_2; + + try { + std_vector_Sl_char_Sg__set(arg1,arg2,(char const &)*arg3); + } catch(std::out_of_range &_e) { + (void)_e; + _swig_gopanic("C++ std::out_of_range exception thrown"); + + } + +} + + +void _wrap_delete_ByteVector_codec_cffb419519a4d845(std::vector< char > *_swig_go_0) { + std::vector< char > *arg1 = (std::vector< char > *) 0 ; + + arg1 = *(std::vector< char > **)&_swig_go_0; + + delete arg1; + +} + + +void _wrap_opj_input_memory_stream_pData_set_codec_cffb419519a4d845(opj_input_memory_stream *_swig_go_0, OPJ_UINT8 *_swig_go_1) { + opj_input_memory_stream *arg1 = (opj_input_memory_stream *) 0 ; + OPJ_UINT8 *arg2 = (OPJ_UINT8 *) 0 ; + + arg1 = *(opj_input_memory_stream **)&_swig_go_0; + arg2 = *(OPJ_UINT8 **)&_swig_go_1; + + if (arg1) (arg1)->pData = arg2; + +} + + +OPJ_UINT8 *_wrap_opj_input_memory_stream_pData_get_codec_cffb419519a4d845(opj_input_memory_stream *_swig_go_0) { + opj_input_memory_stream *arg1 = (opj_input_memory_stream *) 0 ; + OPJ_UINT8 *result = 0 ; + OPJ_UINT8 *_swig_go_result; + + arg1 = *(opj_input_memory_stream **)&_swig_go_0; + + result = (OPJ_UINT8 *) ((arg1)->pData); + *(OPJ_UINT8 **)&_swig_go_result = (OPJ_UINT8 *)result; + return _swig_go_result; +} + + +void _wrap_opj_input_memory_stream_dataSize_set_codec_cffb419519a4d845(opj_input_memory_stream *_swig_go_0, OPJ_SIZE_T *_swig_go_1) { + opj_input_memory_stream *arg1 = (opj_input_memory_stream *) 0 ; + OPJ_SIZE_T arg2 ; + OPJ_SIZE_T *argp2 ; + + arg1 = *(opj_input_memory_stream **)&_swig_go_0; + + argp2 = (OPJ_SIZE_T *)_swig_go_1; + if (argp2 == NULL) { + _swig_gopanic("Attempt to dereference null OPJ_SIZE_T"); + } + arg2 = (OPJ_SIZE_T)*argp2; + + + if (arg1) (arg1)->dataSize = arg2; + +} + + +OPJ_SIZE_T *_wrap_opj_input_memory_stream_dataSize_get_codec_cffb419519a4d845(opj_input_memory_stream *_swig_go_0) { + opj_input_memory_stream *arg1 = (opj_input_memory_stream *) 0 ; + OPJ_SIZE_T result; + OPJ_SIZE_T *_swig_go_result; + + arg1 = *(opj_input_memory_stream **)&_swig_go_0; + + result = ((arg1)->dataSize); + *(OPJ_SIZE_T **)&_swig_go_result = new OPJ_SIZE_T(result); + return _swig_go_result; +} + + +void _wrap_opj_input_memory_stream_offset_set_codec_cffb419519a4d845(opj_input_memory_stream *_swig_go_0, OPJ_SIZE_T *_swig_go_1) { + opj_input_memory_stream *arg1 = (opj_input_memory_stream *) 0 ; + OPJ_SIZE_T arg2 ; + OPJ_SIZE_T *argp2 ; + + arg1 = *(opj_input_memory_stream **)&_swig_go_0; + + argp2 = (OPJ_SIZE_T *)_swig_go_1; + if (argp2 == NULL) { + _swig_gopanic("Attempt to dereference null OPJ_SIZE_T"); + } + arg2 = (OPJ_SIZE_T)*argp2; + + + if (arg1) (arg1)->offset = arg2; + +} + + +OPJ_SIZE_T *_wrap_opj_input_memory_stream_offset_get_codec_cffb419519a4d845(opj_input_memory_stream *_swig_go_0) { + opj_input_memory_stream *arg1 = (opj_input_memory_stream *) 0 ; + OPJ_SIZE_T result; + OPJ_SIZE_T *_swig_go_result; + + arg1 = *(opj_input_memory_stream **)&_swig_go_0; + + result = ((arg1)->offset); + *(OPJ_SIZE_T **)&_swig_go_result = new OPJ_SIZE_T(result); + return _swig_go_result; +} + + +opj_input_memory_stream *_wrap_new_opj_input_memory_stream_codec_cffb419519a4d845() { + opj_input_memory_stream *result = 0 ; + opj_input_memory_stream *_swig_go_result; + + + result = (opj_input_memory_stream *)new opj_input_memory_stream(); + *(opj_input_memory_stream **)&_swig_go_result = (opj_input_memory_stream *)result; + return _swig_go_result; +} + + +void _wrap_delete_opj_input_memory_stream_codec_cffb419519a4d845(opj_input_memory_stream *_swig_go_0) { + opj_input_memory_stream *arg1 = (opj_input_memory_stream *) 0 ; + + arg1 = *(opj_input_memory_stream **)&_swig_go_0; + + delete arg1; + +} + + +OPJ_BOOL *_wrap_opj_input_memory_stream_seek_codec_cffb419519a4d845(OPJ_OFF_T *_swig_go_0, void *_swig_go_1) { + OPJ_OFF_T arg1 ; + void *arg2 = (void *) 0 ; + OPJ_OFF_T *argp1 ; + OPJ_BOOL result; + OPJ_BOOL *_swig_go_result; + + + argp1 = (OPJ_OFF_T *)_swig_go_0; + if (argp1 == NULL) { + _swig_gopanic("Attempt to dereference null OPJ_OFF_T"); + } + arg1 = (OPJ_OFF_T)*argp1; + + arg2 = *(void **)&_swig_go_1; + + result = opj_input_memory_stream_seek(SWIG_STD_MOVE(arg1),arg2); + *(OPJ_BOOL **)&_swig_go_result = new OPJ_BOOL(result); + return _swig_go_result; +} + + +OPJ_OFF_T *_wrap_opj_input_memory_stream_skip_codec_cffb419519a4d845(OPJ_OFF_T *_swig_go_0, void *_swig_go_1) { + OPJ_OFF_T arg1 ; + void *arg2 = (void *) 0 ; + OPJ_OFF_T *argp1 ; + OPJ_OFF_T result; + OPJ_OFF_T *_swig_go_result; + + + argp1 = (OPJ_OFF_T *)_swig_go_0; + if (argp1 == NULL) { + _swig_gopanic("Attempt to dereference null OPJ_OFF_T"); + } + arg1 = (OPJ_OFF_T)*argp1; + + arg2 = *(void **)&_swig_go_1; + + result = opj_input_memory_stream_skip(SWIG_STD_MOVE(arg1),arg2); + *(OPJ_OFF_T **)&_swig_go_result = new OPJ_OFF_T(result); + return _swig_go_result; +} + + +OPJ_SIZE_T *_wrap_opj_input_memory_stream_read_codec_cffb419519a4d845(void *_swig_go_0, OPJ_SIZE_T *_swig_go_1, void *_swig_go_2) { + void *arg1 = (void *) 0 ; + OPJ_SIZE_T arg2 ; + void *arg3 = (void *) 0 ; + OPJ_SIZE_T *argp2 ; + OPJ_SIZE_T result; + OPJ_SIZE_T *_swig_go_result; + + arg1 = *(void **)&_swig_go_0; + + argp2 = (OPJ_SIZE_T *)_swig_go_1; + if (argp2 == NULL) { + _swig_gopanic("Attempt to dereference null OPJ_SIZE_T"); + } + arg2 = (OPJ_SIZE_T)*argp2; + + arg3 = *(void **)&_swig_go_2; + + result = opj_input_memory_stream_read(arg1,SWIG_STD_MOVE(arg2),arg3); + *(OPJ_SIZE_T **)&_swig_go_result = new OPJ_SIZE_T(result); + return _swig_go_result; +} + + +void _wrap_opj_output_memory_stream_chunk_data_set_codec_cffb419519a4d845(opj_output_memory_stream_chunk *_swig_go_0, OPJ_UINT8 *_swig_go_1) { + opj_output_memory_stream_chunk *arg1 = (opj_output_memory_stream_chunk *) 0 ; + OPJ_UINT8 *arg2 = (OPJ_UINT8 *) 0 ; + + arg1 = *(opj_output_memory_stream_chunk **)&_swig_go_0; + arg2 = *(OPJ_UINT8 **)&_swig_go_1; + + if (arg1) (arg1)->data = arg2; + +} + + +OPJ_UINT8 *_wrap_opj_output_memory_stream_chunk_data_get_codec_cffb419519a4d845(opj_output_memory_stream_chunk *_swig_go_0) { + opj_output_memory_stream_chunk *arg1 = (opj_output_memory_stream_chunk *) 0 ; + OPJ_UINT8 *result = 0 ; + OPJ_UINT8 *_swig_go_result; + + arg1 = *(opj_output_memory_stream_chunk **)&_swig_go_0; + + result = (OPJ_UINT8 *) ((arg1)->data); + *(OPJ_UINT8 **)&_swig_go_result = (OPJ_UINT8 *)result; + return _swig_go_result; +} + + +void _wrap_opj_output_memory_stream_chunk_dataLen_set_codec_cffb419519a4d845(opj_output_memory_stream_chunk *_swig_go_0, OPJ_SIZE_T *_swig_go_1) { + opj_output_memory_stream_chunk *arg1 = (opj_output_memory_stream_chunk *) 0 ; + OPJ_SIZE_T arg2 ; + OPJ_SIZE_T *argp2 ; + + arg1 = *(opj_output_memory_stream_chunk **)&_swig_go_0; + + argp2 = (OPJ_SIZE_T *)_swig_go_1; + if (argp2 == NULL) { + _swig_gopanic("Attempt to dereference null OPJ_SIZE_T"); + } + arg2 = (OPJ_SIZE_T)*argp2; + + + if (arg1) (arg1)->dataLen = arg2; + +} + + +OPJ_SIZE_T *_wrap_opj_output_memory_stream_chunk_dataLen_get_codec_cffb419519a4d845(opj_output_memory_stream_chunk *_swig_go_0) { + opj_output_memory_stream_chunk *arg1 = (opj_output_memory_stream_chunk *) 0 ; + OPJ_SIZE_T result; + OPJ_SIZE_T *_swig_go_result; + + arg1 = *(opj_output_memory_stream_chunk **)&_swig_go_0; + + result = ((arg1)->dataLen); + *(OPJ_SIZE_T **)&_swig_go_result = new OPJ_SIZE_T(result); + return _swig_go_result; +} + + +opj_output_memory_stream_chunk *_wrap_new_opj_output_memory_stream_chunk_codec_cffb419519a4d845() { + opj_output_memory_stream_chunk *result = 0 ; + opj_output_memory_stream_chunk *_swig_go_result; + + + result = (opj_output_memory_stream_chunk *)new opj_output_memory_stream_chunk(); + *(opj_output_memory_stream_chunk **)&_swig_go_result = (opj_output_memory_stream_chunk *)result; + return _swig_go_result; +} + + +void _wrap_delete_opj_output_memory_stream_chunk_codec_cffb419519a4d845(opj_output_memory_stream_chunk *_swig_go_0) { + opj_output_memory_stream_chunk *arg1 = (opj_output_memory_stream_chunk *) 0 ; + + arg1 = *(opj_output_memory_stream_chunk **)&_swig_go_0; + + delete arg1; + +} + + +void _wrap_opj_output_memory_stream_dataSize_set_codec_cffb419519a4d845(opj_output_memory_stream *_swig_go_0, OPJ_SIZE_T *_swig_go_1) { + opj_output_memory_stream *arg1 = (opj_output_memory_stream *) 0 ; + OPJ_SIZE_T arg2 ; + OPJ_SIZE_T *argp2 ; + + arg1 = *(opj_output_memory_stream **)&_swig_go_0; + + argp2 = (OPJ_SIZE_T *)_swig_go_1; + if (argp2 == NULL) { + _swig_gopanic("Attempt to dereference null OPJ_SIZE_T"); + } + arg2 = (OPJ_SIZE_T)*argp2; + + + if (arg1) (arg1)->dataSize = arg2; + +} + + +OPJ_SIZE_T *_wrap_opj_output_memory_stream_dataSize_get_codec_cffb419519a4d845(opj_output_memory_stream *_swig_go_0) { + opj_output_memory_stream *arg1 = (opj_output_memory_stream *) 0 ; + OPJ_SIZE_T result; + OPJ_SIZE_T *_swig_go_result; + + arg1 = *(opj_output_memory_stream **)&_swig_go_0; + + result = ((arg1)->dataSize); + *(OPJ_SIZE_T **)&_swig_go_result = new OPJ_SIZE_T(result); + return _swig_go_result; +} + + +void _wrap_opj_output_memory_stream_chunks_set_codec_cffb419519a4d845(opj_output_memory_stream *_swig_go_0, std::vector< opj_output_memory_stream_chunk > *_swig_go_1) { + opj_output_memory_stream *arg1 = (opj_output_memory_stream *) 0 ; + std::vector< opj_output_memory_stream_chunk > *arg2 = (std::vector< opj_output_memory_stream_chunk > *) 0 ; + + arg1 = *(opj_output_memory_stream **)&_swig_go_0; + arg2 = *(std::vector< opj_output_memory_stream_chunk > **)&_swig_go_1; + + if (arg1) (arg1)->chunks = *arg2; + +} + + +std::vector< opj_output_memory_stream_chunk > *_wrap_opj_output_memory_stream_chunks_get_codec_cffb419519a4d845(opj_output_memory_stream *_swig_go_0) { + opj_output_memory_stream *arg1 = (opj_output_memory_stream *) 0 ; + std::vector< opj_output_memory_stream_chunk > *result = 0 ; + std::vector< opj_output_memory_stream_chunk > *_swig_go_result; + + arg1 = *(opj_output_memory_stream **)&_swig_go_0; + + result = (std::vector< opj_output_memory_stream_chunk > *)& ((arg1)->chunks); + *(std::vector< opj_output_memory_stream_chunk > **)&_swig_go_result = (std::vector< opj_output_memory_stream_chunk > *)result; + return _swig_go_result; +} + + +opj_output_memory_stream *_wrap_new_opj_output_memory_stream_codec_cffb419519a4d845() { + opj_output_memory_stream *result = 0 ; + opj_output_memory_stream *_swig_go_result; + + + result = (opj_output_memory_stream *)new opj_output_memory_stream(); + *(opj_output_memory_stream **)&_swig_go_result = (opj_output_memory_stream *)result; + return _swig_go_result; +} + + +void _wrap_delete_opj_output_memory_stream_codec_cffb419519a4d845(opj_output_memory_stream *_swig_go_0) { + opj_output_memory_stream *arg1 = (opj_output_memory_stream *) 0 ; + + arg1 = *(opj_output_memory_stream **)&_swig_go_0; + + delete arg1; + +} + + +OPJ_BOOL *_wrap_opj_output_memory_stream_seek_codec_cffb419519a4d845(OPJ_OFF_T *_swig_go_0, void *_swig_go_1) { + OPJ_OFF_T arg1 ; + void *arg2 = (void *) 0 ; + OPJ_OFF_T *argp1 ; + OPJ_BOOL result; + OPJ_BOOL *_swig_go_result; + + + argp1 = (OPJ_OFF_T *)_swig_go_0; + if (argp1 == NULL) { + _swig_gopanic("Attempt to dereference null OPJ_OFF_T"); + } + arg1 = (OPJ_OFF_T)*argp1; + + arg2 = *(void **)&_swig_go_1; + + result = opj_output_memory_stream_seek(SWIG_STD_MOVE(arg1),arg2); + *(OPJ_BOOL **)&_swig_go_result = new OPJ_BOOL(result); + return _swig_go_result; +} + + +OPJ_OFF_T *_wrap_opj_output_memory_stream_skip_codec_cffb419519a4d845(OPJ_OFF_T *_swig_go_0, void *_swig_go_1) { + OPJ_OFF_T arg1 ; + void *arg2 = (void *) 0 ; + OPJ_OFF_T *argp1 ; + OPJ_OFF_T result; + OPJ_OFF_T *_swig_go_result; + + + argp1 = (OPJ_OFF_T *)_swig_go_0; + if (argp1 == NULL) { + _swig_gopanic("Attempt to dereference null OPJ_OFF_T"); + } + arg1 = (OPJ_OFF_T)*argp1; + + arg2 = *(void **)&_swig_go_1; + + result = opj_output_memory_stream_skip(SWIG_STD_MOVE(arg1),arg2); + *(OPJ_OFF_T **)&_swig_go_result = new OPJ_OFF_T(result); + return _swig_go_result; +} + + +OPJ_SIZE_T *_wrap_opj_output_memory_stream_write_codec_cffb419519a4d845(void *_swig_go_0, OPJ_SIZE_T *_swig_go_1, void *_swig_go_2) { + void *arg1 = (void *) 0 ; + OPJ_SIZE_T arg2 ; + void *arg3 = (void *) 0 ; + OPJ_SIZE_T *argp2 ; + OPJ_SIZE_T result; + OPJ_SIZE_T *_swig_go_result; + + arg1 = *(void **)&_swig_go_0; + + argp2 = (OPJ_SIZE_T *)_swig_go_1; + if (argp2 == NULL) { + _swig_gopanic("Attempt to dereference null OPJ_SIZE_T"); + } + arg2 = (OPJ_SIZE_T)*argp2; + + arg3 = *(void **)&_swig_go_2; + + result = opj_output_memory_stream_write(arg1,SWIG_STD_MOVE(arg2),arg3); + *(OPJ_SIZE_T **)&_swig_go_result = new OPJ_SIZE_T(result); + return _swig_go_result; +} + + +char *_wrap_J2K_Decode_codec_cffb419519a4d845(char *_swig_go_0, long long _swig_go_1, intgo _swig_go_2, intgo _swig_go_3, long long *_swig_go_4) { + unsigned char *arg1 = (unsigned char *) 0 ; + size_t arg2 ; + int arg3 ; + int arg4 ; + size_t *arg5 = (size_t *) 0 ; + unsigned char *result = 0 ; + char *_swig_go_result; + + arg1 = *(unsigned char **)&_swig_go_0; + arg2 = (size_t)_swig_go_1; + arg3 = (int)_swig_go_2; + arg4 = (int)_swig_go_3; + arg5 = *(size_t **)&_swig_go_4; + + result = (unsigned char *)J2K_Decode(arg1,SWIG_STD_MOVE(arg2),arg3,arg4,arg5); + *(unsigned char **)&_swig_go_result = (unsigned char *)result; + return _swig_go_result; +} + + +char *_wrap_JPEG_Decode_codec_cffb419519a4d845(char *_swig_go_0, long long _swig_go_1, intgo _swig_go_2, intgo _swig_go_3, intgo _swig_go_4, intgo _swig_go_5, intgo _swig_go_6, intgo _swig_go_7, long long *_swig_go_8) { + unsigned char *arg1 = (unsigned char *) 0 ; + size_t arg2 ; + int arg3 ; + int arg4 ; + int arg5 ; + int arg6 ; + int arg7 ; + int arg8 ; + size_t *arg9 = (size_t *) 0 ; + unsigned char *result = 0 ; + char *_swig_go_result; + + arg1 = *(unsigned char **)&_swig_go_0; + arg2 = (size_t)_swig_go_1; + arg3 = (int)_swig_go_2; + arg4 = (int)_swig_go_3; + arg5 = (int)_swig_go_4; + arg6 = (int)_swig_go_5; + arg7 = (int)_swig_go_6; + arg8 = (int)_swig_go_7; + arg9 = *(size_t **)&_swig_go_8; + + result = (unsigned char *)JPEG_Decode(arg1,SWIG_STD_MOVE(arg2),arg3,arg4,arg5,arg6,arg7,arg8,arg9); + *(unsigned char **)&_swig_go_result = (unsigned char *)result; + return _swig_go_result; +} + + +char *_wrap_JPEGLS_Decode_codec_cffb419519a4d845(char *_swig_go_0, long long _swig_go_1, intgo _swig_go_2, intgo _swig_go_3, intgo _swig_go_4, intgo _swig_go_5, intgo _swig_go_6, long long *_swig_go_7) { + unsigned char *arg1 = (unsigned char *) 0 ; + size_t arg2 ; + int arg3 ; + int arg4 ; + int arg5 ; + int arg6 ; + int arg7 ; + size_t *arg8 = (size_t *) 0 ; + unsigned char *result = 0 ; + char *_swig_go_result; + + arg1 = *(unsigned char **)&_swig_go_0; + arg2 = (size_t)_swig_go_1; + arg3 = (int)_swig_go_2; + arg4 = (int)_swig_go_3; + arg5 = (int)_swig_go_4; + arg6 = (int)_swig_go_5; + arg7 = (int)_swig_go_6; + arg8 = *(size_t **)&_swig_go_7; + + result = (unsigned char *)JPEGLS_Decode(arg1,SWIG_STD_MOVE(arg2),arg3,arg4,arg5,arg6,arg7,arg8); + *(unsigned char **)&_swig_go_result = (unsigned char *)result; + return _swig_go_result; +} + + +char *_wrap_J2K_Encode_codec_cffb419519a4d845(char *_swig_go_0, intgo _swig_go_1, intgo _swig_go_2, intgo _swig_go_3, intgo _swig_go_4, intgo _swig_go_5, long long *_swig_go_6) { + unsigned char *arg1 = (unsigned char *) 0 ; + int arg2 ; + int arg3 ; + int arg4 ; + int arg5 ; + int arg6 ; + size_t *arg7 = (size_t *) 0 ; + unsigned char *result = 0 ; + char *_swig_go_result; + + arg1 = *(unsigned char **)&_swig_go_0; + arg2 = (int)_swig_go_1; + arg3 = (int)_swig_go_2; + arg4 = (int)_swig_go_3; + arg5 = (int)_swig_go_4; + arg6 = (int)_swig_go_5; + arg7 = *(size_t **)&_swig_go_6; + + result = (unsigned char *)J2K_Encode(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + *(unsigned char **)&_swig_go_result = (unsigned char *)result; + return _swig_go_result; +} + + +#ifdef __cplusplus +} +#endif + diff --git a/pkg/codec/decoder.go b/pkg/codec/decoder.go new file mode 100644 index 00000000..3dae38ea --- /dev/null +++ b/pkg/codec/decoder.go @@ -0,0 +1,189 @@ +// Copyright (c) 2023 Segmed Inc +package codec + +/* +#include +*/ +import "C" +import ( + "bufio" + "bytes" + "encoding/binary" + "errors" + "fmt" + "image" + "image/color" + "strings" + "unsafe" + + "github.com/suyashkumar/dicom/pkg/dicomio" + "github.com/suyashkumar/dicom/pkg/frame" +) + +// GetNativePixelData reads a JPEG-compressed DICOM image, decompresses the JPEG data (i. e. conversion to a +// native DICOM transfer syntax) and returns the converted image +func GetNativePixelData(e frame.EncapsulatedFrame) ([]byte, error) { + var ( + dataOut *byte + outLen int64 + comp = TransferSyntaxUIDToCompressionMethod[e.TransferSyntax] + ) + var ( + dataIn = (*byte)(&e.Data[0]) + length = int64(len(e.Data)) + bitsAllocated = e.BitsAllocated + ) + switch comp { + case JPEG2000Compression: + dataOut = J2K_Decode(dataIn, length, e.Cols, e.Rows, &outLen) + case JPEGLSCompression: + dataOut = JPEGLS_Decode(dataIn, length, bitsAllocated, e.Cols, e.Rows, e.SamplesPerPixel, e.PlanarConfiguration, &outLen) + case JPEGCompression: + ybr := 0 + if strings.HasPrefix(e.PhotometricInterpretation, "YBR_") { + ybr = 1 + } + dataOut = JPEG_Decode(dataIn, length, bitsAllocated, e.Cols, e.Rows, e.SamplesPerPixel, e.PlanarConfiguration, ybr, &outLen) + default: + return nil, errors.New("unsupported transfer syntax") + } + if outLen == 0 { + return nil, errors.New("failed to decode DICOM") + } + defer C.free(unsafe.Pointer(dataOut)) + return makeSliceFromByte(dataOut, uint32(outLen)), nil +} + +// GetStdImage returns the converted image in Go standard format +func GetStdImage(e frame.EncapsulatedFrame) (image.Image, error) { + var ( + upLeft = image.Point{0, 0} + lowRight = image.Point{e.Cols, e.Rows} + img8 = image.NewRGBA(image.Rectangle{upLeft, lowRight}) + img16 = image.NewRGBA64(image.Rectangle{upLeft, lowRight}) + cols = e.Cols + a = 0xffff + pixelValues = make([]int, e.SamplesPerPixel) + ) + decodedBytes, err := GetNativePixelData(e) + if err != nil { + return nil, fmt.Errorf("decode pixeldata: %w", err) + } + buf := bytes.NewBuffer(decodedBytes) + r := dicomio.NewReader(bufio.NewReader(buf), binary.LittleEndian, int64(buf.Len())) + oneByte := e.BitsAllocated == 8 + for i := 0; i < e.Cols*e.Rows; i++ { + var clr color.Color + err := readPixelValues(e, *r, pixelValues) + if err != nil { + return nil, fmt.Errorf("read pixel values: %w", err) + } + switch e.SamplesPerPixel { + case 1: + r := pixelValues[0] + if oneByte { + clr = color.Gray{Y: uint8(r)} + } else { + clr = color.Gray16{Y: uint16(r)} + } + case 3: + r, g, b := pixelValues[0], pixelValues[1], pixelValues[2] + if oneByte { + clr = color.RGBA{uint8(r), uint8(g), uint8(b), uint8(a)} + } else { + clr = color.RGBA64{uint16(r), uint16(g), uint16(b), uint16(a)} + } + case 4: + r, g, b, a := pixelValues[0], pixelValues[1], pixelValues[2], pixelValues[3] + if oneByte { + clr = color.RGBA{uint8(r), uint8(g), uint8(b), uint8(a)} + } else { + clr = color.RGBA64{uint16(r), uint16(g), uint16(b), uint16(a)} + } + } + if oneByte { + img8.Set(i%cols, i/cols, clr) + } else { + img16.Set(i%cols, i/cols, clr) + } + } + if oneByte { + return img8, nil + } + return img16, nil +} + +func readPixelValues(e frame.EncapsulatedFrame, r dicomio.Reader, pixelValues []int) error { + for sample := 0; sample < e.SamplesPerPixel; sample++ { + if r.IsLimitExhausted() { + break + } + switch e.BitsAllocated { + case 8: + v, err := r.ReadUInt8() + if err != nil { + return fmt.Errorf("read uint8 failed: %w", err) + } + pixelValues[sample] = int(v) + case 16: + v, err := r.ReadUInt16() + if err != nil { + return fmt.Errorf("read uint16 failed: %w", err) + } + pixelValues[sample] = int(v) + case 32: + v, err := r.ReadUInt32() + if err != nil { + return fmt.Errorf("read uint32 failed: %w", err) + } + pixelValues[sample] = int(v) + default: + return fmt.Errorf("bitsAllocated not supported: %d", e.BitsAllocated) + } + } + return nil +} + +// Decode reads a JPEG image from EncapsulatedFrame and returns it as an NativeFrame. +func Decode(e frame.EncapsulatedFrame) (frame.NativeFrame, error) { + var nativeData = make([][]int, e.Cols*e.Rows) + decodedBytes, err := GetNativePixelData(e) + if err != nil { + return frame.NativeFrame{}, fmt.Errorf("decode pixeldata: %w", err) + } + buf := bytes.NewBuffer(decodedBytes) + r := dicomio.NewReader(bufio.NewReader(buf), binary.LittleEndian, int64(buf.Len())) + var ( + pixelValues = make([]int, e.SamplesPerPixel) + ) + for i := 0; i < e.Cols*e.Rows; i++ { + err := readPixelValues(e, *r, pixelValues) + if err != nil { + return frame.NativeFrame{}, fmt.Errorf("read pixel values: %w", err) + } + switch e.SamplesPerPixel { + case 1: + r := pixelValues[0] + nativeData[i] = []int{int(r)} + case 3: + r, g, b := pixelValues[0], pixelValues[1], pixelValues[2] + nativeData[i] = []int{int(r), int(g), int(b)} + case 4: + r, g, b, a := pixelValues[0], pixelValues[1], pixelValues[2], pixelValues[3] + nativeData[i] = []int{int(r), int(g), int(b), int(a)} + } + } + nf := frame.NativeFrame{ + BitsPerSample: e.BitsAllocated, + Cols: e.Cols, + Rows: e.Rows, + Data: nativeData, + } + return nf, nil +} + +func init() { + for transferSyntax := range TransferSyntaxUIDToCompressionMethod { + frame.RegisterFormat(transferSyntax, Decode) + } +} diff --git a/pkg/codec/decoder_test.go b/pkg/codec/decoder_test.go new file mode 100644 index 00000000..51604a86 --- /dev/null +++ b/pkg/codec/decoder_test.go @@ -0,0 +1,143 @@ +// Copyright (c) 2023 Segmed Inc. +package codec + +import ( + "bufio" + "bytes" + "image/jpeg" + "os" + "strings" + "testing" + + "github.com/suyashkumar/dicom/pkg/frame" +) + +type testify struct { + in string + out string + transferSyntax string + w, h, prec, numcomps int +} + +func TestMonoDecompresing(t *testing.T) { + for _, tc := range []testify{ + { + in: "testdata/a1_mono.j2c", + out: "testdata/a1_mono.ppm", + w: 303, + h: 179, + prec: 8, + numcomps: 1, + transferSyntax: "1.2.840.10008.1.2.4.90", // JPEG2000 Image Compression + }, + { + in: "testdata/3_jpeg.dcm.1.raw", + out: "testdata/3.dcm.0.raw", + w: 176, + h: 176, + prec: 16, + numcomps: 1, + transferSyntax: "1.2.840.10008.1.2.4.50", // JPEGProcess1TransferSyntax + }, + { + in: "testdata/1_jpls.dcm.3.raw", + out: "testdata/1.dcm.1.raw", + w: 64, + h: 64, + prec: 8, + numcomps: 1, + transferSyntax: "1.2.840.10008.1.2.4.80", // JPEG-LS Lossless + }, + } { + t.Run("decompress_"+tc.in, func(t *testing.T) { + assertJPEGDecompressing(t, tc) + }) + } +} + +func readPPMPixelData(t testing.TB, fn string) []byte { + file, err := os.Open(fn) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + if file.Close() != nil { + t.Fatal(err) + } + }) + scanner := bufio.NewScanner(file) + var ( + expectedData []byte + i int + ) + for scanner.Scan() { + if strings.HasPrefix(scanner.Text(), "#") { + continue + } + i++ + if i < 4 { + continue + } + expectedData = scanner.Bytes() + break + } + return expectedData +} + +func assertJPEGDecompressing(t *testing.T, tc testify) { + input, err := os.ReadFile(tc.in) + if err != nil { + t.Fatal(err) + } + fr := frame.EncapsulatedFrame{ + Data: input, + Rows: tc.h, + Cols: tc.w, + BitsAllocated: tc.prec, + SamplesPerPixel: tc.numcomps, + TransferSyntax: tc.transferSyntax, + } + uncompressedBytes, err := GetNativePixelData(fr) + if err != nil { + t.Fatal(err) + } + if len(uncompressedBytes) == 0 { + t.Fatal("failed to decode image") + } + + img, err := GetStdImage(fr) + if err != nil { + t.Fatal(err) + } + + // convert to jpeg using go std lib + buf := new(bytes.Buffer) + err = jpeg.Encode(buf, img, nil) + if err != nil { + t.Fatal(err) + } + var expectedData []byte + if strings.HasSuffix(tc.out, ".ppm") { + expectedData = readPPMPixelData(t, tc.out) + } + if strings.HasSuffix(tc.out, ".raw") { + expectedData, err = os.ReadFile(tc.out) + if err != nil { + t.Fatal(err) + } + } + + n := 10 + if !bytes.Equal(expectedData[:n], uncompressedBytes[:n]) { + for i := 0; i < n; i++ { + t.Logf("read byte %d in binary, expected %08b, got %08b", i, expectedData[i], uncompressedBytes[i]) + } + t.Errorf("read the first %d bytes of %s: expected %v got %v", n, tc.out, expectedData[:n], uncompressedBytes[:n]) + } + if len(uncompressedBytes) != len(expectedData) { + t.Fatalf("read %s: expected length=%d, got %d", tc.out, len(expectedData), len(uncompressedBytes)) + } + if !bytes.Equal(expectedData, uncompressedBytes) { + t.Fatalf("read %s: expected %v got %v", tc.out, expectedData, uncompressedBytes) + } +} diff --git a/pkg/codec/export.h b/pkg/codec/export.h new file mode 100644 index 00000000..c8a20813 --- /dev/null +++ b/pkg/codec/export.h @@ -0,0 +1,6 @@ +#include + +unsigned char * J2K_Decode(unsigned char * dataIn, size_t length, int width, int height, size_t * lenOut); +unsigned char * JPEG_Decode(unsigned char * dataIn, size_t length, int bitsAllocated, int width, int height, int samplesPerPixel, int planarConfiguration, int ybr, size_t * lenOut); +unsigned char * JPEGLS_Decode(unsigned char * dataIn, size_t length, int bitsAllocated, int width, int height, int samplesPerPixel, int planarConfiguration, size_t * lenOut); +unsigned char * J2K_Encode(unsigned char * dataIn, int bitsAllocated, int width, int height, int samplesPerPixel, int planarConfiguration, size_t * lenOut); diff --git a/pkg/codec/lib.go b/pkg/codec/lib.go new file mode 100644 index 00000000..7d99714b --- /dev/null +++ b/pkg/codec/lib.go @@ -0,0 +1,8 @@ +// Package codec provides JPEG/J2K/JPEG-LS encoder and decoder +// Copyright (c) 2023 Segmed Inc. +package codec + +// #cgo pkg-config: libopenjp2 charls +// #cgo darwin pkg-config: dcmtk +// #cgo linux LDFLAGS: -ldcmjpeg +import "C" diff --git a/pkg/codec/testdata/1.dcm.1.raw b/pkg/codec/testdata/1.dcm.1.raw new file mode 100644 index 00000000..21d755ea Binary files /dev/null and b/pkg/codec/testdata/1.dcm.1.raw differ diff --git a/pkg/codec/testdata/1_jpls.dcm.3.raw b/pkg/codec/testdata/1_jpls.dcm.3.raw new file mode 100644 index 00000000..61621373 Binary files /dev/null and b/pkg/codec/testdata/1_jpls.dcm.3.raw differ diff --git a/pkg/codec/testdata/3.dcm.0.raw b/pkg/codec/testdata/3.dcm.0.raw new file mode 100644 index 00000000..a4456952 Binary files /dev/null and b/pkg/codec/testdata/3.dcm.0.raw differ diff --git a/pkg/codec/testdata/3_jpeg.dcm.1.raw b/pkg/codec/testdata/3_jpeg.dcm.1.raw new file mode 100644 index 00000000..b2ab6f98 Binary files /dev/null and b/pkg/codec/testdata/3_jpeg.dcm.1.raw differ diff --git a/pkg/codec/testdata/a1_mono.j2c b/pkg/codec/testdata/a1_mono.j2c new file mode 100644 index 00000000..01cba5d9 Binary files /dev/null and b/pkg/codec/testdata/a1_mono.j2c differ diff --git a/pkg/codec/testdata/a1_mono.ppm b/pkg/codec/testdata/a1_mono.ppm new file mode 100644 index 00000000..6010cea0 --- /dev/null +++ b/pkg/codec/testdata/a1_mono.ppm @@ -0,0 +1,5 @@ +P5 +# Copyright (c) 2000-2003 Pegasus Digital Imaging +303 179 +255 +¹ºµ³®¨£¤¢¨£¦¨¨¨ª°«®©§«¨¨ªª¨²¬¯³±¶±²¶¶¸º´¹¯µ³¶Æ¿Á¼³À¾¶²¾¼¶½º¯µ±´µ²¼¶¸½¶¶¶µµ·¼¼ÈËÉÑØÔÖÖÔÔÖ×ÖÙÓ×ÓÓÕÑÖÓÑÒÑÒÑÑÓÓÎÍÏÍËÒÌÓÎÍÏÍÐÍÐÐÑÐÍÍÌÎÐÐÉÐÏÍÎÌÎÐÍÎÎÎÍÉÊÏÎÌËËÐÎÐÐÏÑÐÑÏÎÑÍÑÓÌÏËÌÉÊÌÉÈÊËÌÌÌËÌÍÉËÉÈÎÊÌÍËÇÈÈÉÇÊÍÆÇÇÉÈÇÇÆÅÌÅÉÉÂÈÅÆÇÆÄÄÄÇÇÆÈÅÇÆÄÇÆÅÅÄÃÄÇÅÇÃÆÆÄÉÅÇÅÆÅÅÂÅÄÃÃÂÃÉÆûÂÂÂÅÅÃÇÅÃÆÂÅÇÇÄÅÆÃÃľ¼¼¾¾¾À½À¿¾½¿¼½ººº´º¹·¸¼¸·«««££©¤ ¤£¨¬©§­¨©¬¨§¤¦§¦¬¨­®«©ª¬©®«©­®®­²³¬­¬­²®¯´®²®¬±°®¯©°³´³±´¯´°±±°´´¹¹¿ÑÕÒÖØ×Ø×ÖÓÔÔ×ÕÓÔØ×ÕÓØÕÔ×ÖÔÑÏÐÍÈÐÎÏÎÍÎÎÍÌÏÍÍÐÍÑÑÎÓÒÑÓÐÑÐÐÐÐÑÍÊËÏÍÏÍÍÐÊÑÑÏÏÐÌÐÏÍËÎÐÏÎÏÑÏÎÎÏÎÎÊÍËÌÏÊÎÎËÍÈÏËÌËÍÍÎÍÌÌËÍÏÎÍÌËËÎËÊÈÇÍÌËÉËÈÅÁ¾À¿¿ÃÀÀÀÂÄÄ¿ÃÀ½¾½¿ÂÀÀ¾ÁÀ¿¿½¿¾½¹»»½»»´¾³¸»½À³µ¶¶¾¸¾¼¾¿ÀÃÀ½¿½Á¼¼¹¹µ¶µ¶¶¹µ¸¸·¸¸º²²µ²µ³²²·­³º³µ§¯§¡¡¡¢£¢ ¢¤¡£¦©¨©¢¨¤¤¦££¨¢¨ª§¨©¨¥¬©¨«ª®­«­«ª¥¨«­­®®¬°¯®¯¯±¯°±±±­¯®²°°³²±¯®²­ºÉÐÒÔÔÕÕÑÔÑÒÓÔÒÔÔÔÒÖÖÕØÑÕÖÔ×ÒÓÒÏÏÍÏÑ×ÎÎÍËÇÌÏÏÐÔÑÔÒÓÔÒÓÓÒÐÐÔÓÎÒÍÐÐÎÑÊÐËÏÎÊÍÍÏÑÎÎÍÑÎÍÐËÍÐÎÍÍÌËÌÌÊÊÌÌÐÍÎÎËÏÌÎÐÓÏÐÐÊÎËÌÊÉÉÉÇÊÈÅÇÀÀ¿ºÁ¼À¼¸¸µ²¹µ¸´¶¸µ¹¸º··¶¹¸»»¹¼»·¸º¸¸¹º¸µ·³º¸¶´²µ²·¯¹²³³³´¹¸³µµ¹·¸µ¹µµ¹¶¶º·³¶·¹¸»º¼º´¹·¯¯±°­³¯°±³®²´³«§©§¤¡§¡¢£Ÿ¡¡£¤¨£¡¢£¢¥¥¤§§¥«£§¦¤¤¥©ª¤¦¦ª¦§ª¨¨¦¥§«ª¯«¯®­®©ª®ª¯¬°®¬®¬®­¯°°¯°¯­±´·¿ÂÁÅÉÎÉÄÂÃÊÊËÅËÒÌÎÖÑÎÍÇÏÑÒÔÐÒÈÈÈÊÓÔÍÐÌÅÇÅÇÊÆÌÓÍÑÕÒÕÓÔÎÏÓÎÒÎÒÍÑÏÏÐÎÐÉÎÌÊÉÌÏÌÊÊËËÌÉÌÇÈÌËËÇÇËÈÈÅËËÌÍÈËÍÎËÎÎÐØËÉÄ¿ÅÁþ¿½½»¾ºº¹ºº¸º¶·º¹ºµ»±¶¸µ´·¶³¸¶·´¸¸¶¹¼·º¸¸´¶»µ··¸¸²¶µ´µ²²³³°²°²±³³´²´²°µ¶¶µ³´´·¸¸µ¸¹´¹·µ»¸¸¹º¸·³¯¬°¯­²²¯³°´±³º¶³´®­°«¯ª¬¨§§¦«ªª«ªª©ª®¬®¯­°­­°­«¨¦¨¥¥¤§££¥§ §¥¢¢¤§ª§§©¦¬¥¨¨¨¦¦ª­¬¬«©°¬­²®®«°±«±­±°³´¼½¸¾¹¼¸¹½ÃÇÈÄÅÊÉÉÆÇÉÌÍÊÌÊÇÆÆÉÌÇÇÇÈÇÆÂÅƾÈÂÆÎËÍÎÍÍÎÊÏÊËËÎÌÌÉÌËÊÊÊÊÈÊÈÇÉÊÅÅÃÇÇÆÁÉÅËÊÌÉÊÎÌÑÎÊÐÏÌÎÍËÍÏÍÎÌÌÆ»¾¶»ººº¸»º»¼µ»»¹¿½º½¸»¹»¸º¹º¹·º¶´µ´¶·´¶µ°µµµ¶°°³³¶µ³´³³²²²³´¯±´²°³«±²®³²µ´³ºµ¹¸¸½¶¸¸µ¹±·¸´¸´¸¶µ·¶¶²°®®®¯¯±³¯°´°®°³¹º»´´³³´³³±¯±³±«´³´·´³¸¶´¶µ´²´¶´´³®©¨ª«¯¯«¯­ª©§¥¨¦©¢©£¦§¥©¦¨¬¨§«¨­§©©©«¬¬­©ª®¬¯­®¬®±±°²²¯²µ´¸±°ºÁ½¹±º¿µ¾ÁÆÅÅÆÃÇÅÂÇÆÄÃÂÄÁÃĽÆÁÃÆÃÅÁÅÅËÇÇÌÍÊÊËÈÈÈÊÈÈÉÇÊÉÈÉÇÈÈÈËÈÉÅÅÆÆÃÅÉËÌÉÊÍÌÏÎÑÏÒÏËÈÀÃÇÅƾÁ¾¿¿»¼½¼ºº¼½»»¹»¸½º»¹½¹¶ºµ´µ·¹´³²±´±±´³³®²³®´³´³´¬¯´²²¯²²°µ¯¯²­¯¯±°´¶¶±´·µ¹µ¹¶¶¹¶º´·µ³´³®µ´³³´´µµ³±²­²¯ª®­¯¯­±°­°±±¬»¶½»¸¶µµµ¶µ³¸´³µ´´²·²·¶·¹¶¼¸¶¶¹±·º³¶³´µ³·³·¸µ·´´´³¯±°²¯­«¬ªª«¦¨ª§ª¬©©©¦©¨««ª°®®¯ªª¨««««¬«±²±²°³°²¬°²·´±µ´¶»¹¸¾º·¹ÂÇÆÈÊËÊÈÈÉÇÆÃÈÅÁ½¿ÄÂÊÇÉÊÌÉÈÊÈÈÉÊÊÉÌÊÊÇÇÃÂÆÅÊÈÅÇÄÄÅÃÅÆÅÇÅÆÅÄÆÂÈËÉÆÃÂÀ¿ÀÁ¾¼½¿À¿¾º½·»»¸¹»¹µµ¶´¸´±¶²²±®²´´³¶³±³¯²³§³¶·¶¸·²··±¯´®±µ®³¨­´«°°°³®²³°··¸·¸¸¸¸¶¶¶´´´´´±µ³²²³©±´°±±®¯µ¯°°®¯³°¬­­¯¬®¬¬¯­°ª´¶·º¹··µ±¶³³³®²´°´µ±µ¶ºµµ¹·»·¸¸µ¸¶´·¶µ¸·¹º¼¹·¸·¸·¸º±¹»¹¶¸·¹µ³²²´¯°°¤§©¥§£§©©¬­°®¬²°¬«©¨¬§­®­¬®±®°¯¯®±±®²°³´±´¸´´·ºÆÃÉÇÇÇÄÍËÉÎÉÉÅÆÃÇÁÅÆÃÈÇÄÄ¿ÂŹÃÆÅÅÂÈÅÃÅÄÄÆÅÃÁ¿¿ÀÀÁÂÁÄ»ºÃÁ½½¾Ã½Åÿ¿ÂÀ»¼¼·º»»½·»¹¹¸¯¹¶¶¶·¶´´´°²¬°±³³³²²°±­°°¯²®®·¶¸´­´²°´±¯°¯¯®¯±¬°±±²±µ²¸·¶º·¸¸´²·¶·µ¹´³­¯²±®¯¯°®®¬¯¯°­®°±¯®­®®¬²®ª©¨¬ª¬­««ª­¬³±²²¸·¼³­®«­§¦¬®²²´±±²µ¶·¶¹¸¹·¸¸¶¸¸¯¸¸ººº½¸·»·¸»¹¼¾·º¼»¹º¼¹¸ºµ·¹¸º·µ²µ±°¬¨«¬®°¯´¶¶¸¸¶·²¯±®±²±±«©­®¬­««­ª²¯°­®³²²´±¼¼ÂÇÊÊÌËÍÌÈÌÃÈÄÄÉÈËÉËÈÆļ½½¾Á¶¶¿À¿ÃÁÿ¾ÆÂÂÁÀþ¿Á¼¾¿À¼¸·¾½¼ÀÁÀÀ¾¼¼À¼¸»¸µµ¹·¸¹²¸µº¶¸¹´¹³´µ±²±±³²°µ¯³´®±®­­¯¯°±¨´´¯²°­²¬°®¯°²²°³°²´µµ¸¶·¶¸·µ¶³´µµ¶³¶³³°²°¬«­®­¬¬ª«¬«­­¯®­¯°¬¬©¬ª«°¯¬¬ª«¯­¯¨°®¬®¯­°²³´°­ ˜œœŸ ¢®««©©©¤«©¯³±µ··®¹¶·´··¹·¸¹·¶¸»·¹¼¶¹¹ºººº»¸¼»ºº¼»½¼¹º»»¹¸¸·»¹¶¶¹·¸¹¸³¹¸»¿¹»º¹½·¶¶³¬°§«©¦¨§¬¬¬©¬«®²¬°¯±²ÁÅÄÆÆÅËÉÇÇÒÑÎÎÏÎÊÉÈÁ¿¼¼Âº¿À½ÀÁÄÂÅý¿½ÁÁ¾ÃÀÂÀ¶º½¼¶ºº¼ºº»²½´µº¹··¸¸µ¶»µ¹¶¹¸´¸·¶·¸³²±²´²³³®¶±³¸µ´¬­­«²¯¬­­¯°±±±°­²±¯±´´µ¸·¸·²³°´µ¸´¶¶²´²·¶¶³³´­µ°®°­­ª®¬¬¯©¬«­¬ª§¬«¬¯§«­ª¬®¯­­©¬ª«¬¨ª©±«««««¬³µ«ª¤ž™”›•›œœ¤£¥¡¥¢¤¤£¤§¬°´·¯µ²´·¸²¶»¶··¸·¹¶²¸´¸¶¸º¸´º¹¹»º»³»¶°¸¹¹º¶»¸º½º¼¹¹¸º¸¼½½»¿¾¿¾º½º¼¼½½¹·´³¯ª««¬¯­­ªª«¯«­®«­¶µ±µ°¶½½»ÄÏÏÒ×ØÖÒÑÑÍËËÆÊÊÆÇÂÁ½ÂÂÅļ¿¾¾¹½º³·»ºµ¶´¶²³µ°µ²±³µ°³·¸¶·µ¶µµ´±´¹µ¶¶¶´±´´²°­®«°°³´²±±¯®«®®«®®ª­³°²°±¸³¶¸¶µ·µµ¶µ±²®µ²µ´³·°²²³µ®°°±°¯±±®¯°­°ª©®¬ª­­«¬¬«ª¬¯ª©®ª«ª¯ª¬¨¨«©¬¨«©­¨©§©¥ª©¯«¨£œ™™ž˜•ššœ¤¢ ¥£¡¤¥¦¤§ª¬©®¬©±«´«°¹­²µ³¯³²¯²¹²¶¶´··¶²¶µ´¹µ¹¹°·¼»¸º¸¸»¸¼º¸·¸º·À¼¼¼¼À»¾½¾»»¿¼½¾¼»½¼¸¹·³³³²®°««©§¬®°¯®²­«¬°±­­¶³»ÃÊÏÌÔÔÒÎÐÏÏÌÎÍÅžÄĺ½½¸¹ºº·µ¹´²¹¬µ³·µ¯°²´³³­²°¯°³°®¯²²¯²²°¬²¨¯¯±³°³´°µ±²­®ªª®­¯¬¯­«¦ª¨§®©ª´¯¦­²±´´¯³´±·°µ´´¶¯µ´´¶³µ¸¶±²±°±³±°±±±®±±°°³±®ªª©­¬¬ª­¬«¬©ª­©©«¨¬©¥¯¯©±¬«±«¯¯°¯­«© Ÿ¨§­ª§¡›™™š–™—˜¤¥¥°¥Ÿ¥¡£¢¤¦¨¨­ª¦¦§©©¨ª«ªª§ª®¨¦§«¨ªªª¬­¬¨«ª±µ³¼¹¸º­´·¸¶¾¼¶¸»¸»¸¸¹¼·»¾»¼º½·¼º»¾¾¿¹¿»¿º¾½À¾½¹µ·¶¶³°°§­®¬«ª®¦¢ §š›ššŸ¡¬µ´ÆÉÀÀǹ¾º½¹´º¹·®°¯­±±´²²±°³²±³´²¯²®´±²±«­®¯°®¬«ª­®¬¯«¬ª«¬«°°¬¯¯«²¬¯®¨­¦¬ª«­§©¥¥£¥§¨ª¢ª¯§¥¥§¦¯®¥©ª¯­­®®±®³«­²«´µ´·³°²®±®²²®±°­±¯°³¯¯¯¬¬¨®©¬«©ª©««©¬©¬©¯°®³±°±µ®µ±µ³±¹±²³®ˆ¢¢¢¥§¥Ÿ—šš—›––™£ ¥ŸžŸ¢ž¢ŸŸ§¥££¢¡¢£¡¡¢ž¡¦¤Ÿ¡¡  ¡œžž¢ Ÿ£¢¥®¬¯¦–—©±·µ£œ¥¶¯·³»¸¹º»¼½º¸¿º½»¸¹µ²¯¹¹¼¹º¼½¿½¼º¸¹¼¹¶¸¯³´­®©¦—’’”•ˆ”’–Ÿ¦«²ªž¡«¨ª§¢ª¨¨ª­¬®©«ª­®®¬¯®²°«­­°®®¬­¯¯¬°¬¯ªª°«®«¬¬®¬¬°¥§¨ £®®¤ª§§¦¦¬¨¢¬¦©¨¥¨¨¨¬¨§ª±§¤¦¨­§¡¤¤§¤§©¥¦¦£¤ž £¢¦¢¡¡¦¨­®°¯®¬¨¤¨«®¬°±°²°¯·³±±±®°¯¯°¯¯±´±°´µ±²¶´¶³¶·´¶´´²´·³¶´³´´³£¡¤£§£¢£Ÿ  ¡¢ ¡ ¦¦¢£¥¥¦¢Ÿ¥£Ÿ¡ £¡Ÿ¤ž¡žœ¢šš ››£–š˜œž–œš›Ÿ“–ž›š…‰“¢¥¢Š†–™›¨²´¶¸¹´¹¶¸¹¸»³®³«¦¦¦ª®±®¶¶½¸¶¸²³¯®±¯µ³³´¤§œ˜–”‘Ž‹‘—•—›¡˜™—™™˜’™šœ™§¦¨£™¡ª«©¬¦¨«©¦«¬©§¦œš¬¯©§©¤¥¦¦ª¨©©ª­©£ ‚®¥ Ÿ§§£¤©§Ÿ£¨£¥¦¦¨§§¤¥¤¨ ž «ª¤£¦«§¡¢¨¤¥¡¢¢ž¢¥£ž œžŸ¢¤¡¦£ž¢ £¡¬¬¬³­²°´¹³¸º´···¸¶´µ·¸¹·¼··¹²¹¶¸¶¶¶¹¸¶¸¸¶··¹»¶¸–¥¥¡¡Ÿ¥¤¡¢¢¤¡ ŸŸ£¢¥Ÿ¢¨§¦©¢žŸ Ÿ›ŸœŸœ¡£ ž£žœ™‘“›ž—˜œ••••”‹‰“—“Œˆ‹Ž–‚†ˆž£¢¥¯©¦¥¬²®«¯§¦¤¡¡¤¥£ž£¤¥¨­­¨¥¤¡§£¤Ÿ¢¢£™ž‘“’’Ž‘‘““Ž““’•’™•–———”šœ§™™—££¡¡–˜Ÿ¡™«¦¢š™›–§©¨¤¢œ˜¡›œ¡¡¢«¢§©›¥“{ª¨¡§¡Ÿ£ž£¦Ÿ£§  ¤¤¦Ÿ› Ÿ ™š¤£ ¢£  žŸŸŸœŸ¥ŸœœššŸŸœ¢™œž™›žž  ¥ ¡¢¥§¯²¹³¶·µ¸··¶·µ¶¸µ¹·¶ºµµ¹³·»µ¹¶·¹····¸¸¹µ £Ÿœ”¢–™—Ž‡Ž™¤¢š¤¡¦¤¢œŸž›™œ ›Ÿ¡œŸ ž˜”‹Ž˜›˜˜™’“‹Š‹‰‹ŽŒ€ƒŠš‰{€…‰˜œ™”‹ˆ‰Šš’”™™š•‘››”šž›œš–œ¤›™œ—”‘Ž“”’“‹ŽŒ‘‘’’‹‘ŽŽ‘ˆ’’““”œœ–“‘–—“’’”–š•’’œ§¢ ’‹Ž’‹‹““™¦¡¦‰ˆ¤œ £¤Ÿ ¤¢¥«§¨§§ Ÿž™›¡ œš›Ÿ¦««¬¢ ««©ª¥ Ÿ››Ÿžžœ››œ™˜œ›Ÿœ”™•™š—ž›¤¡ž£¡£©¤¨­«²®³°²°³¯±³¬´±°³±¸¼½¾¾½±´²³²¯®²°¶¶˜”‰y}€{rvtwy|„™ œ˜™›Ÿš•‘Š›—–›š™“››š™š›ž˜“Œ„‰‡”˜™˜‰‹‰Ž‰‡Œ‰†Š„{‚‡”…x‚zƒƒˆ›™ˆ{}wu{{yz‚†ƒ„ƒŠŠ•˜‘™Ž‘’“ŽŒŽŠŠŒ‡‹Ž‹‰‹ŒŒ’‡Ž‘ŒŒ‰ŠŽŒŒ‹‹‘‘–Œ”“‘“‰ˆˆ‹‡‰Œˆ‰’˜’}…„……„„Œ‘œŸ™…‡–—šœŸ›Ÿ£¬©ª¡£¤Ÿ¡£ž¤¦¬ª¢¢¤©®ª©¡™ž£©¯­¬¢™œ¢œœ›™œššš™•–™˜›™’Ÿœœ›ŸœžžŸ  ¢¡£¢¥¦«¦­§ ¡¤¦­²À¿ÆÉÊȶ³±²«°°®°¬³}€‡‰€fok`ZZdltrv˜“—Ž‰|xsxs”•™’‹Ž–š™™œ™œœ›•‹…†‡™š›„‰†…Œ„…„~†€†zw{„{z{}~~‚Ž†€uvwzuzy|{x{z€~‹‹’‘ŒŠ‹Š†ŠŠ…†‰‡Š‰ˆŒŒ‰‹ŠŽ‹Š‡‡ŠŠ‰‰ŠŠŒŽ‰ˆŽŽ‘Ž“…‚~yƒ{‚‚‡Šp|…ˆ‡†z|{€}ˆ’wz„Š‰—’‰Ž’–ž› žŸ«¦¦ª¡ž› ›ž¦ŸŸ–œœ£ £¡¡¤Ÿ£¢£¢£¦¥£¤¥¥¢¢ŸŸšžž ŸŸ¡š˜˜šžœšœ–ž™ž–’–—¢Ÿ£¢“‘•™¢­®¯µ±´¸²¯°²¯¬²©¦«¥uyƒ–‡ggibZbfs{w{ˆ…–Œ…€z{y{y€™—“ˆŽ‹’——œ—˜š•›”‹Ž‰’•›˜Ž‰Œ‹ŒŠˆ‚ƒƒ‡ƒ‰„„ˆ†‡Š‡Š‰ˆ‰Œ‹‡„€„Šƒ€~‚‚€€‚‚†”ŽŽŒ‡ˆ‰‹‹‡‹Œ‰‹ŒŠ‹ŒŒŒŠ‰Œ’“ŒŽ‹ˆŠŠŒŠŒ‹‘‹’’‰ŽŽ‹‰yw{y}{x|{„xvvz„‡v}w~u}wh{vy{Œ’Šƒ„ŠŒˆŠ‹™ž›žŸ›Ž…‹†‰‹Œ‘˜›¡ ¢¦¦§ªª­¬«­®¯¯¯©«¬¬­­­£¥¢”ž«©© š™ˆ™˜››››››–ŠŒ—Ÿ•˜”‹‰š£©¬­¬®«²µ­±ª§¬¥©¥¡rsƒž‡faaf\`mr…““–“™™–”•’“•––™›šš–“—™™™—›˜–œ’–•“—••—˜™–——•—–˜—˜“”š–•—˜—š–——š––“˜”—˜“—Ž“‘ŽŠ‹Œ‰‘Š‹ŽŽŽ‹‹ŠŠŒŽ‰ŽŽ‘ŽŒ‘Œ‘‘“’‘‘Ž‘Ž‘Œ‹“Ž‹’’’“Ž”‘‰Œ‰„ˆ‡ƒ~ƒƒ~‚||vww„ˆ„zvwyymbqvuty{‚„}y{‚‡ƒƒ’–“Ž’{}|~„‚”£¤§¬¯©«¬±¤¢§¥­­­ª–™©¬¥ª©”Œ€Š¢¦©’Š{‚ŠˆŒ––’ŽŠ€x‡…Œ™Ž’‹…ˆŒ“–¤§¨£¨¦«°¦¨¤¤¥¦££ nmœ~aacl]blu†•–“™›š›˜›™˜™˜˜˜—––™˜™ž——š—šš—šš™™———š˜˜–—›—™˜—œ˜™›˜›—šš˜—˜™—––™”›™™šš™œœ˜”•˜‹ŠŠŽŽ‘ŒŽŽŠ‹Œ‰‹‹Ž…‹Ž‹’“‘“ŒŒŽ’”Ž’•”’•’”‘’“‘““•’•Ž‘”‘••Œ““‘—“”–’”Ž‰Ž‡†ŽŠŽ€~ru}}‚{|}z{€uzu‚†~‚zƒ‰‰…ƒˆ‰€}{‚€|…‰—”Ÿ§®¢¨ª˜—žŸ¡Œ|‡››’zw}…‰—™‰y~€€}|€Œ‹x{tx|„†ˆ‚…ŽŠˆˆ‰› ž£¡£ Ÿ£ž¤ž¢ mj‚Ÿ}gd`lZgkxŠ“”–”™™—š“”š˜”›˜–—”—˜™—–™—“––—˜›•—˜˜˜”œ”—š•••—˜–™——˜”‘••›™—™–˜™———•˜—•š›•š–˜•’”ˆ€ˆ’Ž“’“™—•—–———˜”—–”’•˜–˜–š™˜–š˜’™–˜–™˜˜™•š——“•—–”•˜˜“”–”–’”—’’“•“–”•“”•Ž””“•““‹•‘’“”‰†””•Ž‘Š‘Œ“’’’’•‘‘†ˆŠŠŠ’’š©¢¤žŸš—˜œ˜•{„˜˜›‹vyuwz|~~{|zx}|~€‰|xtqorx|~ƒƒ†‚††}Š“œŸœ››Ÿ››› ›Ÿ ›mg}™u^_W[Zbpt‰—’“‘š’“™’•˜–š–•”—“’˜“–˜—••—•–”“––˜—™–˜–˜–———Ž–––’—˜“•–•——–—”™•™–”—•–•˜——˜–—˜—–•Ž“‘˜Œ–œ¡Ÿœ¢¥¢¥¤¨§¦¦¤¨¦§©¦§©§©¬¥¥§§¨¦§¨©¨ª¦¤©¥¥¤¡Ÿ¥¥¡§££¤¤££¢¥£¦¥ž¦¡¢£Ÿ¢Ÿ £¢Ÿ¡ž¡¢¡£œ ™Ÿ¡ž£žŸ ŸŸœ¢¡Ÿ¢˜Ÿž¡œŸ¢žŸŸŸŸ¡ž¡ š ž¡Ÿžž—››ž¢«³°­¯¡ Ÿ¢²©©ª¯©§­§·¬±£––ŠŒˆˆ…†„|ƒ|zwxyxuuzrsrrsrrru{ƒ}x||ƒŒ–—˜œ™˜’›šœŸš›œœ›IJU‹mSZQW^[]`cogoxxƒ•’“—––”•’’’‘•“˜–—•”–’“–“˜•“”—”˜•˜—••—””‘•—™––“”™•˜–—––››™š”˜™œš–˜™•˜š•œ˜™˜–—››œœ›¡£¥©¥£¥¥ ¤¥§¥§¥£©¤§£¦©¦¬¢¨ª¨¨ª§¨ªª§¨©¬¦§¦§«©­¨«¬©­®«««««ª¨ª««­©­ª¨¬°«¬ªª«®¬±®­«¨®«¬¬©«ª®®¬­°«±³¯±¯®±­±´­®°­°±®²®®°°­®®®­ª¦¦§¥ •‰‹Ž¢°©®µ¶¼¾¸½¤–œ’—œ³¶°±±¬ £œ–”Žƒwtnkjilpoxxyvq{yˆˆ€ˆ…——”••”˜¤¤¥£¥¥¤Ÿ>E>7462=;79799=692:L]NDJUjppqsvr|~„~xyvsrpxywwuy|wu}rwzpy}zltrtvt|„€ƒ{st„}€}x‹Ž–’–˜”š™šš–›œ ¢¡Ÿ¢ŸŸ¢œŸœ—›”š›ž• œ¦—˜”•šœž››™˜š–––”–™—š••—”–”—–™š™š•——“Ž—šš™”—Ž‰‰“––„Š‚szw„tz|wƒ€€v‰‡‰pslifgnpsvsx~~xx€…{vˆ‰zztx{~ƒ{ƒ„~yytsm‡w{€„Ž~{‚ŽŠ‹‰ŒŠ‡ƒƒ……‡‹†ˆ‰Œ‰Š‹‡‡~„ˆ„‡{‹}‚|ƒ†€ƒyx}€wrw|x€9682D<;?8?CG@<=BG@C@AENcndYVYluousmouuyvtuutmpttrzyyvty{uwyquxtrttlvylw{tƒ}uywƒuuw}€ƒ{‚‰‡Ž’–šš—˜ Ÿž   ¢ ¡ žŸŸž›ž›¡ –¥Ÿ¥™††”Ÿ›žš••¢› ŸŸž Ÿœ™¤Ÿ Ÿœž›››Ÿ–”„ƒŠŽŽ’”…{xrt€…†ƒwvxqyynvwvwyzr}xuyklhnfenlworqy~uyy~su}‚‡vxut~ƒyuustqhpƒxvxx€‡Œ…‰‘ŽŽ’’™”Žƒ†Ž”’Ž„„Œ‹ƒŠƒˆ’†‡‹‡†Œ†€ˆ€‚ƒ†‹‚‹‹‡‚ƒ„ƒvwy}~700//..,2105-3032421136?PPTLT[hjimggiokntopnrpqijpnnqonqpppqvronwutwvunqvqw{€wy|}}sxzzyytprss{‚ƒ˜”š›˜š—ŸžšŸžž¡œœ¡ Ÿž£žœswu‚Œ‹Œ„{‚– ŸŸ››Ÿž›‘–Ÿ¡Ÿ ›”“–›™ˆ†w}yxr}‚qonnksyuqnmnqqpojiqnmqvsvvhlmhiligfhpnollwnkwos}|…€zp{|ƒ}oopmhdpvoswyƒˆ‘‰ŒŠˆ–ŽŽ“•ˆŠ—˜‘†€‰‘‚‰‡„Š‹‘Ž„Š†‡ƒ…~{~{‚ˆ‚††ˆ††‚|ƒ€|‚~00+--(1,/0,../.-0.-+-118DERKTW^hnechfmhipggppsmffkkmhajgelkqvkpmmvkppmnenopvx}sqxy{w|{{xonjimnt}ŠŒ‚†‹’Œ“”—¡™˜ ™–˜–›˜šžœœspinruwpy€kt„š’‰‰†‹‘‡‚…‹‘“Žƒ~„‰‚‚…tsjdsolmkmnqrggjejdskiicicngppotegnbghghdhqqidnpmororsttpx„rwsx|voqqjjborotuz~€†€~yƒ…‰Žƒ‚†“–’“•‹ŒŠ‡‹‹ˆ„‰‡‚}€„{†„ƒŠ~v}€‚z}†‚‚„ƒ1'-*'-)+-(,/..)1+0-.4-138@A:KFFXe`bdekkdimrr^^e__a\_Y`b][__]eceecjhemoiienk_ecepolvmsukqusgfeenkqkmoptqomhjdefikhecebabjp‚v{}cjfxpjl_dbd_`fb_^fafeg{}}{ƒ|vv…uptnmy~‚y}{…†ŽŽ“••”–Ž–˜–žž›œœ˜›–™—š—˜˜•–””“““••”Ž‘’Žˆ†xnfefeedlwnnibeglkdkqknqohklgedbjrw||ƒ‰ˆƒ††€u„Œˆ‘‹‰}{t€‹w~z}€ˆ…~vptoy}zƒz}€~y}†|wzz}NXkef<29,2-+-,+3.22.55DR\^b^eb]aadgffonooeb`b_\]_\[a\[^^bccam_`i]doeaegmcbfeoroolrrtw|ƒ„ƒ‰ŽŽ’Œ“Ž’“‹†ƒ{‚{}sqqhkglovmqqimgywchfacfac`]`^]aacqtxz€„‹|„‡ƒ{~ƒ‡ŒŒ““‘“•”••–š™˜œšž££¤¢  —™›˜—˜š—“––•“•›“””’–“”—“—“”Ž†{pjggllmihloldfechjkplgg`decpzv~€„…‡„|ƒ€~…ˆˆ‹Œ…|uzw|}ƒŠ}{€~ƒƒ{xppuuu|y‚ƒ€ƒ|y~z|~z4Cm^Z=66130/.)5=47667>Xrkeh`cn`^eihgjjprnkgjmfhd^^\`d[X\ad[^j`\gegigdfkge\edilcggoux…‰ˆ‰Š’”˜—‘—”–•‘’‘‘Ž‰‡ˆ‚†‚ƒƒ~y}uxtuwszvxz{||{{ywyz{€w€x€ŒŒ‰Šˆ‡†„€‡‘˜–™˜—––š•šš˜›ž••Ÿ›Ÿ¤§¤¨ ¦¥žŸž˜œ›œœ•Ÿœ˜™š™’˜˜’”“”•˜˜–”‹„wkfgkfjkpnmnj`fcdifeca_cfgu|w}†}ƒzyz|„Š‹Š†‚ƒ††pimo}|ƒ€wzwptt{y~€{{qzƒ„}ƒ|€|z}vw{|;MhU`[F46/4:,/5160<2=AewtjR[bicZ`jfijhpsrhihlinif`Y^]XZ[`\]gk]`a`ihhachf_^ablicabkx~†‡‹Šˆ‹Ž‰Š‘‘“”ŽŽ‘”•’“‘ŒŒ‹Ž‰Š‰Š‰‰ŒŽŽ‹‘Œ‘‡Ž‘‹‰ƒ†zˆŠŒƒ‡‚€„€“š—œ˜œ›š–š™›œœœ›œœœŸž›¢žŸŸœžžžœœ¢¡›Ÿ›žŸ›Ÿž™›”šœŸž—˜‘Œ{woffgemkdjicbfafceg_d^f_mqlx{†w|vsyy}„€ŽŠ‰Œ‚{‹xios‡|‡„wytnrppuu~€{yzy|~w|z|{|{HC]c_gQ330/7'.,+/'8./6NUiV?S__`\cdjhebjm_\__afgej`][X[[\aXZde_\\[b`cd_ghhcjghejhnx}…ƒ†ˆˆ‰ˆ‡‰Ž‹’‹Œ‹Œˆ‘Š’’’”’Œ“–‘“‘‘‘‘ŽŽŒ“‰’‘—”œ“–„ƒ‹”‘†‰…ˆ{€‚ˆ‹…ˆ…y…€}‚€‡‘™˜š›™––˜–™–‘˜’šœ–œ–˜™——™œ ŸŸœ œž›Ÿš›¡ Ÿ¡ Ÿ¥¡¢¡™¤¦¢¦Ÿ›‰~zuqcabjfcdagigfic`g]d^^amlkmsrsqo~€v€…€‚ƒ‡…Šuƒ|t‚‚‡ƒ„†{q‚u}yprt}r€{lxs{x|vtwwy}{z{y6.Kj^iP7?1;>13/:;1=24:JSs]KSYaa]c]cde]`aY^Y\^[cega^\Z^[_`_[b^^]]`cjlovtw~wzz}†„„‡‹ŒŒ‘‘“’”’“‘Ž‘Ž’’‹‘ŒŽ“‘‘—‘’’’Š““–—Ž–yx{‹†yy~€†…ˆ€‡}z}{‚Š–”–‘—“™›’—”’œ™—–“•˜˜—–˜–•  œšŸžŸš™ž™¢¡¡¡¤¦§¨©ª«£©ª¤¡•ƒ||njbb_`a_emiggb`g^rl_afjdkrqkjmv|uw{uqxy~€stuuƒ‰}‚uk|pw|srr||{xhvwx}~xvpu~x}zx>8Pl]dUC3-0-.)25//1155RUaf[XX\dX]_ZiaXZ^Z[XZ[X``eiofmkjgknuurvtvvz~{|‚„~„†ƒ‹‡‰‰‹‰‹“‘“”“”˜Ž“’”—”“–••˜‘•’Ž”ŒŽŽ‚ˆ‰ƒp{Š|€{‚…qrnxx{~z|}Œˆ|‡†{|€|~~Š‹•–”””’‘““˜œ™š——œšœ˜œ˜—–—••–™™˜šžž›™ ¤¤¢¥ª¬­°¬­¡£ž¢¤¦©©©¢š“}yrfsvehnvlbb`bacylhaehgioretniyxx{|yv{rwwttyˆ‰‰xrwlengtwylqpuz{{|†|}€‚tswurztyDGXZb^XD/2+,*,0/*+-*15ITN[`LXY^\W^`e`Weggbhdfcehfpsrvywvsort|‚‡„‚…‡„‡ƒ…†ŠŒˆŽ‰ˆŠ‡‹‹ŠŽŒˆŽ“—”–’•’““““”“–“““––—””“““”ŠŒŽŒ‘…‰Ž†‚|…zx€ˆŠ‡elkqwxzwu|}‡„†Œ‡†‚|~~‡”•––••””“•‘“”Ž–’——š–•—•”““”™™œ–›œš•–—› ž¥Ÿ ¦ž¦©¢Ÿ—š¢¡¡ª¬­ªš’ƒ}yzz€}wsrmebaa]bplfcggojjcnjjmuwnuxox~ywv|xzyˆpv€qejmkftpquotxpr|wtq{|yvilrrs/617FFEG65@;848;86:/6<020KMe]>Smsuuwwu{~€‚ƒ‡‹Š€‡…‡†|k\Xetiebcf}~…ƒ„ƒŒ…‹‰‹ŠŠŠ’ŽŒ‹‰”Ž’’Ž‘‹‹Œ‹’Ž’’‘”‘”’—””•’’”“’˜Ž‹‹ŠŠŽ‹Žƒx„Œ€ppssrphwqjkpƒ}}z{|su‰’’–“–••“’––•—’“‘–”Ž–’•‘—™™—œ¢››š™•Œ†‚‡{}x}~oqnhjhlkitˆ™‚†v‰…‡|nkkoql^f_Zb[etkjhdjpjhbad[agdbjdccgtttnvwt{€|y|xz€‚qwviwtyrlvmqowoootuorrw-+.-><61-3/?8CdtwgN]~z~‚†…†„…‚†‡†…‡„‡ƒzo_bW_j^cXcpgnuw‡ˆŠ‰ˆŽŽ‹‘ŽŒ‹‡‹ˆŠ‹‰‰‚…ˆƒ‚…ˆ‡Œ‡ˆŠ†‰Œ‹ŠŽŠ‹ŽŽ’Œ‘’’“‘’•Ž‘‘Ž”}xŒƒ†ksptutsvzkeq{vxvsun€…‘‹ŒŽ’™”““‘””‘™–ššŒ˜‘“–˜—š˜˜•˜‘ŒŠƒ{{vtwomksfjeaeecklw“tv}|w†z€|yzuonfgg`cajjeaegmljg_fkb_gcfecbhqnimkjpxqzwt|rqokost~~pmilumipklilkjojqlccl)+0=A>9,00*9A=@50/435@;;@8?@Hit‹S]ysg\bgoz{……‚†ƒ€„†mc]_PW^N[_XX[`^glfjahu{ƒˆˆ†ŠŠ‰‰ŒŠ‡‹…‰Šˆˆˆ‰Šƒˆ‰†Œˆˆ‡„‰ŠŒ‹‹ŒŒŽŽŽŽŒŽ”ŒŒ’Œ”…€‚srqmtlqpcdggfnlnupxvw„…Š˜”‘“”—’ˆŠ~}|xz‘‘’‡qx‰ƒmgoika^dde`]dhlzƒ‹ŽŒŽ‘Ž‘Ž‘“’Ž‹‹Š‘Ž•“‘•‘•”“•‰vvkfdbb`j`hicnivsxxuxtq}{~xhjf`_fd_beakqfm{y~|stb^gcdcffgdb_hioq+HWPL/)++--8<76:8:@=?AixlFVklgV\W_ot‚€ƒ‚‚†ƒ€ƒ}~rjeTgURWVTQXbd`_jcgjnp‰„ˆˆ†‰…†‡‡ˆ†…ƒ†‚„‰†ˆŒ†Šˆ†…‰Š‰‰‰ˆ‹ˆ‡ŽŠ‹ˆ†Œ‹ŒˆŒ‰ŽŒ„€olrrwnqtoqe\hdcigffinmptutq‚Ž“’’Ž‹{svqmmkpzŒ‚wyosjbaabda^_ccgrx€‰ŒŽŽ”Ž“”‡ŒŽŽŒ‘Œ‹Œ‰’Ž“Ž•‡}wofa\^b^e`fflkjlnpljjqtzx‡wrld^a``caaalemrovx}obckg`dcdg`dbjinA^eW>2+-0*1799767<><=AmrpXCU`ik]ZX[fkx…„„†‚†„‚~„„€€€wjk[TSRcVQPT\X`lmhdqmp}€†‚}‡‚…„†„…‚‡…††‡…ŠŒŽŽ‹‰Š‹Š‹†Œ‡„ƒ‡ˆ†ƒŒŠŠ‡Œ‹‘…ykhiekktysu~yvrkad`_]^gchiiegxŒ’˜|vskkhhibgcy‹‚wtz€xuyuttwvy{~}~‰‹ŠŽ‘Š‰ŽŒ‘ŒŽŽ““‘’’‹“‘ŒŽ”‹…yrj]c[]aca_bdcc_ce_chjo|ƒ~xiba`\fnwotxzvnwwt}yvpej`]a`hecaccgoHZdX84.8--145-63591;:=apjhQKW^_]`dkufjw‚…„„„|zzy€yzz~odk\ZSOXRROSYY`adXeihlopvqnpu|„††‡‰ˆˆ‡ˆˆŒ‹‹Ž‹‹‡ˆˆ‰†‹‹‹‹Œ‹ŒˆŽ’’Š’ˆoffieejkrvz|„ƒ‰Š…‚vsonedb[]`bbr‡‰‰hefY__[_bbjvw€‚„ŒŒŒ‹‘„Œ‹“ŽŽŒ‹ŒŒŒ‡‹ŽŽŠ’—’ŽŠ•““–”“’‘‘‘”•”ˆ‚{unkk`a`_Z^_Z^^_b_^acfvstvupja_gouxyt{}~{trutz{wk_`aceggebhhea?TYKC+.)$.(&,(,6--0*4.QkpiHJmnppijqpwqt|ƒzu{uyrnulmmtqc[WVTORNMNUYVZ_[\dgchhclg^lol}‚ƒ‚…„ƒ…ƒ‚‡…ˆ‹‰ŠŠ‰ˆŽŒˆ‹‹ƒ„Œ‰Œ……Ž‰Œ‹’“’‹’~dg_ddaflmxo}ƒ‚‚qfcfirsy}{yhefvƒ„€lbc_Zinu{€ƒŠ‰…†‹‰ˆ‡Œ‰‹‘–‘”Œ‹Œˆ‰‡Œ‹‰Œ‹Ž‰Œ‹‹’”•“˜™š–™“”–”—•““‘‘‘ŠŒztmh`\_[\\[[^`U`[fhdlhmjgefpuu|}|rqpstpwxxtrbkungdha_caif<\igI+4./++18677<76<<;VooiKUstrqfhkeljkrrsroqztjmriqrolXXPNOLQRY_ZVcaac^_dhaggcb_jjnz†ˆ‚‡ƒ‡…‡ˆŠŠƒ…€„††Š…‹ŠˆŽ‘‘‹‹‰ŽŒŠŠ„„u_``\``cjnpu~ŽŒ’oeed[cfhm}‰ˆ†ƒŠ„~xsuuv|…‡‹‹Ž‰ˆ‹’‹ŠŽ‹‘Œ‹‰ŠŒŒ”‹Œ“‹ŠŽ‹‡‹‹‰‹Ž””˜–––””‘•’—–––˜–™—•”•••Š…‚tqid^\S_Y[]\\`d`bbheag]kekopztruouy‚„„†ƒqjllrrpugb^Zcg9Xg^E/3)++,79@@<<4:b‚kvcM[VY`Y]cWa[Ydfbhalpukoo`dfbhdgcOKIHKDNQMZVR]\d`fdjowoglbiw††…‰…ƒ‡ƒ†††ˆˆŠƒ}xwz‚ƒƒƒ…‹‰ƒƒŠ‚„zƒ~}~}|ndf_alkc]b`er…{de]\Y^\^_]`bbcw‹ŽŒˆŠ‰Ž…’ŠŽ’‹‘“‰‰ˆƒ‡‡‰ŒŒ‹Šˆ…‰‡††‰ŒŽŒ’ŒŒ‘‹ŒŠ““•“—–—”•“•–”’‘˜™š˜žš ›£¢Ÿ ¡¢¤ ¤§¡¦¥¡›žšœ¢žœ‰‹{qica^\ZZ`ngciftuirturosz~{miy~ƒ…†{~}hbHeiWJ:,47164:979<=>;@:]uaoXNWTX``_`[]UW]Zd_deattioidcaa\XbQMKJHEXRLXPNV[]\Zdjllikkdr|„‡„€ƒ~‚}z€u€xrumjmnu‡ƒ‚€vlnhpqvomqpidcefjjni\bfcpogf^bkfmjc`ajhgq’”Ž‰Š’‘“—’Ž‘’†~{„††ŽˆŠŠŒŒ‡Šˆ‰’’ŽŽ‘ˆ’‘‘•””–™š›™š™žœš§¦¢§¤¨¦¦©¦¦¦§¨¨£§¦¤£¦£ŸŸ¢ ¢¡Ÿ—œ•–‹ytkh`__fomeccipkolqrrvz‚wzmox}stw}„…?QSH@;+0.1245565:9<8@>VjadUJZRWYacb_\STYXg[Xadmiinigfm`\ZTTMOKGPTXNSOMNSYRVckmldhqw|†‚ƒ†ypkiupluwtnfjojgnaivz€ƒwtzge`agcf^b``e`bdifijffdotƒƒspleglcdjkedhjirˆ“–—‘Ž“““—•‘•Œ{†’‹ˆŒ’’”’•“–“˜“•”•–•šœœŸž§£¦£¢¦¡¢¦§ª©¨¨«£­©£§ ¤¤£§¤¢ £¡¡¤¡¢ §¥¢  ¤Ÿ›™•Žˆƒrjgmrrebd`qhagkpornwyt}pqnijouw‚ŒF_^JC59457;9101.174:CEmyoyPO`Z[adhcdbVQ[]g_Ub`e^ckcdmqmm\VVOUTQRZVQTWJLRRSYbdjmhkt||‚}v„q`Y[dZV]fudUb\TW`bcins}~jcab`Zb^ec]aZ\_]cdbfehfgloz{rjbjqphechjmcdejlyŠ‘“’’™’’–”‰’‹”’“‘Š’”’’’“”•—”‘‹Ž”˜•˜š–œ™–žš›œŸ¥Ÿ©«¨§ª§§¨§¨£§¤¢ ¡ £¦¤¡Ÿ¡œœžžœŸœŸ›š™™ œ¡ŸŸ ›ž¤¢Ÿ¡ —”Š‚xjfdflnnqhmwkahklrhqqnvjnndhns{„vDn]WA);14353,0.310:B?OtuojFGTNVYW_^_d[R\[b`]\]c[jf`baddjn`WPLWKU\UQTZSMT_\\bnnxssz|v{w~yaW^UUROR\\QZ[QW[_acekx~f`]hle^_eed_YWZYYZ[cY\_e\bhag\[^ikjmadlggidcrn‹’‘•‘˜’™‘—“”“””“’“–”š™–•’„ŽŽ‰‹ˆ–– Ÿ¡¥§¤¦£¡¡ ¢£¦¦¨¡¦¤¢¥Ÿ¤£Ÿžœšžœšœ˜™—˜Ÿ–œ—’””•–˜œš˜˜•——›ž˜œš˜šœ™œŸ—‘ˆ}ia`_gdmoc^hqkiglcbhnmdnkchbopnx€†:\LF>--1.+4031.2436EDHqxkgIDLLOKNZV]cTXX\dbp][`Z`ka`cd[bujgcYQYZ]ZLRWVLcrpj\jprsotpy€}}vj^RSQVLTUXGXWYbeojwst}zjW_eecaca`c^[[RTX\\^`WZZY^_\a^XY]e\ei_eh_eaZmw‚ŽŒŒ‘“‘Ž‘•“”’””“—•–™™š™ žš™‹x{wvz‘ž¤¦¥¥§­ žž §¢£¥žœ› ™›œ™œ™™˜˜™””“–™š””’•”Ž“•–’’Ž”˜–—•–™••—–™—’“Š}fa]^\`fmc^]kniemaedcjgqohfagmj}Œ9bUM?,4-9723302;:3<8,1+975965<=jmrrEBDCFNNJIPSNMRUWfgan_Ygakd`grknumwphpkurckkjjgjn}„‡yxofddilkknfbSTdVJHNTZgjYWT\u„zhZLY\ox{ƒ€|so|€}~}yrngVVPSXU^b[ZWP[]]`Zdd[e^\ddcookŒ‹Ž‘““ŒŠ‰Œ†ˆŠ’•š–—’‚ntx‰šœ›•”›–upsk{‚ˆ†ƒ‚†~…†‡‰‹’‘”™––”‘“”’‘‘ŠŽŽ’•’“”—•š—•––˜˜—–—”‹ˆ‡~j]`bcf_^[Y[a_b^Z]X]a_mroin`iru€~9[lmJ03,,,>:5>8765347>]qkqPEGCHLJDJJISOLWP[[Xm`NWJ_ePco`cnlhicff\ig\bdWX]ar{pxmsqa`]_beccaYOacMY9CF9JIIKCLGELJGFCDKumikbqz††ˆ†‚Œƒecf\WURU]XZVVVM[Zc\fc_e\[bc]`ahiv……‹ŒˆŽ‘ŽŽ‰‰‹…‹Ž‹ŒŽ“Ž‰‹t€vcnfq}•’„€‚nihkqrlsr|wstt{x‚‡“’”“”—‘Œ‘Œ•‘‹‹‘‘‘“˜”——˜˜™—•š——•”••““‡d`_cfvvihe_]c^Z_X]]ek|‚{yf]nvvqrA^raJ<.-+0.DA6;295;6:Ad{ppLXviibRMJKNUQLRQQWLYVKLLYgX\sikjjmmfc]^onab\UUTajpefadpd_V^ZhfbbUOdbWGDFQYXX[[[`TU_WWRSRh——†‡~~€ƒ…€†klf^YRQRUUQTSY_\`\`febhk]`dXbYafv€‚ˆˆˆˆŒŽŽŒŠƒw~‹‡Ž‹ŽŽ“ƒy†keiily‰ƒvspmfddegdbfijprqnuxs|€„’•’”ŽŽŽŒŒŽ‹Š‘”‘–““™—˜•˜–™™šš˜š–›œ™™–‘–mi^kqƒƒ{{sm`d\YZ^\[ekt{xsglx|vsrBjrdV;5-*+11@9.257:496UtmpFb£¢ªš•Œ|m]XRLJNLLSQRKHOM[edhhj`kioj[f_`lj^XRHTUdygad]`dZZ^ajfaZ\\[eZ=8CLSQOPELEEGPQKMWRe„‚€nvdN[wmtst„‡cYYUROTRZVVY\aZQS\_hfgi_]dgfclqzw‹‹‹Ž‹…shmpy|‚ƒz{…†Ž•˜“seecmir}urribcba\Z\Zaddlggjggnkqv‚‡‹Ž†‹‹‘‹‘’’Žˆ“”“˜“”•–—˜š™›™–˜›š™’–“”ˆˆw{‚~„}wqlea^][ZZXebgdgea|os~{u=Qu`KUH73+,01@7179:2+98[fYmKež”¢¤£ž¡¢ž¢ŸŸ™—™œŸ™œžš™ž Ÿ¢¢¡ £rNVL\OY`g‚Š“’ŽŒ†‚ƒwxh^RMPNT]_IELJGSXUOOJCAD@CLGaluvsynZ_e\VZ^]ba[\`aRPWZXLSJOKHODSRX__fqpx|yz|welojlwshwzrqjnkln`f[_adln‡zhj^c\]dfmmmw_Y]VUUUY]XNbUX[S\Ude`ecsy~~wvmlywzŠ‰Š‹sy€††…„Šzuƒ†––“’–‘—’„nnha[_dblievy„ƒ€{{rmpfeb^YXbctrhjadgfg8O^WU]`ZPM;4//1.C75;=@e|kySi ”£Ÿ ¢¤¥§£¤¡¡¡žŸšžŸ›žšš›šœŸ —˜~UOTSZV][Zv|x|Œ“ž¢œ  œž”“›–ˆ|uh_bYNOVMRWUXX^WUWTVR\Xm‡ŒŒ{^_^ddXVTP_\ZWX\QVTTVOQPNPOMSTWcfxƒ~‚†€{}wwc]gqtlmmuqkkecghimjbhpgjjfga]_]a]gegsY`d^^cdpjdeZXXY]]WabZ^]ijv…opoprruw‡Œ‰Šwqrn{uwyyx€zx„…Œ“‹’‘”}mjg`\^fkbcrqnv€•’‘‹sofdX_ljca`Z^_gi6KbU[kg`[KC7/-/-4>>-@BD@DELUJbd@CLMNJOQaa]mVXNGKKUUIIJIPWVSZYTZWV\Y[`\`[oŽ‰o[MR[[`g|ŠrRWQS_\Xajcuurrvywpp^`rmrgUJMRUfedkcge_`abZ`]`b]ec^_cjlgnz{ywqgs^cedjih]c^b^\c_e_bcbbbgdjlgdiilnipz„—ƒb[e]]djdbhnnvtp}tkrh\WX\W[bhsue__WYbcogfidejbz{j~tld`^Y\]d_^bggdlgjpwzDotefvc_jjnsqaKG:02,39do{Yd›Ÿžžš›˜Ÿœ•—‹“•••–“–—“””——’’yXUOAC@=@=DDNPZiGEHLOHNP[UQceebXDOUKEE7>FQOLRNRIKFIPLNHRO\suxv‚fPPP_YV^chXMGYMNWKUT\bg^agqw€m]cQ`lkv^QnYdgUcfhjkcXf\^j`U]d\a[abdenhpnh`V\UM[^ccc\[]\X[be[[^]]Z_[^b`___`agdcfciok]UdZTe\]bXdbbdftqhmhQ]\Y]X]hhlc]_UVYWY[\pmpjehffd\WXXWR\T\\YffbefcgdqrTqoPXgboutokg]\OPB9.87]nevXkš–‹„‚‡€zusrwwyxyˆŽ‘—™”˜—•tSTI?A=;BWnjnsrdNMIGECZJHLAHJLEBLOVZZJCOOSVibTMMKPQXYOZcl^^b]`\^\la\a\]^ahfabca[]pmg]STOWOMTTXZXYRQYT]\aaT]_a]Z]\\]WYXZU^b]^QP][[V[UTUUYWSLOOaivukrsqvdRbfZbfgfW\Ybc[_]cT\danmg[_VULJLHQLWUTNZ\ZXX[]`cZQaa^wwpaekfoqliY[^N>5Xu{r{…hYY[VZ\VWVYQU[XY]Xa]irz‚„„wlcZa][`[RW`W`mQ@DU\TNUSF>?BGSWRT[[ZVUVL[^MOd^Z^RHA<9:8<9FQHb}‚~…rRKID>CFJHIAFMMDHKJ`_GHCIKRP`YDJDIKOORNK_fc\[[\YWTjZVY]^^oqsm]]^[`gikaQRJUOHSVWWVSRPRT]ZRYRY_aZZX[Y]YX[YXY]YXNJX\aV[gTX][VRNMOTYcsjrrjs]PX]b\_e\YY`ZWZc_ceopoplcSUVYNMMUOOZJXYX^XYW]Y[[RRV\Okdilt}xvkbbhnoqO3\owopnVVMLNTSHFIKNUTVNGPPTY\b`otkjijb[]`c_bd^Ub]W_ic]d_cWTRPUTdgklkmkia`cTSVWUXZURMJAA<>JJRRm„ŒŠƒƒqTGBDBDF?FEFFLOICDGZT@F@GJH]\JKEDGJIJNMV\][UX]]\TT^RSQ[[adgh_\\[_]^adZSFIVHMMPTXTQJSXYYLNPRVU[\T]UX]X^\[U]ZWXOUL`WUai[\URMNZLRPNXghddgimbTZW[^c]hzWX`YYTTbmdgdUQMMSY^[\d`XXSSRYSWXTWVZ`V_\\Q`qqz{wwokswwnlcWANjpiegWUOMJKOEE@BIKRPEBHHNPPTSbgZ`b][ORTUYV]`TOZgc`\bcZcjipmjddmnc_\W_V]b\_YXglabWVPMCA@@GMNp€†xoWHGAB@???C>AGFIC@HRDAG?HIGZXJYMJLNKKGKCQX]XWZ[[MYZNVOQY^R\Z[WZ]^e^S^aaQHRKOPNSW[TFYYW\IOQMWV][NVORWQYX]WXVVXHTJTVT]^`ZLTLQXRXMTX[a]ZdiheXTTQX`acd]YYVPULYf_cTSKMUTc_difeckYQSRVXXVWXVYW\eg]o~wxogjqy}uria^e_Tix…twd[XTOWZIHA?EEDI>=CAFLLHMYPMQPKQLHIKGFPXd^]Y^_]ejkdg]aec]dicmgZcxmdhnoZ[Xb[]ZUWPQGC;FDEHJDCCDFDIMGFLIINLINNKJHNHLKMPRPKEIPU_aX\YU\ivxMRYTYQVXRYXY_SQXPMTMKIIMHNV\OZXVOGZR[WNPKQOMPQOQ[^aNVXWn`eLMRSVYXV``Zfbivx{zggl~}}wp‰›™|__a\dd\[_^\bcde`opeZYcUTUXYacgbYYVMUVaV\c\djpyr|{{{qkekj_RS`ROKJMMLOLMF@NP?EGLEJJLPhbjf]o‰‰Œ‹‘’‘’Ž‘•”’–Š‘‹‹”‹‡‹ŒŽŽ‰‹Š…ŠŠŠ‹ˆ‡‡„…‡ƒƒ|zwjmh]QOQMIJGNFak_fWXSSTMLGDB@CACGFEDDGGGKJLKLMHMMKLIQTRONJOV[eg\b_YTTf_MU\PMSZbhh`aY]UROLJLGIHDLYZ`cc_YVT\NVWMRJONJQJIRW[[JJSL`[YSOVSVVYSQRNWen}{vpgwtt|yqotŠ¡¡zx…vf`cf[^`[^^ed]ZbbaWS\S_hW_cWcN[PNZPegtqkzw€|yv}re`_WTQWNNNFDBDE>DCFMQKOVE?DFDB@ELT]_XUmŒ‡†‰‡ƒŒŒ‹ŽŽŽ”“•‘–’“—™”–˜™Ž‰ˆ’›“†‡ˆ”Š“˜’–’“––Ž•–—›™’”—’Œ‰Œ‡…€|€€ƒ‰‡‡~z€w{tmkc`[VUKGEFGDCEEFLHGHGQQQMKJTERWTY_emojhm[Rdi\[ZSOOYgfjs]UXIZk`acLTTOZa`aa[^dVQMOGKKFKINMMJOVWWYLWSUZNZZUSKORNHOKTQYjrgamty}zrlrz„~‡†€’ “qjh```c[]]Z_Z_^Xc`Y[ckx‚~zqfbbTTlX^bjylqpcbje][YQiyqc`_\WQGGERQIHBOONONQC@PGIGIMITKLMIa‡Š‡Ž‘Ž•˜‘’‘ŒŽƒ|nr…zspelto‹Œ““ŽŒŠ‡Š‹ˆ“Ž‘’Ž“’–”–š••™—•”–•‘ˆwk\UKEDDEDEHCF@DLVLPSYVGTN[RYahl]nrgbgjgZWKU_Z`edic\_pzsrw]Uc\\\]\[_`aQMNL@HGFJJQIIJQT\f^^]\gXV[cXQQX[UOPJTQTXcmopv|vnsw{ƒ~to~ž‘ŽŒzwhd^]f_hqsxwuhrpltoejnv}mjt^USXhdt\a`n\Y\RMglgnhTVmfYYROQXpUGNDGE=B?BB?EJN`VHHE@ACEMQZ[lhs{||‰‰‘’’‘’‘”’Ž“•–ˆŒo^dklimc`cd`kyŒ‡ŽŒŒ‘Ž””ŒŒ‹Œ…‰ˆ‹ŠŒ‹‹Ž’‹„‡‚‚’”‘‘ŽŠˆ‡~qj[MHD>RJCDDEKKJJUZQNM[XM]TP\j†ˆŠ‰zqic^Z^e_iohhjf\M`nijWUZWWWTUY]ZONLGIIIDEGNIIJMOS]ZZ[chg`WVLOS_`\[UPQNOTazxomfw€€}~mm{€‘štvnisn}~‹…ƒ‰|ooh\bfe\W_c\elZ[Zale{x~lqv[cXELTV_]`XUcj``a_VrhLGHBJJJMGLMQODJC@GCCAIHRSTWR]aklkxwŒ‰‹ŽŽŒŒ‘xaTP]ogliadcboqx~|y{~|†‰ŠŠ’ŽŒ‹Š’ˆ‰‡Œ‡ˆŒŽ‰‰uutdkm{ƒƒ‚…‡Œ‘‘Š†wg^POFCB@CEG@KTXOT\X\TZVPW^„‘™”tlb_]`bdb`_`_Z[O]l`ZTWTNJVQTVVRHMGEF>DJAEGHFHNSSXWQVahc[RPUSUUZ]TVUVSPRcoejs‚‹‰|ujor{zyy†—†|ytzoz}{~w}imlVWWXY\[`nkowma`_ccagplXsWJUPaIPkiil]`in\VXGPLERLMDHGD@EGKNMLCMQIPJFHBEFPRXYbefeiyŠš“’——”‘•ƒxp`fRI]gYgk^_ebeioslamiljdqt‰‹Š†Ž“‰–”•Ž‰Ž‹‹‡‹Œˆtiafhc`lkˆ›”“ˆŠ‰‰Ž‹‡„rk]WNJF>B:LQMSV\RXW[]P]pŽŸ£Ÿra\SVb[^\[ZSV\UY]b^SOOOQOMTUU[HNLEGBD@GDAIEENMMQKMSKNWZ[XQSQTRVPPYba`US[]fu}~ƒ{mwmv|vsgx”›“qz‰‚mebbrqww€ƒd[dZ\^c[bjlpo]SSUJKTYd`km]_W^MBRY[_SMV[[acTRPGPG@:ACDFKRni]XQNMKC@CBMWMRZW]dd^^bo†‘Ž—“˜˜•—›–n`Z^XP\aYS\cU^fdcglaUbe^eakruˆ‚Š‰pJWRq‰‰‡…Š‰‹{ldaeggfjl~Œ—Šƒ…Œ‹‹ŒŽŒŠ‰ŽŽ‰‚vqj_ZMDJGLMPYTTZU^]\a”£¢¬‡o^UVTVWRJVNOWONVO]\KQKQKLORNMSFIIFJ@EGAGFKFJMRVRNEPMQYWSdWOOUNQSMU_bfbTS]mr{zno|ƒ…zpojrv{‰}spr†wg_d`ghuw||bVZQZQUQZ\T^^[\XGRXYg`pqh[PPIPRW[hhYUacde`QSMEQDIHHPLQ\oz_RNGGIIFJTQNGBNPTab^cXgm……u……‡ƒ…‘”tTTUXVLXOMYaQW\`gcpdMZbZ]m“‘–™Žw~}xœ˜ŒŽŠ‹~h^^aed`]eejs‚…z‡ƒ€ˆ‰‹‹‘ŠŠ‹‹ŒŒƒƒ€tvtrghc^\[cZ_cS~•šªwi_[YWPMVZMPOFLIKSTSQMKNOKQQONNHFKPPHEEEHHNKIJRXY[IM[TVVN^QFNUVUTMNT\bZPT`hnmovy|ˆ„spz{xxmlnv}qspsnfiYSYabaZQR[ffmg_pmjkil`WSIPNRO[dYTRWNWXYYbdTNVWMQJJSENRPJFFIRIOQSLCKFL`THEGLGHKRXZ`]\VPaawj_rlmmw‚“ƒ`QWNGJSZLTY[OS[YfcfaLS_VMQYd_aZjquz}Š–˜™™——v`fcc^macl_noˆ‘‹”‹ŠŠŠˆ‘‘Œ‹‹‡“’Œƒ‹ŠŒ„†yhmi[``Whm‚’l`[XVNPHPUNPJLHQLNPJKLMHKEKMOULGKIO[PHJIMCJFCPJV^VUKVSSWKM]RMUYWVPTXMVSUYS_jg}…€yzrq„‡ˆ†ylhqz€xceuvc]VYTQUSWZ[ctsw|vtxrl_g^NUTMVW[tjjm`TMTOQNTU]_[\XQQNSROZWSDNKJNUSOSPTQUPJAKNRQVRPXcZfbb^@LP[IJPKURQ][TRZf|†‚€{u‡‘•ymp^cegeimiroz•“Ž‘”‹ŽŒŠŠ“‘“““ŽŽ•‹‡|ecVWWgxaZPLDJJILJGEHELHKGGKLLGHGHKGRPHNLJQWMJFNOFKCEHLMTXLJMNV[GU^faQVYVNKQXXSUQTRVZt‚rm~„†Šƒuoz~uxsownsxiljom]UOUUXY]cfhifafbabl`J^cO]Sdl]kXRWPW_^Y_[ldSWQQLKPNPZY\[\Yin{iLKEIEDKCHKOMJHBCHMUVGLQXkYWZRW[S[b]a[NUECDPTIYUROOMMWWdabXUHFHGILOQRX[c^hp„•’¦¤——}mud\iejadihhmp’˜™–“––˜•”ŒŽ‘ŒŒŒ‹Œ‘“””’‘ŒŠ’•”ŒŒzrgZ^RLLBFHHJFB@FHKJHNGJHLIGIJFLJKPKGIMMJIFCMJEFGDFMJSSMOQYPUGbZ]gZRVMUUPgsbXVNQRSbgm|~{}xpux{„lfo|zq`r{uqmXSMKPJNLYhxvovtxvsqaNGRQQP\ggeda[VW[ZWSSNWPRX]_ZYeec^glXTg_cahaO]QDNE;M@YdESHSW[VKOUUg]W]WRZUW^`XTHA;F;DC?>I]UVZaiaZadjc]`ggjnlnro€‘–‘›”•–š›“—™‘”ŒŽ‰””’‘‘“‹“Œ‘‘}xokZOLCMHA=?@EEHKEHFBKJFHFGEOJEKOJLLJDGBGL?CMNPLOQVWOKKQKFoj\Sba]RRVVR]qZRWY\Z`Ws†urr}ƒ|ohvwnwucho~rdnha``UGRKPUiwjmk`agcfm[\eX]bomong^VNPMPURVcpmmqkZ]b]^ZW]WXa^iir~]DI@BIHHQXc[RLALKJQQTWj_PVNNVUV\_[YKJCLMBKECAHDHOGLKWhXKMS<65031424065686IKCBNQRRVW^e\`a]jcckki…y„˜“—™›’’–•”—˜ž˜“›˜”‘“Œ‘ŒŽŠ‘‘‘‹’ŽŒŠƒ‚€uoaXLDC>>CBIJFCB@HJBDBFDJIJOIFJHGMBELFDENSUJXSRSWQIPFEpeWmyvfSUUUNVTU\X_]]]X„ˆwvˆ|†xkptwvodjy|pfv‚‚qkeTFGXP_\^ilqqz}{syu__^NRZVW[`h`W`dZdXWXafba^[ObYc`fjujknmmX]ODUTVWPMJMMOT[YTWSOIRT^SKVOTQOOVW\NIPCFFKOGEFECCFCLMNZBFKUF8?/64171546383DE>C7AOYITac\[[aeg]de^nnkƒ†’“””””“•–—›˜•œš“š˜›“””ŒŽŽŽ–‹…ŽŒ„yxoaYIFA??FGCB?FJGFDDHJHDIDEBGJIEBEIDBAOMLIPWYdi]TLGHskctw{v]VSIOVWRUSYVSTRgi~ˆŠŽ€qny|v{news}…ses‡vslfkdWIXT[ortt{mhola]aZQXhibbmnjpi[TTVNWVN[hmxtrhimgi^c]_Z[VemlZLMMDKA?CGSgidk]PHEFNEIMFOOQWFGSVVWKSI7BWYNDV`P`^O^\W^`[`al`VZ\[cg}Ž‹’‹‹‹ŠŠ‘ŽŒ’‹‘Ž–˜˜šœ–––™œœ•’†tjdqt‰wqaRKDIBA?B>CI=FGEIGIFBGGCGEHDGKCE?CFJDHPGUWVjja]ÅÊ£uke`mkfhXTTSQNK[]UW[]U_zwr€„ˆƒvmtpiokfhy€{flwkme`\Ubgkjgjmsmwujh^\\QJWZ[dckoxlmneeVUYWYYbjkpqojhqsplwtld`f[\_aaiOSSLFPIQUONNVPWT\^TW^]a_XS]aY_ebfpfin^URMIFHHDQ^;>HEUWSYVLOVD>ACA@AFA?CFB?C@CFEJC@FQMPGKHKPOSUPV{›£ƒe\bp„p^WQgcQ[XUa\WQ[`guƒŠyow†Š„|smtlvkfhuriqukkpgb\\X[j]fgGBJRME=?==HG>CD>BEKGMJ`^[bVPHOfgh‰zpsznrwtttfVQPSMIDOFGFPMcVKOU\Z\[v‰psqk[OIGB:B;>A=<POUVQVNFNGDFFNLKNFJLPSO[bVXLMGHMXgqraZY\\^gg]\WJKIKG?DGLEKSS^RBBQPUYXjypedbsr}‹‰yw}jbVNMPLGB\^IBT^cabbdcg_^`cheo|Ž——n[]XTVQHLMUV[aX[fbQUQeqy‹rk{‡€†‹srysxs`mvxv`ahfikkjmmspvfRPJGEBBFANWU[djpxyxwreejeWYfddjnzvjqvrwy‚ubmghc^a\wi\VKRVZNEFAW\GXVZ\Y…”‹‰’’Œ‡Œ‹ŠŠŠ…Œ‰‹’“”ˆˆˆ†B8?6402546<6CVM^aF|Š„€}xpkpedk`a]^\Xg\]\YZZWV\U^_PMIEGEIT^_[PMONUSXcTLHADFFADCG?IFQU?HBFPSL[cdY[YPacvƒum€y~shqlpmdnn[^_^SS[WWU]XZ\\]Yƒgim™·À¹ƒgaXYULKN\]QYXVT]cYZX\ins|ƒ‡‚vuwƒ‚zhdpsxulicu}€‚}wprkj`_PMTDKMU[WGPplmsqrlhgf\[^cegpppv}pijdbadfbfldjvuppqeSIEPXRRWPNJJIGGKVq•™™˜”’‘Š„Œ‘ŒŒ‡ƒ‰‚‡†ˆŠ‰‡†„‹ŽŠŠA5>.41,4/3.7;NKCSU‚––“–‹ƒ}{}€~{|xtyvx{ntxswlqhoiUUNPRKVY_ZWMQOWU^e`eLHGDD=CCB?E@OPSP@C:BDABJHNIMJEMW^RGGGR][QJKQVb\ZZVPJQIBEHLGKIJQOOQuw‡|z‚¤«­ŒZ_SSRLRWQXP]`QRUaZ\]bjm‚zkp}†‹†vuw}tiijv~s_]`TXmwu{qijc`PFFBGFQNWonjlbtrq{oth]bV_b^`hkqynhs€xqwvmth^c]]ackw]UTFDEQ@a^ITKQKLWUc‹–™˜–˜–™œ—›–’“ŽŠŒŠ‡ˆ‹†…Œˆ‹Š†…ƒA79.45,6261-;=EOVeœ—˜‘˜–™™—š•”†Žz€}ƒz††„Žƒ‡ƒ‚}ƒ†Ž‡„~wysoujfcdcZWOGEHD\SJK=HDEINEMNSNGJNVMBMOKYRKG?LKTXKJQE@NMCEJEEKFHILOOw~ˆ€tsw‹mf_TTOPYlwodgeUVXZflpknssz†‚u~Š|€nhornognxikEUcTUPKFICHKSQILIIR\zukd_^\bca^kpnnohdqrrwr`e_bQUhfqjarvtvor~pNQBFXPK[QRCCRHRYllwŠ”—‘“•Ž•‘””•–‘‘’“Ž„Œ‹‰ˆŠC9<2976::>=4?KHVTYˆ’š—›š–—™•—˜š˜———’”ˆ†‡„‰†ˆˆ‚†ˆ…„ˆ†ƒ‡€‚‰‡‹‡‰…ŠŠŠ‰††‚†„}{uplidfi^ZWYYQYYUXVV[XOVYXKGPLSWTGABLQPGBEKAFJ@=B;@EAEG@I`Œskjx€†§œvp_UQYco…’}`kbddbfpricix‡‹Œwu†ˆŠ‚gilkkifnz€ogkKD@ACA?@E>@@IC?EGIFQWX^bklvxsutwtjd`XLNTbdbhtoWSkz‚mmhqf]_acpuSQOJAAAAOQeqaapebƒŒŽ‘‘”‰‹ŽŠ‰‘Š†Œˆ‹€ƒv4;C8B;9HB?H?ShYa[eŠŽ•’““’–“˜”–š™šš™˜–•‡‹ŒŒŠ‰ƒ‡‰~†ˆ„„€…ˆŠ…‰‰„‰†…………‡Š‹ˆŠˆˆ„}†zyppj]ege_Zbbc^bcTXWNVRX\GGDOUSJKMEKJFC=<<@TkcGMhtt}rxjFJW\_eX^fjstzynsMCHKEEGMP`gZONKKb‡”‘—”””Œ‹ŠˆŒˆ’Œ’{‡†‘K7G726098134BRSYRWz†…„‹‹‘ŽŒ”˜—›—˜˜•“—”•““Œ‹ŠŽ‹‰Š€‡‹‰‰‹Šˆ‡Œ‡†‚‰††‹…ˆŠ…‡†ŠŒ……‡„„„ƒ{vxorqjlnjhnjalknkfibegef[][ZTKLEPC=G>?<7/:Bejaog‰”˜—•ˆ–‰Œ’’“Ž‘’‘“Ž“‹†•’””–„’Œ“”’Ž“’•“•—Ž‘–••‘’”“”’’š‚}{aWefgaUhianmqltƒw}Šƒ‡…€}|€€€|z~…y||€yuy‚yruzfTa]fub‡ˆwxicZ^fXR_c`YXXVZRX]_f`cZ`efnlq†“’€q~„}s‚€{]emisnMBD?GNIERYmqXXpx{€nef`TQ>>H?EVldMKOmp`cc`[NYZY\^ktwmxoQG[hVURGQIKQEDK\cUZ]TSUh…‹Œ’“’–•–——•š–•™šŸœž›¡œ\9>22452;BC46NZX[Vd™—•”•™”•˜•Ž“•”“›•–ž“˜”‘—•’Žš—’‘‹€‹•–ƒ‘––“”–‘Ž••‘”’“„`[]NDcjkuXZeNTOTcon`uz…ˆ†„€ƒ}}{}{{‚ƒ‚~€~}v€ŽŠ}v\^bbu•§š~w`VTNLXeneWTRRVb`dknXapszutkx‡zs|y†„lz…‰€uznkxX_t[GDADJEGNbseRVbbYjQ;FDD@CBDE?ARa\C?EG>Da^wxo}ws~vuug]_HSlbQDKD?E@KJHKOZ\a_QIHK\~ˆŒ‰Š–“‘”˜“’“Š•”—™™š‘˜Žš696//32CLJD1IPRk\g¡ž¡¤™–˜’˜˜Œ–šš ™š™’˜—‹—’‘™˜”—“’–Š•–“›—–•”‘‘‰…Ž””‹”’”’’”†‚h[KKJJVU[mWTXBLFR_^`aXnv‚Ž…‡ˆ‚‡…†ƒ}|xz{~€‚€|~~‚|†‹gRX\{ƒŠœ’{j\g_[MQW_bUW\[Z^_^\bo‚Œ‚xwt‰”uw„…|wu|‚‡~r}ŒƒnimgqmBCEFJBEB\aaqhq~{„qTHJBAA@@giJEBBCAA>:=CL[aYiJFHJf}yqbKWf`WWfkMNOKKCLRWdTRPIQP\ƒ“•“”—Ÿ¡žŸ›¥¡£¡žœž–Ÿw7@99IKDPk[LV\f]hp{ ›˜š›žŸœ›Ÿ›šž›•’‘““––œ˜šš”•–œ˜Ÿšœ¡›”“Š“‘›™—•–—š—”Œ’Œ|œ|XjZ?cXFGI\Wn_af[\VTXQ\UKfZrexŽ–’Œ‡vƒ€yw„•ª”‰†„pufux}~h^cYdgi{‰”ˆwck_W\[a^[__[\dvsky€œ¯¼Á¥ˆ|{s€ƒ…„vƒ‰‹…t}ƒ„€rmb]PGPHBB?AcaXWZ\^h_qkifJCHHVsiMF?JM4;>@FDcxsnFB@>HQ\ckl…xkekeGFMRXUPKQMID\[WLf™’–™ž›œ˜˜ž–™™œ˜¤œ’¡ž¨¡¦—9CKOtcol\reYdkmvt~šœ¡›–˜œ–˜™–˜—›ž›žš˜–‘‘•—˜š˜—•“—Ÿ™››ž˜›š–”‘†Ž““••™”“‘’““•‰†‚hGSMSzUBIEV^uqO[X^hbp\UUD]TRYS}‡Šƒmxu}‚nqzzvta^mqiazx{ƒƒˆ„j`]j‚ƒ€€Œ†r^nomqmg\VXdnwxqtnt~œÆ¾¶ª vtr‹Š…uv‚‡Šnˆ„}pp}q_ZGFCGNPIKJDSeac}w†„wsVECBBU[V`bnpA>E==@F^\MP@?ICFGj~yvt~nc\V^IFPJ\THFLYUVSZ_Ma–”›–”›”’”‹‘•›–•››£¢œ™ƒgnshammudfp\Ygeptt“š¢˜›š›—–”œ—”™—’˜›˜ž˜š””™‘•™™œ—››™™——š™—˜š•™•’––™–•Ž’•ŠeYGLC]wMFPIWoopXTQQ^j\gbU]eY`]Opjmm^bZ\_`dbZe`TV`lpzr‚‡{„‡ƒvZet~Šƒywllwyzyqe_[hx„z€pli‚Ÿ¥°¼¾¦žš”~px……wzxx|r~†„upy†hmxUUPM[ULNMGZq`nwnvda[NV\]]dojplq\=>C88:9D=BHC?Bggd_gukhgqeBDPXXaNPPQGEKGPZv˜œžœ›™™—’’•Ž”––™–Ž…yssvuyfapmnd`[X[aemn–—¢Ÿžœšš•–•›—”›’“–Ž‘•”’šš™›••–‘””‘—œ—™˜šœ“š›žš˜““›’”˜–”“’‰pYZJBGTRRSLOnht€fVLVWQZRMaofij]^V;;7876;8::9I`w~w{„x‡‹ƒ…|uoeekapub__is{|{qaYYox…‹uyŽ“Ž˜Ÿ®ººÉê‘‘~gs‰ts…Š~coƒ‚‚qpwo„†pTJIJIAAE;BSKOHPScwrtqmpjdid_ZTI9?HEAA8ABC54?;DMHAVou‚‡|ui]YEIW[dnII]PYc[cUWb}Ÿš¡Ÿž¡žš—Ž‰†‡{olpwqolntwq[dYWY`wvjdkpv’š¤¨££žœš™›—–—”—’‘™ˆ{w‰—‘”’‘•””˜—–™š––›˜™›˜”›’—–”—–’‰–’‹–wVYOPJPWO_aZhg†ŠŠr\dQ^WZ]NTcQZhWL>3992989889Nxxqm_Ybfx}uu~ƒpfcag`kjdagpj`ihdfgqwwt’¤­Ÿšš ¶ÌÞÖѵuu¢¤ˆ‚ƒ|hz‡rerz…wps‰mPPOUYGCA?9?CIGNU]ryqg]b[T\^g`hY>G?EEA<8>90A:?BPMGE^plz_SL\R?GDFHMTXwg^dV^KONYŽ’–™‰Š‰ƒ†|uYkrcmcuuwn`kc]MWJRWKcYaknr|Š—£Ÿ«£¤¤œ £¦˜šž¢›—œ™œ‚`oOmŽ„’‘”‘••’‘—“–”›™–™›š—˜“˜–˜””—‹‹†cUHTRbfc{oiyxfvz}}Yf|oVJnR]d9@>9>28:;<9;B\bm{xqvqnjhr|‚‚Œ„‚sa[UaxƒobUTXkyzspqhkxvŽš ¢žš•’§»Îѱ{…§«£›wh|…ƒxjonrkp|zxxskhld]UOKHBDB>B>CDDJU\ZlmptqxygcV?<@=:B?4;:;8:7Mmu†|ehci]]m|~‚ŒzaQRQXfxq[W]diwyzvv‡€„‡œ¡©¤ž“‹†ˆq‡Ž’…‘˜}uu‚ukvvvho„‚€gm‰lkhTIHBDAD<CE[wvyqllbdZYbcUNJ>??>>;QLSZagfqmMG]fM@DOkx`VWMSCGU^ohT\WTLXduxys\ouokcmnjY^PO[PYYYZTLMOV]Z^WZmmj_hgcp|ˆ™¤£¨¥ ’—ŽŸœŸž—˜—ŒŠˆ‘Š“—†•p›qz­Šœ“›˜ œš—œ—•““’˜–“ˆ‰’‚xwƒpebnrftqg~|€zˆ~†‘…‡q~wR;?8=V:?><;:<8?OY`^PLHFkvsuz†„}wfY[RU[_kc]dZ^nw–»­¥¨—~}„•¤¦œ{npŒŒ—’ŽˆƒŠŒlp€zkhkt|usu€rgOMNNPLJDFF@B?@?C^g[^]X`jvutsvnK@GDBJCFr|mtsje^RLTmlskRL[}wTCHGJLTQT\JKFPVY`M[a]XEQMNIILICGGU\YTPXXXSSQKKQKWj`{‹plkagr{„’˜šœ’‘†}{ˆ‘‘ƒŽ‘™ž¢š–––š™——š™ožœ‘š–š™š™˜š™–™’”—›ŽŽ‘x}ƒ|w|„}fgm`n[ZkTebi€tt‹Ž—Ž˜‰|Q<;4C48434575;=FFD=DB6€wtjbhg€’†raUZRhyhnejš¯¼ÃÑɱ§–ƒ„ww„{u‰†{q”‘œ›•vƒ–}…†ˆnosrvn}‹‚sq€ŒgKMFCJI>97::=>=Wbiiirqtlqmd\WN>ESVSKLASm]QX^`keSQj~y~eLIXUCAHQG=C9@D?JTipbb\adi^eje^FCGJKKG;A>HQXrxzx^YNKT\ajlx~[EJIKHAEIWcGGEGGLTSSVOMV\RY`SVSKVQSZ[R\ZYQVKLQUY]lwzfk€aaT_msa]aiypbQ[ft€„‘›Ÿ¢¡Ÿ“™ ž‘–ž›˜Ÿ —šŸšŸŸž¡žŸ–™’–~zynxaXWXjpqxow{`bUEMeWPKTUdmb|rŠ‘˜€N7;020)--./-5D?@B@?GC~uiPTZYXYdkpinyztr€‘¥£ž¦¨©»ÌØÜ¿¥¬‚£¶ÃÏÇ°¨¢˜ŠivzyœŽžµÊÄ£‘€}‚|{it|oyuvqy‡q|†tPHMKHB9??:=89=E[ecjurvcdXS[\]fjtkIKFEJLTefdd}vSJfypnhvjXYlcMF-2-+3++,022ENDUIQVejkk^RUPOZk€pxpo}œ®µ«–‘œ—™¡³ÁÀ«†¶®¬ÀÓÎÖÌ£ ¢—zŠ°À¿ÈÏÌ¿•„’Œ€ow|xez„„upky†~_LTJJ]K@CDPB>EDQmhnm`aQJ@CFcqqtqvy_CPUTPQZ^{vzj@Obceimpwof\HJBHLRTRLITIJH^`LFQSRNLRMFDGCIMJIPKHTKHHFHWedprqrr†‚‚yphŽ’w…–oYd]_TolV[o“”•™£¨§£ ªªžÕ  ¥š›šœ“–¦wdoxŸ‘”_[`iilaTNQT_lq‚|VVqtii[INJK[RfkWqhrtƒaC=240.14,;;;LQFCKEBJmsv{s`TX`fap}xs†“˜¥©¸ºµ§”–‘Š‹xf~®Ç«¤ÁÐÌ·œ€ˆ{†–šœ¼»ÈÍÐÀš˜•|tƒ~…ulv‚Štqtrzmd[blgtnTNLKA>:C;BQVf`g`OCF?Hbgf`[]ekmzvl^U_xjfVO^gvŠ‰€zkdq`[\ZYNFDEMEISUcaK@=BGQPQLAKLLMUWSLNFBOLNRHJPY_efuwrup{z~‚f}yo]PQKQGHVahi“’‡’™œœ§ ¢¦›¬‘ªž›¨¢˜“‘˜›ƒ†”“©ž›¤TTe_TVTLJLFSQ]_yuKMSP`MPIINWkeq`o~p}rl;?41.'.+,800?9C;BPNRwttthWTfpchjkv‰¸Ç»ª¦º¸ºÆ¥•wyˆtii—Œœ´œtzk|±Á½¨¢¤››Ÿ ´ ‰‘’|…}‰zo{vuwuŒzsfxvXkshsbMI;<>8BA>A\€xff[KMNU\dqxmnm|}upa``fbcgzr[N^qmxgaqtl}|YMNDMJSQZ^KJKKITVTKENJPNCHJHCHLTPXbQSJQPAHNRW^h~„{‹wr~}’•–qYrSDJKMGL\rˆ†‡‹—žž¤¨ª¬¢œ’ž¨žž§ ›šž¢ £¤›£¡¢šZ[lUOQHDHBHFGWSqiJM;IFFPNRUcVKY^Ylsi‡`JK950674.8,;GJHCGBLDvmiaklcgqnn|}‚‘œ«ª˜¸¿¹½´§—zt¯«qhls{‰‹lhl}vŽ±ÁѾ¬¢´²šƒ}Ž¨€Ž†wx|rs€‰Žzly{lNVMQXgcFE;ACA?AB\n\[aq}{„x~ˆxui[X\gprmu…€qnlo__BGaktƒ€‡‡mx[N^OR\JCDABDEIT\PGFHGDZXNHHOLMPSPMNJTNOOLMHOROoqwttw|„†‚yƒ‹‚ygcib]TOP[[dŠ‹Š‹’œ £ª«ª«¡­¥¥±®­¨¦Ÿž¦¦©Ÿ¢¢¤ œ£€_SLJLKEDCHIGOXmaLF>@@DLRRLZLGXPadex„‡iIJ=00,66-,-1;AEEMLHOi`Ydxvrml‚©Â¹ž¸²{z}£¨¬©§vzŠ£«¬“unccsw€x~lvÍßáÁ«¥Žˆœ¹À´¦™~z‚ˆŒ~ju{‚~rux|iu‚ZTZ[rl]G9B>??8EXrry{v„yvjbPJ\_kyy‚‡vnlmc[]Zv‚aTg|{€wpffZRZWBJLLOMNWQEQQLOHNNCFONGCFGEIHNQNG[]MCGGGMZN\rz‚‰„wsg_`nv‡‹VR\cpWPP_`r‡stˆ’“˜—žŸ¡¡˜ª¬ª¯«¬¸·«« ¨¦¡¨¡©ª¡{QTLEDENG@>?AAGal[SL?@=>CICHEAIJ`T]xjk„pDMB?>778795?HRWBBEHHjpqrxiz¦ËÎÚĦ±¤•yjjsr‹‘}ozŒ’‹“‘ŽˆhnlwŒ‹‚z€ubrn™×ßÅŠŠ¬¢™¨Àżµ•Š‡|qqzvrvƒ†}qjw‹tPSRY]JLNUTPPJBYvuqwfOY^_chXJansiaac[\dmr}skr€wNRc]blox~‚qXXHKNRZYLJK?EGELGACEECDPJNQORSWPKMKKNOYUOBCHTUT]hvw}ƒ†{elkhmtXGMCWK?MP^\XZSwŠŠœŸžž¡©«©ª©©°´­¬§ª¬ª¢¨¬¦ eQVJDGKCD?;:?MCU]fVTGC>?CB;@::@FNITk^\LD>7>BCUCOTLnlrijm}jHL>:95=86578IHGJ<>HBtrlwŒ•©§¯¼¿¬ªª •‘~gVVSabVg{‹‰ƒ‰t\nŠ—“Ž‰‚‚†„{vlY`ov”¦ª™¤©ž™¦¬ ©§‡}{„vv{}igo~}cjxx{t~uPO][AC?EE[wttmmli{x„sLPOLOOVO\PJKFNFEHEHFGNRDKOPQHDCCIHWcYTXMSHGPShkv{‚„…†„™oVfgg]@GKD67;DOG{«Ÿ¡¨¨¡¤¤¤¥¥£˜Ÿœ¥§¨¨©«£ªŸ¢HKQFGK@D6?<;ADHGBJR\aOB?DFJP?[T\nrj|†q†dGK831-82(/,/CM=F;FZU]_=BUG=JIOfargZIRDKZHURObYZgqmhQ>C4?,0,&+3-9DDWLIQSJƨš©³¤››Ÿ§¡’†ƒ€xŒ’Žˆ„m^c_^[Ychtw{wtv‘¡’‡py¨¡‰œ¨§­±¸ËĪ¥­¦|†tp‚u€†uqxr|igiu~rtzƒzmpeb^SUb\aglxcNSeaZXN@BD^ywuqs]\bFOdlzuz|z[GU[^lu}xs‡iFMJWWVWWWYPUCDRIKRROBECCGIIFOTPGLTNTIBJQKRQLVTX`a|vvqbmxt‰†xtM]MLG8HEX]eTTcz¤¦§§¤¨«¨«­ª©©¦¤££¢£¥ ¥•U„ˆfOFBA?=:85;;FEQ^YjhPJLESUIHSZ„og†ug]H=C96302,294?LFOO@KONã×¼¨ÇÉ­¢™›¡œ•‰–}x†“ˆ’Šn]_\Udnhntwwywy”¡•ˆvsˆ¤¸·¬¡•±°¨­®ÌÙʳ—›ƒvx|€”ƒ~xw„{evtiths|‚vthSTMkwo{wknicaLBNWE?>>;CCWr^OLAB?AKSkv}„ckj\ignvv€…~qtgalW[VJLLNIQs]MXZNEOXIUQONIUDHJFIKQVT`XMOMMRM_vu|}‚…Œ{cfwws~ly‰aM`UFCCVXc\X—£¨«£¨¯¬«ª««ª¬®ª¥¥§£§«¨ª£z¤‹UMPJ;IB::=:=@=;7>DGKF=AA>A=JR]hgljx{v€srzfjhgrpt~jMGPLISZOSXMMJKCTPHHEHBLPKFHJPWRTOMOIHOX]\hz~€~uuomredsŒ€~|UHGQCBF@HO\¤¥¬®«¬©®«¶º°«¨¤™§§¥«¨§¥¬¦Ÿ¨rQJNICDECDNCdbHTSU`UNPFVTpulcYSJJEB:47/33.87>MLRNEH?VÕÔÕÙÑÄÌÅ ƒŽŠ˜¨­£‰‚‚‰‚‡y‘«°§ƒjgffpetzqik{ns–Ž„Ÿ«´À¾º®¶ÐÞâÚÒ­mbedaf}„|~ˆ‡ƒw|ƒƒuiorkq~s|\[YZ]ctlt{}pGELJNSagGCDFJBA9;:7ECDCY{z~vqwlafgiszˆ|†aeXj`UZHLJHNTmb_WHIJNLOP\XVLF@BA?LL[fW][GMRHOPdgtz|utia\]evlVZ^TLKJUYH>Jxt‡£¬«ª¬³£¾á¼°¨¦¦§§§© ¤§¥¢œ§lRM9YVCE@;BMMNPNJLIBF=AD_DGSK[mdN\a?G:@<2025102/<8>DLbWgX[oubRNLM;;;75.150+,04CMIKUYQM™¨ÄžƒxvƒŸ½ÌÛÜàÝÈ«…{fpm{’•ž ¦º·³«vec`b{¨¿Ç¿»Í·Š“†ƒ§ÉÕÀ”~acge`^avbli[c[gqzŽŽŠpv„€yl|ƒ{y{„yjkTI\x†v~z~z{fLKF?=A=JDJB[{M><8:Hhzp}|ea[^[WRIQv~jzbSbup^XKNe]ZcZ[OGSMKRBDICGJQ\[`[Y_JCLIGJPXSNUVU\isrv}„“ŒŠ•‚}~l\jjrOA=?DgŠ¦¤—•–•‘†‡–”¢ž¡¤   š—•œ]HiOc>ESCND@9J=@4=FO@765>>XovoWn}dUSIYXBB>D<,40.,3+>GIS@L[]N|Œ”°˜Š‘¥¸ÅÓÛÖ༂„kbjmx}Ž›™¨·¸²±wi‡ˆ„’´Çº¸Îؾ’‚–‹ƒ”Šwt~‚xdSUl{l^khc^Ycp‚Švlzxwmnls{ƒŽ‚u†{WUqˆmh]NMJJBFHBABB?;E=4>Ro`C>>AHpf[c]]t}nxdcLGUe`jpvwo|WMYWqs]olBHAQ[FJDGILPKJJSKMEHONMPSQRTYYc€~ˆ††…€‡€{{v~…x{uoswhJGEOQSm“—‹•šŸ–™žš££  ˜  —¢aLSNGKdFRRKO?;:<2;;;?-0338HWeb^kl\PGJPcI8I=56..0.:+?JGRCJJM]`~±µ¶¼ŸˆŒ“ž¥·Ã²«¡ž¿¬„{nlio—“ ¥’„˜²À³œ™¸¿ÂÁÊÛĤˆ†uomn|Š—špc\hpfbeh_[Vcoeipwxnuqknu~…y…‹‹iFKJNNJHFHHBA<6>:69;7>?BGdw`C>ECIM^plos‚|nia`mxy~‚|€wh\ZW[TPTXVXZRXYceNMCAEDB?970011.502:=12959HHSMTPVTQ[STNDPF<4:;4/3-=LXJQVELRi„„Ÿ·Ì;›‚‚ugo€¥»ÇÁ²Ÿ…qxƒsi`a`^t…‡ ²¾ÎÓ¼©’Œ µÉÏÖØת}‘dkyƒ„‡”Ÿ™‡f]qld_Z\ST<`€vpiz}tdkgwx†…{zzNGEKAECIIYdTG@BE=;?7@@DXkplgtg_YUU^ov€zpsxf[_QRgqz€qocbhUWRSrcKSQGPSIELNOXVjtovy‡ƒ}…€uwnx†‹‚z|xvu{„Š‡‡|q||tgTVUXOOPbdWo‘Œ”••šž  ›ž™žœ›žš«ŸšŸ]l•^@G534/-/./-//8734526CB@FTSQTLUQIJGI@>D::6;<7EOKTAMKTQ=Sx’¤¾º”qlnlzss”ª­ Ž{qnsia\kw„ƒª±¬·»ÑÅ¢•“šºËǤ‰f…‘dbqs’š¬‹fknZYX[NIHIEGMX\C9;2;CCUMDF<[g[Y_Zpwldcsqxqc^eouxmTYkmjhkswveLMIPVS\ZWLPJMdtqywr{‚zzrismxwxˆ‰ƒ}utprz†‘‡…usu‰†Ž†zbS]_nonjW_cwƒ‹‘”‘•žž•š™˜”š™“—œ£”ª‡p šs<=930.*14.+-//42278354:S[WTQXUTI@MIB9563.880GPDXRTV_^6:Ji}‰oi}{ledo‚ƒˆŽ„ibaj{„‰‘ŽŒ“ž¸·§·ÏÖ¿˜”Ž…pk‘Œo\hfj––”–Ÿ‰qkYWX_GA80EJu~teuqllou{qry€u…qPJ?=>?EE<==@:CDC;7O<7=?P^esmqvlcXZ\`cl{qwzxwacdk|‚‡ymUVWY^RdYLEKLKq|{wthgkjgp|‚‰Œ†zwupex}€„}vyqw~……‚…€zux}‡„mx{w…u`ZKTKl‹…Ž‘‘”˜™•’‘Œ†’“‰Š˜“Ÿ•w ™ˆA;84/*-17/0.*4,4;35674=CJQWWSRTH8EDG:1726466GVT\ZNOT[378@Xs|›‹vˆŽŒ…lmso„‘’““‚dn|ƒ‹•—˜•š»Ýγ¾À¸ª‘‚nmu€ƒŠ{gbmjtnv“ž›˜¡•ddcX]L