pax_global_header00006660000000000000000000000064152105121340014504gustar00rootroot0000000000000052 comment=77e079951507352122a12a6a752fa9d18a1bddca golang-github-yeqown-go-qrcode-2.2.5/000077500000000000000000000000001521051213400174375ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/.github/000077500000000000000000000000001521051213400207775ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/.github/ISSUE_TEMPLATE/000077500000000000000000000000001521051213400231625ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000007661521051213400256650ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: "[BUG]" labels: bug assignees: yeqown --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Provide the minimum code snippet to help find out the cause. **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Additional context** Add any other context about the problem here. golang-github-yeqown-go-qrcode-2.2.5/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011661521051213400267130ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: "[FEATURE]" labels: enhancement, help wanted assignees: yeqown --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. golang-github-yeqown-go-qrcode-2.2.5/.github/ISSUE_TEMPLATE/question.md000066400000000000000000000005311521051213400253520ustar00rootroot00000000000000--- name: Question about: Ask questions about this repository title: "[QUESTION]" labels: question assignees: yeqown --- **Describe the question what disturbed you** A clear and concise description of the question. **What solution you have tried** Avoid others' duplicated trying. **Additional context** Any supplementary instruction here? golang-github-yeqown-go-qrcode-2.2.5/.github/workflows/000077500000000000000000000000001521051213400230345ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/.github/workflows/go.yml000066400000000000000000000026101521051213400241630ustar00rootroot00000000000000name: Go on: push: branches: [ main ] pull_request: branches: [ main ] jobs: golangci: name: lint runs-on: ubuntu-latest steps: - uses: actions/setup-go@v3 with: go-version: 1.19.2 - uses: actions/checkout@v3 - name: golangci-lint uses: golangci/golangci-lint-action@v3 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: v1.48 build: name: build-test runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Go uses: actions/setup-go@v2 with: go-version: 1.19.2 stable: false - name: Build run: go build -v -race ./... - name: Test qrcode working-directory: . run: go test -v -race ./... continue-on-error: false - name: Test writer/standard working-directory: ./writer/standard run: go mod tidy && mkdir testdata && go test -v -race ./... continue-on-error: false - name: Test writer/terminal working-directory: ./writer/terminal run: go mod tidy && mkdir testdata && go test -v -race ./... continue-on-error: false - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v3 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} golang-github-yeqown-go-qrcode-2.2.5/.gitignore000066400000000000000000000002171521051213400214270ustar00rootroot00000000000000vendor/ draft/ testdata/ js/ .idea/ .vscode/ # example/ *.png default.jpeg # *.json *.log .DS_store tmp.png go.sum # Go Test new.txt old.txtgolang-github-yeqown-go-qrcode-2.2.5/.issues/000077500000000000000000000000001521051213400210305ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/.issues/go.mod000066400000000000000000000002131521051213400221320ustar00rootroot00000000000000module issues go 1.19 require ( github.com/yeqown/go-qrcode/v2 v2.2.2 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e ) golang-github-yeqown-go-qrcode-2.2.5/.issues/issue69/000077500000000000000000000000001521051213400223375ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/.issues/issue69/issue69.go000066400000000000000000000073161521051213400242040ustar00rootroot00000000000000/* * Link: https://github.com/yeqown/go-qrcode/issues/69 * Title: Feature(image-compression): PNG bit depth must be 1 * Author: stokito(https://github.com/stokito) */ package main import ( "fmt" "image" "image/png" "io" "os" "strings" skip2 "github.com/skip2/go-qrcode" yeqown "github.com/yeqown/go-qrcode/v2" yeqownwstd "github.com/yeqown/go-qrcode/writer/compressed" ) /* See https://github.com/yeqown/go-qrcode/issues/69 Results: (unit: B) Content length: 158 // source text length qr-skip2-best.png: 641 // skip2 generated size qr-yeqown-best.png: 958 // yeqown best compression level */ func main() { // some json content := "{\n \"id\": \"beb6c04733d1a2da0f87c910a384\",\n \"tmax\": 895,\n \"cur\": [\n \"USD\"\n ],\n \"imp\": [\n {\n \"id\": \"21292\",\n \"instl\": 0,\n \"secure\": 0}\n" // strip json to alpha num just for a test content = strings.Replace(content, "{", "$", -1) content = strings.Replace(content, "}", "%", -1) content = strings.Replace(content, "\n", " ", -1) content = strings.Replace(content, "\"", "*", -1) content = strings.Replace(content, ",", "/", -1) content = strings.Replace(content, "[", "/", -1) content = strings.Replace(content, "]", "/", -1) content = strings.ToUpper(content) fmt.Printf("Content lenght: %d\n", len(content)) //imgEncoderNone := CustomPngEncoder{png.NoCompression} imgEncoderBest := CustomPngEncoder{png.BestCompression} encodeWithYeqown(content, "qr-yeqown.png") //encodeWithYeqownCompression(content, "qr-yeqown-none.png", imgEncoderNone) encodeWithYeqownCompression(content, "qr-yeqown-best.png", imgEncoderBest) encodeWithSkip2(content, "qr-skip2-best.png") } func encodeWithSkip2(content, name string) { //err := skip2.WriteFile(content, skip2.Highest, 0, name) //if err != nil { // log.Fatal(err) //} q, err := skip2.New(content, skip2.Highest) if err != nil { panic(err) } err = q.WriteFile(0, name) if err != nil { panic(err) } stat, _ := os.Stat(name) fmt.Printf("%s: %v\n", name, stat.Size()) } type CustomPngEncoder struct { CompressionLevel png.CompressionLevel } func (j CustomPngEncoder) Encode(w io.Writer, img image.Image) error { pngEncoder := png.Encoder{CompressionLevel: j.CompressionLevel} return pngEncoder.Encode(w, img) } func encodeWithYeqown(content, name string) { qrc, err := yeqown.NewWith(content, yeqown.WithEncodingMode(yeqown.EncModeAlphanumeric), yeqown.WithErrorCorrectionLevel(yeqown.ErrorCorrectionHighest), ) if err != nil { panic(err) } option := yeqownwstd.Option{ Padding: 4, BlockSize: 1, } stdw, err := yeqownwstd.New(name, &option) if err != nil { panic(err) } if err := qrc.Save(stdw); err != nil { panic(err) } stat, _ := os.Stat(name) fmt.Printf("%s: %v\n", name, stat.Size()) } func encodeWithYeqownCompression(content, name string, imageEncoder CustomPngEncoder) { //cfg := yeqown.DefaultConfig() //cfg.EncMode = yeqown.EncModeAlphanumeric ////cfg.EncMode = yeqown.EncModeByte //cfg.EcLevel = yeqown.ErrorCorrectionHighest // //imgOpts := yeqown.WithCustomImageEncoder(imageEncoder) //imgOpts2 := yeqown.WithQRWidth(1) //imgOpts3 := yeqown.WithBorderWidth(4) //qrc, err := yeqown.NewWithConfig(content, cfg, imgOpts, imgOpts2, imgOpts3) //if err != nil { // panic(err) //} qrc, err := yeqown.NewWith(content, yeqown.WithEncodingMode(yeqown.EncModeAlphanumeric), yeqown.WithErrorCorrectionLevel(yeqown.ErrorCorrectionHighest), ) if err != nil { panic(err) } option := yeqownwstd.Option{ Padding: 4, BlockSize: 1, } stdw, err := yeqownwstd.New(name, &option) if err != nil { panic(err) } if err := qrc.Save(stdw); err != nil { panic(err) } stat, _ := os.Stat(name) fmt.Printf("%s: %v\n", name, stat.Size()) } golang-github-yeqown-go-qrcode-2.2.5/LICENSE000066400000000000000000000020471521051213400204470ustar00rootroot00000000000000MIT License Copyright (c) 2018 yeqown Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-github-yeqown-go-qrcode-2.2.5/Makefile000066400000000000000000000006361521051213400211040ustar00rootroot00000000000000release: release-osx release-linux release-osx: - mkdir -p draft/osx GOOS=darwin GOARCH=amd64 go build -o draft/osx/go-qrcode ./cmd/go-qrcode.go cd draft/osx && tar -zcvf ../go-qrcode.osx.tar.gz . release-linux: - mkdir -p draft/linux GOOS=linux GOARCH=amd64 go build -o draft/linux/go-qrcode ./cmd/go-qrcode.go cd draft/linux && tar -zcvf ../go-qrcode.linux.tar.gz . test-all: go test -v --count=1 ./...golang-github-yeqown-go-qrcode-2.2.5/README.md000066400000000000000000000131141521051213400207160ustar00rootroot00000000000000# go-qrcode # [![Go Report Card](https://goreportcard.com/badge/github.com/yeqown/go-qrcode)](https://goreportcard.com/report/github.com/yeqown/go-qrcode) [![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/github.com/yeqown/go-qrcode/v2) [![Go](https://github.com/yeqown/go-qrcode/actions/workflows/go.yml/badge.svg?branch=main)](https://github.com/yeqown/go-qrcode/actions/workflows/go.yml) ![](https://changkun.de/urlstat?mode=github&repo=yeqown/go-qrcode) ![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/yeqown/go-qrcode) ![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/yeqown/go-qrcode) [![License](https://img.shields.io/badge/license-MIT-green)](./LICENSE) QR code (abbreviated from Quick Response Code) is the trademark for a type of matrix barcode (or two-dimensional barcode) first designed in 1994 for the automotive industry in Japan. A barcode is a machine-readable optical label that contains information about the item to which it is attached. A QR code uses four standardized encoding modes (numeric, alphanumeric, byte/binary, and kanji) to store data efficiently; extensions may also be used ### Features - [x] Normally generate QR code across `version 1` to `version 40`. - [x] Automatically analyze QR version by source text. - [x] Specifying cell shape allowably with `WithCustomShape`, `WithCircleShape` (default is `rectangle`) - [x] Specifying output file's format with `WithBuiltinImageEncoder`, `WithCustomImageEncoder` (default is `JPEG`) - [x] Not only shape of cell, but also color of QR Code background and foreground color. - [x] `WithLogoImage`, `WithLogoImageFilePNG`, `WithLogoImageFileJPEG` help you add an icon at the central of QR Code. - [x] `WithBorderWidth` allows to specify any width of 4 sides around the qrcode. - [x] `WebAssembly` support, check out the [Example](./example/webassembly/README.md) and [README](cmd/wasm/README.md) for more detail. - [x] support Halftone QR Codes, check out the [Example](./example/with-halftone). ### Install ```sh go get -u github.com/yeqown/go-qrcode/v2 ``` ### Quick Start link to [CODE](./example/main.go) ```go package main import ( "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/standard" ) func main() { qrc, err := qrcode.New("https://github.com/yeqown/go-qrcode") if err != nil { fmt.Printf("could not generate QRCode: %v", err) return } w, err := standard.New("../assets/repo-qrcode.jpeg") if err != nil { fmt.Printf("standard.New failed: %v", err) return } // save file if err = qrc.Save(w); err != nil { fmt.Printf("could not save image: %v", err) } } ``` ### Options ```go const ( // EncModeNone mode ... EncModeNone encMode = 1 << iota // EncModeNumeric mode ... EncModeNumeric // EncModeAlphanumeric mode ... EncModeAlphanumeric // EncModeByte mode ... EncModeByte // EncModeJP mode ... EncModeJP ) // WithEncodingMode sets the encoding mode. func WithEncodingMode(mode encMode) EncodeOption {} const ( // ErrorCorrectionLow :Level L: 7% error recovery. ErrorCorrectionLow ecLevel = iota + 1 // ErrorCorrectionMedium :Level M: 15% error recovery. Good default choice. ErrorCorrectionMedium // ErrorCorrectionQuart :Level Q: 25% error recovery. ErrorCorrectionQuart // ErrorCorrectionHighest :Level H: 30% error recovery. ErrorCorrectionHighest ) // WithErrorCorrectionLevel sets the error correction level. func WithErrorCorrectionLevel(ecLevel ecLevel) EncodeOption {} ``` following are some shots:

### Built-in Writers - [Standard Writer](./writer/standard/README.md), prints QRCode into file and stream - [Terminal Writer](./writer/terminal/README.md), prints QRCode into terminal - [File Writer](./writer/file/README.md), prints QRCode into files - [Compressed Writer](./writer/compressed/README.md), It's generated on a very small scale Of course, you can also code your own writer, just implement [Writer](./writer/README.md) interface. ### Migrating from v1 `go-qrcode.v2` is a major upgrade from v1, and it is not backward compatible. `v2` redesigned the API, and it is more flexible and powerful. Features are split into different modules (according to functionality). - github.com/yeqown/go-qrcode/v2 **_core_** - github.com/yeqown/go-qrcode/writer/standard **_writer/imageFile_** - github.com/yeqown/go-qrcode/writer/terminal **_writer/terminal_** Check [example/migrating-from-v1](./example/migrating-from-v1/main.go) for more details. ### Links * [QRCode Tourist](https://www.thonky.com/qr-code-tutorial/) * [QRCode Wiki](https://en.wikipedia.org/wiki/QR_code) * [二维码详解 (QRCode analysis in CN-zh)](https://zhuanlan.zhihu.com/p/21463650) * [数据编码 (How to encode data payload in QRCode in CN-zh)](https://zhuanlan.zhihu.com/p/25432676) golang-github-yeqown-go-qrcode-2.2.5/assets/000077500000000000000000000000001521051213400207415ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/assets/example_circle.jpeg000066400000000000000000001016361521051213400245730ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?j(L ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@eO%Z+UQTa@t, 9+Pa<ڦdV`3jTUoc?j0E <TUWB0Þ; Xj,W5V"Eg&CȢ©E\(`QEQEQEQEVUZ=飣;J˔1|ݝ$6sYĺI$84Ίy-H UE`>d"sA2xCR9D-g_7g|fY[~sVVQranP0Eg;z "r= ǛѦyfb>T5[{oݓhO𚴎PT[@OqQK;z .T0E-S=̞fߓn}.V`]WVo;i)%&µQ aЊʫVog;J˕Nu^U<Ϳ&kwgw|f3EJm]"~1VVɈ(ӔEZF B+>X.O#Qh5?e&h;{C^*}sIbI9&]jєyb%QH (-Y0܊Y@ *ް2}shZ1,nP0Eg;z lr]JvKB3_7g|f<Ϳ&Uk7ڂ>XŴ`t"r= J׬Gʀ\拑D-g_7g|fY`H$5۟jJ= VUZ=(yySIVnrHLLbTFP~$%QHU2vogYmϽQB|ѽ_7g|fYdI$85aoX>3!k͡m*=2gyx<ADS\GygnVk#@sU;拄_ H UE`>dK iRtS\GZPp"Գ/3OvN+z| (0EE`X`t"=Kk6{qƺ얅ʧzp*̞fߓn}5o;hbN(8((((QBQ ʫNX4m2zz:r*:g/&GAͱ\EETEPEPEPEPEP(T :KPA:csަgUb=H.7EKջUjYd8#Ϫӛh+U*qzI6=SP[mTe͓#Sf؉.Ku"*NU* ]9S3UeZ b PL'^ VU_uD*,xPlLi )EPEPEPZP(eU'W@pÎ{GNI6=3_7|bΪ2U>S:g8.R:B+ T3ΨTvJ*7e (VJ wVtRd<WVRG~K PT3ΨTv +0!nN@unUuQ Ϟ_6LC#%nTQEIj@V8a=fuQ ԌtTP[V_6LQR<9(fQEQEQEQEVU_ut 84tᤓi;ջVFX+>y|2:6mR*( ( ( ( (  XjZ0E4tᢛm"Eg&Cȭzp)lDW%ʴQEI_D ,yLȬ0B0d :KTzTlemQTa@/3OB1'] (xD* fc=g`X`t"pPdV`yTXU DW%ʴQEI_D ,yLȬ0B0d :KTzTlyZ`]WVIM~3 BQ aЊ)2+ 0UOoc?jLt9QTa@t, 9OH PT3*(3_7g|f8FVEQ xв0=#T,zAR\l`Q0yS2+ 0PRTlyZ`]WVIM~3 BQ aЊ)2+ 0V|yR`t<Ѫw 6Er\ETEPEPEPEPV|zZP(4tay_<Ϳ&kwgw|֭SP[ٮ"1V(8VogYmϽ9*=(C675۟j5TTVE D/bQRq|z'۟zr(T :KTzP,ms)o;i*Ȫ AV|zZP( m6޳yߟƴZΊ#6sUjH PT\ϊ5+Y0+}1Rb#2d~Y[@OqEȪVJM&K,/*[_7qު֪(T :B4<Ϳ&<֝3_7|bZ\j~}^ocg\u OB(*p据eQE'QE,P<U*Szɀ\Ub TTVE ҵ<*EBXyySR'hP(-UmLdяϵZJ%)yōS\GPT"3 \ɖPbKI4Pc)_ (_7qެm6ޜR!\}Jz:r*#ydU_7qު֪(T :B5ay~My:gn3.vͿ>Uk7ڮR:B8sF*ZÍfO3oɷ>Pt9ckOyݝIVTVEUpT, k6{ZE G@(Fx^W6O3oɷ>5TTVE6kU*N ((((NX~3 чЙTe͓#V"Eg&CȦq<ܾDTQEI_ut 8LΪ2Pa<ڦdV`=*|TW1VՆT*1[TUP^^bTBrǎ;Qqz'] (xD* fc==3:g/&GAEaϞ/*LC'EETE'W@pÎ{,@ * fc=fEaҧɮ|dt /*LQR8'~g͸U'W@pÎ{  XjBfuQ b+ 0V|yR`t4ٮ"v(QEIj@ájVb>T5W;㈅,+{oݓjް2}s.L1m*=2gyx<ADS\Gy5Nu^P׬Gʀ\XNIɭZ2,D)0d :KT|z'۟z҄{XUU}JGIsIT`t"XxCB4QAh;{C^*}sIbI9&iZeXER9(^Gԭd| )*Sjȫ# *ް2}s ֌c"۰T,zYU,fu)Y0܊Jӗ,5ic l~fߟn}כXLc{h )@,@$Օb>gc4ˌ%/kU2`xUk7ڂ>XZ(KVL"VRn6wlV~fߟn}ۇ9*=u6{TQ@83ʑi>V A(HJ(0d :KT|z'۟z҄{XUU}JGIsIT`t"XxCB4QAhE,/(RBnh#@ájVb>T4\# {UiI,I'$R8.i9j@áV|zv*2y~MݼqyD*N ((((TPtV8a=飧 $Lި܊Ϊ2Yɑp)lD%QE'QEQEQEQEQERNXFX*R2R@unUZy|2:EH (QEQERNXFX*R2R@unUZy|2:EH (U%ٻUjX%x4)44iC!SЊՆT*TBrǎ;S= J*7e (VJ wVtRd<WVRG~K PT3ΨTv +0!n-|s:TW1@Nq\u OB(WVRgQ 8ARTnQEI喬f\%x52T<%2=*gQ 8DV8a=/CIȫl,@3_7g|f#+\r€C< YFsz*=F.6d0@e<(F B)h*6E?oc?j0ML!aUF%wE;zW澥b>T5[{oݓi(%RRݖTRxj͒;zX>UUfĒrM%R3 k6{ZE G@) m6޳_v;jȦqyQEIKjVb>T5VfҲbLGLf%ٻW(7F24`xV4jAvnPBr$b>gc5<\GGPT"am ogYmϽ9*C6CKVɈ՟-|}3:jgKz"r= h:BHƬ=iX>V4jAvnPBr$b>gc5<\GGPT"am xCR9R9Yd$$IE­ZÍVQBQ hay~MݼZz:r)\D/bQRq;zX>U4~sVVUZ(jJ;2Ygyx<ADS\G9~kZk#@sU;撊U%-ioX>E,/**(6,S\GZPZ(ViY1w;欭 '8P(ԔvdxxCQQ@sԴ׬Gʀ\XNI/QH(((((0zM1.NȊTUPg] (xEaWLE_D ,yLȬ0E8f2gʓTT򋋳 (@eUua _ gVF(&טyBQިRg>#P`ʓ'U,y` ~e˹2P:SvIrkF?3oϷ>^{9*=2^ocgog_rް. '۟z}Vdw6"+5ic ̀\⢖w\b!m74 aЊZΊw5+^*}s.Bږ|vwi KZ1~}tAP0ET==j-Nu^U<Ϳ&kwgw|N(8(((((((((QBQ ʫNX4m2zgn9Te}tq\u OB(WVRgQ 8ARTnQEIQ@Q@ZP]V_*LLғJiF2=]XeH"uD*,x3ДvP*O,d7p*gA/&OCua w,EP(C3_7g|f8FVEQ xв0=#T,zAR\l`Q0yS2+ 0PRTlemQTa@/3OB1'] (xD* fc=g`X`t"pPdV`yTXU DW%ʴQEIQEQEQEQE,P<U*Szɀ\UoaZN@unPiZchް2}sY^TTP`ͫ6K/#jV`>Wcm*c8x[S+coۃ*13}1寛1Ory=ۨd*zB(T :E 3z mϽfvwwj;ջC"1V(8br= J׬Gʀ\LUVLRKI4QH*XxCQQLq-59H$4ڵd7p(5NUdeͿ>Uk7ڮR:BÚ6ETh j13}1,f\4c(HΖE;zu OB+**I8PbKI4Pe)_ (_7qެm6ޜR!\!B%ɫ d|jϖn>y3=EKk6{շPT"Pth(6O3oɷ>CKZ-| KڕɈRryiC!SЊ,)am ( ( (^GUSFiJd| * jSWcm*G jeTFWw"8Y8Kj*(&2qwEb>T5[{oݓi(Te`>dnڳdNp9k#@sUhYd ֌~fߟn}Շ}w^ocgEkA2=Lʲp2eb>T5XĒrM%rŠ(@QEQEQEQEU'W@pÎ{  XjhshLΪ2Yɑp+AXa"}Sf9$Z+UQTa@t, 9+K ҺaqzTeD ,yLȬ0LɮO~wcm]XeH"ʓTTs*҃jETBrǎ;QqzWQ0yATNs&gUbd8Ȭ0U>rI-V€C< YFszV2tU T@2Ǟ{T̊ X#m]*x0:EEA(0 Xj M*X%x5Ȭ0YI(4)R4ՆT*TBrǎ;U (mY )İKIkA]XeH"szuΨTvU T@2Ǟ{Q(QZ S쿿Z[jUUF*WB0Þ;a ҺaqzTeD ,yLȬ0LɮO~wcm]XeH"}UEQ 5!uD*,xNXxв0BJVuQ b԰EɃrh.҉2P:ST4\!mBu^UZ_߹cVVɈ9ZY6VQ aЊϖE;z ?e&h3!k͡m*=Y^Q/#i՟Q"VL"`>Wc\YR)&ѩH Sc6sUjgdثETijɀv^UMҏϵR;pyG;BǠVj(^GfuR"VL"`>Wc\Y)&ѩH Sc6sUjgdضR;_7qެm6ހ{XUU}JGIsIT`t"XxCB4QAhE,/(RBnEET&{W+(pEY[@OqMtkF1m*=2gyx<ARÍ\kNh\w m6޳_v;,DQ(((((+U*qzhI&'ykSFX*ڿ1gLGPT"ua y)EFETYjAvnU΂_*LZ *AHrXC!SЊʫΨTv&IU%ٻUjX%x4RiM6h:B+ T3ΨTvzTnQEIQ@j@W]9M8i$dN@unUuQ Ϟ_6LMb$-Ԋ(8( VJ wVtRd<WVRG~K PT3ΨTv +0!n-|s:TW1@Nq\u OB(WVRgQ 8ARTnɑBQ Z +03:Ez:r*KNm)Q@Q@Q@Q@j@W]9M8i$dN@unUuQ Ϟ_6LMb$-Ԋ(8((((a<ڨV0d :M8h`Ȭ0U>3_7g|f8FVEQ xв0=#T,zAR\l`Q0yS2+ 0PRTlemQTa@/3OB1'] (xD* fc=g`X`t"pPdV`yTXU DW%ʴQEI_D ,yLȬ0B0d :KTzTlyZ`]WVIM~3 BQ aЊ)2+ 0V|yR`t<Ѫw 6Er\ET T@2Ǟ{T̊ #@áGFȧ_ gVF)b;4 #؂xв0Aa<ڦv @(F B(g{EaϞ/*LZ5Nu^PEr\ET T@2Ǟ{T̊ #@áGFΞ/*LQU{Ui}TAER3 ( (/a<ڦdV`2=H*6FtyR`t<^. Hꤦ (QEQEQE,y`TUPL"U#r WB0Þ; v @+*1& 0zMEVeETsIF*WB0Þ;P3ДbfC XjXa"`t"bdS/3֫j 1|ݝ}A< YFsz Q0yS;BǠ#@á="Eg&Cȭzp(db".U*N((((VogUTPt:0lfߓn}8Y $*ȦͱӚް2}sY^TTR9]YfVogYmϽ9*wB̲]d$̀\ջUimʔLY^TogUTPt].fm6޳_v;jȦ1yQEIKjVb>T5VfҲbXNIFaV|zZP(4tay_<Ϳ&qA.MjST5VG"4]\яϵVP]r:yN,llnEP({/s\lfߓn}5o;kVި܊^PtXYA.MX[&#p3V|w)X8xͩ,'**u OB+*0MA i*Ւ撈-8=Eh:BvK hT=̞fߓn}ȡP(-̧ݼWw"8*GMK/#j*E G@(FiJd| *I`ժww"iZchhG QE *ް2}sE29GdxyySQV(T :A({Y7"Y0+}1# +Vި܊ F14AoX>E,/**(0uf՛%w5+^*}sE+&8i&c6sUf\<}kS=(xCZEeRfU-59Ė$i(S&QE"((((:csިU T@2Ǟ{SGFBfuQ Ϟ_6LZ S쿿Z6$*Z  +eaXXf'W@pÎ{,@EZVhy|2:EE򓓻 qzWQ0yB7shLΪ2Yɑp+AXa"}Sf9$Z+UQTa@t, 9+K Һe ** fc=fEa,6ٕEZ/3֫j XPW]9D+eaBF:TW1UhT5\i&ZrjR;BǠͿ>Uk7ڃIϖ7V(^Gԭd| )*ںEZ)H*H#RR3 F B+*w4ѽSF/3UPp]\w7!i˩H Sc6sUj '>XŴ`t"r= J׬Gʀ\拑D-g_7g|fY[~sVVQranPeTxyySHʬi>V NQ EZ[&#p3QKzM+h#@áNl2y~MwB|ѽ׬ Ҿvww%#V0d :YUjli[r/3Dfߓn}?o}ij5H Sc6sUj c{hbp=MJLLb©ML"VX hmښ:Ӗv @(F B*כXE8A^N[)b;4Im6޳uHph y-H UE`>d"r**XyySR'r*SjȫCZ1~}<Ýc ʫW^ocgE/#i3*\U&{CY0+}1CA JhԤv @)~}^ocg3s[F B)j8Vd6s@B|ѽ_7g|fYdI$85aoX>3!k͡m*=Y^TTjo@VL"҂T咑H UE`>dsX[MȨ(+U2).#Fj(=Mzp(k#@sU,I'$+V(G QEQEQEQEQEU%ٻUjX%x4)44iC!SЊՆT*TBrǎ;S= J*7dȡP(-AqzTetTP[V_6LQR<9(fjAvnUZ |2z 3JM)GPT"ua yBRB(<(TPtV8a=飧 $L寛1NgUbj)3ck)C!SЊՆT*TBrǎ;PTdPtut 8LΪ2@FQq*^܊R/&GA}VAZP(eU'W@pÎ{ЍpIZuQ b96r2=]XeH"uD*,xJQQ&E G@)j'W@pÎ{,@eZ b PL'^ PT3ΨTv +0=;ջVFX+>y|2: D%QE'RNXFX*R2-|}SW1VՆT(&`u OB(E G@*TBrǎ;QqzCIZuQ b\H P2P:Sx0:Eh;{Mb".U*N* fc=fEa aЊZԌbdgO&CȨ>Jm @e<PpMXa"ʓVS`]Wٶ"+Z(/a<ڦdV`2=H*6FtyR`t<^. Hꤦ (QEQE~3 3"E0E-QF1Q3ʓTUju^UZGU%6QEŠ(( @e<(F B)jR1O쿿Z*(S|vwiF7+eaD ,yL PP <^T"jV(8 @e<(F B)jR1<^T"W <)a<ڨV0d :B5E6Ea_ gW)b;4Ι2**(T3aJm @e<PpMXa"ʓVS`]Wٶ"+Z(/a<ڦdV`2=H*6E?oc?j0ML!aT5XĒrM%)_ (Np9k#@sUhh+&/ܱ+d|hP]rz4c(HΖjBC3MAQE#(XxCR9S4UfĒrM%R3 ( ( (%w5+^*}sE3EViY1w;欭 '8P(Ԕvdx=j@#j \͍mϽg!֥3_7|bZ\ԬLGLfH QaK hg;zX>UȪ+&)%$J(fjlSGF mϽg!$֥SP[ٶ":s_`[@OqQK;z G+6,S\GZPZ(ViY1~g~Y[&#p3EѣGFt<\G).#փd*zYTVIĴ׬Gʀ\XNI)NRQE%w5+^*}sE3EViY1w;欭 '8P(Ԕvdx=j@#j \͍mϽfvwwj;ջMb!xh(((((a<ڙ:nnȡR/&OCEaϞ/*LAJ2P:Sx0:EE@VT֋ΨTvQAJn(FaEPE_D ,yLȬ0NLpͫeQR&CȨ9fQE!Q@Q@Q@,y`TUPczt\̪qz'] (xT(~ ,@S_U{hj T3ΨTvQqڲAER90zMh**(S:.jU_ut 8aڢ€4kB3iCWc[coۃ(*TДUb>gc5<\GnһF0d :KT|z'۟zgt'حzp*+wgw|R8*KMT@8c'dEEZk&pO1U*H#PT(HJ(EK/#jV`>Wc)tɀv^UeoX>kF1m*=Y^Q/#h"i>V NQ EZ[&#p3QKzM+EER3-Y0܊Y@ *ް2}shZ1,nP0Eg;z lr]JvKB3_7g|f<Ϳ&q.I Um JG`X- '8=0E-gE;zX>!mK>b;4d뚲̀\⋓ D_[v @(F B+>Y^TogkNh\w m6޳v rhamil>E,')һF0d :KYNp9k#@sN\q1|ݝ}eomwuY[@OqEɆ"/-BǠR;z "p=M#*J$TU`>WcX0ER!(DQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@j@W]9M8i$d-|s:TW1L\H P2P:S3_7g|f8FVEQ xв0=#T,zAR\l`Q0yS2+ 0PRTlyZ`]WVIM~3 BQ aЊ)2+ 0V|yR`t<Ѫw 6Er\ETEPEPEPEPEP T@2Ǟ{T̊ #@áGFΞ/*LQU{Ui}TAWQ0yT+U2ᢛm"Eg&Cȭzp)lDW%ʴQEI_D ,yLȬ0B0d :KTzTlyZ`]WVIM~3 BQ aЊ)2+ 0UOoc?jLt9QTa@t, 9OH PT3*(dV̖Y^Qj*(y_PmvNIKvZ[@OqQK;z ͫ6Z=̞fߓn}ȡP(-3卮e>vww%ZP[VRPtr2v rj13}1寛1Oq^mL`xgc5<\GGPT" Xx[C>(^Gԭd| *(T :KE8x[S+coۃ*13}1寛1OryyySZEP(GȨLLblmpwtjT5XĒrM%rŠ(@QEQEQEQEU'W@pÎ{  XjhshLΪ2Yɑp+AXa"ʓSfn_"*( ** fc=fEav:cm]*_ gVF(C*< YFsz Q0yEBdV`yXU(+QE NXFX* T@2Ǟ{T̊ GO]d8K<^T"pNϛp XjN(QZ <^T"RQHqzTeD ,yLȬ0TzT5ܩ b V|yR`thk{Ui_v;撑R\l+U2).#Ѝ(Pz5Nu^P׬Gʀ\XNIVG"QECU2vogYmϽQB|ѽ׬ ӈv rj13}1GR&*֪0d :YryxCATԍzp(k#@sU,I'$˭Z2,D)EPE(dLGLfqj@á,'(w4ҟR4ib;5YX>Vdw5"+5ic ̀\⢖w\b!m7"*N(T`t"կ8MyV\y'۟z%BI!tUm JG`X- '8=0E-gE;zX>!mK>b;4d뚲̀\⋓ D_[v @(F B+>Y^Qh}fy|2:6mR*(5QBQ Z +03:QFQq寛1Oj*ںʐEqEP(CNm)Q@Q@P(-AqzTe#( ?~wcm]XeH"a8PT"!U9c&sbdIQH ( (-Y(. YKIkA]XeH"y.Kd*zYU~yB16 (QEQEQEVU_ut 84tᤓi;ջVFX+>y|2:6mR*( ( ( ( ( (5QBQ Z +03:QFQq*^܊R/&GA}VAER3 ( ( ( ( ( (  XjZ0E4tᢛm"Eg&Cȭzp)lDW%ʴQEI_D ,yLȬ0B0d :KTzTlemQTa@/3OB1'] (xD* fc=g`X`t"pPdV`yTXU DW%ʴQEI_D ,yLȬ0B0d :KTzTlyZ`]WVIM~3 BQ aЊ)2+ 0V|yR`t<Ѫw 6Er\ETEPEPEPEPEP T@2Ǟ{T̊ #@áGFΞ/*LQU{Ui}TAER3 0zMEVeE3JI9j  +eazG`XJ1q2%/6LZ Rɀv^Uʤw.A< YFsz Q0yS;BǠ#@á~Ȭ0U>3_7g|f#+\r€C< YFsz*=F.6fUQRydEɃrkAQTa@Y0܊T5TTVE6kU*N"XxCR9S4Uf{oݓjް2}sEIGfK,/(w5<}KMz|j%$J( NRQE-ZÍfO3oɷ>PtXSwgw|UջUi#&ZÍVQBQ  mϽfvwwj;ջM!xh(^Gԭd| *(T :KUc8x[S+coۃ*13}1寛1OryWPT"3Jb&Y(. i(13}1X.O#V#d*zNdK_7qެm6ޜR\!\!B%ɫ d|jϖn>y3=E@8C!SЊBQ ,/GȨLLb ֥3_7|bXu.۟ju6{UGPT"IÚ6/#jV`>Wcm*G je ֌~fߟn}:T/N,llnEP(yqy~M]d$Ԫww"N":s_`[@OqQK;z G+6,P<Zɀ\UPtmLdяϵZJ%)yōS\GPT"3 \ɖPmvNTe`>dnڳaER32MY[&#p3EFeiryxCZEePEX{)'^*}sIbI9& 9KaER ((((*V8a=_D ,y4ta&gUbd8Ȭ0U>jKb0PQޕi]2~3 3"EWlʢ}UEQ ,(aʢQވ T@2Ǟ{Q`PY*1 ԫEj*(T3ax0:EEJ2(6_uD*,xNXQq}b\5YFX*ڿ1R&Aɢu6Mua y2€C< YFszgMN~M7'W@pÎ{,@E+Ĵk_[WVR"d950MД{:Sy|2:h2+ 0UOoc?jrI-V€C< YFszV2t +03:eQE8-}j*A^l=&F)ZobTBrǎ;U < YFsz Q0yH9ٔ(VEa_ gEKmJV€C< YFsz,9aWLER9`ʓ'ւʐEg&AɭEQ vṹ|gQ 8T*+eaD ,y"jSfPY+>x0:E3E\(`QEQEQEQEVUKiz53_7g|f59~sNE|&#T,zUTRx,D-0d :KYNp9k#@sE8[RϘn>;欭 '8݂c  aЊϖwE;z.Y7Lz|j߻'w\p"+5ic ̀\⢖w\b!m74 aЊZΊw5+^*}s.Bڅ$i)s4(@U&{UiA*AS.咑H UE`>dsX[MȨd;/r*eT+z| )h<-BǠ#@á,/(w4WchE,/)"r*(-Y0܊Y@ *ް2}shZ1,nP0Eg;z "r= ;y41|ݝ׬Gʀ\omwu "V*=z| *)gyx<AEʖ"r*(-Y0܊Y@ *ް2}shZ1,nP0Eg;z "r= ;y41|ݝ׬Gʀ\omwu "V*=z| *)gyx<AEʖ"r*(-Y0܊Y@ *ް2}shZ1,nP0Eg;z "r= ;y5Nu^P׬Gʀ\XNIɭZ2,D)EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPgolang-github-yeqown-go-qrcode-2.2.5/assets/example_fg_bg.jpeg000066400000000000000000001416571521051213400244050ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?j(L ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<.7k[ye._wms:+W?u;+{~Cc_:(W??u;+{~Cc_:(W??u;+{~Cc_:(W??u;+{~Cc_|7/_[c0V*W绂fkZ׾;W]9v]ozַK5̳/rm^O?'ӯQ\:Q_4}8QX>$_0y7hƯ=n煍^T}mo~yEptWOO?'/NyEptQwWEc:+^c_:?sc2oQ^{άw{+7t((((((_{~OX(?y~?^X(?y~?^X(?y~?^X(?y~?{͌ɾFUyo/;w:YkƏޢ+=Т((((x{^|S8]|@o|9Z`TvH4g^j5vV#7O\?/W4V#7OG AOEo7OG#k࿟W4V#7OG AOEo7OG#k࿟W4V#7OG AOEWykz|7/_[9_>&qa\w=?t8nk+^ '׾˹Eo7OT5-7??Ìcs,5itv;[,PR6KB(Ӏ(I?"?'Z'#3p??˯V _Ե/+^^s{{U NWyhWJ7t o^c(ekXl|Mom_Eo7OG#OEo7OG#k࿟W4QEzGoxo^ַu/7^f1{I?",[*tv^ge4J_{Otȟj?׭rN߻kuіe |To~37/_G#M83ZfYTۣ̳C#dv~e(X$O֣Otȟj1<ğ[0ӿݻJ?ׯoi֯w~[3k4%k;[=уEo7OG#O[{z?^?o瞵͌QQ U[-ՂWW#XFwOun{z?'ZI?"'p??7L(($O֮>&7rq0ҵ ':O_u/7^^s{VM:#dQӕ_+8:(I?1 *hycsگ7O\U,5u%frUx*t4V#7OYk࿟iOEo7OG#k࿟W4V#7OG AOEo7OG#k࿟W4V#7OG AOEo7OX5ӇQJNlN 6گ+{[l/97>7Š((((:+yO?u7/_X5zZ)4yy7>7Š((((((OM `o^ַs$}MŠ(0°|I.?[ՃOuJ|&y_0hc((뼯w{B(>(袊$(+!?~/(Š((OM `o^ַs$}MŠ(0°|I.?[ՃOuJ|&y_0hc(͏ӂ(:+yO?u7/_X5zZ)4yy7>7(OM `o^ַs$}MŠ(0Š((((:+yO?u7/_X5zZ)4yy7>7Š((((:+yO?u7/_X5zZ)4yy7>7(OB((7/_X5zZs)4zy7>7(OM `o^ַs$}MŠ(0°|I.?[ՃOuJ|&y_0hc( `o^ַs$}MŠ(0Š(((OM `o^ַs$}M¸:+K<#_?+{[K7rGC3z(>(((+ğX>$_O(}g(>(8(+:^/#_?+{[K7rGC3z(>袊$?oVkz'7}G0l+:{^|S?u(>`((?oVkz'7}G0l+:{^|S?u7/_X5zZ)4yy7>7Š((((:+yO?u7/_X5zZ)4yy7>7(OB((7/_X5zZs)4zy7>7(OM `o^ַs$}MŠ(0°|I.?[ՃOuJ|&y_0hc F!o^?l~/nߏ1zEZMԨF(ASV$?ս\z6'>ǏkὟ{輻ӧDQ ':O`^F ?g ':OӧDV d`8C=?oQ_7_47?Ìc>~+i֛QݳPMY F!zbpT16ѽ#M83W+fXtJ/2ahMT5(;I?"?'Zh'Ow MԿ,:XԨ6QEpX>$_'zyG></4QE}yEW KRuocǷP?'Z˯V }N[aRn<3PJ9Y+t] ':O`Ez|5m_8{i^h@  oxo^ֹ)4tLޢ+8:(I?177/_[ՃzZޯgy7> 뼮./]|@+ ( (77/_[ՃzZޯgy7> 뼮./]|@  oxo^ֽ,/^M( ((((x{^|S8]|@  oxo^ֽ,/^M( +((  oxo^ּ/M( +{X>/w˲s{ֵ_{f_Ry[;'`^&h罼qhJ((8(˯V {<4cWsV*>c+DZsG_wc(X?{8:+?\:(W??u;+^&3jҥ{{,OhF{QEuQ@Q@Q_Kӿ=?>(iUV=#F(:˲s{ֵ_{6e}K[mo'+ğ[K;;y_으o{[]w0h?wsB(>'`?+(rgg?~H(3|~Oeoy^[t]7/_[W~FT-?;=Ij/ko+w (38:(I?177/_[ՃzZޯgy7> 뼮./]|@+ ( (77/_[ՃzZޯgy7> 뼮./]|@  oxo^ֽ,/^M( ((((x{^|S8]|@  oxo^ֽ,/^M( ף{z|'ף{z?_?lw~++{{z?ף_ ' =?_t7f1eaaNݺ>2U TjTU袊c(OM `o^ַs$}M¸:+K<#_?(C((͏ӌ˯V ox]Ұk(|6|&s?䂻뼯7=N/(Š(o^F!_?>0?oV6֏I?"`c+Jg[X*%8foQX?ӧDQ ':Osdc_uloQX?ӧDU7Rug9Ϸe[-уR6K ^j9]'E(N(jZ3~=$?G-ւN7O[3ЛRVk\oING#w̿O-׵f`ho^o3~?}L2VJ9]t}בYbbRl̿EWXV$?IN^F7?gx]Ұk{Fw?{~XG#ptcB5fx8|myb0愭gtVg0kF!?'ZQ{ݙՖg7k[{~ޢ$O֫nُsoj+e0u*Fy=9:r~OQEpEW'&kz|7/_[9_>&qa\w=?t8nk+^ '׾˹Eo7OG#k࿟x?W4V#7OG AOEo7OG#k࿟Wkzio3~?}|eZ2M;~H̲acNWW]pu~oxo^ְk{fS~ho|&oQE݅Q@Q@Q@Q@puW_K1oxo^ְk{fS~ho|&oQE݅Q@Q@Q@Q@Q@Q_?oW~H?ͅpuW^ϗy|G.QEQ@Q_>$_'`PlL/wy^o˿z9/~_QEGӅQ@Q@>$_'`PlL/Q^oxo^ְk{S~ho|&oQE݅Q@>$_'`PlL/wy^o˿z9/~_QEGӅQ@Q_?oW~H?ͅpuW^ϗy|G.Vk7/_^o?/&~fQ_}EIzZެ |No?䏻ɿaQEQEQEQEQEW]pu=/>_G.Vk7/_^o?/&~fQ_}QEQEQEQEW]pu=/>_G.QEQ@Q@Q@Q@Q@Q@Q@?oW~H?ͅpuW^ϗy|G.Vk7/_^o?/&~fQ_}EIzZެ |No?䏻ɿaW]pup~oxo^ְk{fS~ho|&oQEݜQ_?oW~H?ͅpuW^ϗy|G.Vk7/_^o?/&~fQ_}EIzZެ |No?䏻ɿaW]pup~oxo^ְk{fS~ho|&oQEݜQ_?oW~H?ͅpuW^ϗy|G.Vk7/_^o?/&~fQ_}EIQEQEQEQEQEQEQEVk7/_^no?O&~fQ_}QEQEQEQEV#EuaR?S0ף{zޢ/9?0ף{zޢ|o 3{z?׭(???0ף{zޢ|o 3{z?׭(???0ף{zޢ|o 3{z?׭(???0ף{zޢ|o 2g7qgޯEp֭:u*;wQ T$=?oQZR?S,N &7ڿo^moV?++c+Fy^u_1**a8fӧDQ ':O`^F ?g=?CQOCM83W袸kVi;х*tՒ 뼮>w _o,cWV t+|ӡ5RF$?INX4WF ?gw;AEWy7RuocϷ_?'Zh*nJ~o9*:r^KI?"o^k#1_{׿]mݞ[ |[mnﵻ#{zo|cW[2փRWOQ0&SQEpEW'%7RuocϷ_?'Zh*nJ~o9*:r^KI?"+L>6eJE_u/7^f1{ +ZaZEt̨֝ ݚ7$O֣Otȟj0_;q/ (#77/_[ՃzZޯgy7> o^l>2VtpT16ѽ#M83W+fXtJ/2ahMT5(;F!o^O_#'o^F!z?/l~/F!o^_ 'o^F!z?/l~/F!o^_ 'o^F!z?/l~/F!o^_ 'o^F!z?/l~/F!g7qgޯYV̱5ԕ_iG,КN6kQEwQ@Q@Q@Q@Q@V?+hҽW9qPk^czo^X(?y~?^X(?y~?^X(?y~?^X(?y~?뼯71˾^m[}w[%+ğX>$_(}a(>(8(˯V {<4cWsV*>c+DZsG_wc(X?{8:+?\+ +{^&39iR佼pY'hF良뼢:9>w/V(?y~?^X(?wsN'`׷}fj;7 j{QEtEzZb>FUm{5F\+X{8:({X>/w˲s{ֵ_{f_Ry[;+ N3&U罼gY>׾cz( B('`׹ɾF5y/;w<,nwjkk+;+y9?u;+ 63&U罼gY>׾cz( B((+O.˾Z}fe}K[mo'(7/_]8̛eWsfh;^(3 ( ( ( ( ( 'oV?+?ag?3~h+폄 +{{z?ׯ7_#'ף{z?_?lw~++{{z?ף_ 'ף{z?_?lw~++{{z?ף_ 'ף{z?_?lw~++{{z?ף_ 'ףOtȟjsQ{ݙew{^_7ğING?nҹx::ѯ^6Vw:9Zld`[C=?{/6;?f ':OӧDWdc_}GAOuJ~ٟsoj_Sѝ4iVj>O3 T$W]yC.p~ECRԿyX1_?FMSUBJI?"?'Z18p??0hF!o^_# `ȽOn=h?'ZLf2Ѝz-{>"\.fpu ':OCN] [yn^_9s/S{m٘4V#CR81^ Zj9]'G[,PR6KB(Ӏ(I?"?'Z'#3p??˯V _Ե/+^^s{{U NWyhWJ7t + ?`kܧLޢ+8:(I?177/_[i3~?}$?ٖ[Jqv/32 C u%f~Fpu ':OCֹw's}o浺{~2>_{ܷK^ݙ[{z?^?o瞵ӌQQ U[-˂WW#XFwOun{z?'ZI?"'p??7I?"?'Zo~+g '`?nҏF!(ƅyZkuߥq*a Zlt`[C=?tk࿟rcc_`ho^msc1qeB7ldu`UUG[ޢ$O֣Otȟj?1=+Otȟj?$O֣#0?ޢ$O֣Otȟj?1{Otȟj?ׯK.oַ]}^e |To~37/_G#M83ZfYTۣ̳C#dv~e(X(((((˯V`]ҽ<?ɞfs?(C+cࢊ((((((x{^|S8]|@  oxo^ֽ,/^M( +(:+]Cs^P˯V`]Ҽܣ?ɞs?(C+cğ[$_|?͟ O :+wS? 'oV?+?ag?3~h+폄 ( ( ( ?`kܧLޢ+8:(I?1 ( +o>? 'oV?+?ag?3~h+폄 (77/_[ՃzZޯgy7> ( 'oV?+?ag?3~h+폄 ( ( +o>? (hp(((((((((ğ[$_|?͟ O +<  oxo^ּ/M( +(:+]Cs^P+揧 ( (0|I.?X5OuJ?ܡ_ (# ?`kܧLޢ+ ( ( ( 'oV?+?ag?3~h+폄;(6?N ( 뼮>c ?`kܧLޢ+8:(I?177/_[ՃzZޯgy7> 뼮./]|@+ (;(6?N ( ( 'oV?+?ag?3~h+폄 ( ( +o>? (hp((((((~ߟ1ozX>$_춌+bcNw֝ ,SvjߚI?"?'Zh'?w (>'`?+(rgg?~H+{{z򹳜el7'~]άC=ok[Wo^o3~?},Mh:u%tEG,КN6kQEw?C=?oQ^7GO=?Ck__?C ':OoW^] <[mn[<9~^ok[{f$?MԿg#{Fw?{~XG#xo^ַc+`J Z e_X*b#9^ld`7OX5W^Mϱx*ogck.[?tS~hɿߡEWv`ING$?ՃE}F ?gl㿟_unُsojX>lʌ(eNVeiƥGvI?"z:ɰtq<78sm|72}s{Otȟjj_W,8WQpfS|l^I]?%AEWioING$?ՃEy/_;F$?INX4QOl㿟_oINX4Q]8|5m_km{m7/_X5zZܧӓC3z(>o^F!z/yX>$_?z_|ܽ-mcd{e۹EwQӿWEV +뜾~kӖ_Ry_;+ ׉ɾFUyo/;w=w{+7t(_{~OX(?y~?:+DZp9>w{X>$_GGﶻYvٿٟ|ܽ-kM7?y~?(aW??oV?+n^nou۰ifrr}v+|noYy}^[]7/_X5zZ3)47>7(XsL `]Ұhkk]g'/7/[k>:(K.˾^m^e}w[o%(7/_]8Gըʭo͂}fh׾+4WyEx;O'EwQӿptV?+#4cVֿoWp+ ?`\?hʕՂZkZ+^'O?'ӯQ\:zZޯiRW='4#Zֽ(:|I.?[ՃOuJ|&y_0hc(XsL `]Ұhkk]g'/7/[k>^X+ğEtoV^{\nw{k; ( +oa{0|7/_[ՃOuJ;Gv_ٟ으ܽok];袽,.7{ۥyye_wo`  oxo^֌/M( ((((x{^|S8]|@  oxo^ֽ,/^M( ף{z|'ף{z?_?lw~++{{z>2&WsbpUѵ~[?sfS~hɿߡEWvptV#7O_oW4V#7OG AO]`7O[g88Oe+I6OuJު~ٟsjkB&5*;%ɝٝʝ5vף{z|'ޢ+0|I.?X5Zo/f9=#9ne:W#<_*tv^f =?`ׯQJO ?`7RuocϷgQl4Wnߚ5+B*5*;%ɝm ':OӧDWdc_}gFQ^a>$_u-7C?ÜC{z2QFIY}ߑyYJqv/3o^k(o{zW[FUoxo^ְjg7g޳̨ζT髷o啡Cζ?'ZI?"忲1>g#z?'ZI?"'?p??˯V oNGv(o^2hWZ]l,F<ЕlF =?CO G/6;?f =?PԴ+f1{ִs,5itv1T T_P+ +{{z?ׯ7_#'<7/_[Ճ"$_?ɜ_0hc(͏ӌ˯V u~ٟsj=?}N[aN><,WJ8;u]Eo7OG#OEo7OT5-7??Ìc Zj9]'FuU:#d(8(͏ӌ˯V u~ٟsj=?}N[aN><,WJ8;u]Eo7OX5q7RSk7/_X5zZܧӓC3z(>((((+:^/#_?+{[K7rGC3z(>((+:^/#_?+{[K7rGC3z(>(((((((+:^/#_?(C((͏ӂ(:+yO?u(>`((?oVkz'7}G0l(L+ğX>$_O(}g(>(8'`?+(rgg?~H+x]C{B|I.?[ՃOuJr|&z_0hc(͏ӂ((|I.?[ՃOuJ|&y_0hc(͏ӂ(:+yO?u7/_X5zZ)4yy7>7Š(((((|I.?[ՃOuJ|&y_0hc(͏ӌ˯V ox]Ұk(|6|&s?䂻뼯7=N/(Š((OB(뼯w{B|I.?[ՃOuJr|&z_0hc(((7/_X5zZs)4zy7>7(OB(뼯w{B(>(((+:^/#_?(C(( `o^ַs$}M¸:+K<#_?(C((͏ӌ˯V ox]Ұk(|6|&s?䂊(H(((͏ӌ˯V ox]Ұk(|6|&s?䂻뼯7=N/(Š((((((|I.?[ՃOuJ|&y_0hc(͏ӌ˯V ox]Ұk(|6|&s?䂷$O֬+lm|5}_ ':OӧDV O ':OӧDV d`8C=?oQ_7_?C=?oQG7AO=?ӧDVpue{ﵻ#̿35voINT5-KCח?ŜBj3U)y2VkPFW?C KM{oǿuOuJ[u%tv~GZYT5n0hŠ( `o^ַs$}M°׭+8 Mom=?PԴ+f1{[X>$_[-̱51RWNgxYJqV3(>L?'ZI?"0_=?w cCzZޯ*%h-u~{`chG4{K-=?CO=?PԴ+f1{[X>$_ܷ2ƝI];]ZYT5n0hI?"?'Zh7#3?ߖ:Q=?1:ҡBVhWw= 6qNW[;t?CWVO (N((((((˯VՃ}Zj+7hJ{k]?x_=?Q_4}9OuJ0yըƗ%~Dž>^Um-nEwWON/O'EwOuJ?Y\ܓ%[^v`EQ\/w+=0˯VՃ}Zj+7hJ{k]?x_=?Q_H|zZެ |No?䏻ɿaQEV?+z|I.?^Q39qF Q_l| Q];O zZެ˯V ?|ܼ-}`d{^g߹Q\:`]Ұk{ggsr{KOkkn QGN ]?=?>'`Mv/N^n^}y^nc}O޽[=L27nKQEQEQEQEQEQEQEQEQEQX?ӧDQ ':OzWgFCMԿ$_Otȟj?a#w厕`uu^mvym m a札efwe0hF!o^|3o^F!??0hF!o^|3o^I?"G-{[{vgg7k[{~ެ˯Q ':O0ӿݻJ`Fx w[hchK4k+5[-Eo7OG#k࿟x?W4QEzGoxo^ַu/7^f1{I?",[*tv^ge4J_+Otȟj?$O֮/o~++Otȟj_o,9e0u*Fy4kS+ȿEW V$?IN^F7?gE`ING$?dc_8$?7O^] [yn^_<~r-{[{vf oxo^֏F!g7qg޴̳,5l4ӕ۷Gyef**5*F_QE|EW'&kz|7/_[9_>&qaE ':Osau7Q?S7I?"?'Z19p??7I?"?'Zo~+g#(>?oW%_o,cӧDWfYn&&U)۪Ϭ3<- ,iԕGV$?ս^N#[ ok_=66&W?+ğX>$_?ɜ_0hc(͏ӌ˯V u~ٟsj=?}N[aN><,WJ8;u]Eo7OG#O[{zo|c2VJ9]t}בߖeԩ%~/E ':OӧDWOl$_ߖ:Q=?{x$_'`PlL/wy^o˿z9/~_QEGӅQ@Q_?oW~H?ͅQ^a`]ҷğL34`EQ_Q@Q@`]ҷğL34`EQ_Q@Q@`]ҷğL34`EQ@Q@Q@Q@Q@Q_>$_'`PlL/wy^o˿z9/~_QEGӅQ@Q@Q@Q@Q@Q@Q@Q@Q_Q@oINX4W6#Gok:kZS{Otȟj?a#w厕[7*#iwn[3ckk4%{%K=7OG#Ex6?f#7O[Qc``7OG#E6?f#7O[Qc``7OG6ַğӃVV EK=ˍPP#Ywown[0?'ZI?"0_<w I?"?'Zh#0?ߖ:Q=?1:ҡBVhWw= 6qNW[;t?CWVO (N(+{X>/w+=0~ٟsjEkFTѕj0Nf#7O[Ww7G6?f$?INX4Wd`|;G[_o,9zZޯ̨Ž&T%oYV|,jTwn ?'ZGc{[c;{?c+^yw7$O֪~ٟsojE} Fj8ٯ7gUԕ_QEv$?INX4WOl㿟_unُsojX>lʌ(eNVeiƥGvI?"z:ɰtq<78sm|72}s{Otȟjj_W,8WQpfS|l^I]?%AEWiQE_t7^sUF!?oWfY&&T[켏2-|,jTۿW?C wvMϱa{Q^Q@ӧDQ ':O`^oF ?gRԿVk̲54SWyYN.ޢ+召 ( ( ( ( ( (˯WVѥ{_rq?V*ֽ^O?'ӯQEzZޯZr^~W{,4#[ZvptWyEs?upuzZެ˯Q]wnn^}WEc\Ec1Y*ǻ}Zh;puQ]9vc>ov[m'̲ܼ߮}V?+?Y\7$ V4QE{gWyE|N`o^ַğGw_7/7K_m7??9yz׾YwEzYv]>ozKm7,뼾/-{y.EWyEPEwW?}?O&kz|I.?X4ghrt{݃K3{뵟~y\WeS{t}/2̾߭QEzGQEWyE|NptV?+#4cVֿoWp+ ?`kܧLޢ+ ( ( ( ( (I?"m 5}X>$_Otȟj?a#w厕`uu^mvym m a札efwe0hF!o^|3o^F!?? Pt7f1lʴ+beRveƝEf+ 'oV?+?ag?3~h+폄 +{{z?ׯ7_#'<7/_[CM83W*ЭJnGegC u¸:+{zɱpV8s|O1}Ws7/_G#M83]e:rv#,1T1QR6JWg_+召8:+{{z?ׯ?Olw~++{{z?ף_ '׭3eO'~]{$W{Om^y (~ߟ1oz(ѝit=աBGdV$?IN]W?8V$?INGF7?ax]Ұjhy_gڨWgG uϓB*U)oV##G ok+_2`oc{oL?C"gkeNݺ>ȡEWԟ&wV$?IN_O8?+Z/f9=}N[FtpѧQYl<δ+RvQEo7OZb1pC,6 &7ת~ߟ1zΎe5Nߓ#Zf*J^kQEvyE`ING$??Wwx]Ұk{Fw?{~XG#ptcB5fx8|myb0愭gtVg0hF!o^_?90hF!o^|3o^F!??7I?"?'Zo#3?p??˯V _Ե/+^^s{{U NWyhWJ7t o^c(ekXl|Mom_[{zo|c#2̰հҧNWnu{fYJW?2Q_,}`QEQEQEQEW]pu=/>_G.Vk7/_^o?/&~fQ_}QEQEQEV?+z|I.?^Q39qF Q_l|!QEpQEQEQEQEQEQEQEV?+z|I.?^Q39qF Q_l| QEQEWy\w|C.9/~_V?+z|I.?^nQS9qF Q_l| QEzZެ |No?䏻ɿaW]pup~Q_H|QEQEQEWy\w|C.9/~_V?+z|I.?^nQS9qF Q_l| QEzZެ |No?䏻ɿaQEQEQEEIQEWy\w|C.9/~_QEGӅQ@Q@Q@Q@Q@puW_K1oxo^ְk{fS~ho|&oQEݜQ_?oW~H?ͅpuW^ϗy|G.QEQ@Q@Q@wy_7?OßQ_4}8QEQEOuJ˯V }QτߧWy\wß`]ҷğL34`EQ_Q@puW_K1oxo^ְk{fS~ho|&oQE݅Q@>$_'`PlL/wy^o˿z9/~_V?+z|I.?^nQS9qF Q_l| QEzZެ |No?䏻ɿaQEV?+z|I.?^Q39qF Q_l| QEzZެ |No?䏻ɿaW]pup~oxo^ְk{fS~ho|&oQE݅Q@>$_'`PlL/wy^o˿z9/~_QEGӅQ@Q@Q@Q@Q@puW_K1oxo^ְk{fS~ho|&oQEݘ?C=?oQ^7GO"ǏkὟ{輻ӧDU KRug9ǷP[5Rlכ3kfxtJ/ (N({X>/wyO/ _o,cWV t+|ӡ5RF$?INX4WF ?gw;F$?INX4QOl㿟__Ե/+^^s{{U (4aF 5dէ^nGv»뼯w{B(>(((((+:^/#_?+{[K7rGC3z(>(_{~OX'`E{xV (|~OӖ]ymv8:+?S\(X?{ +{~Cc_|7/_[c0V*W绂fkZ׾;Q\PV?+z>Z5m{\n4%Fw(((((+ׯs&QsYZ|O1}Ws7/_G#M83]e:rv#,1T1QR6JWg_+召8:+{{z?ׯ?Olw~++{{z?ף_ '׭3eO'~]{$W{Om^y 'oU KM{9ǿp嵡GΌeNvQ[C=?}O Gcc_`[C=?/6;?f =?Ccc_`yX?C ':Oy(Sokon2L߻ku}V$?IN^oF7?gE`ING$?dc_84QE}kz|7/_[9_>&qaE ':Osau7Q?S7I?"?'Z19p??7I?"?'Zo~+g#o^F!?_?>_3o^F!??0hF!o^|3o^jZo3~=Z9:r~Oeu*Fy(QEpQ_>$_'`PlL/Q^oxo^ְk{S~ho|&oQEݜQ_M<{19sW׮*ٖ:^O9f*Jq~k+{{z08)^޿'_ om_mWQW7CÜ>խjУRFThμ:j(F!o^_?;0hF!o^|3o^F!??0hF!p8)^޿͉W[FUoxo^ְjg7g޳̨ζT髷o啡Cζ?'ZI?"忲1>g#z?'ZI?"'?p??˯V oNGv(o^2hWZ]l,F<ЕlF w=?ӧDW6c 7(OM `o^ַs$}M¸:+K<#_?+{[K7rGC3z(>((+:^/#_?(C(( `o^ַs$}M¸:+K<#_?+{[K7rGC3z(>((((+:^/#_?(C((((((( `o^ַs$}M¸:+K<#_?+{[K7rGC3z(>('`?+(rgg?~H+x]C{B|I.?[ՃOuJr|&z_0hc(͏ӌ˯V ox]Ұk(|6|&s?䂻뼯7=N/(Š(((:+yO?u7/_X5zZ)4yy7>7(OB((7/_X5zZs)4zy7>7(OM `o^ַs$}M¸:+K<#_?+{[K7rGC3z(>袊$(+!?~/(Š(((((:+yO?uo/f?9}oxo^ֽ|ʴRVa_uӿ{z?׭+念/>3{z?׭(???0ף{zޢ|o 3{z?׭(???0ף{zޢ|o 3{z?׭(???8:(C{X>/wyO/ _o,cWV t+|ӡ5RF$?INX4WF ?gw;F$?INX4QOl㿟_oNGv(o^ xeliP+Al{ݞ CB8Dy+ݭYlF!?'Zyr7dr_Ow{Z߻7$O֣Fw?{~XX5zZ`ʽkgۭckk4%{%K=7OG#Ex6?aEWze KM{9ǿPo^9&:r^K fJ~oF!z+o^F!z/O3 S$QEv[?y_=<?ɛQE|Af#7O[Wc`Pt7f1(էZnGv4aB 5d:+yO?u麗3~?}´:;FMTѽ ':OӧDV OQE`QEWy\w|C.9/~_QEGӅQ@Q@Q@Q@Q@puW_K1oxo^ְk{fS~ho|&oQE݅_K :GO?!ӯQ\:k}Z^vu`׍gk[_EW{EW'&kz|7/_[9_>&qa\wץ_˯Q[oUv<,5F\+X{8:+?\Ec1Y*ǻ}Zh;puW^ϗx\G.Vkѕ+sb~^5{_O^X(?y~??oWZ^+ k^|Q\tw9Z/c2̾s_wWEz_ZUmkwѽ}~w 뼮/]|@  0Y*W煂ZkZ+^'O?'ӯQ\:$_?oQ]?n^n]W^]sݵv<-/~oVkaFTkl'Z׵X(?y=~?^X(?y~?:(K.˾^m^e}w[o%(0((( xեKcdY׾sGwcDZs:?sc2oQ^{άw{+7t((((+:^/#_?+{[K7rGC3z(>袊$((+{[77rGC3z(>袊$?oVkz'7}G0l+:{^|S?u7/_X5zZ)4yy7>7Š?'ZI?"'?p??7I?"?'Zo~+g#z:?'ZF!˿;~5kkGŸ/=[ߥkonף{z_?,0RVjwoW[ӧDV wd:nk^ݼ6'^׾˸QE_t7^sWZ(Ԩѣ:T髶Pף{z?'ޢ$O֣Otȟjo~+Ϩ?ޢi/f?9}p֣:3t+4wQ U)yX?Cׯc({wx '׾˹Eo7OT5-7??Ìcs,5itv;[,PR6KB(Ӏ(F!o^|O0?oV6֏I?"`c+Jg[X*%8foW[ӧDQ=?tw2>_{ܷK^ݙEo7OT5-7??Ìc̰զӕxU:#d(8o^F!?0h~ߟ1z]kBJn5΄:V##G ok+_5`oc{oL+{{ziW|cXjT?5bAԩ%̡EWiQEoxo^ַ_#o|6y\z\=/>_[?zY_<?ɛQE|AaEPEPEPEP\w~q[?zY_<?ɛQE|AgEW'!EPEP[?y_=<?ɛQE|AgEW'&kz|7/_[9_>&qa\wץ_˯zZ ץOɿߡEWvptQE~~bQEW]|˿}?ߗQE|EPEW'!EPEP[?y_=<?ɛQE|AgEW'&kz|7/_[9_>&qaEWzaX>$_'zyG></4QE}yEW?+I.?X5G>>9~A]puW?ߗOuJެ˯W3gуEWwQE~l~`]Ұk{ğ_oC3$W]yC.p~X>$_'yG>=L/4QE}EPkz|7/_[9_>&qa\wץ_˯zZ ץOɿߡEWvQEQEQEQEy\}/ϗ|˯zZ ץOɿߡEWvptQE~~bQEQEzZ כOɿߡEWvptQE~~boxo^ַ_#o|6y\z\=/>_[?zY_<?ɛQE|AaEPEP\w~q[?zY_<?ɛQE|AaEP?+I.?X5G>>9~A]puW?ߗQE|EPEW'&kz|7/_[9_>&qa\wץ_˯QE}!EPyEW?+I.?X5G>>9~AEWyEPEPyEWEPEPX>$_'zyG></4QE}yEWEPEPEPEPEPEPEPEP\w~q[?zY_<?ɛQE|Af#7O[Wc``7OG#E6?f#7O[Qc``7OW7?Ìc>~ʶeN#J9fJq^oŠ(袊$?oVkz'7}G0l+:{^|S?u麗3~?}´:;FMTѽ ':OӧDV O ':OӧDV d`8nhycگkz[2 8S$}fYZuQݻl+{zޢ+ak~ Mom=?/ǟ۷Zެ˯WVV EK=cpT0T%ǖqۭ?$O֣Otȟj~/g#+0|I.?X5OuJ?ܡ_ +!?8s^P~ߟ1ozX>$_#- ؘӨ&{iʥ7f?'ZI?"~/ϓ?(0?oVkz'7}G0l+{zޢk)ZӉPFW?C KM{oǿuOuJ[u%tv~GZYT5n0h(͏ӊ~ٟsj=?oQ]s,M*td-y#v?C=?oQZk_gO=?PԴ+f1{[X>$_ܷ2ƝI];]ZYT5n0h(͏ӂ($O֭ɰtq<7<,_ {E?'ZjZ/f9=r5f;[3WRWOQEpӧDQ ':O`^oF ?g麗/f?9}`o^ַ*0:j[Ge_ ۿŠ(((((((+:^/#_?+{E{x?hʕ`?VֽyEptW wWEov[m'3,뼾/-_{yEwWӿptWyE;O'EW0oxo^ַ_#o|6QEyOuJެ˯W3gуEWwQE~l~`]Ұk{ğ_oC3$W]yC.p~X>$_+>Z5m{w Qm~w8:+? \(X?{0|7/_[Q^&3ҫk_{,7ըFkQEpuӗe\kt]l2/~OV?+7/_^ww_77/K[}79yyYv`]?=?GO?!ӯQ\:GO?!ӯV?+V4%GwQE{gwWE|O?'wVkzLfեJ\pXЍkZ`yO ((({\c2o֕^{_wZh;뼯1˾^m[}w[%(L(((((+ׯs&QsYZ|O1}Wso^F!?0hF!o^|3o^F!??0hF!o^|3o^F!??0hF!o^|3o^F!??0hF!o^|0?oU 7M{oϿ_̫B&U)oYQ ,iVj (N((ף{z|'<7/_[CM83W*ЭJnGegC uŠ(+ğT5-7C?ÜݖօLjTvJ83:3:jG%Eo7OG#?/'OEWv`]ҰkԴ+^s{UF!r G u%f~Gyf**U)۪+{zޮ,G{_s$W{Om^y (3 ( ( ( 뼬F!ɱpV<,_okU =?_t7f1neaaNݺ>2U TjTU袊co^F!_?>3o^F!??0hF!o^|3o^F!??0hF!o^|3o^F!?? Pt7f1lʴ+beRveƝEfo^le7?n}_okUף{z_?<lw~++{{z?ף_ 'ף{z?_?lw~++{{z?ף_ '׭3eO'~]{$W{Om^y (3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?golang-github-yeqown-go-qrcode-2.2.5/assets/example_halftone0.jpeg000066400000000000000000002172441521051213400252150ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((+ (+ (+ (+ (+ (+ (+ (+ (+ qyVO{Q@Q@V~'ypo3g=EhQT[MmK-/W(Z̲lTq*V4Ķ%ѡ')$r_Ĭ AVQEQEQEQEQEQX,ޙy%4Kc '# uoż9#`FApA椠(((*g%|#Ee$+/M.5ӪhnV 2Bq}jPEe^%tk56v@DrF@b2ϱ7zwp]ɝA G@(n".4H&gbpI(((((+ (^ ԼyͥsC0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x))Or\Ҥٽ Bs Xw7jEE_0WC²訨((u; ??v=㧂|E ?eGۻg;[t YK5(gݮERp6oZ( x[Yo,5?]I<ʞjI1:(>Xg~2//2P\r4TFAkz((((+>$.fAs uaހ6(u; ??v=@%{]'; ??v#',]K\xn:lH :@?<^k]ծo IX0LzV.߇0(v<$?~Wn@>tyCI\oJ ?%q (]?a+7\/^ Í[Iu_Oq}dݶdc O&p=#৊to\%{¯p;]cP#Jآ ( ( ow:@%{]'<*擦ͬ6:]FGoHHPA8':+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƫ` F^?^8C?'>(((((+ J`?lU=CRب( ( ( ( ( (<ow:$](@jEE_0WC²訨((` F_O=CRث(w-}[o7CnWv<8ɯp+վxWYoKCYYn$c 385QEQExş:UkvlKd Q0b]F0{%4w?߉0n~& 5RTU`x&>?ڼ۶En: (  :$cWvNOrCҤ߱Bs X]?wmݻwr8ɣB?Ci>w븭ݻopg8ȨmJmgY.5K0Bv,@'>'RFluKu5pAGTC!}Gϲt{8^?^⟍~$w.;-*;[62Gjz(+4/of OH|7mqg>SIF6KE ĀgPA ccW+۶6^DžIyk%ծ:r2Aǽw¿:myX;n1xν/Ta+VՋe1=+Pq5o߰y7mm}vwv?;>_/Wtjw'ݎs_uiz]455nQ \ߊ|Iyj* I製c׿‹+*H/lی9Tվ>Yѯ?FX/m䷑P]J3!4Mԣ/]Ïۢ`t?7; v;|t;#l/y{F|n^3V|ZEsnݳzۜ 8xG~SyX:$+屉vVaƤ$^ɤ5n4VX(PNbx{Sռ;6[؅3^_@sj?3n3޽SVatk.X/m䷑ 0WR3kO Gv%ծ<;ǽzEQ@|JnO}_ |mۿ@]?k¶5kP5a[_Q@Q@Q@Q@Q@Q@|_W~?PIb` F@OEQEQEQEQEW|@{%PT6*J`?lTQ@8|R/|Gմ'Y=Oa}F<y$kt|mۿ^@  ?%ouPCI[?vC$y~!Vn]a+7^E};Oe֟o4ϴ ѩc'lW?O'UZ(6!J#+Huw҈ +IaY?TU}?8g.-򱝤g=}M{mKY-Ʃ]N]LҰ_*#Xqk(<7ҭ.6MqxHk(p4-[[J~%ٟ783V'MѼuco06vJ[͔dg ( ( ( ( (i 7ѡ-2;LA.AǔQ^ Iu_[} H+*b#><BOG?t;>g--򱝠g=}Mx}v'/xsGIuˋ찾XIɭ]a+7^~חҮ=r;by+OA CooprTQ+诈?; z f⫸Ajk;jvyIeI=Q@|JnO}_ |mۿ@]?k¶5kP5a[_Q@?"w?}rnqּo?JM̭oF=o?J  ?%o@tCI[(?vC$~!Vn৊ux6\]z¯$xAd ν"qyVO{}_P^8C?'~q*O}?EPEPEPEPEP_W=CRث?g(zѱPQE|JnOyz+"wݷcr~(*ŅƧXY]]J›@Q#W oo9ϫj7`K_n 8W$@W@xc>"ڿ4}gۻ;~ kt$F; rRD&TRL$$uSP=Q@Vj># t_OˋzX'@WQO~*}ID*hLbz)<7^.Ӥ)G0Fcz&b}'V=|ȷܡ*H<x4EPE k>.duFfO5#9rVc]/}Oڷ?Mq17/_Z oGi:7,gSv*xgrW/cqj76wV3&vdppA@袊J`?lU|8C?'@%{]'>6^I?P5a[_AO(~Z~(ih׀W_+ѯ(((g'dQWW?O5 ` +?g(zѱWװ~?PIb袊((((+ q*Ox{%PT6*~(>6^I?@%{]' ( ( (>' *E-tI熿k Huw҈ ow: qyVO|_O?O5 `(((7Oƿ Gwz%ծQ;\`õWm/֋s]n673,Y|y[]/Kԡ+ԸfJusk|&׼yMiwzl0EpR:`Q0㿭pu$P**>n>t; 1(wJ0HQE||V_jY[q"4 f03+5oڞIm 7]q">;τ5|⫭STh%{u[TV`Ѳw2aJGm}|3h^1;W@Q@jxkRFV\,7,`*p=Ee@_]MKCc<𭮗jP\3]FB:mv9ˎ޵tQ@΃? iz4޽µh.S\OYzay[uؑ@$uS޹z((7tT lV1tḷCҸ:(>0|G cd_C?Z"mfQ@_#M7CdwFP`õx߉u(ujȰ^q`8$g]QE=CRثq*O}?@|JnO}_ |mۿ@]?k¶5kP5a[_Q@?_+ѯV^@Q@Q@Q@O?O5 `jEE^@|_W~?PIb` F@OEQEQEQEQEW|@{%PT6*J`?lTQ@ |mۿ^^JnOyQEQEQE}O'UZ+' *E-t$:Du$P**jEE@EPEPEyƿ>myK5I29 pGUxG.߈0䕿*?-xlx:ϋϵG_HՏX_xWY𮑪\j{e ċ O+3N|[XS)Zw?xM;[7{8 ;Wyg6? ]ޥ4ޥ-ԈFS\/+xp(c/@6 jޥ ^T"6Nc\O Gza$Z[vHucڏ DWt,4=W얲Jfd}>2]Q€g~%]ºok-=DT!`#t=:]-nxfO@7#d&FA=(((((?g(zѱW%PT6*~ ow:@%{]'<Cmj?]?k¶5h(>V^^M̭oF ( ( (>jEE^^?8(((((+ J`?lU=CRب(1'NKWwRc|G#,FNx?M5Q@ SCt?Mx?M5Q@ SCt?Mx?M5Q@ SCt?Mx?M5Q@6[0D#5 `*J(?$](@6!J#(g'dQW$P** ( (<yV?-|_OO4 e?x|5k>:MJ#FPl#8 W >w]GxnB2AhOЩ&\Uu[kY u;H%eu2 s_a=7^Gya*< (u $~5\? Ongai=ԞF`' 98¼WXd]ZJ[͈g{.+O׵Xiz&}鑣Ikjo6STq(+Aay|-Ѭ' s>T4-cD[Jߏ78qV' kώn4RtѤyT7)*8tU 2K;I.gʞFAO %ѡ-2$KJ APǔQ] =3▍yw~~F$,x$ƀ8z+迏%uzޛ}:qGkt_*Q3+J(xAѼ }okzmD|@b2ϱ,gRo,.໵4 `PEPEPEPEPEnx.xm|u닉c;gI*TI9}Ş6v Ү6Cr;bxƒ (?g(zѱW%PT6*~ ow:@%{]'<Cmj?]?k¶5h(3= Gm*ϗtfqn+?OЩ& (*h.OЩ& (*h.OЩ& (*h.OЩ& (5[z} ;XV%-2B3}\+ q*Ox{%PT6*~((((( +> xF/ϲZɧ*Sɗ2F@z)v<$?~Wn@>tyCI\oJ ?%q (]?a+7G.߇0(v<$?~Wn@>tyCI\?/ƭ:/|2n21'_8QE$P**jEE@EPyCI\?v<$?|E}[Ӿ-z@=ov m҅SH瞜x;{Oھ97m7}8\%PT6*~ ^ >k?gof}0P]|JnO{.߇0 6zuu*C }q؀%02H_WAO(~Z~(6}[&s~Wn[x} ?%q븰k9<[h_i*pyu+<RAY޷xsGVծ>c2]w0Q‚O$hWmCۿG@.߇0oJPN:Kvag<8ax$P** +v<$?z|@_yCI\O QC~uFfO ˨X~uE{%PT6*~(>6^I?@%{]',XXjz~eԩ ) < :q K ;o+'? VF}@ ’BNOx;տrnۍq1z52 (;;k= ̵&܌Su!нr' *E-t^յm0m%T/s+y p+6!J#(U:KJ]rYxp#a/_O?O5  %’BN(` F_O=CRث+Wwxow:-O.PgNYұv<$?~Wn@>tyCI\oJ ?%q (]?a+7G.߇0(v<$?~Wn@>tyCI\oJQ@{%PT6*J`?lTQ@Q@Q@Q@Q@|_׏8?ZPW>T8?ZPW>T8?ZPW>T8?ZPW>T8?ZPW>T8?ZPW>T8?ZPW>T8?ZPW>T8?ZP$P**?|A-sƫWiz\sA-\3]:*Tc;zIEPW>T8?ZP8C?'_ 3j]ޥ4۵-ԈFS]+T~?O5 `o^ |Ms ptQ ]%}^? k5@0W~?PIb??jO|&|ͪiwznR#(RQNrwQE|JnOy}o⟂wV; c61Gzq'? VF}^W𮍬\Gq4EK#0q+KR,#K_+bN*!{Q_?_+Ѭh7CuXkk~ydG\ۜfE?xkV)k4*Ѵk.Oњ +xi!TPHp=\t?7_$](@HOƿx×zR]\`ꣵy$P**|Y׼MvlKp Q0b]F0}E| o;G4w?߉xQ@8C?'?g(zѱWWk))x\cٽ 0j* =w(|A-sƨq(|A-sƨq(|A-sƨq(|A-sƨq(|A-sƨq(|A-sƨq(|A-sƨq(|A-sƨq+?g(zѱW k5]'h>f4Jikv[)el9Aր;( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (8Zޣχ}'˗b"x$r+ |DWeyajkOy>xq$`я^}aggiݬ ASOMփ\5Ɨi3i-mR&+pJq=jQEQEDŽ/SayZ3' P!22 _S Wѡ'DA.AQEQE3]ծq4/SlTs ռG4I#C+ qo/x>,gȾ n P_G=7^Gya*< (u $~5@?"w?}rnqֶ> xYwo/ϵG<*RG@:-[򿵴'>_]qg4'MѭK,`g.±)l3(|ϋ;;ǷwvOJ)mg> ,u&*y&P(HH9i[[m((((x_kcg|y^*}cvzv?X!5ϛ78t]ؿsڀ=B(( -+o7CvvUz>0 Ɠ&Ѯ|ߵâs'|xYK'ymZٔ)f\ʧ9Cҹ;J`lQE{<bx{Sտ)i-ϕ~->aqEv< 7O&2slٳwt?(дO+o7n.dg2+"1=;P7ƺoUuj]Onj6NQ!^ ;_0W|2e S&`߿kl@ ;G4w߈x¿ :n|#]n773>>u; ??v`>u; ??v`>u; ??v`Pq5o߰y7mm}vwvOuTu(uTY x#Y 0;>_/Wtjw'ݎ<RA\O xa$]y[v!QHSڼBCi?y?nݳ{ݏ,g2+(gKC?|aA-ƫ#okmyV2۳cg2 S%`߿ l@A  ho5G3?%}?E|  ho5_OYOV|Ksnۿbۜg hQ^?@sj?3n3޽ ( ( ( ( ( ( (8|8 }Z_;;:c\Wiz\sA-\3]:*Tc;zIEz/ :qk+=ė,sD3bc'>R+>w.;'fq uQڶ(_ 3j]ޥ4۵-ԈFS]PEPEPEqGß5m[I=O.}E<0 HW~!Vn>?h(zѲ?  ?%o'uj1뗟k! $ ΀1袾j~ 4/2Og\sjX>I=(((((O]˽I㵺ٽ`muqATvo_ 3j]ޥ4۵-ԈFS]QEQEzO/ ͎ok-=wDT0`#R(((z_iw "{o%$dCW(7O Gv%ծ<;ǽzEP㯇?k\C3#~rLw V=m/Kh%kkV`Up6aoZ(V]gY.5 egEhv,@d'תQ@cv~.އ$l06 ;V+6=fmSKԦ[veBVڊskkA]P۪ȊC3dF9˞8?ZWQ@? k5^i|}V_iw~^o#G $fB3k| &rBtvN ր>X^5ԼͪipZM0Ȏ߷9돢(Sh͎nWFT0`8x_<]˽Jf)0LuQڼފ+/}cmfw}v1{WEt5fST[u[TeRw3J袀 ( ( <g^6iA-\3]Fmu޵@)%狼Gw_wW[7 B 0 'i?|Uh:]4VC)bA8 z ('tmfT5;I*Y0Q^EZo4htR{`n]Ueܬ1=*~hs}7ۼ3n=sڻ ((z_iw "{o%$dCW(7O Gv%ծ<;ǽzEPEPEPEPEPEPEPEPEP_xƞ*׈mKZGw򪢉Xl((((?$](@/^j u; I6CfGlO8Q 0S\tMsWA'?T?]7Yzh oiv3XhH A4N' *E-|A_oI熿k: ( ( (>< o,n x.-/d9iYI!A }Ey? oL[XxJ4Q FA#+Huw҈ ((\xG4v$r(eu2 q/7|-o, 'c]K>nqg=S:KL;XV%-2B3}y]PEPEPEPEPyx^.4v$r_ePAAbâ((+Ɠk_[$3Ŧ\rFYDG krc9Ha8 t//k>*K}CFX/ofdP]q4]Q@Q@>"xW:vK"*}Y2QH[ӼGi7hw.MX#G"m{Ǟ*46"Kv[Xwlqֻχ~4H$w Jһõu|_&XYeԩ )Ib#w󧆾xFV\j3Ae{ ċҖ*袊+;J`l|GC<~' *E-|A_oI熿k: ( ( (8{5 w˺>9Ha8 t//k>*K}CFX/ofdP]q5]QEQEQEp 6zuu*C }q؀%02H]|ᯀ^*ѼUjY^q"4 f03+((*\ILIڊ cXk>vg6 p O =◃|GA:/Yv,ydp a^৉<#7\Ҥw\`ý{s'|_CjI7m︧ܽ}jdžSxNC]rY$a=~u`q|@ɹ>u/ڭS7/VK'yo^Zٔ)D\ʧ9CҀ;( ;Ú'ukA̋zrY|D%wkו'PmGU=뗠>/Sm,2T$sFJ`dֻP5a[_QEb}'V~}2/w(aʡ cdX?Z;cgmeթƺ<+ujZC=';_/ot{ݞᦿQʗj@$](@G*_?`xVhW;W;WE{~c ?|ͻdd`vz?B?<=i>wHݻw@8ɯ<-Ğ妇aeIkkcg9"@:_QkRY𮑪\,k=7,` N2}MjQY~%ԦѼ+Oee5k %K"Q^7_<]7CңwHm`ꣵ{W`|?ɶv/=(7u/xVT x^VTDl9sһ((((((('ƿxGzaeIkkly␹9Տj+/ZυtRcYlc(g@ qh.6]_TX{+)#Y*YdzԢƿxzneGkux"82Gj((($5-r8$$JҢAǽuW&xWZ^iVOpkc{zWPExş:UkvlKd Q0b]F0wIyipGuuHetGz+*E5tZ΍}i2{o%2 T+((((((/ >5KCYYlc 385WQv~.ޛ5>;Դ; -*K[_+cH{PQY~Ԧ|+j {e ċ!C: dSGu)o YMq Rȅ8 #P5;t;-*;[7{؝ ;WPEPEPEPEPEPEPEP?w?e]O羅nn3Ҭxo7t,4;?Z)y2N\G[PEPYމxGIխc>2-웶aʐG  hQ@W:K"0Y2F򮢊('ÿ Q\ҾuBK@0Xuhw4x4&0nϷs<$IօWafmgywVп;]H*p_Q@InQ|_{XYvrYAwk&77Ú} \jRrEvP\Ogw?=0v_J(  [F%gKY%32y&\ ˒z(b(((((((?[[ڶdݵB8Q@,m:?.$NPNh [q 29P|-o55m'F=~3ܥO  ( ( ( M;zWڌwXDӼ96gw}'O&(ş< x7\м]>h_sS8 uX'񧊮巸.4I#VWR0AAb0袊(((((,>/Lӭ,.$$j(FJdָz( [|9Ai7gw.}G"vȥ'?.߇04{FƩjV06",Vb8'ƾ?tyCI\ +v<$?~Wn=]?a+7^@? Ongai=ԞF`' 98¼WXd]ZJ[͈g{.+O׵Xiz&}鑣Ikjo6STq+(Aay|-Ѭ' sS;XZV J2Bq}jyCI\?v<$?qƅhkiWwټۼ[2:z?h(zѲׯyCI\~)Ѽ]+;v ?Ē0?:z~4𭯁|=oq]-H俉YD dx|yE| >)hחpZZyh@2ǁ@k>51 3]7'Uq}%ٜ;Ipz~|]a8̞jGr?:_|E?j?ݷr|5k>:MJ#FPl#8 W >w]GxnB2Ak OЩo&ߢ>49//?ZǍOe$h $ƻπZxT-,`m2DY.X,@85>d7O|ϲ\$3c;Ipz((  =qq,plI#TQ*I<9/zfUԞF`GlO8Prp?|Eƻkj6wټ$[2:z(>>n/PtѤePl#8 WE}xV. i$r_Ĭ"PAҾpgOjz%>wm%؅81( (=#Oۮnٽmqg3cw4; ~ǝAHSڽ</g>'1=;P  ho5G3?%}?E|I_j^aI&[uVve YrPn*?-xz Z΍c[2{ok$҆ ' *E-tQEW_:tRRymZ4e YsP?X!տ~-O78wm޿1ڀ; x,#;[ud9Ozخ>;:>_3Wtw'ݎ46mgY5;xBBv '>OxGzn{IkkH%1Շz~؞!5oJ|sg߱mϘqc85ƺohuMR mmQYf1=*~#>m}|3h=qڏ}'GMG#n_9Y ¹vlg;PQE~xYV[2{{5k$҆ X f_h(e)f_h< X웛~kw\݌mVOƾ ԼåM;:>_3Wtw'ݎ+~>WYlt}?YYn# q!853V W>W~63@$:Du'xYK紆xTe\ 9q־$](pqW!տZ5Xˣn1xƱ63}ٷ9ܫ=돯@77_J?ϛ~ּ=#Oۮnٽmqg3袊+/Ícnla}sv1[;W^o+Oh}+f6sۥaZtR{In]Beܪs=+?`xVhW;W;W@Q@Q@Q@Q@Q@Q@zG x,/tnI8 FGU=<X}g#?1{Pl6}4m=Ė4d,T2=}?}𮳬v~GoI AC;BqkMwSy>Oۮnٽmqg< %_ѫ@oEQEQEQEQEQEQEQEQ^?"w?}rnqֶ> xYwo/ϵG<*RG@:(Xg2,,.P$j,dNhz( ( +5DW|egadOI>s$G^[|GIյk_OyTݶgQ€vZ΍}i2{o%2 TYgu= ˺&98/Z~wI㵺w ;ꣵ{3%y/+<x3%xşiUw4%5ӫ0bUF0}_0~PGe< 7Cм˫>isѩc$X(65wcv/oSnnx6fSTԡ+uUJf܌s=+q)|]rwQ q0:5n4VX(PNr((((X~2/52Pd$r4d&FA=+z(7g> >u&I&P!#~6}Ocn3wQ^QEQX,<_ZBA8<:ߊ^2}'IյXy}ݶaʠ#(+|_ޙ-r]mu aO@vFJdր>(((cwC|[B (ag$](@6!J#)m2,k*yI(A7㧂|; ?jG$ݷxW ~74[VѾ}?KvٝG  X2,,mu aMENh𝍾-?2PdFi0dҽsƭi:7|~32)ᜃ#@8QEQEQEQEQE{O~wo/+wQ %#`:▉xs>6gϷt(ǖ$I<((ÿ _DŽ@0Xuнr>@N6Oeqk %K#Q_Y’yBN?I|<{'n?y4w?߉w ,` F_O^Y[SDoT]Z$${cagYgaiy rI8Q$5OR.\-3X&+2qF}\㼰L $0? \xW_)O_]qg D򿵵[;>_-q# 4'MѭK,`g.±)l3*Sum7Yk/P\Ik2ʡ RFpAǸQEQU9//വA.H,x$Ʃ%u6uBJrHRN2@ϸ J( (0_mn"֍ 8x%d`r!r<+xV+{O+8fv'$+r)ZNۭ_@ceP# 0#8$gzfoNcac%Evd5&i5j K%-p 3N=Gk>d7N<ϲ\$3gi8_C@QX,ޙy%4Kc '# G<[oqsA*92<G ặXTeu# 8 sDko-ıH^I$`I$2|'2;VQdYGA FA#DZg;,&g5[KX/d$$\uq-IJM<^I$bNI$I<棢$yn"Hg$lU A֥j7`~ \_Gכ[_];MU~Ǟ( rDSڽ" +}?wns{xM6w \5-*`Y0㿭tNj>xSgyZпb2_S@xW_) /Ŀ|+WWeg6t* Ą'Δ=CRثq*O}?@ߊ]+;J]zzBÉ$$a?:􏅺&χN[;̋z;Tx j~,>aKMJi[kXє)f\Χ9CҺO x,#;[ud9OzخO"ϲq3ҽ|# rRj2e qr*((?▉ƭ6hީlǖ <U^_W-dE&\SWQ@Q@Q@,xOhwkk[3E,p'=PkhvkPI<ԏ# ua?'ɻo17/_Z (>)|-#ڶ}'˗P9};3~]ծo ɸa,XY]]i›< :߅2}'VմoyۺQ¹' 4}wn/oanSτ|yaYMATRL0PO^ENj>xSgyZпb2_S@Q@Q@Q@|qzfsyyvWY𮯥{e5m$1 T O(((-O.PgNYҽ/ƭ:/|2n21'_8Q@Q@Q@Q@oN}'Vծ>cKn]G <8"xW _G$̟g< @N]@ ( ( ( (  ?J_ hj]ޛ \5-ԎX*Fa8^|Ghx_t ye]X(9Q=zxJ+uZ߯~>WYlt}?YYn# q!84QEQEQEQEQEQEmL|'q[ywlwc#8q_wN6Oeqk %K#Q@ W_ooo}7}ӜciڪXA}~Ly#婕vfQFO]3%y߉𱿲Q7^|~C²訫>0|8cdM?[cgmUC²訨(t/h*}?Fh,fRQʂq tQEv ^пI䯯_W/xy++;J`l|GC :$cWvN~bx{L|;6[yv؁wc'q_,x[_<#MJ~Ǟ) rDucھ֥6]#TX{(n$X 1$d]<=OIn|wBs/OOL|_c9?ywllwu^i:5p,[ѐ+RFA5[৆#;MrU~ĞXr`cހ="oW?(/>V͛?lJ uGk~ydt\ۜV|8,\j`ngjj+Wiz\sA-\3]:*Tc;zI@؞!Emhm߱ǖqg5z/ :qk+=ė,sD3bc'>R ( ?_Ih>oevcs9z kA]P۪ȊC3dF9˞c cW7۶FONV?7gZhvO%;sǵlPEP_=og}λ[o+vݝc?Xڟ(/>n\cgZ񯂴hzp+Z ˃Xc{zU?8&oy~g7cUzv6wG>_/nn_gݎ+SS~.޹{uuzA,aT2z(@ƅm{Lռ'֑\[lށ83Fbx{Sռ;6[؅3Ri:l:6c۴v*p=_iw "{o%$dC@W@sj?3n3޽<7kV$PFC#QEQEQEQE0¿ :n|ߵX˺sx'B_~6푓`g;sӽa6fSTԡ+uUJf܌s=+#MI䵵߱`\vsX ]?<=aۿb۟08pkSVgF4`FCu*H̄gEQEQEQEQEQEQEx'@g~6퍟g;q׽v¿:myX;n1[ėa]Zؓ(w#!{I_:4htRMZ7V,s(((ǁ`xIh>o{V߆_o7]6n~?PIboÍ?osns[;|8 O붹~c({occW7۶5ON>T8?ZPj؞!5o' W>V8mq>T8?ZP@sj?3n3޽<7kV$PFC#QEQEQEQEQEW|@&sXVn>}.]w)SEv~!Vn˿qݍqFszW?O5 +SM.[V03hn%-2B3}z/^2}[Iuq}ۺc!'O&^Sno$.y}nv$dҋNKN xѦ]2KJI$I'ǔQ] =O▍giݬ~gH$#*x8 €8z+迏toiz&c;jqIkj1_*STq+J((+k_[kFx˗H"VF1s@&hޣb [I=v+ܥO <9CI[(?vC$r$NF;rwQ!W< $uc=Wqazfmagv$0 ;Q@ 2S'<'Ony*O?|G#' 8¾t6G jw)qUEq(+h}wX?onqgpc>^Ѽucoz FĥFHRpϰSAy-ѯ/绺4:4KL;VU 23F}y]>dV6w|ϲ[[c;@2z(xOzUԞ~GlO b2p|H!׈m"R8P%`EPEƅkiV7Oټۤ3p:z +>>:n}/OݣbRl$(8gWE}V֍4$XDbRI%rI<<(((ƞ 𭯁|Cqo.^9#YDBy|y@NFKRDagL uQWm/ool/f︣9ڽ}+ 5cDu[;g.-3'+jZρo5MBuEfQĜds^YŞ$>)k6v m-c6C쑢ƒIhz+NaC^~ ( ( ( ( ( ( ,,n5=F?2TbIhk |e}[VѾc2_Bw0Q¹'((;k= ̵&܌Su(((+A3Nм[Xip8Jl/5;-';!3#' 98¶? k%%{B'? k/Ru-mM>v@-8#>ƾ?h(zѲE|_&XYeԩ )Ib#wQEs'|_CjI7m︧ܽ}h7tc/Sm,2T$sFJ`dֻ(xFyKY%O&\@z)P?VFs}OZe֡q4/1S#t.-꛶cMlxߊ#Gi_dQ ".A a*袊((:BmbyvX>N=+߅j2Xhvk#3'άx>"wݷcr~(<<6:ıZ$QDI$ŅƧXY]]J›@Q#} ߃kcW4:[zޛ}:v%`$)' gWȚxsGVմo̗PpIq*O}?EPEPEPEPEP_ xkRFV\,7,`*p=E}_P|DxR,X#moy6mynp۳cqQEt կCmjW`q|@ɹ>u/ڭ(7/VK'yo^Zٔ)D\ʧ9Cһ(G*_iڨxFV\j3Ae{ ċҖ*/o:f븭 7]q"€8?> Լy[]/KKkeRp6oZ?Xsc7ۼ/퍞fsW{רQ@x?O$w-rJؓ q$C##P_ٴo ]FYCo#FIRȁI#Q]6mgºnѬS[3PN85Ex?ÿ$rJސK!s'AcQ@_Ʊ&g;cj\vO Լ[/Ti{kWfPpw*oJ((w5-H#,Y|y[]/Kԡ+ԸfJusk((Kºυu}.OV{)i!(gBHN2} |E|&?]jsA-۪ڢ.c{V?ok~kD\=qڼ(+SZ:7Rdh,acTp 3+.7jZו0l$HOE=q*Ox{%PT6*~(((((֛#Ki mh )# 5k9/Lӭ,.$$j(FJdր8z( (=7mǞ5KJ{u[YTDl9sҸ?-I䵵< #ǵXhz-dxː9u'ʱoQ>\}}d7mP ϯK º7u}RPZ{+)#Y&dBF2=E|]zuͅZD̟dnF0LzPEPEP|;)xM/uXet2z(^7]6Zn4W[X9PN|R4x4'Y= ŏ,I<5=FO2WgbKI=(M'RFluKu5pAG{wĞ.ޛiQy60LuQھx@%%{B'>((O}V_KfkxHe,U'A^]JmºnVS\FT!`8 &h^eԯ4bK'v6sayku2n#r0!G# G4w?߉s~5xFK-4`ncubYpw; aoJ?_ |χgTϷtȧrE|@Q@߅ Í'Vմo_OydݶgQ¸R_?^ۏ9@0xJ+kV߮4FBeIvTk('ƿxGzaeIkkly␹9Տj >hho/ڦMT(\@Ԧ|+j {e ċ!C: dSGu)o YMq Rȅ8 #U }3N˵!7'Z/m=:?2'dF`C FA=(k'wwZTv^n);!Tvx?D[kjN{7yrg۹J<9PEPEPEPEP_ |mۿ__k~%]ºok-=DT!`#t=:]-nxfO@7#d&FA=(((>ߋ wW^nX =w._Ki +٭i,U' z >)xÚ<N \_ebǖBO$Mrsy'uu+3s%$sZl:ϊ.X/oa 0Wp3k>"|߄| kVVĞXҢ=5k9GGE39ܭǍE`jcV;1ɻnv8@|V^=Kd NmU޵ljڊQ8u ( O xVT.(gmdERw#J<7^Ӥ_Z)I rOE<7gZkkly;G9 ՏjC[ڵ/KSv 8P((+>ߋ wW^nX =wD/hi:N{7yq}۹Y kdWO|ϲ[3c;Apz +i:[}SO9cbTC 0gתPEP{ =NK;H.dgHʞF-Ɨi348%@8½ҊY-ƩiӮ",V+88'Ҿt{YՍƗjW.4*e8%A>,㳰<h$(d\? 3ngi=~~g#*yƻ(((X?jvy&I`~=&/"-HR"PAAx {xyt˔8Գ;xnQ_,| 4ϊZ5[KXOe$h@2`d? +h} Xүdyvgv5 IԴo[}݌-8#>ƀ=R+x/W^: ſSxVWS+A 4Q@Q@|JnOv|5k>:MJ#FPl#8 WX^iYOiu7)hחpZZyh@2ǁ@k>A| cozmJ|FHRN2@ϸ(]F-3#wWI8#>ƀ>tz-f Yw ҭ.=qyʓAh+sƓu[KܼrFGk J`?lU=CRب( ( ( ( ( 46mgY5;xBBv '>)^⟂$.*K[] d.w:1Շzz(5oɹ>_uoTkKz:^=n ̡֮K2U9ޔEz Z΍c[2{ok$҆ +<];MH#߱bmFs= z+m{z4:w nk#*͓c{W@Q@WjUhڥơ4V\H)b zzw>#:q{<2]wB8PIv<$?|E} ?%q>5Fw;ϵǧ,SLJHHÀz0(ޝψN\};̗c>кy p+tٵfKh{ۈi ('d_Eo@W_#;Uf(Ȯ0Laڀ="P:5n,F+` 5r ( ( ( (>/K[]TՇzآ?|Y|yͥv3n QPʸ]r㷭w'|#ajd!2(I*c▷x>i7hɻl(A?h(zѲ׏EPEx+Z5.{HgݮJUڬsh|8>Zoy_6;:gqQEQW46mgY5;xBBv '>'|9w_RZސK!s;EQEQEQEQEw MxFT`nubU6 aZ譏n>#K]%W$чjǠM[mT4fK9,U1Q^W@Q@Q@Q@{%PT6*J`?lTQ@Q@Q@Q@Q@|!j؞!5o' W>V8mq{:c ϱۼͻdWXvz(@e7J?>ϕf9ҳ#moy6mynp۳cqP^~؞4EEmhm߱ǖqg5P]|Owug1=;W?Ez<=oa}ɻ[7~npqy}PEP^~EZKmhnٽ ǖ3PEu7gkuxbw$GjgK\??jsςK绚 l՘1w\ Aր8:(44-O:faݷ~ 881|t#cWyvȯ|^P~?PIbJ`?lUQEx~<mSտ)~w-ϕf->`3WQEQE &myûn1P?  l/+ݺFn^QEx~<bxLտ)wϕ~ >aq׸QEq O<|78G]ܿsڳ|2s_lٿwt@ | $cWvƩNP~bx{L|;6[yv؁wc'qZQ@Q@Q@Q@s6&>>?yͻdWu]>¿ ƭ:ѭyXˣn1W`|?ɶv/=?h(zѲ׏I_^xn5o֍myV2۳cqP|M /%`߿g l^EQEj؞!5o' W>V8mqרx&>?ڼ۶En: ( ( ( ( ?_zIv>oevcs9z(1}?Ǜmvz袀=]=?y?nݳzݏ,g2+袀 ( ( ( J`?lU=CRب( ( ( ( ( cv6; [BqP#OJyn"Hg$lU A7ß5m[IѾ}nO  ¶/YMNK;jvc|3"6#*Nz(+ &B.y7;FdҾX ^пI䯯?h(zѲ%OT6Z-oi:};̗S&:8,poqg=}M}Ey_-[R| }qjwӮ",S4ʈ$${Jcşwx\|[]BS0Q8uV[ hO+I,"fv'$W$kr ( ( ( (<_u6C%ԚB$C8#ʱ^1>_?=qFszWjZNۭ_@ceP# 0#8$gzfoNcac%Evd4_8|R/|Gմ'Y=Oa}F<y$kǾ;//?]IOe 8€ \j~ $.y}nvKI=(eƙrO.OXةֵ "@TP0O7VEJ$E `(Oe?Nk?h",)l.Õ@G  }X>ޙy凇Kh, # xOx?;1ɻo77OZ)g />uIGSд}oҬokIvgqt7Fk}/OGk ĥHPpϰ Nj>/Lagv0 ;Qd`%2p_S ķѦW/$XDNI$I'W~L[X]iuh$1xFA# ~)|#;Rj ?e r0?*6~}g;WSԼKk6okz ;C`ČsYtQEW,AM3ZBku|[WVxY P++ 1@u<-xWceO5É#=usMյ-4BvB%8%H8€=S㧂|; ?jG$ݷxhjz_ڭ/w.8N3V}}o|GIյmdj7mpe-r?.PNY(֋xLy FIƒIk.y溸Y&W/$1fv'$y$s@EW| O|cg}${wy j 3]4O7'U}ߌ;H2z>5[F4;?Zɧ̞kɗ2H ˒z(楫jZjKV p qN=S((ÿ _DŽ@0Xu^ѭK+˴vO!H>€7>)hw>#No{<.-wBybIɮ>__jw^_wu&7'_m常ֳ !y$UTP2I%p|_&r].aON7;FFJ`dր>X(((( 3B57'Jq}ٜ;Apzϯ`o;{PھI7m7}8@K?x6NEΖڜF & RUzeO{gvgdH$F WSxVwc)É$$a=~u_PQEQEQEQEQEQEQEQEQE>kj6v|$[qGOQRi۵ƗZ_@QeP#8 WtOch}{wy{~ ktޝ.?; >Yn27'i7hɻl(Ar[ k0I,%UE$Wkgj~ ,,2O$sldIh( (6,|'MN;vgdYI"6  #[{xȥYAx}◃|9Iumgyd_erAe-rO2PFidր1袊((((((ܟ~*Z0DK UQ@$sïYu =w̺!>8)GZb.iN5N]`$(' gThW}ag]ſ7dt|N^_뗟dOxU.dSVOxw??>;2GwvOJر5;8, cd?[mV>0U3?%>0U3?%>0U3?%>0U3?%>0U3?%>0U3?%>0U3?%>0U3?%>0UQ@W|2e S&`߿kl@^_#M7CdwFP`õy¿ :n|#]n773>>u(uTY x#Y 0_8h_?''o;6[yw@gM}@Q@WG 6OE~c.{Q\|O ,u^g<3n>s=;A@3I[uVo.yc8q^@G+[oegksze77J?ϛ~ր=(+iڨ+4/of OH|7mqg<>((((+q_X!~5ϛyâs^7+h}o+f͟sۥyWx'_&>#ڼ}۶FO nzw/tOzO}[o7nd82h>(+>|2y_߿6{?}'GuGnog9\}Wh_߇['֑\_o@s 8x}WA ccW+۶6^|G? 뵶c(;;EQEQEQ]Ï Ɠ&Ѯ|#n7/ \eCoy[6lm(袊(4-3o:fy?nۻf sϯ` FG ?}|ۤTa7gj?g(zѱPQEQEQEQEQEQ_ CI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J׻N_뗟kPxU#ucQE)//vPx>63}>֎ٻ=>5;|g_dPHY,C;G^@'|kxYT xVTfl9sҹ(+<'z; w̵->܍" OJ(?&|yêjz3n궲"P;r翥wP?7gZhvO%;sǵlQEy^ º6c[Oeqk$,GTk7ǚ4:^=0Ep ֮łVÞޕO4oɹ_F_]xOx?;1ɻo77OZŝ{~*M6h%Kkݘ1w\ AָOh7CxYvyI@:=; v~((/}cmfw}v1{U?RAi [2P;r翥stP^}VXv~Y[oI @3+((((OxR6i4۵-3(RYNrstPa㯈k[X3":~s7Lw>(<-Ğ妇aeIkkcg9"@:\M7ڥƳIq"Pň$':((oɶ_v_\}xƺ5uMR HgmmQJfs=+M'mKf;xHe,U('A^WEo^xGvpIukbN܌ z1]'~,<ѡKM6"[kXXV\sҸ:((((Wu/3j\O-[#2,(;|G> }Z_;;:cqPEPW4JmY-6;@JF @⟍~$w.;-*;[62Gj F^?^8C?'>(((((+ (nk7 owӪhaiX.@ HN? h*k.~? h*k.~? h*k.~? h*k.~? h*k.~? h*k.~ؾ49//?ZǍOe$h $Ʊg'dQW$P** ( +51ס*<yV?-rƅkiV7Oټۤ3p:z ]Y-ӮvI+!I8>tT7m>#vKy a^WE[zZ4˦[_+ѯ ( ( (=xд}oOm*7tf|p8OAXt7FՍXdn±)o6Q3+(((((S>:4KL;VU 23F}y]>dV6w|ϲ[[c;@2z(((xд}oOm*7tf|p8OA^Ez'MѼuco06vJ[͔dg ((KFO?|3$F<^Z[/DlgmN4i-mR&+JpJq=|EQEQE}OV!֍ i/D"b!r<<OZNT/]2GXYT7  5CZ>Nca}%EV3 ' 7-ѯ/?]I{(v#'WP ^!8`SHB(Q!ׇ"h%HPePAE}O~>7ҭ.6MqxHk?g(zѱWװ~?PIb袊((((+ q*Ox{%PT6*~((((((?$](@6!J#(g'dQW$P** (>( ~,M犭uM. `-nUv1k=:B-nI7#TFAk5º7t.OZ{+(mhሩd@2=|@&XIm}>.-꛶cMlxߊ#Gi_dQ ".A a*>>;uސ(.wD0 |Y¶^iC$w-r9㵺$"HꧽrQE k>.duFfO5#9rVX?|EocV'ɻn7}8[ kWZKd궨de>&g;ck7\v/D[/jNyrݵ9׼|;MY.|Q;w&@z0@cqj76wV3&vdppAEƧXY]]J›@Q#\._TY ٮ#Y ܰ<5CxH.F0 G @8752>hgo/ڡ}(\\}{O~w5-UATs$'QEWqazmgyQ$п*p_# ~]ºFq-=64pT RFd>t D|GA6hwMTO&wK?M/K[_7z@$;O~*}ID*hLbz)dgAmt.RxR4U*k\v(;4 ˵ڊ c8/ >}?YYl q!84lxoϋ,4;?GHN\ՇX|&?]jsA-۪ڢ.c{P/}Oڷ?Mq17/_Z>0|G cd_C?Z"mfQEQEWA?j]wn3ҹ?}Ȉg;:gp$F; rRD&TRL$$uSV=w|kV0EdHŃdmfÎqazmgyQ$п*p_# ~]ºFq-=64pT RFdt D|GA6hwMTO&,Y|y[]/Kԡ+ԸfJush袊(((((+?g(zѱWװ~?PIb袊((((+ q*Ox{%PT6*~(OC_}9ϲwtjw8u\4J?RU|mۿ^@ 5RTU_(KWQ@ 5RTU_(KWQ@ 5RTU_(KWQ@wZ߇[~iϕvnp38\?xkV)k?$](@6!J#(g'dQW$P** (>e)f_k (_zVvW,+Mt.{.Yuڪ1k/_+WH.5 egEht @d'ΔQEQEQEQEQ]oi2xS~&X^]Z[yc(wJr`c޼ +>8 lk\C##VgZoUksIptQ @W~]gºFqk+=7,sD3bc'>>t((7mǞ5KJ{u[YTDl9sҸ?-I䵵< #ǵrQ_Eto VS\FMRȅ8dzҊ((((((((((/Ŀ+xWW- e5hD,`#WΔQEQEQEjxkMYV464d Fp} eװ~?PIb<7jZ%կ'2t FF=q*O}?EPEPEPEPEP_W=CRث?g(zѱPQE|JnOyz+Hm>2k&2y&\ '.I7/ h:j&}:E%`''$?A<BX_\i]լ4/8<:x?M5v/xGIյXϷ̋찦r>(ǍE`jcV;1ɻnv8UIgڌwB$x@Iz(:]mbHaO@vdNk ( (: DWt,4=W얲Jfd}>2]Q€g<'Ony*O?|G#' 8€>X=:]-nxfO@7#d&FA=+A<B?  h +ޙYiuh,3 G_,PEPEPEPEPEPEPEPEPEPqzsayQ<3'  2# EQEQEbLmeI}u ֫@K^#umg3",)k9k F^?^8C?'>(((((+ J`?lU=CRب(>@%{]'ow:(((O<5`_W?O'UZ(6!J#+Huw҈ +IaY?TU}?8zw>#:q{<2]wB8PI_<+FK U]q>,x@@'.uaQ@|~$)k7nd6M#b+z(pMk_[E$3Ŧ[$ȥYD (]x6I4)qfv10$ܢ> *k.OЩo&ߢ> *k.KIԴk4wPLW$d μ_ÿxVwXGHHð=~t>&g凇[Y3h,W~ k_z)!-2$E*%y1Y tMGß4'V=w}v Aa@Q^ K ;o(%N5N]`$(' gWƅhkiWwټۼ[2:zSߊ#+sJ%{¯˙# a*(+/V:dž`Sy$UTQ*I+5W}u-g6^w}:qGk J|FHPN2@ϸT> *k.KIԴk4wPLW$d μ_ÿxVwXGHHð=~t蚏5Zm"ޯr A}nx.xm|u닉c;gI*TI9}Ş6v Ү6Cr;bxƒ +(p5D[U"ߏ78FqW@VuXiz F%*e8%I⼮(?¶ljthgLI#%da-APEP_E.xTS;Q dc_:Q@=O△yawݬFɠH# 88 ¸z(((((q*Ox{%PT6*~((((( +?g(zѱWװ~?PIb袊ow:Wwx(((<RA\?xkV)k?$](@6!J#(g'dQW$P** (>(5oɹ>_uo\}z/?Q+^|7n_j^aI&[uVve YrPn:}[;My^;_\}z Z΍c[2{ok$҆ +pпhOiO"wm"6؁wc83((((>xMMR mQYF1=+?G }&~g;cYz|~n׵tQEƺohuMR mmQYf1=+??`xzIv>o{P_?d_C/Z"~ck7\v¼/W?ڟ7.V͛lJ /t-mvoH%Vе?O隷}++v68pkW?ڟ(/>V͛lJ񯂵/0zO-+Z2,˃T({zW7] &m?vvv> ( ( <^6[HłdmFÎר|8 O붹~c({ xGwzIuk{ġ܊z0Xx_6S`g;sӽsQEx+Z5.{HgݮJUڬsj玾ksc7ۼ/퍛sʿ3ޏ:[y^6ocZ~&G~^3,׵y^ͣk7]F\Io#FIRI#Qk:͎nѬ3PN85&mSռ'r[l83FbxLռ;7q\[3@NJ~ x>/t-mvoH%Vcq*O6 /G>/n6_c9ێ F@OEQEQEQEQEW|@{%PT6*J`?lTQ@o⟂wV; c61Gzq`<??jgK\ (|A-sƨq`<??jgK\ (ãh:]HY[oHAbA8gU(?$](@6!J#(g'dQW$P** (>(~ }O羅n3wa^W|kYhvdOI<ד.d$QWEPEPE>W 4G<*h< 2Z&ψ'ˋ{>УXy$kş< x7\м]>h_sS8 u[i#:,gȷn H#;J`?lUx}NI}ZK>t,vYG:kC_ECe?ۻg;W{W)xßm'I~cX_nQ,I<>ƧO2OghԱdҏ_\i /t}uhbo/x>,gȾ n P_GEPENj>/Lagv0 ;Qd`%2p@SEQEQ^'#+; U%zLx˙$Ԟ?*􏅺ޣ?N\};̗b:8p((~)|#;Rj ?e r0?*+^1>_?=qFszWP_xJ+uZC/xs>:`| 1吓']&7u=N+2yHݶf'3Q@Q@Q@?xSnyyWZ}?R2I_,PEPEPEPEPEzGO h.冹gXSxH9BF?l|tO|_h}${~cst?oƓj7/~2n3\@8Q[,> 3]4O7'U}ߌ;H2z?yV?-|hZƷdWN<ϲ[3gh8_C@Z-Ʃ]Nd`''$:i:pwc; u䌀dcT _⸷ֳ4xVWR2!pA(M7ĺn^X]x @EX$Loy ? [>&g凇[Y3h,W~ k_z)!-2$E*%y1@*xOŞ$ "IGjYI'VIYyV,&g5[KX/d$$=lXOĚwndɠDl G@s5ķ4y$39$$󚎤 n%HgIUAQ]\EooO+8Գ;O?g(zѱWxOĚem-c4\X ^8C?'>(((((+j<~gKC?|aA-ƨ`q?7j<~gKC?|aA-ƨ`q?7j<~gKC?|aA-ƨ`q?7j<~gKC?|aA-ƨ`q?7j<~jEE\3?%{oj^֗Oi4޽µ(R;NrwQEQEx$O*Z>þ>?M|qN1zױYV z\\3];*끵X.;z׎8ZP?ƿ.yXxI pFy{3?%>0TM3Z̟duC |^  ho5G3?%xlxoϋ,4;?GHN\Շ^  ho5]oUujzlKd궲;0b;F0y')//?vWPD|9IukAyoWۺgaʒ vQ@,xOhwkk[3E,p'=PkhvkPI<ԏ# ua?'ɻo17/_Z ((((((?▉ƭ6hީlǖ <()^}M=WDRȇ0OE?{PEP_,xOhwkk[3E,p'=QEQE/2}[VtoXrݶS8#G"v7gt; ]>p;]cP#Jآ>Pо>!5_F6]{y?ڡ*;r N8_??h,ɻlǖ@Mztٵ ]FMoHHP΅A8'Ο>0TmoocW&f︧ܽ}hq?7j15Fw;ϵǧ,SLJHHÀz0?|aA-ƨq?7jgKCzw>#:q{<2]wB8PIH¾.m=A&d<rrVc8ZQ  ho5@?E{3?%>0TW8ZQ  ho5@ϋXYe֟q )Ih(L :>0T8ZP^  ho5G3?%x}◃|9Iumgyd_erACjgKC_[~2/-n }nFFAh-O.PgNYҽ#jgKC)|RojN'ˋ&#Yy5~?PIbj T.٠mdv`Ѳw"aJJ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?golang-github-yeqown-go-qrcode-2.2.5/assets/example_halftone1.jpeg000066400000000000000000002315511521051213400252130ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((+ (+ (+ (+ (+ (+ (+ (+ (+ qyVO{Q@Q@V~'ypo3g=EhQT[MmK-/W(Z̲lTq*V4Ķ%ѡ')$r_Ĭ AVQEQEQETs  !y$($s51|K7 ozm;[ dqZQEcxzew ҭ.g7\FT@TpO ռW4x䍃+s ( ( ( (zepZZǍO $< @(7ĺp^N]IX.@ IH@xAѮTwWI8#>ƮXvqX]wk&vMDlppAXÃƞĺ4#;$ܢ((Y2K;iVQ|3@#*NFAH'+yc P0TW8ZQ  ho5@?E{3?%>0TW8ZQ  ho5@?E{3?%>0TWx৉<#˽rJfY Ψ0 `ua޼ހ qyVO|_O?O5 `(; ??vh7\ 4}wn/oanx+΃fm/Kԡ+vfJUsk7)mg> ,u&*y&P(HHcş/SnagWZ}0'`%02H_,W8ZQ  ho5@\j7mȮqyVO{cNLnayuk2nkjdppA[Q@Q@Q@Q@qMG5m'IEOMfF<p aEx?O~*/+얲i ".dbz)(<_ÿxVwXGHHð=~u tMGß4'V=w}v AaEDŽxLyyv?;QdRp_S@Q@Q@8|R[/Gյm'FEO/ڡMaE<39r+'cqx7C˺75 288 (((>6^I㯯Wwx袮i:lγc۴k=v񴄅 N2} SjgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7j~ J`?lU=CRب( ( ( ( ( (` F^?^8C?'>((((((6!J#+Huw҈ +IaY?TU}?8xn5o֍myV2۳c}o,oOg7~.1߭|ZoV!mqח'&>/?ڼ۶6n:TմuKi y-h ԩ# -S~a{ukbO,ed90z1@EP_ |mۿ__kAO(~Z'? VF}EPEPEPEPEPEP_W=CRث?g(zѱPQEQEQEQEQE}_P^8C?'~q*O}?EP)xßm'I~cX_nQ,I<vC$kןCI[?vC$y~!Vn]a+7^Ez.߈0䕿o?Jן@sNSny'uu3sjXp2I[I熿k Huw҈ ow: qyVO|_O?O5 `( (=q*O{Ogw?=0v_JJ`?lU9Xyi>poǕ#8h>5[F4;?Zɧ̞kɗ2H ˒z(D/hi:N{7yq}۹Y ,ϊZ͝!1.`(d  ?%oCB/xL5}g:fwe= [x^|u}okz Hʡ؆@bFpHϹt]{FՍV06vOe!H>½OFO?|dv<@Q@Q@Q@Q@I/n-.^9#b"b#A5xSYU H$#*N袊+Wwxow:< %_ѫ\t ՠ袊65wcv/oSnn~!Vnkeo{5~!Vn]a+7^Ez.߈0䕿o?Jן@  ?%ouP(Wwx>6^I?((( $_ K]syZ襮<ow:$](@jEE_0WC²訨(OЩo&AV3gp> ԴKF[}SO:u DrF@`2ϱxzgU~~g7\!Rr2?y%OT6Z ặXTeu# 8 sRW?O'UZ(((/Lnl/5.Wd$k!B`Ҁ;( ( ( (5=F].HaON7;dIh((([u]O4ϴ8zW/|Ro4'YE2nڥ,<(+Wwxow:< %_ѫ\t ՠ袊[x{52 (((qyVO{x$P** + q*Ox{%PT6*~((((( +?g(zѱWװ~?PIb袊ow:Wwx(((<RA\?xkV)k?$](@6!J#(g'dQW$P** ( ( ( (> ?VF}_xJ+uZߠ(om{Ǟ*46"Kv[Xwlqֽn>t; 1(wJ0HQE|ᯀ^*ѼUjY^q"4 f03+((?h(zѲ׏װ~PGe $_ K]syZ襮 ( ( ĿUW- `5iCw,dgtPEPEPEP_:xkoiơ4WH)b z.(((.6]_Kh{)i Ш'd6^I?P5a[_AO(~Z~(ih׀W_+ѯ(((g'dQWW?O5 ` +?g(zѱWװ~?PIb袊((((+ q*Ox{%PT6*~(>6^I?@%{]' ( ( (>' *E-tI熿k Huw҈ ow: qyVO|_O?O5 `(((/xs>:`| 1吓'@ޭ ºγ}\j{q%ċ XOT?vC$}@Q@xş:UkvlKd Q0b]F0{%r$w_j1WBcHF΀~$w4r8#w B I製uhw4x4&0nϷs<$IօQEp|kx¶zH̡J;dme9>gZ_;s7LwĞѼ]GaY9DʞkLJr:g?Gx|?oۏ1c98GC~ڊQ8u=:]-nxfO@7#d&FA=(k'wwZTv^n);!Tvx4MoQ} \R ?vC${okkGll񍬿=sڵ>xRnMR HgmQJFs=+^1/ϲs{wcwQ^cr'.QP~>FV3Ae{5m$2*T[[>#qڵ/v*n3@ &h^eԯ4bK'wQEQEQEQEY? \O-[#2(푵(;yX$:; rv&T^<8 c>gZ_;s7LwP [5>;Դ; -*K[_+cH{WxkRY𮑪\,k=7,` N2}Ma |=b}[VѾ}>2_LQ¸ }3N˵!7'Z]JmºnVS\FT!`85;t;-*;[7{؝ ;W_zuͅ~eO ɸzW/|-o55m'F=~3ܥO  (+Wwxow:< %_ѫ\t ՠ袊[x{52 (((qyVO{x$P** + q*Ox{%PT6*~((((( +?g(zѱWװ~?PIb袊Ǿ;//?]IOe 8« 4?CAEsx?M4 4?CAEsx?M4 4?CAEsx?M4 4?CAEGoop8*(<ow:$](@jEE_0WC²訨(((zqj03Y.X ,@85 ߃kc@|JnOu/*h.OЩ&\ZI i$r)VF( ܠOЩ&A<B(OЩ&A<B( 6zevvZZǝ$ O_"xƞ*׈mKZGw򪢉Xl?; z f⫸Ajk;jvyIeI=Q^WIԵz}-+!A8>t*k.)gi(CPyS[HјPd*JLH51 ặXTeu# 8 s_ x/~*ׇ.<5Z$TI\9袼k>S;XZV J2Bq}zƅhkiWwټۼ[2:z (>/OĚ-fݬFɠDlA8`0pA}&/"-HR"PAAEPEP_ |mۿ__kAO(~Z'? VF}EP~hߕX9n38=g 4?CAEsx?M4 4?CAEsx?M4 4?CAEsx?M4 4?CAESt7Fk}/OGk ĥHPpϰQ@|_W~?PIb` F@OEQEQEQEQEW|@zGOyKY4_y2H@OE?y.߇0oJP~Wn]?a+7_ Q@_yCI\?v<$?|E} ?%qu.߇0oJP~Wn]?a+7_ Q@GR8մ'YEOfMfF<8k (jEE_0WC²訨(]?a+7G.߇0(#zwſ[X64aTt-P~i`Ӄ^a K ;o+ F_OXkdPy<ԓ(c$uSVƷK'umgm",Ϸrx k>6^Iub5=F].HaON7;dIk< %_ѫ@oEw$ݷcroJן_+ѯv<$?wmg'kuM #r0N# E}O'UZ+?[hڵ`Kn 8PI Huw҈tyCI\~)Ѽ]I}9L,SLJ0?:دjEE^@y.߇0@(]?a+7[_j2Xhzyc9uξ(` F@OEb}'V~}2/w(aʡv<$?x+kOI!#7O<5`_W?O'UZ(?[hڵ`Kn 8PI?oJInQ|@_yCI\<7tc(((((+gK\??jgK\??jgK\??jgK\??jgK\??jgK\??jgK\??jgK\??jgK\jEEG3%w V=m/Kh%kkV`Up6aoZ(??jgK\?g(zѱW+6=fmSKԦ[veBVڊsk@%{]'oŝ{~*M6h%Kkݘ1w\ A־|O/<];r8#ٽ RmEAI=w z< %_ѫ\}W𮍬\Gq4EK#0q(([x}㯇?k\C3#~rLw???j>` $_ K^ k5\Eƿx;QeKcJ}H4p"@ $3Pךxki]Ɵ,(`I?n;[W$Gjb??jgK\?g'dQWW7iѦ[fuf UWjv q+?g(zѱW k5]'h>f4Jikv[)el9Aր;(>@%{]'OO wzQP`製c8?ZPxJ+kV߯+~xWFluK}CYi#d"q8Wk uGk~ydt\ۜV3%>TyZ襮:l:6c۴v*p=\?$](@S?xrCxnox]\`GUϋ? VT)-nFP6ZqyVO|_O?O5 `( +gK\?|A-sƨ F_O௄M.RymݖDe Y[#j)Pw ow:?<7wW[7mEAc'E3%>T3%>T3%>T3%>T3%>T3%>T3%>T3%>T{%PT6*|A-sƫWmzڦwM |Qi}%ΧcIcc^cagYgaiy rI8Q$4’yBN:`| 1吓'^/}q77yWR>7;Xp2I_oxOz䗗ҮGlXU  h 3Q˺&ԂZe?Nk?h",)l.Õ@G  x}z/+<umKF-Ɨ]ڜhZ1_*STq+xuoOmV7f|q8OA@EPX,<_ZBA8<:ʞ4񧊭|u{0rV*? Ě=;Qycu[qmq{$HI <h.߈0䕿o?Jx?M4 4?C~!Vn]a+7_O 4?C'T]@ uG4[VEw.Mfu(pWxkzkk\C }F 2S'gd0F#E$G$\ ķѦW/$XDNI$I'qGß5m[I=O.}E<0 HWaU,;9, 1"6#*x8 €>HtCI[OЩ&A<B xYwo/ϵG<*RG@:*5[z} ;XV%-2B3}\ƞ4UCoo]f"R8㿕UJ`8}@c75?(SxPя[P<``icWhߕX9n38=|ItoXz} F+e!@>€=nƓjh%ةlΣ +xLy FIƒIk5ׁ|=qq,O.lI#gcI2/>k&O&\ 1o_>˳̑ݝ}FszPAX,ޙy%4Kc '# |KoGVմ3>\j7mȠx-h%@WR2#4O<6\K0DF dOk/v7gt; ]>p;]cP#J|_&r].aON7;FFJ`dր=Ş#wu&vCr;`p د>zw>#:q{<2]wB8PIv<$?vWcag]E7dt&iͻ\iz KYU pJ3=|ϲ̑3Ҷ> |D|yajdPy>,C`O@C4Ķ%ѡ')$r_Ĭ AW7 ?%q_[~2/-n }nFFAhz+MOQ|˫RS쓍)GZ(((Ş,ީsNӼA^_]i[[$HѲ"K1$$//Lnl/5.Wd$k!B`ҾP-O.PgNYҀ;ៈNWVoy׷1nw;,O$޾51/K#qi:N./̛̌ydp ~ߛ8>pq8=} hWmoocW&f︧ܽ}kv<$?x+@(( ( ( ( ( ( ( ( ,+Rmt.{Hg.Juڬsk>`q?7joW?(/>V͛?lJqXտݵ#n1>0T8ZWOI[ ܶoygq@3?%>0Us6?!ϲ|ۤT8@  ho5^ƱgZoy_t//k>*K}CFX/ofdP]q5  ho5_O@08ZQ  ho5_O@08ZW&V? izO-+Z2(T({zWy^_+?_o_log9@E| 5RTU_(KPjڔ:6}\,,`*Xp=Ey_4w߈s?5Sϱmķ_n<;{ycv7g2+ >>^*}0ӵwn~!Gx? qg9,cOiڨ +?B=jOH|۶o@sg (';_/ot{ݞqn4/y6sn6/P((_'<]MKC;l$z)^o~~!4E]mhnٽǖ36?!ϲ|ۤT8@.x6=STf[Uكf܊1=+f_kQ ?4Rc'L~ل|?ÌsǠ|2e S&oٳm@EP_08ZW؞o' >V!mq>0T8ZW@sj?3n3޽>`q?7joW?(/>V͛?lJqXտݵ#n1G|7ywA%ծr+õc6 H/a6Sy9۞ wLwnv߱N3&$֥#TY +n$X,U1$ z/; ??vf_k >>^*}0ӵwn~!Gx?Pn~!Gx?  ,uH3a6푓y9۞KCW-Ek@w,#8>:lγc۴k=v񴄅 N2} {3/MM~؞!5oJ|sg߱mϘqc848ZQ  ho5_O@xƱ63}ٷ9ܫ=돯&2y߳6{?e) w~&j]Z(wJ0Laڼoĺ:ϊ}RdX/ofd0Wr3j獼1w}_/vN1{W?@/w.&IwW^VǝATs=7пhO"Oۮ7lwcs ~IGOH2H$b$ rG_?d_C/Z"~ck7\v?`xzIv>o{V/_?o+]7nQEW뿴?'u='o;7rywrgM{W?o l/7ݺEOnN8 7O/?ڼ۶6n:`(((((((?_4`ֹ>gGEoW<7z4^=Kp NmU޵Q@y^ ºγ}\j{q%ċ XOT O]˽I㵺ٽ`muqATv(WmzڦwM}˱_nO <9.߈0䕿;J`lCI[&o-u;{}U툪G9#ڋ#)Z xouϊ4V['-㸖68T?I]wZTv[7Hmuqd#՟zsayQ<3'  2# _nx>h"ɻl.Õ @<?g(zѱWo߅|#_d# ?%(H$a؎?*((z_iw "{o%$dCW(7O Gv%ծ<;ǽzEP㯇?k\C3#~rLw V=m/Kh%kkV`Up6aoZ(V]gY.5 egEhv,@d'תQ@cv~.އ$l06 ;V>T8?ZWQ@? k5^o GÖkkc$:[PEPEPEP৆];rUfX 0 dQޱ|A-sƫ(< %_ѫ_oח |jz}S-%S?4h]k9SPpA\ߊ^2}'IյXy}ݶaʠ#>/Xmc7ۼ3h퍞^1{WW?w?e]O羅nn3Ҁ0xRnMR HgmQJFs=+>#zO.-X6,gt-P>X`qӓ^[|GIյk_OyTݶgQ€sz/ :qk+=ė,sD3bc'>R(>w.;'fq uQڹ|&|ͪiwznR#(RQNrwPEPEP?+k6:WFMR8dzJ(oƾ |yCW pjX+.a9T G웛ktll݌mUQ@Q@SմuKi y-h ԩ# Ey xo>#,/uY.wI匡܌ FF=( ( ( ( ( ( ( ( ( ƞ4UCoo]f"R8㿕UJ`8}EQEQEQEI/n-.^9#b"b#A5_AW[$#5,$(RŞ$䳿wk&7=#`2 ǮOЩo&A/Ěg-f~F`4\8Pp2I?y\uq-IJM<^I$bNI$IxĚ-ݬ~gDlA!Rpp@?}OEQEWǞ4񧊭|u{0rV+:((((<O]x%f]N$KY]L #WtP^WVԴoiz݌ƍ%8%H8½R]5I?['_]s8={PYM3△ga V?#d0^.`(8$ƾ\]x4$1fv1)$$ܢ#n巸9 I]H#WRд 8յ}Jҵ;'ɽH&tȭV`py|.T+L;Cy Čs_Eʟm7FƩZXd]L)o6#Xqk3]7'Uq}%ٜ;Ipz*?-z/$:D+n>t; 1(wJ0HfsaywV3'';]I 2ǁ?k¶5h?VFzxFV\j3Ae{ ċҖ*袊(^ >k?gof}0P]E[_ZDBH܌S#xO$w-rJؓ q$C##fѼ+iw Oee %K"$dA@QEQEQEp j76uk+2}sԐ!0pA_(xNLy'kk[3'j,Xrp^_^*|U^q423kxÿ!}O jk_&HdoEUDc1ּ?vQKJoO%}@?/>"w?}rnnqֽ((MOQ|˫RS쓍)GZ+O |V#T4f9,U11Q_EEPEPU:O.'gNPKN=*eMY𮯥۴k=񴄅 TN2} a=b 'I~}>./̛c O& pZD狼 hvAוbmOE=O QC~uFfO ˨X~uW&MxWZwOnk#.c{WPEP\=jz]]JŸdnv (L :q_:xkoiơ4WH)b z.I:tw-dB6^I㯠x+RnR{I]BEܪs=+ύWwx'gt; w˺>9 JSIgF- `5iCu dgtzw4ymZ0m%Ϸs($@V?"xWڌ32}XN]@'<]MKC;l$z)\oUujzlKd궲;0b;F0{%Q@Q@=jz]]JŸdnv (L :q_:xkoiơ4WH)b z. ( ^ >k?gof}0P]x?O$w-rJؓ q$C##mg'kuM #r0N# _[u]O4ϴ8zU? ih4F2Gĺlυu}.ݣYl$(gBqhDi:Nyq}dݵKYy5W;)OM/t-m|;t0:^@Q@Q@Q@Q@Q@Q@Q@>#mfw}6|jM]KǞ5H-!+׷UFU*'s1\(+KR,#K_+bN*!{QExo:1=;WMԣ/^InQ|@ 5RTUzÏƭ&?vvv+IaY?TTWDOR,-m|&oyg>??_zVvWc(;[;Տ$5-r8$$JҢAǽ|_:4htRMZ7V,s >&My߳6{?t;:#l/y{H|n^~m{Lռ'֑\[lށ83_Wi?|Uh:]4VC)bA8 z .6]_TX{+)#Y*YdzIכ@lNGUcyV?-y/?Q+^|7nߍ|FK'ZXV\sҾtGs}7ۼ3n^1W{P8,\j`ngjjow:_uiz]455nQ ^|8-x_=tV lb]՘|9c=:PxI熿k 5n4VX(PNr ( (g^t.M l7f ]kvd~$w4r8#w B I製uQ_:xki]Ɵ,(`I. ( (ĞޥYiRZ[x.wDrDucڀ=֥6]#TX{(n$X 1$dWڌwXDӼ96gw}'O&({5k= ˺&9AS8 uHuw҈ S Y1#`2+OЩ&> g'dQW 4?C֦5[z} ;XV%-2B3}szXVմo_O̗S&pLӭ,mbHaME(֬Q@m=:?2'dF`C FA=+>7Ú} \jRrEvP\Ogw?=0v_J(  [F%gKY%32y&\ ˒z(b(((((ŗgu9<]>h_h;]cbZco?J7?2-웶aʐG  hQ@W:K"0Y2F򮢊('ÿ Q\ҾuBK@0Xuhw4x4&0nϷs<$IօWafmgywVп;]H*p_Q@InQ|__mCۿG_ PEPEP6sayku2n#r0!G# |b [IѾ}._Lw)S9G" (ih52  ?J%$B(=((|;𯋵+wQ!WD$ #Տ]Ehw4x4&0nϷs<$IօPafmgywVп;]H*p_QEQE |=b}[VѾ}>2_LQ¸ ([XYЛڊQ6sayku2n#r0!G# bO gw/ڦ}ᜃ#]PEPEPEPEPEPEPEP9__?i>nϕksh4S;Z&+D2qF}zQEQEQEQE·_5s~ U=qqf"I$UJJ9aJ+uZߠ;Ú/OĚ-fݬFɠDlA8`0pA}&/"-HR"PAAEQEQEQEQEp/5?͝wRy!3#'( π^״o_\j&ci"uj)o6#Xqk(>>k^|ucq蚕 F%ʡN PFpAǸ/[qcjvwepM靗r9 2dr=O ׎Cqo,sA.rWS+AG9ow:ƞ4ׁ|Coo]i.R8㿉dx|yEQEQEW~4k)&]2#5,&9$1_W L^_U4RF$,FI袀 ( ( ( (>t{YՍƗjW.4*e8%AOF??|3cu<]WǞ _|u닏 k0lI%U$Wk:(zqj03Y.X ,@85ryV?-r>d7O|ϲ\$3c;Ipz((P5a[_|AO(~Z~ (>` F^KIoQ%y%OT6ZRo>i:N;̋>;U<x4U{ }ON̵&GZ@? Ongai=ԞF`' 98¼WXd]ZJ[͈g{.(((򿏺NK]N7haiX/( H"x;Եؓ6Ĉr#Ao l/+ݺ5n^EPEP^o$w-5 *;[yd6!Ozzt;:#l/y{H|n^z6iw Oeq%%K#$dA_IGx?OV|]snݳ{ۜ 8{3/MMx[_];MU~Ǟ( rDSڽ"?} >~>^Ѳ}0ӵ{QEz q-=Ė4pT1RFdR?]?C?nݳ{۟0gp(+>$.fAs ua޶+?1ϱm"vzWŝǚ^iCaKMJi[kXє)f\Χ9CҺO x,#;[ud9Oz#}[wMy_dsvݝcO?϶}#?7cj+u.OV{ۈi!(g`HN2} zx~<bxLտ)wϕ~ >aqWgZ<+ksC>?yͻdWu\ÏCqnδko+V2۳czp~5YK-5)ncFPpw:oJ+#}[wMy_dsvݝc,]Mr9㵺߱'PmvC TC!c}e?y{Hrqں 'ufK;xHb ('C^^~؞!5oJ|sg߱mϘqc85ƺohuMR mmQYf1=*~#>m}|3h=qڏ}'GMG#n_9Y ¹vlg;PQEQEQEQEQEQEQEQEQEQEQ^?"w?}rnqֶ> xYwo/ϵG<*RG@:(Xg2,,.P$j,dNhz( ( +5DW|egadOI>s$G^[|GIյk_OyTݶgQ€v<7:u-KFB *JAq^Um=:?2'dF`C FA=(>oXGIS*.̣Aʞ ֺgK\4O gw/ڦ}ᜃ#]x3%w V=m/Kh%kkV`Up6aoZ(/xs>:`| 1吓'^;Oe֟o4ϴ ѩc'lQEQExOx?;1ɻo77OZ + xYwo/ϵG<*RG@:((((Wwxoo|GOj7/Kv 8WpW,qjM|v+2)G"OxWXSGF(=tQEQEWOZZj̟dnFC '}O@SGw.)$$aT~U/"ϲqn3Ҁ=((((((((*9[cHU I9IEczvv Ү`GlNO[Z>kiV7N|ۤ3p8OARiN[X]bR$(8gU(9[n.<5M<^I$؜I\O9ßƞĺ43$K ܢ}gYywx4r@c ~4b|K7 ozm;[ dqZxkAnT4,V+88'XYqZAikvCb4\Np2I?SԼK okzm;䌀dcW,o;8,.໵;&A"6  88 €,QEQ^InQ|@_V{Yk/DԯW(Zڼg{N~$wu&7=r;`2d? Ԃmmⷷ8`GjQ@WL[YOiu1yʞFA *9[cHU I9ezvv Ү`GlNO@Z>kiV7N|ۤ3p8OAZ>kj6v|$[qGOQ@iN[X]bR$(8gUʧnn^i}FeC`qW((_r^_ik7<4\X2HS|K7 ozm;[ dq@QE·_5( +xzu;Ny}uAomo{M#Fʨ ,ĐkAnq8=} gŏ,ާy43/c'VV~'ypo3g=EInn^i}FeC`q@+V[ hO+I,"fv'$W$krmn%. 9I#%d`pASp`'GZآ>p[^ڶ{<2_BwB8W$@WQ@Q@|τ;e_^e֡q4/i|:P\-QÍ[Im}?ŽSvّ,@y5Q@Sߊ#+sJ%{¯˙# a*(^.}==!gDQĒ0FzGQÍ'Iխ}E_n靇*H<x5Q@Q@InQ|_kD狼 hvAוbmOE=?|aA-ƨIaY?TU8ZW&V? izO-+Z2(T({zPyEP?,n5?qWZ}07;FFO$ ~ß[VѾcK_n]G H >+:x'^1_y߾=}szWQ@oSτ|yaYMATRL0PO^EQER58մ&>\[7m'^oSߊ#+sJ%{¯˙# a*((( ޙ-Bmu yvȥҾ~|]; wQ 3'rr?:x;{Oھ97m7}8^E/2}[VtoXrݶS8#G"1'cqx7C˺75 288 Ŗ7u 8˫>Sp`'GZآ>p[^ڶ{<2_BwB8W$@WQ@?>"ϲq3Ҷ> x[Yo,5?]I<ʞjI1:(Xg~2//2P\r4TFAkz((((<'zg; ˵-ڋ"8J+5[Ywl4;?G$̞jG ː:+tꚤsA-۪ڢ*͓c{P/>"w?}rnnqֽG }&~g;cYzv/2}[VtoXrݶS8#G"v7gt; ]>p;]cP#Jآ ( 4}wn/oanP8i7hɻl(A?h(zѲ? x,/tnI8 FGU=>=:B-nI7#TFAkz֛6]#Kh{+(mh*Y)# dz Ԡ(_ÿxVwXGHHð=~uPD|9IukAyoWۺgaʒ vQ@,xOhwkk[3E,p'=PkhvkPI<ԏ# ua?'ɻo17/_Z (((((((((((&Mslٳwt:[;M[y^"6_Gh>s}|/쎋s1ޮx+Zoi.{YUڪ1h(';_/ot{ݞn;[W$Gj|`' M\ksEۍ=+WmzڦwM#,/uY.wI匡܌ FF=+&Mslٳwt@?_4`ֹ>gGEo@Ïƭ&?vvv¹x+M6w455ӫ0bUF0tOI[ ܶoygq^^W|𮳬jIq"4AC; f2qk((/m/֋s]n673Pƿ k0ꚥޥ [T36Nc@ ?&>?y|ͻdd]c[v~妇a$Z.w;9{VQEqu w뵶+Gm1޳|My_߿6{+MOw \-µ`;0緥S/Ínow}ѱv1W{Pa^?ox@se/vqڽ?<7wW[7mEAc'hZ߇[~iϕvnp38k'=[i-ϕn[npqc85&ãh:]HY[oHAbA8gQi:5p,[ѐ+RFA4~ tG>3n6퍟c9ێ+-S~a{ukbO,ed90z1^@Q@Q@Q@Q@_+?_o_log9]|O ,u^g<3n>s=;~h>$K[]vg9 Տjآ.6]_TX{+)#Y*Ydzo l/7ݺEOnN<=oa}ɻ[7~npqWOƿx×zR]\`ꣵSM7Ǟ*I+'VuV,rCiO_@W_?dM/[cfcj\€<?}>^ѫ,׵zm{Lռ'֑\[lށ83\?~ xo#/uXoH% ڊOEttmKi +xi,U(' z ]<=OIn|wBs/OOL|_c9?ywllwu^i:5p,[ѐ+RFA5[৆#;MrU~ĞXr`cހ="oW?(/>V͛?lJ uGk~ydt\ۜV &m?vvv !пJ$>,+Mt.{.Yuڪ1k?_Ht/x҉(hOzO"wn6wc83 [ufT5K9 ر1S^@Q@yCoa}δ[7~V2qzp~5MYT.(gmmdERw#JO1?Ǜm#'vz+-4; '~ǝsHucڶ(/o:f븭 7]q"¼I]Y- e5hF `#WPEP^?ox@se/vqڽ?<7wW[7mEAc'hZ߇[~iϕvnp38k'=[i-ϕn[npqc85&ãh:]HY[oHAbA8gQi:5p,[ѐ+RFA4~ tG>3n6퍟c9ێ+-S~a{ukbO,ed90z1^@Q@Q@Q@Q@Q@V'!HgLx䍊0 AxSYU H$#*N?uVOK~>^Ѽucoz FĥFHRpϰSAy-ѯ/绺4.my_H8@V?|ZouݭoRGkt)l3(+Ay-ѯ/绺4poǕ#8h(+jZρo5MBuEfQĜds^@Q@Q@Q@Q@Q@umKF-Ɨ]ڜhZ1_*STq+xuoOmV7f|q8OA@ExLxU F#' I'?5ׁ|=qq,O.lI#gcI/Lagv0 ;Qd`%2p\zuͅZD̟dnF0LzW<]\Kqq,O+I;Iޙy凇Kh, # QEQEV'!HgLx䍊0 AΟox;Pھ~97m8^Y~Wc]K87t4M;߇5[jvme #U?4rFy`4M;Ú<No{7yqog۹Xy$jM7ItkvK˴vJ[dg @Q@_>7s]Gl n0pÑHk>x^|u}okz Hʡ؆@bFpHϹ袾t]{FՍV06vOe!H>€>{ƽRǾg,AZ]G{n9Ƶ x-h%@WR2#5'+Odvnqր: +~)Ѽ]I}9L,SLJ0?:ؠ/Lnl/5.Wd$k!B`һ((((5=F].HaON7;dIk'to뗟dQ e$ 'ʫcڿ5}g#ۻ;~kt+)x7ÚN d_ePÕB vU{ }ON̵&GZ/:O.'gNPKN=(y_'R| cowӮvʔd$ 4O^ ?hwfMT']|A'?T?]7G 0S\tM}xwe>Odvnq֬xo:7/;ϵ)xFч@_X^iYOiu7i:7,g|~ n )#\)//; z a⫇  u;iWwRy!9hgo/ڡ}(\@ޛZ[z};XZV 2Bq}j 5Mנ~?PIbA]wdn3Һ (?[k:{6}g۹CU<x5X_[zueI4/8<:}gYywx4r@c ~4_[u]O4ϴ8zWR8մ'YEOfMfF<8h?%uzޛ}:qGkt_*Q3*3Oj [Yv%g32y ː:Ŝ%ھWSn<V?SxNC]rY$a=~u@Q@Q@W/OHʟgL$R:MoN}}\7mbAР((+)x7ÚN d_ePÕB vU{ }ON̵&GZ@Q@Q@Q@Q@Q@Q@Q@Q@_Ʊ&g;cj\vO Լ[/Ti{kWfPpw*oJ((w5-H#0UzO :͎o+=v3PN$'>RWU&_ey?ٿ;ss]~:cϱۼͻcgXvz 5760>Uzz&V? izO-+Z2(T({zWyE~xYV[2{{5k$҆ X袀 ( ( (>t/h*5KCFh,acRQ3]PgZ<+ksC(wSĞޛ_RZ d.wD0 `ua޽(0|8> cd?[mVթZ+uM Լy[]/KKkeRp6oZ(/?Xsc7ۼ/퍞fsW{רQEx?O$w-rJؓ q$C##fѼ+iw Oee %K"$dAZOI[ ܶoygq@u ]S[CP΅A8d xn#$;v!g9 Oji~!4;uVn7]3dW wuH_3anyݞ? T.٠mdv`Ѳw"aJXsc|3n^1[;WQ@oj^֗Oi4޽µ(R;NrwQ@Q@Q@xş lk[X#":fx75?(SxPя^/7,_ _(~/ogq?Lg<>৊ux6\]z¯$xAd ν">t/h*}?Fh,fRQʂq ]p< 77uu+3qؒ2I]r[}d[7m`Õ @<ÿ GQCҾu$FK&PHñT~TWYxV^iIpu.끵c;zײW/O~v}8*h< $`:wKxM/;7z@ +$;QY&xsGImc.-w1cO$MhPΞgZFq64p+RFd#8>4FBeIvTk('ƿxGzaeIkkly␹9Տj >hho/ڦMT(\@Ԧ|+j {e ċ!C: dSGu)o YMq Rȅ8 #U }3N˵!7'Z/m=:?2'dF`C FA=(k'wwZTv^n);!Tvx?D[kjN{7yrg۹J<9PEPEPEPEPEPEP\ş^𭮩i4ޥ-3(RYNrwO h.ӣ,keO5À@9BF?p#?asw3ptz oY@Q^<+f~yp~!Vn>5Լ[]SKiKv[fP6Z?Xmc|/fs;qO h.ӣ,keO5À@9BF?Wǂ|;`icV;Inv8@Q@Q@Q@Q@Q@Q@Q@Q@V !ILHK3I'P L^_U4RF$,FI?еo*OKwf|gh8_C[KF-ڜB1_*!3h(((((}aggiݬ AS'T]] 4?C֦5[z} ;XV%-2B3}\ ( ( -[򿵴'>_]qg B5G?t'>g-]򱝠8=} {&5[z} ;XV%-2B3}|Ş$>)k6v m-c6C쑢ƒIki:[}SO9cbTC 0gתPs3U 0S\tM}E|B<3I*J-:-кpe@;?0TQ\'~C?UxGƻ Qzz@:df5I#-@`N:ᇭ}/Ep,/4υ5Q3gd(((cIRo,)hחm-c= @kz(-c[s'J~}ٟ+3-'RѼ }oiv3#wPLWʈd J(_]qg{Y-ƩiӮ",V+88'4-cD[Jߏ78qWP{ =2;; H--c`FIŽI' SXxU4RH# #־RCS;XZV J2Bq}aI_XyfnoǛn8(((i^ RMxOĚg-~~4\ b02H}O@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@΃=f/TԦ[uVBes=+,]Mr9㵺߱'PmvC T (3oN>\} d`H v<$?.߇0~)Ѽ]I}9L,SLJ0?:bjEE@Ey~5o>#Y.vox"܊Fu(uTY x#Y 0EPEPEPEy^º6}iOeq%1,TGT?▉ƭ6hީlǖ <?vWP!нr?Ʒ|$Ɓ㋏NbcOD@ۢ 9%OT6Z]?a+7G.߇0OxÖ<]ꧽl8ZP|_&XYeԩ )Ib#w?k¶5k>/K[]TՇzآ; ??vh7\ +᣼@sChu`; ??vi?|+6:]CPA8dJ+>$.fAs ua޼; ??v= Gk~kD\݌mfOƿt0z4ۭµh.S@n~!NX"{ok S@_.߇0oJא8ZV?~ x>/t-mvoH%Vv<$?~WndW/k3iz\\3];* X.;z|8>Zoy_6;:gl|kNYwkOHY$a>^#մ3T)k<39r+xw~&j]Z(wJ0Laڀ8R_^9UxLӮo4/.'g\j(%Ҿu(uTY x#Y 0;~s}:UYy."cY&5.DH㱠(%%{B'4OMbk67:fΊo1LK:E',8J?|Y|yͥv3n QPʸ]r㷭wQEW_#;Uf(Ȯ0Laڻ'RYѬuKu`5]CpH QEQ\#m}7ۼ/숍s̿3ހ; +Wthj\p[" c;I@z q-=Ė4pT1RFdR +>$.fAs ua޹|Y|yͥv3n QPʸ]r㷭wQEQEQEW7_ѡ5H.[UEf U's(~@M?aϵ.w6pj(?7wZV7FPEqdU='RYѬuKu`5]CpHVԡѴkRdh,丑cTR 3(xCc߱0j3!=H(((((((((((/mo߰y6m}vwv>;:>_3Wtw'ݎ (<ow:O]˽I㵺ٽ`muqATv7q+IaY?TT8?ZWyiѦ[fuf UWjv1} >fݱ}0g;sӽzbx{L|;6[yv؁wc'qZPEPEPEP뿳߈u=['r_ors 8{PEY? \O-[#2(푵(;~&¹Gylg;W1 _?~߲_j߳17W~63^o c cW+۶E^Q@?2\߆_o7]6n|M̭oF9`xzVvW<gzjnomqyVO{|!؞!; ܶnݻ9]qdև?k¶5h?VF ՠmL|!}}jyvȯr3޼_ \jCWy[6om+??X!տ~-O78wm޿1ڽB Lwm"v߱N3&(xc_hlڼ^fݲ+܌n:_VhWms=;רhZg''inv2qg5EQE~o{V/_?o+]7nP^?o_jq3n>3޽дOiO}+o7n.d82htjzO[o7nЮdg2+B ;:$l/{FÌnNQ@Q@Q@Q@Q@Q@Q@Q@?"w?}rnqֶ> xYwo/ϵG<*RG@:-[򿵴'>_]qg4'MѭK,`g.±)l3(Q@qGß5m[I=O.}E<0 HWaU,;9, 1"6#*x8 €܍" OJ_mn"֍ 8x%d`r!r<7((((((cşwx\|[]BS0Q8uV[ hO+I,"fv'$W$kr ;IaXT|_>7s]Gl n0pÑHk> _xWw.,ct71H8Y23 }h_e?}YfoNcac%Evd5@Q@Q@o:τ|g}MA!gLBFG_4x"}ۻj-'MmT/WBl3kBOG?t;>g--򱝠g=}MuC²訫K^i:N{<./wByd$I_8,gȾ n P_Gh_Wr+!@>€.W,3Z兞ŸdE}OXs/·W\xkFy\Ia39$$s@QEQE|GC ?J;J`l>,&g5[KX/d$$< 77uu+3qؒ2I]a.y 닉dytgI;Iy|x^.4v$r_ePAAb>ìx[FvgX*yz1boY@Q^<+f~yw}˱_nO <9>"x25_ǧʟg<80QAp䳿LoxĈ  kAѮK4 48%@8€5((cwC|[B (aV+ hH"VF  kr ( ( eƙrO.OXةֶ*9[{ PȡԌA8|◌GIumg3d_e7mr~/#iuvMqpdd?ؠ(((((xmm常8` $Q@$ԕO兜~e֟q ) ѰQ#>,ާy43/c'V|o9Iյm0ydjpI(9i[[mp;]cP#JԞxmm常8` $Q@$]<7Gga *L v$AxSnaguuC nsld2H^o9Iյm0ydjpI袊(*9[cHU I9I\xW_)&qicwOeap.ّj!,pp={FƩjV06",Vb8'Ƹ_W/xy+(((+keo{5|M̭oF:IaY?TUC²訫(?A5ׁ|CooO.rgcO]?a+7@1~$>)hחm-c= @kz]?a+7[_j2Xhzyc9u΀65=wGxSgyZпb2@S{=2K--cFIR58մ&>\[7m'@?0Tw?W$wW-dBːHF'ʫc>"ڿ4}gۻ;~ ktHayY>\OHLƲ $b )\0_Aay|-Ѭ' sm冹gK5SI289BGU?zE|yO^!ֳ4w/Jeb!pAICuv67RG1$ǮOpq8=} |GC~ Ov3wcn^ߊ]+;J]zzBÉ$$a?:> !пJ$@O;>^yidfEVSu<k,/=:O2$F` FAhI[cHU I9ezvv Ү`GlNOG,n5?qWZ}07;FFO$ ~ß[VѾcK_n]G H >=wG ,u&*y&P(HH 9i[[m`q?7cMK~I&[׸Vve QrP(h7\?᣼@sCk (?|Y|yͥv3n QPʸ]r㷭w%PT6*~ ( .6]_Kh{)i Ш'd=w-}[o7CnWv<8ɣBCi?y?nݳ{ݏ,g2(ÿ$rJސK!s'AcQ@WG 6OE~c.{Q\|O ,u^g<3n>s=;A@3I[uVo.yc8q^@yo웛~kw\=qں:}[;uy^ocY &G>',;_g}k(MMDq2ve^1ϯQƱgZoy_?y|ͻdd@eMY𮯥۴k=񴄅 TN2} jW_?߈t'o'q[yop9E`h58lnt3wbhuU?4NXp^~ YK5(gݮERp6oZow:J`?lTQ@ |mۿ_OI熿k1} >fݱ}0g;sӽzbx{L|;6[yv؁wc'q@V~bx{Sռ;6[؅3^_@sj?3n3ހ=((((+#`}' ukuۍ=(>':3ol{9۞렠 -+o7Cvv@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC${O>.my_H8@V?zEQ@Q__’yBN?I|<{'n?y%PT6*~ ;u/=+RDagDe ;G]EQEy^ ºγ}\j{q%ċ XO< %_ѫ_o ՠ袊+mǚ:wCqjM|v+2)G"8;IaXT̿4ۧ֯('OxN\~keO(=u/? ( i:5p,[ѐ+RFA5r |߄|GiX^]ZؓC@{פQEQEQEx3%>UP௄M.RymݖDe Y[#j)Pw(mǚ:wC:4KL;VU 23F}}7hZ>dV6v<ϲ[[ghO_S_8~?PIb>/Ěg-f~F`4\8Pp2I?}OEa.y 닉dytgI;Iy4k_Y!-26*& 9s[PWFo?Yi$"3 8QEQEQE,MO兞]]iŸdnv#|^|V_jY[q"4 f03+?g(zѱW%PT6*~ ( ( (9þ/?os$wSn^c~)Ѽ]I}9L,SLJ0?:0|8> cd?[mVթZ+uM"xW:vK"*}Y2QH[ӼGi7hw.MX#G"m{Ǟ*46"Kv[Xwlqֻχ~4H$w JһõuQE-vfO5#X~uƺohuMR mmQYf1=(x;{Oھ97m7}8^\~#>m}|3h=qڻ ^ >k?gof}0P]E[_ZDBH܌S#xO$w-rJؓ q$C##fѼ+iw Oee %K"$dA@xNLy'kk[3'j,Xrp_[=b 'I~}>./̛c O&/Sm,2T$sFJ`dֻ_UxH.5 EiKG @`gWtOӣ/>k$)ːH@OE?WǍ;`jl.;2GvvX|x¶^=3z NʥB:mV9ˎ޵ƱgZoy_0O^ ?hwfMT']x?ÿ$rJސK!s'AcQEQEQEQEQEW|@{%PT6*J`?lTQ@?ox@se/vqڹiګ%{]'=k?ᦿQʗj=k?ᦿQʗj=k?ᦿQʗj>е?i++v6gp+B<RA@InQ|__mCۿG_ P_O?O5 +IaY?TTQE| SwSm̿77P8? 7Fc.;;רQEQE|A(~%j~V]gY.5 egEhv,@d'תPEr:>3Wllw#9ێվ>Yѯ?FX/m䷑P]J3!5KJoO%{ÏCqnδko+V2۳czPE>5>;Դ; -*K[_+cH{PQY~Ԧ|+j {e ċ!C: dSZQEQEQEQErGDu39('ƿxGzaeIkkly␹9Տj+/ZυtRcYlc(g@ qkR ( ( ( ( ( ( (` F^?^8C?'>(Wwx>6^I?((( $_ K]syZ襮<ow:$](@jEE_0WC²訨((?; z f51话>x^|u}okz Hʡ؆@bFpHϹ(|_ޙ-r]mu aO@vFJd־hho/ڦMT(\]^Lӭ,mbHaME(֬QEQEQEQEwyZ3"ɻkrօo߅|#_d# ?%(H$a؎?*( ( (8Zޣχ}'˗b"x$r+>kzſh8-(6,fWD ~Y`sӁ^InQy%PT6* x'þW?l}$ocnnQEqXVմo_O̗S&pLӭ,mbHaME(֬WǞ4񧊭|u{0rV(𝍾-?2PdFi0dҾ>7Ú} \jRrE|O(~Z~ O>˿ݍqszWAEco7t,4;?Z)y2N\G[Q@=jz]]JLknv$| zWqEwyZ3"ɻkr?W:K"0Y2F򮢊+'ÿ Q\ҾuBK@0XuQ@&xsGImc.-w1cO$MhQEQEc75?(SxPяU1;_ճn۝}1zAE |=b}[VѾ}>2_LQ¸ ([XYЛڊQX((((((+ q*Ox{%PT6*~(>6^I?@%{]' ( ( (>' *E-tI熿k Huw҈ ow: qyVO|_O?O5 `( (=q*O}?_0~?PIb(>/Sm,2T$sFJ`dրf{<Nrp?yg/ k75MRdx,85]WΟ|5k>:MJ#FPl#8 WtPL[YOiu1yʞFA(<+u_Fyt˔8fv10$1_>|^^KJoO%}EP_,|_5?Z凇[YxOĚg-~~4\ b02H}OE>kdWO|ϲ[3c;ApzZ7oM>vuQ dc^EQE_6vIl̎؞2p +>t{FƩjV06",Vb8'ƾ(+/V:dž`Sy$UTQ*I+5W4<[Xii;QA,p98ow:K#qi:N./̛̌ydp ׄxoϋ,4;?GHN\Շ@ 'ca}]Enq#o51((((ay-l-' S;XZV J2Bq}aI_XyfnoǛn8+(X?jvy&I`~=&/"-HR"PAAx {xyt˔8Գ;xnQ@,| 4ϊZ5[KXOe$h@2`d?((((((+ J`?lU=CRب(>@%{]'ow:(((O<5`_W?O'UZ(6!J#+Huw҈ +IaY?TU}?8O,#˽r9䵵ٽ P\uAHXwo_tk3iz] [5hT2c[6&>>?yͻdWu\ÏCqnδko+V2۳czp~5YK-5)ncFPpw:oJ+#}[wMy_dsvݝc,]Mr9㵺߱'PmvC TC!c}e?y{Hrqں 3Ifu.ݣYn#$(g`qk'|wTnY : Xw'? VF}@ߍ|kFT nV1VḷCҩ>6>ֈ߻_X~ݭϛy:s՟+Oh}o+fsۥzQ@Q@Q@#m}7ۼ/숍s̿3ޮx+ƺo4iM. `nUV1ko/X7.n?\cgZq_W~]ϛyX"sQEQEQE΃=f/TԦ[uVBes=+,]Mr9㵺߱'PmvC T?X!տ~-O78wm޿1ڸY?}cǙ$.fAs ua޹|Y|yͥv3n QPʸ]r㷭nxB@g6_g;q׽q>¿ ƭ:ѭyXˣn1QEQEy^ºγc{qm$1  OTпgO隷%>wn81 (((((((((+ q*Ox{%PT6*~(7OO wzQP`製c8?ZWQ@? k5G3%{>T8?ZWQ@? k5G3%{OIaѴk.ݤh,㷍 TP3*PmCۿG_ WWC²訫 qyVO{Q@QE=CRثq*O}?@Q@xO ;NF{}DwѴ"0J qWϋ;s SO<]yK||3);A략S']+ sU]z{̩xÉ#:( Ŀ|UxW6KG* ĀgWu·_5/IԦѵRci#dd`q+k'wwZTv^n);!TvvV մnTϷr<3x$r(_u6C%ԚB$C8#ʼ#o?JW~!Vn]a+7@_XI]]iL@8 zQ3]ծq4/SlQ_8|-/Gt[YEwaMav9k((Xg2,,.P$j,dNhz+]a+7]ߊ^2}'IյXy}ݶaʠ#>/Xmc7ۼ3h퍞^1{WW?w?e]O羅nn3Ҁ<; vƏoGtHWcIIҼ_oC%zL漙s$'ʽ ?J|A-sƫ5o*tk.Oі y-h0WRFp} }W^ K ;q(> ^пI䯯>7Ú} \jRrEckNwdPHY(cuQPQ^?/"ϲqn3ҽ +_eψ?g,/t(ǖBO$M{5?wyWZ}>7;F$EcLng'ukM klTp@^◌GIumg3d_e7mr袼㧍E CjGݷ{}˱_nO <9>"x25_ǧʟg<80QAx}?KSvٝG 8PE|?;e^ke֡o Hi0LzWQEQEQEcLng'ukM klTp@@W ~)x'V~c?EXSv]*@<> ( ( ( ( ( (` F^?E}E|E}E|E}E|E}E|E}E|E}E|E}InQ|EWC²訫 qyVO{Q@Q_@0~?PIb袀 (0_n%֍4y$&gbrI%rI<(<ow:3Mյ-4BvB%8%H8¾뾿,伿ү/y.n,Ihՙ݈%I'MwP?'T]V,|'2;VQdYGA FA#񭊯}gYywx4r@c ~4b|K7 ozm;[ dqZxkAnT4,V+88'XYqZAikvCb4\Np2I?X>6^IiOZ6%a-N#;UQD6Qx^.4v$r_ePAAb:< %_ѫ@o=KIuu4KìwPdgEgy:U3gqօP=7Iy*Lo{(ve~oop8*xoLUx ʓAkR ặXTeu# 8 s@Cuo-QRHPF Ab|'2;VQdYGA FA#(OB+[Js%ٜgp:z Т)N[X]bR$(8gU(ßƞĺ43$K ܠ zw]ɍ<T h:5\iz&c;!F"bVV^Y[SDoT]Z$${ԬKĺpcHH AA4rL KX#pIjW㼰L $0? @px/¶\[kFxޙy凇Kh, # PEPEPEPEPEP_W3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x}?8i:No{<2-wL9RAŠ( ޙ-Bmu yvȥҾ~|]; wQ 3'rr?:x;{Oھ97m7}8^EQEQEQEQEQER58մ&>\[7m']>>24Zɧ*hL2xI¾c5_]ISɔ$rGU?xG//_4 5ם[F#+ :0]ş.mgH99rVc O_g}cr` ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?golang-github-yeqown-go-qrcode-2.2.5/assets/example_halftone2.png000066400000000000000000002365301521051213400250550ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((+ (+ (+ (+ (+ (+ (+ (+ (+ qyVO{Q@Q@w?±k "S{3#2;`p *{F[SDԬ`g]ZJ[g{4 kͻ\iz&}FP#8 PtWew]G <Zx/WV\[kY PƻxoLUx ʓAhb ặXTeu# 8 sRPEPEPEPE|A'?T?]7U'M2K궖|I.H,FI诃4'RnKT.Ұ\3+SOЩo&>ߢ ԴKF[}SO:u DrF@`2ϱt\tKYk}/OPGk JrHPN2@ϸ评5= X>> "IGjYI'VIYyV6^I诀(诀(诀(诀(诀(诀(诀(诀(诀+?g(zѱPQEQEQEQEQE}_PEx+Z5.{HgݮJUڬshjgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7#?)|-#ڶ}'˗P9};3~]ծo ɸalQEQEQEQER58մ&>\[7m']>>24Zɧ*hL2xUYzWcEI!#aל’BN?vU{;4 ˵ڊ c8/ĺlυu}.ݣYl$(gBqhJ􏂞)Ѽ#+r얲i ȇ0*q?7oƿ ꚥޛ4-6NQ!@'Oxw??>;2GwvOJ(( [2$mu y}EKN=+)|RojN'ˋ&#Yy5=CRثq*O}?@|JnO}_ |mۿ@EsIfu.ݣYn#$(g`qh>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x>0UW~?PIb` F@OEQEQEQEQEW|@{%PT6*J`?lTQ@Q@Q@Q@Q@Q@InQ|__mCۿG_ P_O?O5 +IaY?TTQE|EP^,oOgo7~1߭yv|?Mnϵ6n6|j>#m֋sV2qq?7gN({;YN#ƠH ;+s`=v?|A-sƨ ?B?CbxSw-~+Yqdѡ~~!4E]mhnٽǖ3|𮳬jIq"4AC; f2qh~xWFluK}CYi#d"q8xxB_>nS`ӵx4J?RU)ݟ9wTMԣ/G4J?RU8?ZQ k5@4J?RU3V|ZEsnݳzۜ 8y3%zãh:]HY[oHAbA8gPMԣ/]~:cϱۼͻcgXvz?|A-sƫ?[q$Ɓs}s|Dۂ*db0Ð:p`t?7; v>`t?7; v>5MWH.50Bt @'>(??`xzIv>o{WaE| SwSmy¿ :n|#]n773mǚ:wCW~683]3%zãh:]HY[oHAbA8gPϚOV >W~3^_ ccW+۶6^ì]H^o#F@`Igo5 VK]yc(w#!яz+jۿo'6oc^EWk+myK5I29 pGU| ߌ?k?c7^R>2ӼQw>c󥶧!dFɐac@.߈0䕿_Ğ)|]^}8*RG0:OЩ&t7m>#vKy a@߅ Í'Vմo_OydݶgQ¸R_?^ۏ9G/$:DнrR_?^ۏ9^Erw_2_zW.d v#ʺ򿏺xK.gmN4i-fh)*A@8nqgp((((ƞ4UCoo]f"R8㿕UJ`8}YމxGIխc>2-웶aʐG  hW~L[X]iuh$1xFA# нrR_?^ۏ9^i ĺ}S[ԯ]2GXU 23F}}@ K ;q+Z&ψ'ˋ{>УXy$k>>^Ѽucoz FĥFHRpϰnƓUyuO4fu]ªv3N|[XS)Z<'z; w̵->܍" OJOЩ&Y? ~ 5;Uq=ͽq 20r׮o*SugW_@d]<͈d$g.((Z7 i/VF1 c&%Χ2FIXcS_C:3 .N3חO4 e?{f]F[}S[lgd]$LW$d  ߃kc^GCoGi:7,gSv*xgrPxOĚGNycu\Oosoe$Ḫ AjO/V:dž`Sy$UTQ*I+5z/gf?fH ,MuܨTᔌAפ_[u]O4ϴ8zP+>)x7zN}\_e7mRǖ@Mlx:7tϲZ(_y2O@xAѮTwWI8#>ƹ?]?a+7^:7eg}==!g<8BFч@Kw?Vuoż9#`FApA'gt; w˺>9 J+v<$?~Wn=7¾.d_GDŽrVuQEq/sXIյA̋>rAŠa}oryQ$о7#T2V((I¾c5_]ISɔ$rGU?u?<+kq-ljthgI+#-AyCI\cŗ9<[Bh_ibGZס*NC^?vQ K ;o(NC^?; z aR_^9G)//; z a51?I|C{'m!нr>515 Y^p;]I 288 >/Sm,2T$sFJ`dրf{<Nrp?|'?T?]7_o@? +{fEyyݍ˜t=k?; z a:x'^1_y߾=}szW$F; rRD&TRL$$uSPqKB6^I?P5a[_AO(~Z~(ih׀W_+ѯ(((g'dQWW?O5 ` +?g(zѱWװ~?PIb袊((((+ q*Ox{%PT6*~(>6^I?@%{]' ( ( (>' *E-tI熿k Huw҈ ow: qyVO|_O?O5 `((h'cRט|?ֶGDF39=h'cRא|2e S&`߿kl@lj<7yQ ;XlcȤHq*=}߆<#M7C .|tz0Ux4msV2qv~xYV[2{{5k$҆ X}]_KkxHb Ш'CRk?'u='o;7rywrgMg2@/+<şj^<𭮗i ^5ӲPUr㷭s~ wuH_3anyݞ(gKC?|aA-ƫ(gKC?|aA-ƫ(gKCOOxG×z%;P`ý}o\1 /}^_3nFs{˟ kWZKd궨de~#>m}|3h=qڼ?Wտ~]O+Gm1޳|Ms_lٿwt"|'wkTv^VĞY"THqXտݵ#n1P_ٴo ]FYCo#FIRȁI#VPEG+[oegksz1=;W>0 Ɠ&Ѯ|ߵâs~kwmݻwr8ɠKͬWW5kxBBt* '>oOxGzn{IkkH%1Շz 5RTUt tG>3n6퍟c9ێ(+Wwxow:< %_ѫ\t ՠ袊[x{52 (((qyVO{x$P** + q*Ox{%PT6*~((((( +?g(zѱWװ~?PIb袊ow:Wwx(((<RA\?xkV)k?$](@6!J#(g'dQW$P** ( (9+MOw \-µ`;0緥S/Ínow}ѱv1W{WaE>5>;Դ; -*K[_+cH{Q'#+; U%zLx˙$Ԟ?*o[|GOjho.MT(@>)(ouXPX5`$`HPXN; $_ K]QE~,UiA-\3]Fmu޵߅|]i_k! % a:>uސ)60 'V~itˋ{>Xē'ZQEw?±k ĞѼ]GaY9DʞkLJr:I|<{'n?|ோ:i.M n7f UWkv; v5[F4;?Zɧ̞kɗ2H ˒z(-oi:};̗S&:8Ԧ|+j {e ċ!C: dSGu)o YMq Rȅ8 #U }3N˵!7'Z/m=:?2'dF`C FA=(k'wwZTv^n);!Tv;IaXTx>s SO<]yK||3);A략$ikcLxÀ@9E΀9zqyVOpool/If9ڽ}+ [F%gKY%32y&\ ˒z(bt/h*}?Fh,fRQʂq ]p< 77uu+3qؒ2I@Q@Q@Q@SմuKi y-h ԩ# E|৆#MK\d$Pǽy_kxYTചymݖ)el9A־M;z5;|g_dPHY,C;G@kk~ydG\31޽BiO_@PDOR,-m| ^пI? [|9Ai7gw.}G">OxWXSGF(=uWk+d7N<ϲ\$3gi8_C^ Z/Dԯ]24i-m^U pJ3=}Ep,/4υ5Q3gd(((;J`l_WWkW?O'UZ(6!J#ώM>$uCy s^InQy%PT6*?Lд}Ҭl: KLKYU pJ3=qs3TwW?_a/ƞ/,x@@'.uaQ_0~?PIb5;Weg_kOHYxq$;ч[ ~Bž+?36L#Hp;]cP#Jv<$?z|@GR8մ'YEOfMfF<8k F^?^8C?'; 4}wn/oan!нr>MGÚNo{6oW۹CTx k>ow:< %_ѫ_o կ6}[&t52]?a+7G.߇0(/=:O2$F` FAjsyZ襮3oN>\} d`H <+hzfOG '.uaףmCۿG_ P| |}_gs$cr7tcf4Jikv[)el9Aֻ+Wwx,Y׼]/Kf[$fكu1k#/;!TGzǮP5a[_~]gºFqk+=7,sD3bc'> 'tmfT5;I*Y0Q@EPk+|8 }Z_;;:cq>T}O'UZgK\M'MFѬtv6QBp נV?|7g]wOkꣵ|1E}? k5G3%C²訫+xF/7Q A c(6% lk[X#":f+T~?PIbWmzڦwMUx+6=fmSKԦ[veBVڊsh(((((((((((((((((('ÿ Q\ҾuBK@0Xu-N}[ImcŽnQ,I}˱_nO <9>"x25_ǧʟg<80QAp䳿LoxĈ  kAѮK4 48%@8€5((cwC|[B (aV+ hH"VF  kr 65wcv/oSnnsh SKY&+JpJq=|ɩƷkjN|<3q8OA@DӾ-z_ſovQO 8]SH$g DӼ96gw}'O&qyVOyxLxU F#' I'ŗgu9<]>h_h;]cbZ׮o*ƞ*ĺJ$KY]HqOe?Nk?h",)l.Õ@G  {<-xN\]r<׏=uyQdHcu # '~0\UzģWgyV͟ǘ1 > xYwo/ϵG<*RG@:%>'7l3;W8zVGƻxNzNd6"+bFzG}/_,xkzkk\C }F 2S'wWOz*O9$FY؂Y$y$q\-oQÍ[Vn>}˱_nO <9U{ =NK;H.dgHʞ)^.冹==Th_h;]cbZe?Nk?h",)l.Õ@G  }<[oqsA*92<G oLUy4QAHhb(((((((((((((((((yV?-{x$O*Z(((e?x{3Oj( ^пI䯬-[MѭT-,`g]L)lXqkυ |eψNhg%T/t.rO$z?ƿ k>.mgH99rVu?0Tw?W!нrR_^9@Ow?Q ߃kc_0’BN?I|C{'m}GH&/mi.R8Rb`I 0S\tM}E| ZSDԬ`m2DY.^%-p 3N={ާ'ypo3g=EW'to뗟dQ e$ 'ʾxoPg~~H@ ߃kc_,|_)k7p]l ؂0pÃ+?U:KJ]rYxp#a>j>'ukA̋zr@QEQE_/:7oMoM9cH AA5Oc ?e~8߾9=*<-GQ\%ԑ <ԓ(I TT|Rе|Gյ}Jtˏ'ɽyl(8e`px s5ĶI 9I#J08 /o/sƓȾ33P\^&7tN[9 yѶV3 5M'?T?]7_o@ 5M'?T?]7_o@ 5M'?T?]7_o@~ k_z)!-2$E*%y1D4V%ѦW qN6I'V|?;d7N<ϲ\$3gi8_CZ/oocWG&fܽ}k(Ş/$iu7=q2dԂxn⸷9$l]H #Οm[IѾc?SvQO A i /#txfMuC =(RyᵷX$/$0UE$xsYv>,ާy43/c'QO兜~e֟q ) ѰQ#xG߅2}'VմoyۺQ¹'>((((((?$](ow:((+((((((+᣼@sCk+ LOۮvٽFq">uŝǞMJKkTG\ 9q֣C!}Gϲt{8^?@Q@Q@Q@z?kkydDll3̿3޼; ??vh7\`xzVvW<gzjmC_}}ey{Frqڀ)RYV[ XFp}Me^؞oJ|Ksg߱ mϘqc84狼GiIwW[0U__>0UoĖ4_3nngݎ Sy>Oۭ"nٽmqg4(((((';_/ot{ݞqn4/y6sn6/P((>/K[]TՇz} -+o7Cvvϕf9Ҵ>x5oy7mmynp۳cx3?%v7:-i[FBlP*Ja^_xJ+uZ>ߢ?BCi?y?nݳ{ݏ,g2+wm%؅81᣼@sChu(᣼@sChu+>|[wM[y_dsFݝc᣼@sChu?}϶}7cjh7\>"|kߋ hvZwW^VǞ( != ( (`OL|!cG?yl{@?_OGx?OImۿc݌gMgn~!x+΃fm/Kԡ+vfJUskJ`?lTQ@Q@Q@Q@Q@|Sh͎nWFT0`8|@⟍~$w.;-*;[62Gjz(((((_uiz]455nQ \ߊ|Iyj* I製c@zZ΍}i2{o%2 T+= ?J5GÚq{7yrW۹Jx$r+t|GC]a+7\l:΍}44d TFp} |  ?%ot)\d߱'2r2=H?vC$~!Vn>Í?osns[;x+M6w455ӫ0bUF0pm/ool/f︣9ڽ}+(+վxWYoKCYYn$c 385Nj>/Lagv0 ;Qd`%2p@??k¶5kn;[W$Gj>xLm/.T\kN ֻA6SO-[HK+dmE9QEp~5MYT.(gmmdERw#J<-?rCy-mwy;V=b(((ߋGw_]lސKA;y5n4VX(PNr(+0|G>cdX?Z;cgme52O5Լy[ST{u[TeRw3J+g'dQWP+7ڥơ\HPňd#vKy a^WEQE| )hw]xĈ؂B2+>F-Ɨi348%@8¾t/gN]Zʈ${ϋzg-f KX0FNp2I?pP_a~/n-5C­_+ѮqyVOx'~0\Ua_]qg [{5[z} ;XV%-2B3}\jEE^@xƞ*׈mKZGw򪢉Xlw$Ŀ M]s;y_]覠((((OZNT/]2GXYT7  5CZ>Nca}%EV3 ' 7-ѯ/?]I{(v#'WP ^!8`SHB(VP^8C?'~q*O}?EPEPEPEPEP_WQEtOc ?e~8߾9=*<-GQ\%ԑ <ԓ(I TU|?ֶGDF39=/ύtxTໆݖXwlqր8:( 4MGzNoyqoTݵKX8k>~$r9䵵w : @ý$wW-dBːHF'ʹzO?txVK5(g.ERp6oZ((_W/xy+ ?J *?-}?_0~PGeo/sƓȾ33P^a}oryQ$о7#T2_(x[৉<]MrJ~ĞYrduS޾֛6]#Kh{+(mh*Y)# dz Ԣ(((M3Q|Y^쓝 J+OV_T4ekI ܰS_EEPEPEPamagWR0' 2S$WΞZFqh7,sJX8bc8㧂|E ?eGۻg;[{lj<-GQ\%ԑ <ԓ(I TU?/$:Dw=?Qk !пJ$@+[tmfKKy8b*Y#2A_*P|__h_W52?g'dQW?M̭oFIaY?TTQEzw4ymZ0m%Ϸs($@Vr<7yjZGuuly؄eG9 Oj<7¾.d_GDŽrVu kU֩]A-۪dEQEWamagWR0' 2S$WΞZFqh7,sJX8bc8>xFyKY%O&\@z)b?> Լy[]/KKkeRp6oZǍ;`jl.;2Gvv]ykydwll3ʿ3޽B ( ( [}_?_+ѠqyVO{x$P** /Lnl/5.Wd$k!B`Ҷ$w-r9㵺$"HꧽrQE k>.duFfO5#9rVX?|EocV'ɻn7}8[ kWZKd궨de>&g;ck7\v/((` F^?^8C?'>(((((+SZl:ϊ.X/oa 0Wp3h.<7jZ%կ'2t FF=(/_+WH.5 egEht @d'ΔQEQEQEQEt ?!/ϲ|ۣd8^ 5RTUx_(KW|G,`mݷgjj`OOC!c9ϲwtw8u_GZ߇[~iϕvnp38}O'UZ(ShKu5 pAGwĞ.ޛiQy60LuQڀ=+0|G>cdX?Z;cgmeWƺ<+ujZCuސ)60 'QE|ᯏ*|Uiw~^o#G $fB3h(ύu/VTചyoRݖ)Gl9Aր;+G> lk[X#":fQ^_<#KCҤXYk;H.d[}d[7m`Õ @<Т9 ;u/=+RDagDe ;G]EP/O~v}8*h< $`:cD4hi:M`Žn,ybIɭ (4FBeIvTk 'oikkQ2 ζ( [ մA˗bT#[$ikcLxÀ@9Eιz((((c~)|#}H,RI$0?*x?e>]Ocnn3ҹ(((` F^?^8C?'>(((((<<6:ıZ$QDI$㯀(,ާYwu'/cNO_,QEQEi[_zĺ43Ŧ[$0A +Ag|Rѯ/വ4se$E}ĺ[}/[o]N7hnV J2Bq}|E_/:7oMoM9cH AA5?Zvy&A"6 0? (@%%{B'>zw>#:q{<2]wB8PIv<$?z~Wn Fv%yX0OHÀz0反Wwx<RkyZ襠((((YO#d0FdvO^Y ZSDԬ`m2DY.^%-p 3N=}E kώn4RtѤyT7)*8] >w]GxnB2Ak(򿏺NK]N7haiX/( H)hחm-c= @kz(((((>>k^|ucq蚕 F%ʡN PFpAǸSAay|-Ѭ' sƾt;z-f Y  u;iWwRy!9/t-mvoH%Vϕf9ҳ#moy6mynp۳cqO/k:5ohwJ+`##8>B<=i?yaۿbݏ,82hcw4; ~ǝAHSڱO}?}Ǜ'7gjm{z4:w nk#*͓c{W^,[?_`n_#l_9^_@炾k<Ѧ46"kv[XUlqֹn>#K]%W$чj>|`' u\kEۍ=1}?Ǜmvz袊(+IaY?TU}?8~>^Ѳ}0ӵ{Q@Q@Q@Q@p~5YK-5)ncFPpw:oJ+#}[wMy_dsvݝc,]Mr9㵺߱'PmvC TC!c}e?y{Hrqں 'ufK;xHb ('C^^~؞!5oJ|sg߱mϘqc85ƺohuMR mmQYf1=*~#>m}|3h=qڏ}'GMG#n_9Y ¹vlg;PQEU=[RFѯKEQK2@~;un7]3dPo~w4; -V;x69Oj ;:$l/{FÌnNQEW|+k7]ƟW[RIdz JwxS[+?v[n|gp>/K[]TՇzخ>/Wlw#9ێ_tk3iz] [5hT2c]yÏCqnδko+V2۳czp~5YK-5)ncFPpw:oJ<-K?xr\xnI]GU=mo߰y6m}vwv>;:>_3Wtw'ݎ+~>WYlt}?YYn# q!853V W>W~63@EPEPEP=[RFѯKEQK2@7hvZwW[ cd?[mV~&¹Gylg;P x·Z^=z ̡֮J"U9ޕW_(KWx'B_~6푓`g;sӽqz q-=Ė4pT1RFdOu?z[+vܶgp(е?O隷}++v68phOOxG×z%;P`ýl~?PIb?1fݲ+,g;q׽=CRب( ( ( ( ( <'coC̵-7E 29 z+_ |χgTϷtȧrE|@Q@Q@WaDӼGIukXyodݶaʐG  qW|kw_6CҾu&Y29 v#ʼ ( (I|<{'n?|v~.ޛdg2,,.P$j,dNkz'O Ga{uklI匡*!яzzow:Ѽ]+ rv2đr:z+>:x'þy߾M|}1zO~wo/+wQ %#`:▉xs>6gϷt(ǖ$I<((?oƓj7/~2n3\@8Q[,noqg=}MIjnnic8EeK` cQ:3 .N3V=<7^Ig *pq8=} hPEcxzew ҭ.g7\FTZO ռW4x䍃+s(V_@Wh+_Ht/x҉+ ر5;8,˟~Z4K$$ܯ'k[m"rG"d`pAA'~C?Ul_XYvrYAwk&7kiV7N|ۤ3p8OA_<|kw ϡɧmHmi )r!TgzWxAѮTwWI8#>ƀ>$Loy ? ]=O△yawݬFɠH# 88 ¸z((+bŞ$,㳰ikvC쑢pdǭ Sݬ4RHA(.y溸Y&W/$1fv'$y$sDkqżCþ>?M|qN1z?ƿ.yXxI pFyQEQEQEvq|@M͌?aϵw6pjῇ~*v%}9L,h<8`z0&χN[;̋z;Tx joj^֗Oi4޽µ(R;NrwU{}3N˵J^/~1Ӯ|/Yj_k1>o%Qk$ƥȐv4_/ƭ:/|2n21'_8W8ZQ  ho5@?]GtX0(Fj7/VK'yo^Zٔ)D\ʧ9CҀ9ÿ|!cO݇_&Ivo_5e9GS=qֽbSӭ-nI}nFd־H%{]'' *E-XeƧr?2Oh(dּ#oxs>j7`~ \_G@xO??>;ǷwvOJ ( x[Yo,5?]I<ʞjI1:( (8Z&?'ˋz#X8k |;W|eyi_dOxUs$d #O^EQEQE|?;(:x'^1_y߾=}szVO k>m冹gK5SI289BGU?zEW,AOZZjBknF#}OEQEQEQEDŽxLyyv?;QdRp_S@yƿ k>.mgH99rVzE/oocWG&fܽ}k(>p^#jN._BŠxgrWNLnayuk2nkjdppA[PEP_?_+ѯ+0|8> cd?[mV}KIoQ%|_j^aI&[uVve YrP !пJ$g~2//2P\r4TFAkA3Nм[Xip8JKͬWW5kxBBt* '>>D[ڵ`v3 A'O QC~uFfO ˨X~u~ x>/t-mvoH%Vcq*O}?^ߊ]+;J]zzBÉ$$a?:(R_^9\=ƙ^GZ̛Ha}_xJ+uZ9( ( ?o/sƓȾ33P_8Q@,e_ZjBH܍#8<:;}3Z]o4ϴ)cc@GR8մ'YEOfMfF<8k F^?^8C?'>(((((4-3o:fy?nۻf s u)mfTX{+#Y*Y0dzO| ;$l/{HÌnN)OxrCңٽ@k!Tv7(B?=j?nݳz۟0gp+4*Ѵk.Oњ +xi!TPHp=y]Q@{3Oj < XkkGll݌me}& j۪ڣ*.{Wy@|!j؞!5o' W>V8mq}?@sj?3n3޽@%%{B'+,Y׼]/Kf[$fكu1hO| $cWvƩN3IEmۿb݌gM| o;_EkRY𮑪\,k=7,` N2}MI؞o' >V!mqח'&>/?ڼ۶6n:TմuKi y-h ԩ# -S~a{ukbO,ed90z1@^7o+h}+f͟6sۥzq:q@?a<:.ww+ptz>x5oy7mmynp۳cv+Zoi.{YUڪ1khOzO"wn6wc83 [ufT5K9 ر1S^@Q@yCoa}δ[7~V2qzp~5MYT.(gmmdERw#JO1?Ǜm#'vz+-4; '~ǝsHucڶ((Wտ]X;n1o,oOg7~.1߭nxZo4htR{`n]Ueܬ1=*~hs}7ۼ3n=sڀ; |t;#l/y{F|n^))x\cٽ 0j* =wB=jOH|۶o@sg]<=OIn|wBs46FF;xB E 8[MYѯ`F]J2+OOL|_c9?ywllwu^^oo5 VK]yc(w#!яz((((?_Ih>oevcs9z<L|!cj?qv3ްkA]P۪ȊC3dF9˞x[v~妇a$Z.w;9{PQ@qu w뵶+Gm1޻ k7ǚ4:^=0Ep ֮łVÞޔo,oOg7~.1߭zqq?Mnϵ66n6|j(mh}_1{WhZ߇[~iϕvnp38৆];rUfX 0 dQ޻'MFѬtv6QBpOڞaݷ~-881t:#cWyv|^ꚶ_iw "{o%$dC\ xo>#,/uY.wI匡܌ FF=+&Mslٳwt@?_4`ֹ>gGEo@0|G,`mݷgjj? ?JςK绚 l՘1w\ A֮x[_<#MJ~Ǟ) rDucڀ=]|u[y_dFݝc x>#,#K]u%d9яz7ŝ{Ǟ*KM6"{kXXt\sҀ=?W!Z-ϛ+w]s޽B?&|yêjz3n궲"P;r翥nx'B_~6푓`g;sӽ|(~%j-4; '~ǝsHucھ8?VFsQEv< 7O&2slٳwt?xR6i4۵-3(RYNr\}c?asns;EPEP^8C?'~q*O}?EPEPEPEPEP_WQEQEQ_a/~/.<5Mh_sS8 uXym"h%BG"WR0A𦉭> մA˗bT#].߈0䕿g? uVQ&8s<`$~5z.߈0䕿Oqi=qWSk(mQ.؊s3^|_O?O5 ii:M`| 1'O&' *E-X;//?]IOe 8µ "@TP0%Q@W9Xyi>poǕ#8h(+jZρo5MBuEfQĜds^@Q@Q@Q@Q@Q@umKF-Ɨ]ڜhZ1_*STq+xuoOmV7f|q8OA@ExLxU F#' I'?5ׁ|=qq,O.lI#gcI>uV6^Xdn:`| 1吓'^/}q77yWR>7;Xp2IEy%wRc|dve'Uz(i 7ѡ-2;LA.AǔQEQEQEnx.nu{ u;d92TA8aװ~?PIbG? uVQ&8s<`$~5=CRب( ( ( ( ( ,,n5=F?2TbIhk |e}[VѾc2_Bw0Q¹'((;k= ̵&܌Su((A tk;iVQ8sƽRow:O<5`_+rAŠa}oryQ$о7#T2E\ILIڊ cX◃|GA:/Yv,ydp a@w$ݷcrN:Kvag<8aQ@V~յk̗c>p@W/Ὲv%8̟g< P:먠((+Ğ)Ѽ#G^}ID*Sɗ 0*آ xþ1Wϲs${wgoQnPEq/sXIյA̋>rASӭ-nI}nFdր,QU:O.'gNPKN=+>)x7zN}\_e7mRǖ@MvQ\m}Pڷ?Mq)7/_Z;J`l_W|kNYwkOHY$a׻CI@EPEOӣ/>k$)ːH@OE?XD򿵵[;>_-q#>>n/PtѤePl#8 Uώ65}wdn/oQnQEQ]uLkE|zW@ k>.duFfO5#9rVX?|EocV'ɻn7}8@Q@U OQ̺!7؀'GZ^8C?'oo9ϫj7`K_n 8W$@Wa8C?'>(((((<5CxH.F0 G @8므(>"|kߋ hvZwW^VǞ( !=(+ |}]#Ky8b*Y)#2A_:Q@Q@Q@Q@}? ;_0Q@[[_];MU~Ǟ( rDSڽ" O}?}Ǜ'7gjiڨ +iګ>x5oy7mmynp۳c|JnO}?O'UZow:O<5`_QEW`q|@ɹ>u/ڭ(7/VK'yo^Zٔ)D\ʧ9Cһ( Լy[]/KKkeRp6oZ?Xsc7ۼ/퍞fsW{רQ@x?O$w-rJؓ q$C##P_ٴo ]FYCo#FIRȁI#Q]6mgºnѬS[3PN85Ex?ÿ$rJސK!s'AcQ@_Ʊ&g;cj\vO Լ[/Ti{kWfPpw*oJ((w5-H#oOxGzn{IkkH%1Շz(/Xsc|3n^1[;WQ@xZtR{In]Beܪs=+鿂_Ht/x҉+?h(zѲׯCI@EP?|Ig]%s @ý|g΃ z] ^5hT#c^InQ|@Q@Q@Eu ]S[CP΅A8dҊ(M]7~*5H.['UEf ]'s(O6>ֈYzy}QEV(toiY^q"b gV]>5oԴ; -V;+caQH{V?%PT6*J`?lTQ@Q@Q@Q@Q@|)6gZFp,ѐ+RFA5]|a}qj6rywVоvTp@@৆#MK\d$Pǽx=v/xGIյXϷ̋찦r> ( /_+WH.5 egEht @d'ΕX|_ޙ[XY]I )HPpQEQE{'o<+ujz3z궲"P;r翥p<7gZkkly;G9 Տj<7^Ӥ_Z)I rOEczޣ=b}[VE|v*nڡG 8_Eto VS\FMRȅ8dzһ; w̵>܌a(jEE_0WQῈ*%IL̟gLRz(ߋGw_]lސKA;y5n4VX(PNg.߈0䕿'}q7C̺5,p8$ 2-웶aʐG  co߅|#_d# ?%(H$a؎?*+,Y׼]/Kf[$fكu1k+'ÿ Q\ҾuBK@0Xt|;%狼 כ Rm`OE먬DӼ96gw}'O&(O |}V#Key8e )#2C_EafmgywVп;]H*p_PEP^_<#KCҤ5KgE2IOĺ7u}Rci쬦ddBq*免[XYЛڊQ6sayku2n#r0!G# 5;t;-*;[7{؝ ;WW|-o55m'F=~3ܥO  (((((((ύu/VTചyoRݖ)Gl9Aֻ'oikkQ2 ΀8?0Ȏg;:czsO| ?j~I7m߾=k(((?h(zѲׯCI^AGC ?J (<ow:$](@7mǞ5KJ{u[YTDl9sҼn DWt,4=W얲Jfd ( ( <7iכ 0lOE>)xÚ<N \_ebǖBO$MaMFV۴*Tp=a|Uiw "{{ $dCT5=FO2WgbKI=(5k9)hחm-c= @kz(-c[s'J~}ٟ+3-'RѼ }oiv3#wPLWʈd J(:MJ#FPl#8 W >w]GxnB2Ah~ U=qqf"I$UJJ9}EtKY-NnҰ_*Q3((4-cD[Jߏ78qWPE|~$)k7nd6M#b+5|=oqlG"da< ( (>` F^KIoQ%y%OT6Z_Ht/x҉((sc|3n=qکZtR{In]Beܪs=(M'T4e;I 0S@WEo xvGuuc ڌ$z)@Wy_huMRM nVGf U'r( ( (TվxFѯKCFh,丑cRQK3-|GumZ0ydp_GyCI\oJׄ|kNYwkOHY$aכ@_CI^_<|;MY.|Q;w&@z0^P:5n,F+` 4r((([tmfKKy8b*Y#2A^@Q@W_:tRRymZ4e YsP,]Mr9㵺߱'PmvC T(+~>WYlt}?YYn# q!85Q\ߍ|kFT nV1VḷCҩ>6>ֈ߻k߄|Gwj]ZEC ;PQTJgF-E;@u #8>PEPEPEPEYG×zskkz@:@Wோ:5.Rx4U*Wk\v +ŝz:^iM5|y]SK"Kv[Ubݲ6 aZ ?J +oѵ.OZ{+-hሩdb2=zy$:Du}InQ|@Wy௄4iM.MݖGV,[#j0wO<#;H$ٽbPEq@=vz(TվxFѯKCFh,丑cRQK3tQEQEQEW~?PIb` F@OEQEQEQEQEW3V|snۿcۜg }_Px&>?ڼ۶En:_\jģCW[6oa+??`xVhW;W;WE3I[ Vo.ygq^Ex'x_>~n`ӵsP|G O<~{WEQEOI[uoЮyc8q^EWQv~.ޛ,+Mt.{.Yuڪ1hOL|!cG?yl{_GZg''inv2qg5CI^@Q@Q@Q@~!oJ|]sgٽmϘ38Q@Q@y~n׵tQ@~؞!5oJ|sg߱mϘqc85Q@&n|#n7/_ \jCWy[6om+(1} >fݱ}0g;sӽ{i؞4; Vnݻ ]qdօPEPEPEP\1 /}^_3nFs{AEyÏCqnδko+V2۳czPG? 6aq׸Q@Q@Q@?o_jq3n>3޽CB?<=i>wHݻw@8ɭ ((?7_M˷~ֽ?_Ih>oc.{_W~PGe_%$B(8wxS[+?v[n|gpHuw҈ ow: ?_zIv>oevcs9z(1}?Ǜmvz袀=]=?y?nݳzݏ,g2+袀 ( ( ( J`?lU=CRب( ( ( ( ( cv6; [BqP#OJyn"Hg$lU A7ß5m[IѾ}nO  ¶/YMNK;jvc|3"6#*Nz(+ &B.y7;FdҾX ^пI䯯?h(zѲ%OT6Z_Ht/x҉++xLy FIƒIk5ׁ|=qq,O.lI#gcIXg2,,.P$j,dNkzß~Z4K$$ܠ((((7g> >u&I&P!#~6}Ocn3wQ^Ꚗ6oi+XYT6  5h'Xy>noqg=}MhW)xßm'I~cX_nQ,I<>'NKWwRc|G#,FNwt;<˫>ihROJ,gȾ n P_G=7^Gya*< (u $~5@?"w?}rnqֶ> xYwo/ϵG<*RG@:-[򿵴'>_]qg4'MѭK,`g.±)l3(|ϋ;/Lagv0 ;Qd`%2p_GLng'ukM klTp@Q \KqqirI%LJyG'%UjC[/:}ݵUx5E>W 4G<*h< 2M7ĺn^X]x @KDӼ9VtqogۺcO$MqbS{1i2;`2Ǔ*QEzGO h.冹gXSxH9BF?l|tO|_h}${~cst+umKFk/PIk3Dr R2ǰ5=wXmVϗfqn'(>[#qڶ2_L8WpWciqxU;!HrI8Pp2I?,(((((+ (44 X*ǙKwfsj=KIԴk4wPLW$d O~6Odv3wSn^:7eg}==!g<8BFч@oEPV,l/5;-';!3#' 98«a[Ӽ9IյkygۺQ‚O$a^״ku4MJp%իĥN`p DZ<+hzfOG '.ua׃{Yk/DԯW(Zڼg{}ay^Igi=x rS 5>"xW> 5_]I<ʟgL0QH7#jM,g|v2n )#G"8ܟ~*Z0DK UQ@$sïYu =w̺!>8)GZb(+ÿxNCҾkEHð=~tyZ襯5Q>[ d[PÕ$<?O<5`_j7`~ \@GEQEQEQEQEQEQEQEQEQEQE>kj6v|$[qGOQRi۵ƗZ_@QeP#8 WtOch}{wy{~ kt|# rRj2e qr*ßƞĺ43$K ܯ>24Zɧ*hL2x((Z[ƩZXdbR'8~|]; wQ 3'rr?:4wGVǙKfs'kB_|E?j?ݷ{QEGj7`~ \@Gk [x}KIoQ%|ῇ~*v%}9L,h<8`z0&χN[;̋z;Tx hRxV[{9/VF[ *?S쓍ѰQ$u(曤Z[z};XZV 2Bq}IZƉkiWv|ۼ[pGOQ]OyKY4_y2H@OE?l|t|c}hs${wy{~kt Sݬ4RHA+[Kq:{<2/wL9T AΓ5ĶI 9I#J08 kipgbpI}OZe֡q4/1S#':3ol{9۞렠 -+o7CvvV!mq tG>3n6퍟c9ێ(((mC!}eq{Hqڀ: +|`' M\ksEۍ=(?W!Z-ϛ+w]s޻Xcڼyfݲ2} nzw+/o:f븭 7]q"=Š(((u?Ojz}[+v8pk}^gm?s{Wk ce?oymqhjEE^\Ï¿Ɠ:|#Qn773€ w$Ŀ M]|~EZKmhnٽ ǖ3WA ccW+۶6^|G? 뵶c(;;EQEQEQ]Ï Ɠ&Ѯ|#n7/ \eCoy[6lm(袊(4-3o:fy?nۻf sϯ` FG ?}|ۤTa7gj?g(zѱPQEQEQEQEQEQ_ CI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J׻N_뗟kPxU#ucQE)//vP~?PIbÿ GQCҾu$FK&PHñT~UPEP+7ڥơ\HPňdJ((?&|yêjz3n궲"P;r翥wP?7gZhvO%;sǵlQEy^ º6c[Oeqk$,GTk7ǚ4:^=0Ep ֮łVÞޕO4oɹ_F_]QEU=[MYѯ`F]J2P[৆#;MrU~ĞXr`c޽"(((n;[W$Gjآ8?|&|ͪiwznR#(RQNrwQ@~h>$K[]vg9 Տjآ 'tmfT5;I*Y0Q^EQEQEQESմuKi y-h ԩ# -S~a{ukbO,ed90z1^Ep|kx¶zH̡J;dme90n~&O4 _|;?e?#ۻg;W{o^<֩Ai ^2P;r翥w hӤk$fO5ː9rOElP_Wlx[ėa]Zؓ(w#!{I_:4htRMZ7V,s(((<]KzڦnH̡K+dme9s_`ֶ>gDuo\}QEU'RFluKu5pAGtPx_<]˽Jf)0LuQڶ?g(zѱWװ~?PIb袊((((+ *曤Z[z};XZV 2Bq}SANca}%EV3 ' 7-ѯ/?]I{(v#'WP ^!8`SHB(Q!ׇ"h%HPePAE}O~>7ҭ.6MqxHk?g(zѱWװ~?PIb袊((((+ q*Ox{%PT6*~((((((?$](@6!J#(g'dQW$P** (>(?g(zѱW%PT6*~ ( ( ( ( (8{k =w̺!>8@Q$ut/h*5KCFh,acRQ3]QEQEQEQEs'|_CjI7m︧ܽ}jdžSxNC]rY$a=~u`q|@ɹ>u/ڭS7/VK'yo^Zٔ)D\ʧ9CҀ;( ( (9|Du5WRD&Tc>.]SG Ey_şk?gof}0P]E[_ZDBH܌S#xO$w-rJؓ q$C##fѼ+iw Oee %K"$dA@/:O.'gNPKN=+moF<)hkw_٭|"߲EyTa$tZ/ >}?YYl q!85h_Pw\Ҿk&)2HF'ʽ(?[k:{6}g۹CU<x5Wk^&7tN[9 yѶV3_>WF𮑥iOee 1,G(CD5i:M/ŽSv,ybɭ|;Wt+얲J!WDRe$ #OGÿYGznZ ua޻ϋ?txVK5(g.ERp6oZ( ( ( ( ( ( J`?lU=CRب( ( ( ( ( (` F^?^8C?'>(mh}_1{W? 5RTUpkןMԣ/G4J?RUPMԣ/G4J?RUPMԣ/G4J?RUP3V|ZEsnݳzۜ 8hW?O'UZ(6!J#+Huw҈ +IaY?TU}?8gZ_;s7LwPIZ%BtH$HV=t?7/дO+o7n.dg2+ ;:$l/{FÌnN^৆\NeѢ}B;chHAC%IQ8+?ƿxzneGkux"82Gj(/Xmc7ۼ3h퍞^1{P+?_o_log9_8x_6S`g;sӽI_^"|߄| kVVĞXҢ=J`?lTQ@Q@Q@Q@Q@|_W~?PIb` F@OE+[}d[7m`Õ @<Т9 ;u/=+RDagDe ;G]EPEPEPX$:; rv&T^<8 cc>wڿ4g$ݷ;~cst?uVOK~}#ۻ j#_oC%zL漙s$'ʼ޽*?-xQEQEQEQEww6ku2}!22 \=PEPEPV,/4FO.TR jke=}'V~c>2/›aʠ#J`?lU=CRب( ( ( ( ( (` F^?^8C?'>(Wwx>6^I?((( $_ K]syZ襮<ow:$](@jEE_0WC²訨((` F_O=CRثgV7^_@dhZڼ͔g{A]wdn3Һ X^i tk;I.V3gπZNxTgmNGXh A5PEP\? Ongai=ԞF`' 98»(O^״o_\j&ci"uj)o6#Xqk((8ICuv67RG1$M3Q|Y^쓝 JYu =w̺!>8)GZ?; z a>A| cozmJ|FHRN2@ϸ4MGzNoyqoTݵKX8kcğU:;sJ%Ur SP>kߛ__8>nq8=} }7 IԴo[}݌-8#>ƹ?ٗft|~$)k7nd6M#b+5|=oqlG"da</Lnl/5.Wd$k!B`Ҁ>pICuv67RG1$51?]x{S4g:i-e<٤B@ oo9ϫj7`K_n 8W$@PzotfoMPGkt\3+R` F_O_ |mۿ__m[IѾc?SvQO A?¶ljthgLI#%da-AX5 Y^p;]I 288 QEWK56vu"bTC 1gΔPq~SX]wk'h$#b#(((((` F^?^8C?'>(((((+ J`?lU=CRب(>@%{]'ow:(((O<5`_W?O'UZ(6!J#+Huw҈ +IaY?TU}?8oevcs9zᦿQʗj+'MYltvg6p O-Oof?nݻf 8q xS}++?nn|Ì8OOxG×z%;P`ýy}o c cW+۶E^̿77!>gZoy_V8mq׷Mԣ/@_ѡ5H.[UEf U's(~@M?aϵ.w6pj?`xzIv>ovb9je7J?>ϕf9Ҁ>:[;M[y^"6_]QEQEq:?n<"66mw2|tz<Ѧ4.+eEV,[#k0w? ce?oymqk'~Skڼ߲0Ǖ9k?ᦿQʗj(ᦿQʗjkMAw4-+0b;F0pn~!0&n|ߵ:s՟,oOgo7~1߭z4w߈n~!2G3/MMSĞ1n|Q^QX2oIJ,ȡ05_jдOiO}+o7n.d82kB<OxGzn{IkkH%1ՇziEK^\&n|#n7/?Gm}7ۼ/숍fs{~ mSK"kv[UbU6 aZ?f_h)Oo}&_j~˳lVs8 ĿUW- `5iCw,dg׵'B_~6푓`g;sӽt?k¶5kHuw҈ Sy>wnm߱m3gC?1fݲ+,g;q׽=CRثq*O}?@W!/?g|ݺ5cv:?VFs~!o'uܷ>V7m3V}QEx+6mSKa+eՋVڌ1kPq4/msQn673>; fC aڱ1}?Ǜmvz(W/k3iz\\3];* X.;z|8>Zoy_6;:g&My߳6{?HOxÖ<]ꧽy{~: ϶}ۼۤgY7cj[MFoF2GIfu.ݣYn#$(g`qjMwSy>Oۮnٽmqg Sy>wnm߱m3g;'|9w_RZސK!s;%PT6*(((((+ J`?lU=CRب(UP8?ZQ k5^Ex3%>UP='MFѬtv6QBpQ@InQ|__mCۿG_ P_O?O5 +IaY?TTQE|EP~?PIbOXmc7ۼ3h퍞^1{WNFKRDagL uQW2 M˿fi8ɠ$u/k0ꚤ۪ڣ* ͓.{W|;)xM/uXet2z(^ K ;q+4M;Ú<No{7yqog۹Xy$hM'MFѬtv6QBpNj>/Lagv0 ;Qd`%2p_SEqGß5m[I=O.}E<0 HWx\~k*}(H9E΀=(7OO wzQP`製c8?ZWQ@? k5G3%{'ş+kiwzzR#(RQNrx}?G<+~ }O羅n3wa^+ν=m/Kf[fكU1kt?7_%-N}[ImcŽnQ,I Pw28U$q4>T8?ZWQ@? k5]~hs}7ۼ3n=sڻ (_OxGVvKY4I2H ˩=~U uG4[VEw.Mfu(pPaE3]ծq4/SlQ_8|-/Gt[YEwaMav9k5Yl;ϲ]I$,RI1HÂ:+mǚ:wCp# 5[Xf&[w〉~i (k?; vWwx߆]7CxnlN:^τ<_^]ծq4/Xة|:׌|@A+6=fmSKԦ[veBVڊsk㧍E CjGݷ{|JnO{O>.my_H8@V?xG+w?}nqր<~+ |?Nhh%TɻlΣp|ElxLagkk\C n'j,dpXW~?PIb` F@OEQEQEQEQEW|@{%PT6*(+ (+ (+ (+ (+ (+ (Huw҈ (jEE_0WC²訨(S>:4KL;VU 23F}}7hZ>dV6v<ϲ[[ghO_SZPEP ķѦW/$XDNI$I'I/n-.^9#b"b#A5_P0TW8ZQ  ho5@?E{3?%>0TW8ZQ  ho5@?E{3?%>0TW8ZQ  ho5@?E{3?%>0TW8ZQ  ho5@?E{3?%>0T$P**?|aA-ƫx+RnR{I]BEܪs=(((6}[&t>k?nla}s6pjtyCI\gKC?|aA-ƨv<$?|^  ho5G3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x>0T8ZP ~)x7ß4'V~}EYn靇*<?|aA-ƨq?77e-rO2PFid֏ [2$mu y}EKN=+?|aA-ƨq?7/ƭ:/|2n21'_8W8ZQ  ho5@xw'2Io)7/_Z2>kOI!#gKC?|aA-ƨ _&]txfONvơB`ҼjgKC+?|aA-ƨq?7jgKC)¾m冹MATc?˱vQO 98ZQ  ho5@?E{3?%>0T0T8ZPyCI\)|RojN'ˋ&#Yy58ZQ  ho5@?^/w?}̒nnq֏gKC?|aA-ƨ_toxC]zzBjg%Ϸt.H <+hzfOG '.ua?3?%>0TW8ZQ  ho5@?E{3?%>0T,MO兞]]iŸdnv#|^  ho5G3?%x>0T8ZP ~)x7ß4'V~}EYn靇*<?|aA-ƨq?77e-rO2PFid֏ [2$mu y}EKN=+?|aA-ƨq?7/ƭ:/|2n21'\%PT6*?|aA-ƫM^MRM lVGf ]'r(d((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((golang-github-yeqown-go-qrcode-2.2.5/assets/example_halftone3.jpeg000066400000000000000000002521741521051213400252210ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((+ (+ (+ (+ (+ (+ (+ (+ (+ qyVO{Q@Q@V~'ypo3g=EhQT[MmK-/W(Z̲lTq*V4Ķ%ѡ')$r_Ĭ AVQEQEQEQEQEQX,ޙy%4Kc '# uoż9#`FApA椠(((*g%|#Ee$+/M.5ӪhnV 2Bq}jPEe^%tk56v@DrF@b2ϱ7zwp]ɝA G@(n".4H&gbpI(((((+ (^ ԼyͥsC0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x))Or\Ҥٽ Bs Xw7jEE_0WC²訨((u; ??v=㧂|E ?eGۻg;[t YK5(gݮERp6oZ( x[Yo,5?]I<ʞjI1:(>Xg~2//2P\r4TFAkz((((((p^#jN._BŠxgrWP?n4vwV}3&vơGEQEQEQEWKD|GVt_OqoTݶdcMvPw\Ҿk&)2HF'ʽ(5;Weg_kOHYxq$;ч^D|9IukAyoWۺgaʒ vP_,xOhwkk[3E,p'=QEQE/2}[VtoXrݶS8#G"v7gt; ]>p;]cP#Jآ ( ( ow:@%{]'<*擦ͬ6:]FGoHHPA8':+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƫ` F^?^8C?'>(((((+ J`?lU=CRب( ( ( ( ( (<ow:$](@jEE_0WC²訨((` F_O=CRث(w-}[o7CnWv<8ɯp+վxWYoKCYYn$c 385QEQEQE3I[uVo.yc8q^^W𮍬\Gq4EK#0q+(Wտ]X;n1o,oOg7~.1߭nxZo4htR{`n]Ueܬ1=*~hs}7ۼ3n=sڀ; ( ( (<oW?(/>V͛?lJqXտݵ#n1xƏ7߷9ܭ炼FK绚 n՘1U\ Aր:J( ( ( ( ( ( (<?}>^ѫ,׵zm{Lռ'֑\[lށ83\?~ xo#/uXoH% ڊOEttmKi +xi,U(' z ]<=OIn|wBs/OOL|_c9?ywllwu^i:5p,[ѐ+RFA5[৆#;MrU~ĞXr`cހ="(@%{]'>6^I?P5a[_AO(~Z~(((((( +?g(zѱWװ~?PIb袊((((+ q*Ox{%PT6*~(>)|R>#N'ˋ찾УY 6^I?@tCI[(?vC$~!Vn]a+7G.߈0䕿?>ƧO2OghԱdҶ+' *E-t$:Du$P**jEE@EPQE{%PT6*~` F]'#:3yX3=ŠZT.]NDY.iX/,II85Q_xƞ*׈mKZGw򪢉Xlgf{KA!3r2 yg/ώMoRtcyT7 H 4]WΟ|Kh:J#vRl$)8gPtWS[^_wu'i2;byN ( +>ږ[/P8ѤbTV$ڭo/w.q=Š((((+xV: u`SHUTQ+ W~L[X]iuh$1xFA#ugW_@d]<͈d$g. +O%״oXzޥciGkt)o6Q3+_j tk6^I?P5a[_AO(~Z~(ox;Pھ~97m8^A  ?%oV^@  ?%ouPCI[?vC$y~!Vn]a+7^E}oS:ϋy^}=AW< 2Տ^^?8(((((+ J`?lU=CRب(>@%{]'ow:(((O<5`_W?O'UZ(6!J#+Huw҈ +IaY?TU}?8xk^Ѽu}qh H%իĥ؎`p DZ袀 ( +M3Q|Y^쓝 J((I¾c5_]ISɔ$rGU?uV~#մXϻ˗c&T#ZQ\=jz]]JŸdnv (L :q@Q@WRo5[Y=|Ⱦ3ܡ*<(mg'kuM #r0N# |_&XYeԩ )Ib#wV~յk̗c>p\.߇0St}ll<kH3; z a& &^o?vl]v|cdWxτu5?]ISI2PO@cw?Q ߃kc_Q@ow?Q ߃kc_Vj># t_OˋzX'@gw?Q ߃kc_$xߊ#Gi_dQ ".A a*NC^ر㼰L $0? U:KJ]rYxp#a׻'s  xP<ϴ2K|"): 뎴WyCI\?v<$?z=b 'I~}>./̛c O& (((fsy'kk3'j(%'=b 'I~}>./̛c O&; ( ow:@%{]'<Cmj?]?k¶5h(>V^^M̭oF ( ( (>jEE^^?8(((((+ J`?lU=CRب(>@%{]'ow:(((O<5`_W?O'UZ(6!J#+Huw҈ +IaY?TU}?8"x;Եؓ6Ĉr#c?`xVhW;W;W@Ekto ]ƟVPRȁIdz jP*5KEQ2@(>"|kߋ hvZwW^VǞ( !=?}Ȉg;:geYZ\p["푵c;EQE|;%|w% P\`V뗢=ŝǞMJKkTG\ 9qּn(>|Y|[/TԦ[׸VBEs=+K?xR,#;[+bN8!{/EQEuIgskkH;tՇzh7\; ??vxM6w \5-*`Y0㿭|I^+\i?_o_.log9@W_?Mԣ/^j~5o'uW>V7m3P~%f|+v{e5m!!C:C^7৉<#7\Ҥw\`ý{QEWk+uސ)60 'V~itˋ{>Xē'_4xkzkk\C }F 2S'u)o YMq Rȅ8 #W˞)OxrCңٽ@k!Tv; w̵>܌a ( ( ( ( ( + |?Nhh%TɻlΣpvнr>@߆]7CxnlN:_K’yBN>7Ú} \jRrExş+kiwzzR#(RQNrx}O h.ӣ,keO5À@9BF?rнr<7mǞ5KJ{u[YTDl9sҸ?-I䵵< #ǵ} hӤk$fO5ː9rOE|JnOy}_^Ѽ+YMq4EK"0q+J//SӮl/52'd$r0!BddҀ8z( ( M'mKf;xHe,U('A^WE}]JmºnVS\FT!`85;t;-*;[7{؝ ;W|R񗉼Ch3Sžl28G]ʁU E{ մnTϷr<3x$r((>6^I㯯Wwx'? VFsxJ+kV>ߢ(keo{5k((((IaY?TUC²訫(+ J`?lU=CRب( ( ( ( ( (` F^?^8C?'>(~$wu&7=r;`2d? 'T]] 4?C'T]] 4?C'T]] 4?C'T]]CkoQH8PpbHuw҈ ow: qyVO|_O?O5 `((((£[s'U~}%ٟ+N3ׇA ߌ?k?c7Xs5ķ4y$39$$󚎊(iO x6%Ѧ]2#;L6I'WǔQ^ Vto_\j H%b8'Ʒ?h}wGlodIvgv4QEQ[ _xzX-NF U$xs@tWYOnga *O#d0^#'(98¾XY-ƩiӮ",V+88'?gwG?$ll,㳰<h$(d^OŞ>w ҭ.=qyʓAk x-h%@WR2#4%Q@Q@:|}.xK+L;[Ky a^'}yIyw=Ԙ4c~]F[}S[lgd]$LW$d 3KYO#dH$FG@=TA5VI4HK38$? h*k.~?xеOm*7w~6^I㯯Wwx'? VFsxJ+kV>ߢ(?Sд}oҬokIvgq  k9A<B?  k9A<B?  k9A<B?  k)N[X]bR$(8gU( +?g(zѱWװ~?PIb袊((((+ #৊to\%{¯tyCI\oJ ?%q (]?a+7G.߇0()|RojN'ˋ&#Yy5P_O?O5 +IaY?TTQEy.߇0oJP_j2Xhzyc9uκq*O}?@q/sXIյA̋>rA¾@%{]'=oJՋk =w̺!>8@Q$u+'? VF}^oϋga=A&dR< @N\Շ^E|AeOvnqֹkeo{5WqazmgyQ$п*p_# yZ襠?I|C{'mg |e}[VѾc2_Bw0Q¹'ϯ?$](>@(ÿxNCҾkEHð=~u K ;o+g'dQWP!нr( [Yv%g32y ː:q*Os!нrR_^9__@kz&b}'V=|ȷܡ*H<x5/LnaywV}3'';]cP!0pA^1JnOy}amagWR0' 2S$W կ6}[&t52>5Fw;ϵǧ,SLJHHÀz0袀;;k= ̵&܌Su6!J#(]?a+7]GSxNC]rY$a=~u}?86^I㯯Wwxcwg;<[]Bii;QdRJǢ>tyCI\oJ ?%q (]?a+7G.߇0(v<$?~Wn@>tyCI\oJ ?%q (]?a+7_ QE=CRث?g(zѱPQEQEQEQEQE}^? k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0WC²訨q^ |Ms ptQ @%Q@Q_O8?ZQ k5@%PT6*~?|&|ͪiwznR#(RQNrwWk))x\cٽ 0j* =w+'? VFS._Ki +٭i,U' z Sh͎nWFT0`84w?߉0n~&M̭oF?j gٿwf\cO^3%|_oI熿kH?R$K[_+c9{WY}VXv~Y[oI @3(Huw҈?᣼a@Mk?I]wZTv[7Hmuqd#Q^ƏgZ_;rLwOjEE^\߂FK绚 n՘1U\ AֺJ+ ??j>`` F]3%t MYT)ݭnFP6Z(ow:?<7wW[7mEAc' k5@O(~Z~I]Y- e5hF `#WP_?_+ѯ+Í?osns[;W>T8?ZPxI熿k 5n4VX(PNr<ow:O]˽I㵺ٽ`muqATv7q+IaY?TT8?ZWyiѦ[fuf UWjv((|A-sƨqq*O}?\h>f4Jikv[)el9Aֻ+WwxߋGw_]lސKA;W>T8?ZPW>T8?ZPW>T8?ZPW>T8?ZPW>T8?ZPW>T8?ZPW>T8?ZPW>T8?ZP=CRثq_ 3j]ޥ4۵-ԈFS@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|K◌9Vtg0y>\_eIɩ>>^Ѽucoz FĥFHRpϰ$Loy ? B[x{L}:ij<٤@UŒ B 񧊭mⷷ.  HUTP0bOZNT/]2GXYT7  4̿4ۧ֯+?Lд}Ҭl|'2;VQdYGA FA#65wcv/oSnnS:ϋy^}=AW< 2Տ]ƧhߕX9n38=I:nn^ic9vK` a@+|_ޙ-r]mu aO@vFJd־9[n.<5M<^I$؜I\O9 )kz>jڶq{<.]wLx`AȮ«XYvrYAwk&7ޙy凇Kh, # Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@x$O*Z ;IaXTQ@Q@Q@{3Oj ٗftQ@xJ+uZ(((ס* ?vP?0Tw?W!нrR_^9@W:3 .N3օ|,'(/oq'\g9 JI[cHU I9ezvv Ү`GlNO^ϋXYe֟q )Ih(L :ׄ|-|GumZ0ydp@g\"xWڌ32}XN]@󮢀 ( ( ( ( ( Huw҈+6!J#((+(((((((?> Լy[]/KKkeRp6oZ(?|aA-ƨq?7_7_J?>ϕf9Ҵ>x5oy7mmynp۳cx3?%>0Ux~CbxSw-~+Yqd!  ho5G3?%}?\Ow/_1=;P8ZWq|?ֹGGv39ܫ=qn4/y6sn6/P(0T8ZWP>0U x·Z^=z ̡֮J"U9ޕQ@6wG>_/nn_gݎ4-Oof?nݻf 8q Т(h'cR$O*Z_ cj?Wymqh?_Ih>oc.{@\tٵfKh{ۈi ('dM xS++?vn|g/'? VF{?ÿ$rJސK!s'AcxB_>nS`ӵq>0 Ɠ&Ѯ|ߵâsQEQEW_?߈t'o'q[yop9E{>}Ȉٷ9=밯?7_M˷~ր7<]7ǚ4ڦ0EpHłdmfÎW=qhλk7Eۍ=밠mC!}eq{Hqڀ: +|`' M\ksEۍ=(7Oƿ Gwz%ծQ;\`õWm/֋s]n673?.??hޛ8tn~!Gx?? SwSm̿77A ;G4w߈p6w/H_/anSyݞq_X!~5ϛyâs|`@ɶ>E/>&2slٳwt?SIgF- `5iCu dgוyZ襠q?7jk:[;M[y^"6_@Q@r<7yjZGuuly؄eG9 Oj} -+o7Cvv0U3?%}?Eg뺟'=[i-ϕn[npqc84Ex~:cϱۼͻcgXvz (((((((uGk~ydt\ۜVs^ |Ms ptQ ]%W+7ڥơ\HPňdJ(n;[W$Gjآ8?|&|ͪiwznR#(RQNrwQ@Q@Q@R|8յm&y>\#_8CI[o?J׻N_뗟kPxU#uc⟂wV; c61Gz46FF;xB E 8Q@rxLm/.T\kN ր:n;[W$GjA6SO-[HK+dmE9Q@Q@Q@i:6c[m=w,2=Ez4w?߉z)//vPGx o;^ K ;q+>:x'þy߾M|}1z o;G4w?߉xsVԦuRcYn$c(gb qj;}OZ~e֡o ɸ(a'h|;ݟwwOכ`m`GU|A-sƫ>7Ú} \jRrEv>Ux+Zoi.{YUڪ1k [ufT5K9 ر1S^E ×zku{8:[P௄M.RymݖDe Y[#j)Pw(mǚ:wCgGEo\3%{>UNXv#Aeom!AW((((+վxWYoKCYYn$c 385Q@)ݟ9wUP>hnow}ѱ6|jWŝ{z4^i pu*c;z~'O|c_?eH9ڽ}+揍~Ѽ#+; 얲i3'e̒r䞊?*?߉/<]M7\lz(]E|a|R4x4'Y= ŏ,IihROJ^ѵRPZ{+#Y&d`F2=EzP7_i<ѡI+VuV,r~q?Mnϵ66n6|j((l:΍}44d TFp} \<<7kV$PFC#Q@Q@Q@Q@Q@Q@Q@Q@Q@|yOx^!. jw)qʪ%`bâ ( ( ( (<ow:ay-l-' >:n}/OݣbRl$(8gWE|9Uuoſ$vA 5QEQEQEQEZ>kiV7N|ۤ3p8OAZP?'T]G SCt?MtP?'T]X,뚎*O8E]U9WqE|Ş$)hw nd=#b ʓ+z((<Xi;j!HsdA$5_ILy$3I$I'QEQEQE $_ K]|A(~%j_)x7zN}\_e7mRǖ@Mv x>;u*K[_7zA,;׼PEP\=iͅZ̟du$0LzWq_:xj,\FM(`8.((_ğ<+F; sU%ԑ >,BH(uSVƉ#մXϻ˗c&T#^Wg6Z]ޛ Y%-ԎX;Fa8]ÿ xGn$]Z%] aڀ:>/Sm,2T$sFJ`dֻ_UxH.5 EiKG @`gPtQEQ\~,>aKMJi[kXє)f\Χ9CҀ.kb}'V~}2/w(aʡv<$?yXOL1_娉VQFatY>0T7maguu*C nsFO$’BN<5 Z7RPњ +n$X攱Tp p=E}@ ’BN?I|C{'m}E|1O k>c,u$BeO5$@9BGU?c~kvg6 p O =◃|GA:/Yv,ydp a^৉<#7\Ҥw\`ý{s'|_CjI7m︧ܽ}jdžSxNC]rY$a=~u`q|@ɹ>u/ڭS7/VK'yo^Zٔ)D\ʧ9CҀ;( ;Úk)À pFlWZ+uM,x@@'.uaw.&IwW^VǝATs=7m{~*5K6h%{u[Y1tlȣCҀ=(Xg~2//2P\r4TFAkz(Cmj𧆵(toiY^q"b gW~xCc߱0j3!=H(?[k:{6}g۹CU<x5WD)OxR,/tn<bD92:@a}oryQ$о7#T2E\ILIڊ cS֛6]#Kh{+(mh*Y)# dz 0O^ ?hwfMT']x?ÿ$rJސK!s'AcQEQEQEQEQEQE|ᯏ*|Uiw~^o#G $fB3h+KR,#K_+bN*!{ׄGxW0n~&GxW0n~&_) ƳCq"P΁$'W/ė&XGVVĝICTC=uxK-4`cubpw; aoJJ(g^t.M l7f ]kv߉/<]M7\lz(@EWΞgZFq64p+RFd#8>=';_/ot{ݞᦿQʗj@$](@G*_F?g?[_+[~~3<jEE@  l/+ݺFn^WDOR,-m|&oyg5>;Դ; -*K[_+cH{PQY~Ԧ|+j {e ċ!C: dSGu)o YMq Rȅ8 #P5;t;-*;[7{؝ ;WPEPEPED%| k%կ'RPF=o7ŝ{Ǟ*KM6"{kXXt\sҽ +,Y׼]/Kf[$fكu1kwKxM/;7z@ +$;QE󧆾>YVi2{{ 2 袸?>5Լ[]SKiKv[fP6Z(/?Xmc|/fs;רPEx?O~$-J!s$s$Ԧ|+j {e ċ!C: dS@V_u)o YMq Rȅ8 #W;OxM촨nRbw&B:@E>#mfw}6|j +M]KǞ5H-!+׷UFU*'s1\ ( ( (g^t.M l7f ]kvd~$w4r8#w B I製u<bx{Sտ)i-ϕ~->aqKJoO%jj|U]Ɵ,[(`I%%{B'>(IZ%BtH$HV=( jSk>5KgE2IOĺ7u}Rci쬦ddBq(RIכ@lNGU((((((4FBeIvTk3N>[}d[7m`Õ @<I|<{'n?zнrR_?^ۏ9^Ey)//Lӭ,mbHaME(֬Q@ CI[)xzd>u$F)$ pGU}/"ϲqn3ҽOЩ&Q_?ćhOW/ۿnlg@O~v}8*h< $`:cD4hi:M`Žn,ybIɯ?; z f51뇰AM3QмYRh_s8/Zc׮o*NaC^ow:Cnx>k\yu av]*  h qyVOz SCt?MjiN[X]bR$(8gP7-om[FE|~2nڡG  ,,m:?.$NPNj^SӮl/#-nxfMnF0dҹ}o|9Ai:7n*xg HWaE>}#ۻ j߅oXhvdS3'e'ʶ( ( ( ( ( ( ( >hho/ڦMT(\]^Lӭ,mbHaME(֋}ON̵7#OJEq'sXVtoA˗S>TAȮŠ(((oDӼGϤhoMX0H#(_+FKJ%ԑY,BA#uQWQE߅|]i_k! % a:4M;Ú<No{7yqog۹Xy$kB+AM3QмYRh_s8/Z(ImtvcLxp(A(ǂ|;`icV;Inv8]P-om[FE|~2nڡG  ,,m:?.$NPNj^SӮl/#-nxfMnF0dҹ}o|9Ai:7n*xg HWaE>}#ۻ j߅oXhvdS3'e'ʶ( ( ( I¾.c4G_DŽ0V?uP~itˋ{>Xē'ZQ@Oτ<_^]ծq4/Xة|:׌|_OIu(/#< n0d?ފugW_@d]<͈d$g. >hho/ڦMT(\]^Lӭ,mbHaME(֋}ON̵7#OJ_wP'sXVtoA˗S>TAȮ¾ 51T]{YW.#wWO*b#>>(((((((h} Xүdyvgv5 IԴo[}݌-8#>ƽR((((+[yn.<5H^I$U I\9*E5|KJoO%}_|-|GumZ0ydp_GyCI\ +v<$?uN:Kvag<8a'MO△yaVO#dYI"6 08 ¾\ZI i$r)VF( ܢ ( ( ( (8f{<Nrp?yg/ k75MRdx,85]WΟ|5k>:MJ#FPl#8 WtPL[YOiu1yʞFA((>:[}/Ou8ݣ`T$(' gVk'$Uo/vy3Š+友&KYwk'h,F G_S@~ k_z)!-2$E*%y1G !ILHK3I'V L^_U4RF$,FI袀 ( ( ( (>t{YՍƗjW.4*e8%AOF??|3cu<]WǞ _|u닏 k0lI%U$Wk:(((友&KYwk'h,F G_E. | {xd9#AxnQ@Q@Q@Q@Q@? Ongai=ԞF`' 98¼WXd]ZJ[͈g{.((+6!J#LӮo$mby}EҼ_/ƭ:/|2n21'@>iN5N]`$(' gV 0S\tMz%PT6*~> *k.OЩo&ߢ> *k.袀 ( ( ( ( ( ( ( ( ( ( ( ( ( }]_KkxHb Ш'C^_8k'=[;6_wBsg x}Q@}?8~n׵tzO :͎o+=v3PN$'>R?B?wImݻoBg8Ƞ7hvZwW[WFo?Yi$"3 8OVuܷ>W~ܶ83@X)%|9w_<7 Ψ0 \1 /}^_3nFs{,>'1=;PQEQEz q-=Ė4pT1RFdR?]?C?nݳ{۟0gp+(>$.fAs ua޹|Y|yͥv3n QPʸ]r㷭nxB@g6_g;q׽q>¿ ƭ:ѭyXˣn1΃=f/TԦ[uVBes=+/mo߰y6m}vwv$w-5~ĝ@q@$uS޶+O?϶}#?7cj(Kºυu}.OV{)i!(gBHN2} xg7yhvA;j3 觵zƻ<bx{Sտ)i-ϕ~->aqKJoO%wFOxH/,n:zG1A# $HmMs8G }&~g;cYz O<|78G]ܿsڳ|2s_lٿwt@((((((((((㧍E CjGݷl|N_뗟kPxU#ucQE|ϋ;0w?xM;[7{8 ;W8?ZWa|-o55m'F=~3ܥO  (|A-sƫWiz\sA-\3]:*Tc;zIEW)xßm'I~cX_nQ,I< \j~ $.y}nvKI=(b(+:x^>y߹M|}N1zQ^oS:ϋy^}=AW< 2Տ^@Q@Q@Q@Q@DŽ/SayZ3' P!22 _SEyƿ>myK5I29 pGUc 񷈼c}gs{wyj`(eƙrO.OXةր6(>R#:N;̋찦Ux5}QEQ_,xkzkk\C }F 2S'=Q@Q@Q@WOZZj̟dnFC '}OEPEPEPEPEuIGHcşwx\|[]BS0Q8uZޣχ}'˗b"x$r+ |DWeyajkOy>xq$`я@EPEP?'%Uj ?Jо)x!4 _YNeyaO6#@*dFx"D[kjN{7yrg۹J<9Q^o:τ|g}MA!gLBFGXm/ool/f︣9ڽ}((((((((((xmm常8` $Q@$V=<7Gga *L v$A@~Wc]K87t&5[z} ;XV%-2B3}\ ß~Z4K$$ܬ9i[[mpq8=} hPEcxzew ҭ.g7\FTZO ռW4x䍃+s(= Gm*ϗtfqn+B=wGnoqg=}MIjnnic8EeK` cQ:3 .N3Q@Q@Q@Q@Q@Q@Q@Q@cSnaguuC nsld2H[P ~ß[VѾcK_n]G H >((#qi:M/|n21O& ( |;W|eyi_dOxUs$d #O^E2ǧ,h<8BFH[j>q:ȷ3I ((6!J#+w5-H#->#:};̗Pк<8}WtOch}{wy{~ kt`<৅6\%Ԛ̩椙C`#ʽ"(?u|}𮍬iw~\Io#G EK#$f@q+ 'MYltvg6p O)|RojN'ˋ&#Yy5"w?}rnnqֽ+_ |e?hT)l(pG E}EcNLnayuk2nkjdppAG,n5?qWZ}07;FFO$E|o9Iյm0ydjpI袀<㧂|E ?eGۻg;[l|XkdPy<ԓ(c$uSWQ@|τ;e_^e֡q4/i|:PEPEPEP_,xOhwkk[3E,p'z q-=Ė4pT1RFdGx?WkhvkPI<ԏ# uao~w4; -V;x69Oj~ Ov3wcn^Q@8|R[/Gյm'FEO/ڡMaE<39r+'cqx7C˺75 288 ((xOg~~8^EyO k>m冹gK5SI289BGU?zEP,AOZZjBknF#}OEQEWkwxCҾk(I vν#_`ֶgDF͹_\4w߈|蚏5Zm"ޯr AQazmgyQ$п*p_# k5z8.lmOoLZpEe4lFGN~fѼ+iw Oee %K"$dA@6xOhwkk[3E,p'=PkhvkPI<ԏ# ua?'ɻo17/_Z (((((((((((&Mslٳwt:[;M[y^"6_Gh>s}|/쎋s1ޮx+Zoi.{YUڪ1h(';_/ot{ݞn;[W$Gj|`' M\ksEۍ=+WmzڦwMovb9j7_J?>ϕf9ҾdWu/3j\O-[#2,(;|G> }Z_;;:cz4J?RTMԣ/^^৆]M7\cwm`製xmSռ'r[l83Z ժ~%aѼUv#Ae{5m!A_K?+k6:WFMR8dzJ(<o/X7.n?\cgZ?_Ih>oc.{6fSTԡ+uUJf܌s=(<X}g#?1{W3V|ZEsnݳzۜ 8y3%qIFu-+\E#HLj\,Ba@K_0Gx o;@_=og}λ[o+vݝc?Xڟ(/>n\cgZ 㾣'Qv6A$!Hd.6V~hs}7ۼ3n=sڀ; |t;#l/y{F|n^))x\cٽ 0j* =wB=jOH|۶o@sg]<=OIn|wBs46FF;xB E 8[MYѯ`F]J2+OOL|_c9?ywllwu^^oo5 VK]yc(w#!яz((((?_Ih>oevcs9zᦿQʗjDmǚ:wCU|YM¶wM63}>֎ٻ=?5Լy[ST{u[TeRw3Jmh}_1{WhZ߇[~iϕvnp38৆];rUfX 0 dQ޻'MFѬtv6QBpOڞaݷ~-881t:#cWyv|^ꚶ_iw "{o%$dC\ xo>#,/uY.wI匡܌ FF=+&Mslٳwt@?_4`ֹ>gGEo@Ïƭ&?vvv¹x+M6w455ӫ0bUF0tOI[ ܶoygq^^W|𮳬jIq"4AC; f2qkn?\cgZ??jgK\> !пJ$@ xn>$K[]vg9 ՏjؠпhO"Oۮ7lwcs 'tmfT5;I*Y0Q^@Q@x:϶}ۼۣWY7cj ߋGw_]lސKA;qj~5o'uW>V7m3Q؞o' >V!mqԚNXv#Aeom!AFì]H^o#F@`Ig'&>/?ڼ۶6n:`7O Gv%ծ<;ǽzEQEQEQEQEQEQX~4k_Y!-26*& 9s@Wg.-򱝤g=}Mn|յ-gw}:r"u3J|bN2IǹT(((t]{FՍV06vOe!H>½OFO?|dv<@Q@-oQÍ[Vn>}˱_nO <9.߈0䕿$](@@tCI[/gN]Zʈ${O]a+7^ߡ|-o=kOSLl wmFY vx?M5oop8*//SӮl/52'd$r0!Bddҫ-4GtZ3d[7mrY~ xz(]N$E Ux 1_eOzewҭ.ɠ7\ G@)//vWW9Xyi>poǕ#8h%h& 'I=ŏ,It,vYG:k?vC$z$O*Z?g G$ҬoykIvg7tCI[?vC$}?'T]_,|_>)k6vZZlh2pIh.߈0䕿o?J~ _n 닏 hO.lI%L%$W$ksOЩ&,gȾ n P_GחRд 8յ}Jҵ;'ɽH&tȭV`py'~0\U}Ex$ڭo/w.q>>^Ѽucoz FĥFHRpϰ诈?; z f51诏<O]x%f]N$KY]L #WtQEWkiĺ}/[Ԭ`m27hn%-2B3}xy%wRc|dve'PyZ襮ƞ*ĺ0D#;UQ@q<O]x%f]N$KY]L #PuO h.ӣ,keO5À@9BF?lQ@0|tO|_h}${~cstr'.QW_+ѯzi:q2]8P¼ ?J (?O5|Cqo,rdaA9>xĚ-ݬ~gDlA!Rpp@?}OEy_[RѼ cqv344LWʔ { 5c[[U~ٟ78N3PQ_:|}.xK+L;[Ky a^W ߌ?k?c7@Nj>/Lagv0 ;Qd`%2p\zuͅZD̟dnF0LzWOz*O9$FY؂Y$y$ SCt?M|DӼGIukXyodݶaʐG  }Oῇ~%}H,hL b:hqjcjvO{anM[k 2 ]{YW.#wWO*b#>>uV6^Xdn)k6v m-c6C쑢ƒIhz+su_\\K$˦[,x@@'.uaQ@'|#ajd!2(I*5;z<qyrdݵ9r(Bxmm常8` $Q@$ԕIu8Zoj:q6V < Nھp*k. ?J> *k.KIԴk4wPLW$d ξ` F@Ş>w ҭ.=qyʓAkOO ׎Cqo,sA.rWS+AG9:,>xSӭ/2$\r0N dր0_m常ֳ !y$UTP2I%p>_k--c<4\ c ~5,n5?qWZ}07;FFO$)//; z aCLt}oloydIvg8q8'ÿxGN\Ҿk$E&\@1=U| |}_gs$cr Fv%yX0OHÀz0[k:{6}g۹CU<x4·_5cŗ9<[Bh_ibGZ ( ( ( +MOQ|˫RS쓍)GZ(I:tw-dBk?gof}0P@^Sӭ-nI}nFd֋}3N˵J^WIԵz}-+!A8>M◃|GA:/Yv,ydp a@ 5MKF-ڜB1_*!3k?;ocV'2In7}8V<7tc *k.OЩo&߬o[Ӽ9ϫjgo.}(A'>0*k.OЩo&O QC~uFfO ˨X~uPxMs4 5MP5ĶI 9I#J08 񊎽cş"ڿ4}gۻ;~ kt?vPZމsXIխ}2-w(aʒ u./̛c O&>P*k.o4-cD[Jߏ78qWW?xwe>Odvnqր: +~)Ѽ]I}9L,SLJ0?:ؠ"xW:vK"*}Y2QH5;z<qyrdݵ9r+B ( ( (?[k:{6}g۹CU<x4QU/=:O2$F` FAjQEQEQEQEQEQEQEQEyo웛~kw\=qڵ>x+RnR{I]BEܪs=+ ( "xnԴ; 6ʎr@'Q@76?]jޛ4=6NQ!^E~k#ڼ}۶FO nzw zO/k:5ohwJ+`##8> Lwm"v߱N3&((?_Ih>oevcs9z⟍~;-VK](w"2чj4JgF-E;@u #8>/.??hޛ8? S϶bķ_n'{ygnv82hxFV\j3Ae{ ċҖ*iڨG*_=ς/xVK紆xRTG\ 9qֲ8>lk\##cgUMԣ/G4J?RTx?O$w-rJؓ q$C##(wSĞޛ_RZ d.wD0 `ua޽(0|8> cd?[mVթZ+uM,+Rmt.{Hg.Juڬskcg|y^Ѳ}cvzv_G*_;5?63}g;:gzy/𱿵?Q+^|~> x;Ե *;[+bO,ؑ@{ײxkMF𮑥4m=64d,2=jQ@~%f|+v{e5m!!C:C^7৉<#7\Ҥw\`ý{W`q|@ɹ>u/ڭ(7/VK'yo^Zٔ)D\ʧ9Cһ(TվxFѯKCFh,丑cRQK3]s;y_]覠> ^пI䯯_W/xy++,&׼y]SKa+$eՋvڌ1k(_߆<#M7C .|tz0]EPEPEP^৉<]K\ң$mꧽ{6mºFpѴVPђT RF@8EQEQEQEQEQEQEQEQE>#mfw}6|jM]KǞ5H-!+׷UFU*'s1\'þ1/ϲ}${wcwa^c~Ѽ#IaIL̞kɗ r䞊?*آ(_'/<#MK\ .|:t z1]Egz&=}'VE|ȷn*Ax4 ,2/›aʠ#(ÿ _DŽ@0Xt_WW6񷈾ž?K/־LrFV3Ae{5m$2*T뇿AMOQм˫^isĖ8OJ(KR,#K_+bN*!{ν]iz Y=µnX:.a9^wyZ3"ɻkr׏G4o]iBWl|ѡ&:63}>֎Yz|_^˿qݍqFszW?@o~$-4; -*K[]x.w;9ՏjmJmgY.5K0Bv,@'>[#qڶ2_L8WpWa K ;q(O i>*4`F]’2|A-sƫAM3QмYRh_s8/Z(|A-sƫ>0|8cdM?[cgmU}s'O|c_?eH9ڽ}(|Y׼MvlKp Q0b]F0t0n~&нrpii:M`| 1'O&>֥6]#TX{(n$X 1$dU|-o=kOSLl wmFY zx3%p~h>𭮩SO-[HJ;dmE9c75?(SxPя@$x>63}>֎ٻ=?5Լy[ST{u[TeRw3Jώ 4w邏v/ocnno'#IadS3'.@Ԟ?*^zi:q2]8P€ ( (ox;Pھ~97m8@EyO>.my_H8@V?zEIu co6Q<3&7#dr2 @x[ėa]Zؓ(w#!{ ,GDu39'oikkQ2 Ϋc>wڿ4g$ݷ;~cst((((((((+ƐMu_$˦\qƥ$(rcI|Rѯ/?Z{)#E#$Q^CZƷN}%˳>V3gπZNxTgmNGXh A4QEQEQEQX,ޙy%4Kc '# ;_ ֯ym"h%BG"WR0AA<7V\[J6 dGk<+u_Fyt˔8fv10$1@x?M4 4?Ch_W 4?C֦5[z} ;XV%-2B3}\>@%{]'nϕh(+Z7oM>vuQ dc^@Ts  !y$($s/i u .6M7\8a$~5f]{Y[}S[ԯW]<d$gNŞ#wu&vCr;`p ؠ?g G$ҬoykIvg7tItoXz} F+e!@>¾>>k^|ucq蚕 F%ʡN PFpAǸK%$B(/$' *E-t&/"-HR"PAAǂ_xzZ0E:[}/Ou8ݣ`T$(' gPjz_U/v.83V SCt?Myk'$Uo/vy3€>Pi}iOeapCQj! 2rI=51IRo,_-q#/jEE^T[MmK-/W(Z̲lTq*WǞ4_u k3A.rV k:Huw҈?g(zѱWzepZZǍO $< T:[zޛ}:v%`$)' gPQ@Q@_xzZ0E:[}/Ou8ݣ`T$(' gVk'$Uo/vy3=Š(+ƐMu_$˦\qƥ$(rcI|Rѯ/?Z{)#E#$QEQEQEQEQEQEQEQEQEQEQEWk~5YK-5)ncFPpw:oJoƱoX͍bwIQn捈Ҁ=O<5`_)//5ͣxWH6y2JD H('_|_c%:9vo_6f9wQ=sҽoJInQ|@_yCI\<7tc=N5=F].HaON7;dIk< %_ѫ_oEs~5=STh%[u[TV`Yw2aJ_?d_C/Z"~ck7\vŠ+S~އeuk{eW&@z0@\xW_)SIԡtkRdX/m㸍d0WP3jtٵ ]FMoHHP΅A8'ʟh_W x>;u*K[_7zA,;׼PEPEPEYG×zskkz@:@w$ݷcr?|Y|yͥv3n QPʸ]r㷭y52>5Fw;ϵǧ,SLJHHÀz0 !пJ$+_Ht/x҉((I]gYeg6v Ą'QEQEQ^o⟍~;-VK](w"2чj4JgF-E;@u #8>>DA3Nм[Xip8J[Ӽ9IյkygۺQ‚O$}w]6mgºnѬS[3PN85~ x>/t-mvoH%V D𯋵,4=WwQfd<Շ^OM̭oF7tT lV1tḷCҵ>0|G cd_C?Z"mfC²訫+g'dQWPU:O.'gNPKN=+oѵ.OZ{+-hሩdb2=s%]gºo+=3PN$'>$K#qi:N./̛̌ydp !8C?'~q*O}?EPEPEPEs~5=STh%[u[TV`Yw2aJ_?d_C/Z"~ck7\vŠ+S~އeuk{eW&@z0@ESu(uTY x#Y 05mJF.FK0 E,@8.Q^oo~w4; -V;x69Oj(((((((((((*?-z/$:Dw=?Qk !пJ$@пhO"Oۮ7lwcs/h*}?Fh,fRQʂq ~ ՠ6!J#+n;[W$GjgK\jEEG3%w V=m/Kh%kkV`Up6aoZow:O<5`_+T‹*H/|l ݌g*ãh:]HY[oHAbA8gU(+#}[wMy_dsvݝc(>;:>_3Wtw'ݎ_!_UGO}>_f0g t tG>3n6퍟c9ێ5m6gFEKy2u*H#8>o[q$Ɓs}s|Dۂ*db0Ð:@_X~ݭϛy:s՟+Oh}o+fsۥs ,/#ڼ}۶5O nzw`3-3fya۷~ 835Oڞaݷ~-881ЮO3n6퍟c9ێ+_W/xy+((+?1ϱm"vz(~ko|Ǖc9??^?{v>w?±kiO@3/MM !>ϲۤg8u]x?O~$-J!s$s$3V W>W~63\4w?߉0n~&4w?߉0n~&~&¹Gylg;WMԣ/G? ~ _&ϳe~ǔ:gK\xkcڼyfݱ} nzwPпhOiO"wm"6؁wc83|A-sƨqkOL|!}9?ywlwu]3%>T3%y?o웛ktll񍪿=sڀ=?qyVO{x$P**ĞޥYiRZ[x.wDrDucڀ/>?yͻcgu_G8? 7Fc.;;׈|__EPEPEP<=ohɻ[7suۍ=?/W?ڟ7.V͛lJ (L|_}G?ylj{^EgZg''inv2qg4kg߇='~i-vWv23Ex~?}|ۣda7gj ((((((((ox;Pھ~97m8[ߢ((7z}}dj7mPpu6fmagkkC n'j(FO'b('oikkQ2 Ϋc>wڿ4g$ݷ;~cst(cşwx\|[]BS0Q8uV[ hO+I,"fv'$W$kr ( (>>^Ѽucoz FĥFHRpϰ诈?; z f51Y}qx7\˺&6*px8 u5^2>k?hoaMX0P_e7VEJ$E `+OЩ&>8ߊu2_wd# ?e 8#ʾox{Pg~87}Y|5M6vF"bTWiy:3gFq/^2}[Iuq}ۺc!'O&ZT.]NDY.iX/,II85_xOz䗗ҮGlX@5?wyWZ}>7;F$_OuIGSд}oҬokIvgqt7Fk}/OGk ĥHPpϰ Nj>/Lagv0 ;Qd`%2p_S ķѦW/$XDNI$I'Q@?G<+6}[<&}i:nni}uC`sYx?M4.߈0䕿?[ڵ/KSv 8P  h*h.< 7Cм˫>isѩc$R_?^ۏ9]CkoQH8Ppb?%’yBN (ǂ|;`icV;Inv8]PEP?/4rywV}оvN ~)x'V~c?EXSv]*@<.x!(T)$r(eu#x 1Yv>ޙy凇Kh, # s'O|c_?eH9ڽ}+cDs'U}ߏ+Fq}oQI}ZeŢştJ :rkO|;>+^i~5#eQE=kKVԵ5 ,S4$$${ ?JcŖ6g 8[]BSq;Qd`'Z~SӮl/#-nxfMnF0dҲ_n%֍4y$&gbrI%rI<(m9)gv_ٮ%پEI Z)^.冹==T,ާy43/c'V|o9Iյm0ydjpI(9i[[mtvY:+v<$?z~Wn [ӼGi7hw.MX#G"4(*i5j K%-p 3N=\iEK@ ߃kc^>2|/i>c=ΙdH GSa^o?j]wn3Ҿ)mg> ,u&*y&P(H g{K3FT2?wQ@^LӮo$mby}EҸ]?a+7@_?_+ѯ@uƽS Y3h$#`pÃ+?o/sƓȾ33P@?<+kq-ljthgI+#-AMuqRM<8RNrIN=(A?ik궖Hse ~5=P~'ypo3g=EInn^i}FeC`q^W>"ϲq3Ҷ> x[Yo,5?]I<ʞjI1:+xV[{9/VF[ +rXg~2//2P\r4TFAhz}gYywx4r@c ~5bZ&?'ˋz#X8hsM.5ӪhnV 2Bq}jW4MG'n5[eie}3f,nrF8ȯOtWyCI\4MoN}}\7mbAТ}oi7yv<>vXrp@*i5j K%-p 3N=q~Wnޝo?u;{ U n*D<i:3 .N3օx'ɻo17/_Z (yᵷX$/$0UE$xsYv>,ާy43/c'QO兜~e֟q ) ѰQ#xG߅2}'VմoyۺQ¹'>ih</``il/[ d[PÕ$<?ס* =:B-nI7#TFAkzHuw҈?g(zѱWmCۿG^A8C?'>KĺpcHH AA5^ߊ]+;J]zzBÉ$$a?: =N; .dɠHA#-5|8tZyd[r]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExş0U6mºFpѴVPђT RF@8ED狼 hvAוbmOE=?|aA-ƫ(gKC? Լ[/Ti{kWfPpw*oJ((u; ??v`>',;_g}k(MMDq2ve^1ϯ1  ho5G%PT6*~>`q?7D$>m}s雼lʻKdPrzpL|_}G?ylj{@P:5n,F+` 5rWR}%jwy?߳;s8q_@P?|Ig]%s @ýx/Wlw#9ێqn5o߷֍m}]vw1wÍc͌n<;6y_^EyCoa}δ[7~V2qz4J?RTMԣ/@'%Ujw4; ~ǝAHSڽ&J9/g~~,n#8Et wuH_3anyݞq?7?_5`ֹgGv͹__OG+[oegkszoX(/>n?\cgZ_ hj]ޛ \5-ԎX*Fa8\ߊ|7ywA%ծr+õ}8 Lwm"v߱N3&wSy>wm%m߱ m3g4(OOL|_c9?ywllwu^@p~5YK-5)ncFPpw:oJ+;J`lGx? ;\~c ?|ͻdd`vze):h7\?᣼@sCke)"1=;P~,><𭮗jP\3]FB:mv9ˎ޵Ʊ760>߻ڭq_X!~5ϛyâs/_?o+]7n'|xYK'ymZٔ)f\ʧ9CҽSƿ Gneukx"+2чj FG~c ?|ͻdd`vz᣼@sCk/Ŀ|+WWeg6t* Ą'?f_k4-3o:fy?nۻf sϯ` F[̿77a+jۿo'6oc@EPEPEg뺟'=[i-ϕn[npqc85 tG>3n6퍟c9ێ(kgAZjSO-+ZƌK2u9ޕÍcޱ?4 m3S~/&YG<ӥgPGe_%$B(9{~vm}FUF4-⍣i!6(L%N 㰯hgz%>Oۮlq Huw҈?g(zѱWB@g6_g;q׽q>¿ ƭ:ѭyXˣn1Q^_+?_o_log9@Es ?&>?y|ͻdd]W_?߈t'o'q[yop9E{QEQ^?ox@se/vqڀ=е?i++v6gp+B ( ( ( ( ( ( (?vC$}E|  ?%ot.߈0䕿o?JW~!Vn]a+7@__ CI[?vC$}E|  ?%ot.߈0䕿o?JW~!Vn]a+7@__ CI[?vC$}E|  ?%o xYwo/ϵG<*RG@:(vQ K ;q(OxR6i4۵-3(RYNr}>gZ_;s7LwR_?^ۏ9]<}Oڶy߾Ms77OZ?uK4٠.v`p6aoZ?᣼a@MkI¾.c4G_DŽ0V?c’yBN> xo:u5V+f$.#5d  18Sĺ7u}Rci쬦ddBq*免[XYЛڊQ6sayku2n#r0!G# 5;t;-*;[7{؝ ;WW|-o55m'F=~3ܥO  g> >u&I&P!#H?h(zѲ/"ϲqn3Ҹ;J`l৆]M7\cwm`製t>U|CI^@W𮍬\Gq4EK#0q+(9+MOw \-µ`;0緥|Ə&oygz_iw "{o%$dCT'}q7C̺5,p8$ |߄|GiX^]ZؓC@{פQEyokkGll񍬿=sڹ n㾝' n34t[v~妇a$Z.w;9{Vq uG4[VEw.Mfu(pWa@cv~.އ$l06 ;V+6=fmSKԦ[veBVڊskkA]P۪ȊC3dF9˞x[v~妇a$Z.w;9{VW?+k6:WFMR8dzJ(ύu/VTചyoRݖ)Gl9Aֻ;IaXT>gZ_;s7LwPf_kWQEOVatk.X/m䷑ 0WR3kO Gv%ծ<;ǽzEQE%OT6Z_Ht/x҉+?h(zѲׯCI@i_*ѼUv~Y^oI @3+PKa[rp+*#>Q@foNcac%Evd5Y[SDoT]Z$${St}ll<kH3xayY>\OHLƲ $b )\0l,8- ;!1.I' 8$ƬWL[YOiu1yʞFA ( [}_?_+ѠqyVOy+6^I $_ KRxy| ydx˗Hث#yGO'UZ(叄,&KFwk'dHFT_SE%OT6Z~` F@KIoQ%|Ox^!. jw)qʪ%`b%$B( /i u .6M7\8a$~5Q@:|.T+L;Cy Čs_EE|ĺ}/[Ԭ`m27hn%-2B3}z Onyw=Ԟ~,y8»(<O]x%f]N$KY]L #WtPT-'MmT/WBl3jx$O*Z 3BO7'J}"ߌ;@2zЯf_kWxLxU F#' I'<^IJMxĚ-ݬ~gDlA!Rpp@?}OEQE|GCŞ$,㳰ikvC쑢pd;J`l_Pȓ5ķ4y$39$$mn%. 9I#%d`pACPHL[Hјb*JLh$.fAs ua޼Ğ$G =Py55cPc ˝ٕx0>& &^o?vl]v|cdWqSτ|yaYMATRL0POU8>lk\##cgUQE|_&XYeԩ )Ib#w󧆾xFV\j3Ae{ ċҖ*ih52O GK5Sɔ1)TUo7WM?CDuGmH9zW7௄4iM.MݖGV,[#j0wn>t; 1(wJ0H;3~]ծo ɸalQEQEs'|_CjI7m︧ܽ}k揍~)Ѽ]+;v ?Ē0?:5760>Uz|_j^aI&[uVve YrP !пJ$@?%$B( ( (9|Du5WRD&Tc>.]SG Ey_ş"w?}rnnqֽG }&~g;cYzvb}'V~}2/w(aʡ }ON̵&GZ; fC aڀ;woMO_4o隝ܷsaˣmg 2g*DŽxLyyv?;QdRp]>WF𮑥iOee 1,Gt+tꚤsA-۪ڢ*͓c{PI\>"xW:vK"*}Y2QH@M?aϵ.w6pj,&׼y]SKa+$eՋvڌ1h4MoN}}\7mbAЮ_߆<#M7C .|tz0]Ep 6zuu*C }q؀%02H]|ᯀ^*ѼUjY^q"4 f03+'to뗟dQ e$ 'ʫcڿ5}g#ۻ;~kt?> Լy[]/KKkeRp6oZ?Xsc7ۼ/퍞fsW{WRo5[Y=|Ⱦ3ܡ*<+"|'wkTv^VĞY"Tpk9<[h_i*pyuLӮo$mby}EҩkMF𮑥4m=64d,2=%f|+v{e5m!!C:C@z'/XIu_Oˋ&Xɮ¼OxGzn{IkkH%1Շz(((((+ q*Ox{%PT6*~(OC_}9ϲwtjw8u\4J?RU|mۿ^@ 5RTU_(KWQ@ 5RTU_(KWQ@ 5RTU_(KWQ@wZ߇[~iϕvnp38\?xkV)k?$](@6!J#(g'dQW$P** (>e)f_k (|u[y_dFݝc( ow:@%{]'>' *E-tI熿k Huw҈?g(zѱWmCۿG^A8C?'>?uK4٠.v`p6aoZJ+wKxM/;7z@ +$;Q@󧆾>YVi2{{ 2 ih52?g'dQQox@se/vqڏIaY?TUk3V|ZEsnݳzۜ 8hW?O'UZ((?h(zѲ6fSTԡ+uUJf܌s=(?_Ht/x҉++ o>XΙmeGyQ+n(ʧ摀ŽֽZυtRcYlc(g@ qhR; vh7C~; vh7C~xRnMR HgmQJFs=+G*_qk?'S?dڼߵo0ϛqx?|A-sƫĞG =ԣOx6F#`d$ىy0O/_?o+]7n#?asw3ptz (ĞޥYiRZ[x.wDrDucڹh7C?]<=OIn|wBsG*_M[KeKy8e ԩ#2C\ÿ zn$y؝ uQڀ:?`xzIv>ovb9j??jÍ7Mnϵ66yx_@85>;Դ; -*K[_+cH{PQY~Ԧ|+j {e ċ!C: dSZQEQEQEQEQEQEW|@{%PT6*J`?lTQ@ |mۿ^^JnOyQEQEQE}O'UZ+' *E-t$:Du$P**jEE@EPE|A ߌ?k?c7G'~0\U}E| ĺ}S[ԯ]2GXU 23F}}@qXVմo_O̗S&p$]{FՍV06vOe!H>½OFO?|dv<@[XYЛڊQXHuw҈?g(zѱWzw]ɍ<T h:5\iz&c;!F"bPr$w_j1WBcHFκ(?D4hi:M`Žn,ybIɭ (4FBeIvTk~)|#;Rj ?e r0?*&^WwSv|cdAG<+ٗftC>$ {2oebϺfwBۥ 95޷XVծ>}>2]Q€z%OT6Z,>/Lӭ,.$$j(FJd֬CI[~ ׁ|=qqi-I$ĤJyn 4?C~!VnOxWXSGF(=ux?M5,=Ghwj 鑋i3Px%IU8Ws3TwPXVմo_O̗S&pLӭ,mbHaME(־(51׮o*>%’yBN׮o*NaC^vQ K ;q+NaC^?; z f [F%gKY%32y&\ ˒z(b 51_j tk_]qgA<B[ڵ/KSv 8P't; ̺88OJ?  kr!($ qUE81@)// o|9Ai:7n*xg HWaE52>>ږ[/P8ѤbTW'/+_J}OW+ngnvqhqyVO{St7Fk}/OGk ĥHPpϰ &h^eԯ4bK'wQ@މxGIխc>2-웶aʐG  co߅|#_d# ?%(H$a؎?*(|;𯋵+wQ!WD$ #Տ]Ehw4x4&0nϷs<$IօPEP?<-xN\]r<׏=u_ [(?g(zѱW%PT6*~>` F^KIoQ%y%OT6Z_Ht/x҉(+g<7x7\ӴiWZ}$4lI&P5a[_ 5Mת|ֽxT5+LKWKy c_E@|Z/Dԯ]24i-m^U pJ3=}Ep,/4υ5Q3gd( ()Z[ƩZXdbR'8zf~oNc%K9v5w?±kiO@w=?Qk?h(zѲ|-x5m'FE~ nO AO~4𭯁|=oq]-H俉YD dx4n {O.rL&$+R_^9G)// ?J`O|E>+^Xyif5#fcu=+7¾.d_GDŽrVyk#:U3.Xq>i:[}SO9cbTC 0gתQ@WfsaywV3'';]I 2W~S[ZOwu'#2;bxŽN'5=F].HaON7;dIk>xk^Ѽu}qh H%իĥ؎`p DZ袀 ( ~ U=qqf"I$UJJ9}Ew?±k5oN>\} d`H <+hzfOG '.ua]</Ogvy߾=vOJ?I|C{'mr>&g凇[Y3h,W~ k_z)!-2$E*%y1^wxwτ,|)C?[>k.4Ƭ(x':׬X_[zueI4/8<:(<yV?-s/?iEK\3Oj((YO#d0FdvO^Y ZSDԬ`m2DY.^%-p 3N=}EQEQE|y^ֳ jv$XJ%RI%pâ򿏺NK]N7haiX/( H)hחm-c= @kz(((((( +?g(zѱWװ~?PIb袊ow:Wwx(((<RA\?xkV)k?$](@6!J#(g'dQW$P** (>(?g(zѱW%PT6*~wn81>/K[]TՇzgA6jP\3]FC*mv9ˎ޵o c cW+۶E^8? 7Fc.;;W_:tRRymZ4e YsP?X!տ~-O78wm޿1ڀ; x,#;[ud9Ozخ>;:>_3Wtw'ݎ+~>WYlt}?YYn# q!85xĖ~޹Zސ(.w:$;ד_'t[;7q\_wpsg v|Y¶^iChOzO"wn6wc83/h*5KCFh,acRQ3]PEP_:tRRymZ4e YsP$w-5~ĝ@q@$uS޸`xVhW<ݷgzj<C!c}e?y{Hrqڀ: jP5p4V\HX)bHrphjzO"Oۭ%7lޅwcs_]MKCc/>?yͻcgu^ SwSm/? _ \jCWy[6om+("|'wkTv^VĞY"T ~vm}FUF4-⍣i!6(L%N 㰯hOۮlq O,#˽r9䵵ٽ P\uAHXwo_tk3iz] [5hT2c[6&>>?yͻdWu\ÏCqnδko+V2۳czQ@Q@W}𮳬v~GoI AC;Bqk+/:f O|8m3g€ ( ( ( ( ( ( ( ( ( (` F^?^8C?'>(SS~.޹{uuzA,aT2z(X>UP8?ZQ k5^Ex3%>UP8?ZQ k5^ESttmKi +xi,U(' z E$:Du$P**jEE@EPQE{%PT6*63}>֎Yzy%PT6*'þ1/ϲ}${wcwa^ƺ<+ujZC/557Ʋ7"䞸@OXI]]iL@8 zQ3]ծq4/Srא~?PIb?[/:}ݵUx5~?PIb袊+C/nkW·_5( ( +5DW|egadOI>s$G^q  ?%o/h*}?Fh,fRQʂq a|Uiw "{{ $dCT5=FO2WgbKI=+5k= ˺&9AS8 u |߄|GiX^]ZؓC@{פQ^o:τ|g}MA!gLBFG@Exx?>'1Ƿw(v_J +o^uRPV{ۉ.$X(gb N2}Mp)xßm'I~cX_nQ,I< \j~ $.y}nvKI=(M'RFluKu5pAG{wĞ.ޛiQy60LuQں| &rBtvN ־h5GÚq{7yrW۹Jx$r(;IaXT̿4ۧ֯('OxN\~keO(=u_6}[<&}EyO>.my_H8@V?zEQEWK[|9VմArWۺdSEyO*w,5Wv2$Pz1(_OxGVvKY4I2H ˩=~TW[|GIյk_OyTݶgQ€vQ_,xO?hvku[2}E 2# =QEQEQX,<_ZBA8<:ߊ^2}'IյXy}ݶaʠ#((((( +?g(zѱW@_Q@_Q@_Q@_Q@_Q@_Q@_mCۿG_ QE$P**jEE@EPWP=CRثcDs'U}ߏ+Fq׸W9__?i>nϕhsk>5 SKV Dp qN=zy_-'RѼ }oiv3#wPLWʈd Jß~Z4K$$S~,&-N|AXj\[\^$sF*:C) '? VF}'T]W4 h:5\iz&c;!F"bU=2K--cFIzotfoMPGkt\3(R+/R.\-3X&+2qF}jQUo;8,.໵;&A"6  88 ¬P'!HgLx䍊0 A͟ uc#_o]2xe G%NT{ 'c]K>nqgtKYk}/OPGk JrHPN2@ϸOAr+!@>®WxMs4 5MW5ĶI 9I#J08 *k.,;9, 1"6#*x8 ©tkM6vB%Dr P2ǰ? h*k./Rփ-ƩiӪY.RV p qN=|i'?T?]7Yzh oiv3XhH A4]gd0F#E$G$Պb~$㼰wk&vM#`p`? '?T?]7@a EqopJBynWxMs4 5MWšn5MR"uj)lXqj=3B57'Jq}ٜ;ApzOЩo&Aޙy凇Kh, # |A'?T?]7^ ZSDԬ`m2DY.^%-p 3N=}EPEPEPEPEP_W3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x}?8i:No{<2-wL9RAŠ(;4 ˵ڊ c8h_W~%f|+v{e5m!!C:C^7৉<#7\Ҥw\`ýl~O4 _;Cj?$ݷ{şj^<𭮗i ^5ӲPUr㷭x3?%z.߇0oJא8ZQ  ho5@ ?%qu>0T8ZPoxw7/)MCC[k,Ȫy#:?O~*/+얲i ".dbz)wSĞޛ_RZ d.wD0 `ua޽ ( ( )hjNo.-꛶̌ybɮŠU^_W-dE&\SWQE/2}[VtoXrݶS8#G">@%’BN?vWw\Ҿk&)2HF'ʽ 4}wn/oan!нr>@%’BNcXg~2//2P\r4TFAkz((_ÿxVwXGHHð=~uPD|9IukAyoWۺgaʒ vQ@Q@oϋga=A&dR< @N\ՇX/oocWG&fܽ}k((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((golang-github-yeqown-go-qrcode-2.2.5/assets/example_logo.jpeg000066400000000000000000000523041521051213400242670ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?j(L ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (jfԩ{KdZQc_4VX>dZQ`EkQEfME4VX>dZQ`EkQEfMnY?ҪPsԇ$B+ZRɢ*<*QEpcfMnY?ҪPsԇ$B(@QEQEQZS_3&{,U(9C\EAt{KdZQc_4VX>dZQ`EkQEfMY4UQEB(֢4VX>dZQ`EkQEfME4VX>dZQ`EkQEfMU/(0R(sQ@Q@Q@Q@kVMkSG^QEEL?smRjG;(bb+§bSsR;oˌ{4*Rh(FaEPEPQTzKgJV*&yµ&"# 誟mMvuF$-QAQU>L>L.e-U>L>L.ޟrdտ?zRg6"gnP)EPQTzEE*=G=E[}}\=>*=G=E[}}\=>*=V.#?*[2+ ( ( ( ( ( ֦֬/Pn^?SfʔQEIQ@Q@Q@Q@Q@QEQ/*[# (U/iZVijE(4QEIQ@Q@Q@Q@QEQ/*[# (U/iZVijE(4QEIQ@Q@Q@Q@QEQ/*[# (QEQEQEQEVdֵ4uzTuRY?қ66T*O8((((+ZkZ:B^?U{,MW*QE'kQEGQEQERY?ҭKgJᲥQRyƵQTzKgJV*&yµ&F^ES:Š( (B((OJe-?MP"-E@ɢ*O$e-?V꥗?[GCh( B(( (B(& *[ٵᲥQRyƵQTzKgJV*&yµ&F^ES:Š(( R?UJLkVMkPpB^?U{,MW*QE'QEQEQEQEY5Mx^U/*Tͫ (5 ( ( {,V ʿR(LEoSo__tS)3g> [*QH*=U(P(|%?z;oˌ{4P9U (EURY?ҪUgJI}0jɭjQEΰ((TwR<aZՓZ#\/Pn^?SfʔQEIQ@Q@Q@Q@kVMkSG^UKgJU/)jeJ(j(((^?U{,C26T*O8֢*X{,U*T>Vd@REdջ/iZw:)9bQAdZR_3&{,U(9C\ER (O.9TG|̚+Z,U*YOպ(tӇ$yBkZi3(OsӇM?V<aSR/i/i`;(bTӔ> )QEkQEGTnY?ҪRg_+Zj=B+R01ngQgS-U>L>L.ޟrS gJSO?=GY)MY5B7 {,V6m_lETpQEQEQEQEVdֵ4uzTuRY?қ66T*O8(((((֢*X{,U*T>Vdֵ *[ٵᲥQRyƵQTzKgJV*&yŠ(bnZ~֪U/iZhڇn(zEPKgJV*&yŠ(bnZ~֪U/iZhڇn(zEPEPY5Y4ɊQE#(֢*X{,U*T>QEB((((& *[ٵᲥQRyEPEPEPEPZՓZׅQE3((((((({,U*T>Vdֵ *[ٵᲥQRyƵQTzKgJV*&yµ&F^U/*Tͫ (5*^?UJ{,U)3ϯFY5B5 {,V6m_lETqEURY?ҪUgJI}0jɭjUKgJU/)jeJ(j((((((((^?U{,C26T*O8((((*=U(\*J oQrN忶?z?zQE[o3Ǩo3Ǫ\=N忶?z?zQE[o3Ǩo3Ǫ\=N忶?z?zQE[o3Ǩo3Ǫ\=N忶?z?zQEMM?>M?ڷE3QARY?ҪUgJI}0mT!RPKmELEoSoQp;L>LEoSoQp;L>LEoSoQp;Ly.1PA29+6QE#0(((((e-?Lp)R֢U2hG QVj;湓EkVMեQE[p)R֢U2hj(}Wɢ_3&*^UKgJ >H謚)\בES:ʗR?UJLQH(O.9TG|̚+Z,U2hwR9%QE"OJ)N|5(#Zɢּj+&.Z5(}k֪ROʔVX>dZQ`EkQEfMY4UQE[p)R֢U2hj(}Wɢ?UJz(QEkP]*^4VTTGJ(QEQEQEQEQEnZ~֪U/iZhڇn(zMQRy%/iZYOszvҫ&uVLC2TnZ~֪U/iZ4?tQE3 *=G=E̽>*=G=E[}nR3B^?U{,C"R({,U*~T}㴎jR\ةE[4jS(|AVjMN9t4١ETo3Ǩo3ǩ誟mmoO^?UJlsUb#9T4v*QVM?>M?,OةE[4h4h{ UOvOvةER1 *h |ǵK/i4)]"o__{ nZ~֏Ov'w͜PiJ4%)EPEEҒfSs[}}\=>{,U*~T}㴎jR\ةZS_tѶ~`n^?P˯6T*O8(((((*ݗ?Tv_ѵ"QL (B((OJe-?MP"-E@ɢ*O$(+ZkZ:B^?U{,MW*QE'QE[uRZ~֭#ѡ4ZՓIQH ( (-Oպe-?V (P((&(<ݗ?[_nᠢ(5 ( ( (*^?UJ{,U)3ϯFQE#(((ݗ?[_nᠢ(5 {,V ʿR(<ࢊ((((((((ݗ?[_nᠢ(5 ( ( (*^?UJ{,U)3ϯFQE#v_ROF?tQE3 (*^?UJ{,U)3ϯFY5B5 {,V6m_lETqEUQEVMkVM&rbQH ( (-Oպe-?V ɭjɤq]OJe-?B2D[)QERY?ҪUgJI}0jɭjUKgJU/)jeJ(j((kZi3(G QEQEQEQEQEUOvV4taw*}}nv:}>OOvOvESdE'MN9~LE3H՜U-}R.WܷgTOnqzΫv_R9M&tQE3gQgUJ)\Ncg4htΊtR<ܩ/i/iպ(~Ÿbؿ;Gy?un^?PEJqhmmToSES=TwR<aVLEBL?sꪕnZ~փZu%R\>M?>M?ڷE;>Ÿ`(5"'o˜?mRV6-R(0IO (EPEPOszS4YY2=U(N[nZ~ք]"QL(cؿ;VT'vbm[FunM.[o3Ǫ)ǽCE9+6QE#3Z(=`(֬Lt (QEQEQEQEQEY5Mx^ERY?ҙR|-Y4R _3&֢|̚+Z,U2jݗ?[5Š(2hj)XRZ~֭KgJ@{_eZ5֦mJU/*R2hj)XQY4QpבnY?ҪU/iZ@{/k2hj(}Wɫv_n^?P{tVM\>kQEβTj(S.k4VG|̚+Z,U2hj(}Wɢ)E[ttSǚMY4VVj["QL({,U(S.[ՓEkR܏Xɢ_3&֢|Šɢּj*?[tӟ*=G=ER?Gؿ;HNU%U>M?>L rSVvL(ɢ*O$e-?V> .sRUa$ngUf!U/*E<vߛrH΢}㴬q tUO?z?zοoOn .1Ri)+(QEQEETInZ~֭|;\ޥo3ǩ0Idտ?zOvjܚةVh4jh w|ϵJqmE}}\R;oˌ{4*Rh+Zj=B4Ԍ/[}4۾\cޙdQEMQRy%/iZYOszvҫ&tUO?z?z=>庩{,G=QO?=ի AhGQEQEQEQEQEU/iZVijE(4QEIjTuHh dֵdf8ER9(( v_nYOպz4?kZi3W@v_ROЌ袊gdE'QEY5Mx^ES:Ί-JxRH#BiDb%l؞vɪ%-ža %#"חOsXzjz ZrvH>mzeJnɦWbzæ.I*xRVx_`ndݕqF֠]r/2h?ux{|GMX|Wj pH>"' H]r5: k-mHLʡ#9:5qɱSǦ=;tbӕ7ttIIBg[?UwSp3T1_ƑAEW9AEPMQRy!EPZՓZׅQE3(ɢ*O$((*ݗ?Tv_ѵ"QL (B((((((((& (gXQEQEQEQEUKgJU/(fUʔQEIQEQQ@dֵdg&+QE@(((jɭjh (bNn]YQ7<"k5VîSQKEpxO}Có4/{B.fNp}5^vN<crw$W5*;B{l1u݃I=/0mN׬~icsThZL>LE+ܷgQgUJ({zmmTܷgTSmqz YY)L>LE;{z'|ǽKU,j3 /iպ(*t?/i/iպ(Ÿbؿ;Gؿ;V)*}}n,Ÿbؿ;Gؿ;V)*}n(.*)vϽKU/(&`)xٴV]\yl($~"_zڔG&Y\I xaۊkhnddU*ÆyCA9 wV`oQ寳Wg^Η/ZdEK}EP=v__Ӥ$2&882\5nZ[/ ɸcmxN?B!T2܎3jo{/5+oS[H}j;XС${~o6Y" է w*?+Э s.>ivա@zg*URdU(@Mdձ?r3iJc[o3Ǩ6~9U/iZ3RU%-__tS)*}}n,Ÿc>x<6sPջgJH&F^U/*Tͫ ( ( ( /iJ֦=8OOvoTmRiǚ;=G=U(sQE#ݗ?[_nᠪm[KmEL .1LXI2Z(C&/i/iұ Z~֭PAjJ.0IQAQEQEE[4h4iXNe-?V( w|ϵKL$Š*=AS|E*=SA?=&5a'dh (B<61R#JrWHE[4j9C e-?U*ݗ?E(4UOvOv?T_n'w͜TQqL+&&0t (QEUOvOvNJ*ivϵCAŠ( (((((((v_ROF?tQE32h ( ֦֬/P)aEPMQRy!EPEPVj[袊gQEQEQEQEQEQEQEZՓIVj[P"-E@ɢ*O$e-?V꥗?[GCh+&&1t e-?U*ݗ?ʇn(zEPEPY5Y4ɊQE#(֢*X{,U*T>QEB((((((& *[ٵᲥQRyƵQTzKgJV*&yµ&F^ES:Š((((^?U{,C26T*O8(e-?V꥗?[GCh( B(( (B(((( j(R?UJLkVMkPpB(uQ@Q@/*[# ֬֡zTuRY?қ66T*O8֢*X((*[3*eJ(((((Re¤Ly.1P@VrVl(FfQTzKgJV*&yµ&F^QO?}Z{,Lެ`?z?zQJܷgQgUJ({zmmTܷgQgUJ({zmEM?>LY4*ܚ\gQlsUTv_NK[ؿ;Gؿ;VcSTo3Ǩo3Ǫr{z'|ǽKU,j3 gUɡ*J-~\cޡ*aER3 ( ( ( ( (jfԩ{KdZRY?ҋSk(G9EURY?ҪUgJI}0jɭjUKgJU/)jeJ(֢4UgJAR (EnZ~֙t.RE:>dEBݗ?[)览-jɢܿXɫv_nv.\ (()\בEdE^FEyVM[r9bQAdE'[uRZ~֭#ѡ4QEU/*R2hj)XQEΰ(֢*2jݗ?[}{謚(}k(G!nZ~֭K/iZTFVMkVM&cQE#(((((+Zj=MzuRY?ҏ?z;oˌ{kV%!)FSz}Y?ҪTmqzVJSmkVM[o3ǨFzuRY?ҏ?z;oˌ{kV%!)FSz}Y?ҪTmqzVJSmUOvB*ݗ?bMN9ޕ)iKES; (B<61R#JrWHZS_ޗϥtUO?z?zͽ>*=G=ET*O8((˅9O*U/iZ>M??1֝9S4-U>L>Lw:}>J(v_n>/=LVM誟m[o QQO?}hmm3誟mmoOngQgQp誟m[Tn;o͌{PMXAgQVM?>M?V8NJ(nZ~֭|;\ޥo3ǩ0Idտ?zOvjܚةE[4j)vϵ8CER3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ֦֬/P)aEPMQRy%/iZU,jR=AY5Y4+QE@(((jɭjh {,V6m_lETpQEQEVdֵ4uzTuRY?қ66T*O8((+ZkZ:B(uQ@4QEIQ@kVMkSG^UKgJU/)jeJ(((((& (gXQEQEQEQEQEQEQERY?ҪUgJI}0jɭjUKgJU/)jeJ(j(R?UJLkVMkPpB(uQ@4QEIQ@kVMkSG^QEΰ(&(<ݗ?[_nᠢ(5 {,V ʿR(LEoSoQp;L>LEoSoQp;L>LEoSES=TwR<aZՓZ#\/Pn^?SfʔQEIQEQ/*[# ֬֡zEL>LE+~ާrؿ;Gؿ;VcST4h4jX=>OOvEœaEM?ڷE;~Ÿby?t}^?UJG5J.X[o3Ǫdֵ4m)ߘ*[2 (-}Rw6;O?=(RrwaZՓZ# *[ٵᲥQRyſOvOvUcA}Z(1QVAY5Y4ˊQE#(((((+ZkZ:B^?U{,MW*QE'VuWɢ_3&֢|̚+Z^?Qb*a#rQH5*^?UJ{,U)3ϯFY4P;kUKgJVh5ܵT_0h"Tv_n^߽dֵS6KPn^?P¿R(kQY5Lڕ_i}^?U{,C eJ(j(R?UJLkVMkPpB^?U)5!S&֢o4VX>dZQ`ZQLڕ/g}B^?U(.9dZR_0h#Ze-?V4`֢*ɢ+0R(sQ@Q@Q@Q@kVMkSG^UKgJU/)jeJ(j(((^?U{,C26T*O8֢*X{,U*T>QE[4h"?Vh4jh w|ϵN3MZ(dVM?>M?V<aSYOպ1]m3Hӏ,-U>L>L._ܷU/(o3Ǫ)ǽ#:a(4 QH ( *h |ǵK/i4)]"kUOOv?zz_>-KgJ>Ly.1AUjPi2(kQU>L>L꫞/*[6~9OvRK;+Z}n6Ӕ/QQO?}7U-S~ޟrQAQQO?}?z9U]-U>L>L./oOngTOnqzdQEMo__c;?[gS:)ԍ8rStBgTuRY?҆EᲥQRyEPEPEPEPZՓZׅRY?ҭKgJlڿR(QEBOJe-?MP"-E@((+&&91](rQ@QEQQ@Q@TuRY?҆e_lETpQEnZ~֭K/iZTFVMkVM&cnZ~֪U/iZ"QL (B(& (gXQEQERY?ҪUgJI}0jɭjUKgJU/)jeJ(((((& *[ٵᲥQRyſ?z?zQNާr=G=U(w-}R.ާr=QO?=(&Ug%fŠ(fkQEGTnY?ҪRg_*ؿ;U+ZVg~bؿ;Gy?un^?S6N4Rw5gE*}}nv6>M?>M?ڷEaOSRw-}R.ާr=V&RS0TSmj %fT4h4jXST4h4jX=>PAj(4TUUOOv@N3bպ{,AJqhmmToSo__tS)*}}n,Ÿbؿ;G=V&_[KL>LE2;L>LEoSoQp;s_Z~֭:)ӍHKrؿ;G=V&unM.[o3Ǫ)ǽCE9+6QE#0((((jɭjh {,VtԇdZQ`QEβTwR<aZՓEJTQrb9`)QTzKgJV*&yµ&F^ERY?ҙR|-Y4R )E[ttSǚMkQE3/g}B((()\בEdE^FZͩU*[C .sRUa$ngQgSܷETo3Ǩo3Ǩ{z}tUO?z?zܩETpQEVdտ?z:0# 誟mm;>ޟrS-U>L>L.ޟrS-U>L>L.ޟrTՄd4QE#(e-?V> .sRUa$nj=U(fXB(sQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@golang-github-yeqown-go-qrcode-2.2.5/assets/example_transparent.png000066400000000000000000000057321521051213400255320ustar00rootroot00000000000000PNG  IHDRw| IDATxQn@Ѫ~H<7X,} &8r  '8r  '8r  '8r  '8rȽ5`M>uz_6}l۟w|>/Fϳ '8r  '8r  '8r  '8r  '8ruzO>miVr  '8r  '8r  '8r  '8r  :=~uzs@Np9@Np9@Np9@Np9@uzvzk>   '8r  '8r  '8r  '8r  '8=5i  @Np9@Np9@Np9@Np9@NpNܧ|  '8r  '8r  '8r  '8r  '8?p?e\=3?  '8r  '8r  '8r  '8r  '8uzxlop9@Np9@Np9@Np9@Np9{kxoyM_=} '8r  '8r  '8r  '8r  '8r`{xkxM>~<}y޾Ӝ7r  '8r  '8r  '8r  '8r  :=^^o|Ӧwz~^mޞp9@Np9@Np9@Np9@Np9Nz'=M?ﴧ=vl(7@Np9@Np9@Np9@Np9@Np9=3O7m38{mϻ}Fߟ '8r  '8r  '8r  '8r  '8r~^o3O?4MWV_r  '8r  '8r  '8r  '8r  :=O˞Ӯ~Le|_p9@Np9@Np9@Np9@Np95g>y>y @Np9@Np9@Np9@Np9@Np|igp~L۾O߯ '8r  '8r  '8r  '8r  '8rNzϻ>v  '8r  '8r  '8r  '8r  '8+Xs]s2vvO;/Ӽ7r  '8r  '8r  '8r  '8r  :=~uz_睶xnߏ(7@Np9@Np9@Np9@Np9@Np9^az~ާN{nor  '8r  '8r  '8r  '8r  :=,w1w|gyr  '8r  '8r  '8r  '8r  :=S˽|p@Np9@Np9@Np9@Np9@ ּ5\iw?3r  '8r  '8r  '8r  '8r s@Np9@Np9@Np9@Np9@xZSIENDB`golang-github-yeqown-go-qrcode-2.2.5/assets/mask_origin.jpeg000066400000000000000000000552061521051213400241220ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!2222222222222222222222222222222222222222222222222244" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((+ (+ (+ (+ (+ (+ (+ (+ (+ٗftQ_=5j;hzfYo{/cJ+</iZ^7" VvzQ[֊⨣,vWEc( QG0Xh*9kEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*9kEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*9kEqTQ;Z+`\Um^??֚acj( >>>>>>>>iO@@QEQEQEQEQEW|@W|2e S&`߿kl@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@EP̿4ۧ֯+ٗft} _=+\3/+?j?jƏƏW:qGOEWqAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP[~J5EU(_ cj?Wymqke)<f_he)<f_he)<f_he)<f_he)<f_he)<f_k(iO^^2nZ>(((((+ ٗft/? ( ( ( ( ( (>(f_kW3Oj x?_5rx?_5cGG+ (((((((((((((((((((((((%m^??֚Lڢ*|EP̿4ۧ֯+ٗftQEQEQEQEQE}_P^2nZe?}EPEPEPEPEP_W/?+f_kPQE|EPEPEP^2nZe?}EPQE{3OjiO_@P_=ЕqU?Bf^fhhs4tQEwQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExZĭ[TQEX(ٗft|2nZ (((ٗft|2nZ +f_kWW̿4ۧ֠(((((+ e?x{3Oj((((+f_kWW̿4ۧ֠((iO_@W/? +{(f_kW3Oj ((((f_kW3Oj (iO^^2nZ>(((((+ ٗft/? (>?nom?nom?nomiOG3/MM ¹vlg;PQEQ@2nZf_kWWu%|\xpP٫٫?=\/=Q]Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV# (=e?}_?̿4ۧ֯(+ +nom +nom +nom?f_kW ¹vlg;WP_W/?+f_kPQEQEQEQEQE}_P^2nZe?}EPEPEPEPEPEPQE{3OjiO_@P_=ЕqU?Bf^fhhs4tQEwQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExZĭ[TQEX(ٗft|2nZ((((( +f_kWW̿4ۧ֠(((((+ ((((((((iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠(((((((((e?x{3Oj(((((e)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)</W?ڟ7.V͛lJ (=kQo*% rG7[߱µKUC}y{wY5x?_5eJ4= +PN8Yu}י_ӯDQ :ObQ]wgP2l/L#+h,s_ % S;CWlnӯDV%]H?"P2le_e^_?ӿ>/+f]-]H?"'Z(,x(_GQ _Qv9^s+Yy[6olJH?".$?(_GWEXP2l@e/W?ڟo嗕fvwt.$?ANXQvxKwelٿݳ+ :OӯDV%] S/H?B?.5_?ӿ>/+f^ :ObQEX'Z S/HZ( 5 _GL#Xy{6yw[xZiEU?nom(nom?nom(nom?nom(nom?nom(nom_ \jCWy[6om+((((((+ƭ_gmW,>rۥ} E|Ec#VK>=BQ_=GּY/J+(א?%} E|EZgO(^A %}k?՟{>>=k1Oe}\1?PoikK_gnЕW=ZAeQ_ </z</u?掞((((((((((((((((((((((((?/Xx\-LȹUFes(~{=BQ_=GּY/J+(א?%} E|EZgO(^A %}k?՟{>{yO_'ДWtQ VK>=BQ_=ס|/9cV{KZۻw= ( ( ( ( ( #?e\؈JV6{iZ~/EuA?e\}k#C TOϰm`rWQ?ʏC T{^?Q?ʏc>]G!*?Qg???9z+?eG!*=G/EuA?eG`?rf_he)#=k1Oe}ZWC}X?/nsߥiOԧ)^i:W#C TOG/]GQ?ʴ}' }ϭ]*Sh3L%|$ӝ۷GyQEu"QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEx\-thO+wnq=** #+N.*;%ɜ%O~?r{>k#C TOϰm`rWQ?ʏC T{^?Q?ʏc>]G!*?Qg???9z+?eG!*=G/EuA?eG`?讣~?A3XO~?}k#B_1_c/!*docw(ҜfGfJIӧ;n:( ( ( ( ( ⫵*CAET((((((hГ[~ JQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExZĭ[TQEX((((kQE# ( ( ( ( ( (>5+BOe 3ZZ񯀿0۷կe{QHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0((((((?nomГ|%?olٻwtA./Xq) (((((((((((((((((((((((((((((((((((+o[~6Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEvWVr]_ұ+ƾnV4QE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ((((((he)f_kBL_0۷կek_ \&o.V͛lJjAERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET((((((hГ[~ JQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExZĭ[TQEX((((kQE# ( ( ( ( ( (>5+BOe 3ZZ񯀿0۷կe{QHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0((((((?nomГ|%?olٻwtA./Xq) (((((((((((((((((((((((((((((((((((+o[~6Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEvWVr]_ұ+ƾnV4QE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ((((((he)f_kBL_0۷կek_ \&o.V͛lJjAERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET((((((hГ[~ JQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExZĭ[TQEX((((kQE# ( ( ( ( ( (>5+BOe 3ZZ񯀿0۷կe{QHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0((((((?nomГ|%?olٻwtA./Xq) (((((((((((((((((((((((((((((((((((+o[~6Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEvWVr]_ұ+ƾnV4QE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ((((((he)f_kBL_0۷կek_ \&o.V͛lJjAERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET((((((hГ[~ JQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExZĭ[TQEX((((kQE# ( ( ( ( ( (>5+BOe 3ZZ񯀿0۷կe{QHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0((((((?nomГ|%?olٻwtA./Xq) (((((((((((((((((((((((((((((((((((+o[~6Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEvWVr]_ұ+ƾnV4QE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ((((((he)f_kBL_0۷կek_ \&o.V͛lJjAERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET((((((hГ[~ JQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExZĭ[TQEX((((kQE# ( ( ( ( ( (>5+BOe 3ZZ񯀿0۷կe{QHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0((((((?nomГ|%?olٻwtA./Xq) (((((((((((((((((((((((((((((((((((+o[~6Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEvWVr]_ұ+ƾnV4QE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@WƴҸh>ʢ5PUrϲh.}E|kEs+Z_0۷աQEHŠ(((?/XxZkq3j(QEQEQEQEW]b?O_I^G!l%=?Cf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! Q^ SwSm̿77Ո 3ZZ/B??y߶yٻ+^V#/{ҳ Ex/{g/o߱}f֋QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE}_DL(/Xڟ7.n\cgZE{3/MM2@E{3/MM2@E{3/MM2@E{3/MMWݿx{/_?j{=(((((+o[~6Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|_Wݿx{/_?j{=((((((((((((((((((((((((+Z*5W̿4ۧ֯iOT# ( ( ( (e 3Z_0۷դ{-QPPQEQEQEV߇k?/Mn&mQEb ( ( ( ( (((((((((f_kW3Oj x?_5rx?_5cGG+ ((((((((((((((((((((((k֪"a^2nZe?P((iO_@W/? + /kƫ~nVQEAAEPEPEP[~J5EU((((+ /Xڟ7.n\cgZٗft2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@QE/? e?}@|_BWuNJ}W w </z</οgE|QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWƵU|kU0iO^^2nZGQE| SwSm̿77P2e S&oٳm^EW|@{/_?j׍Wݿ'#h(((?/XxZkq3j(QEQEQEQEW|@{3Oj ٗftQ@{3Oj((ٗft|2nZ{+t>u\uX_3~h袊>((((((((((((((((((((((+Z*5W̿4ۧ֯GWPWPWPP^fvڵU`oIZ((((%m^??֚Lڢ*QEQEQEQE}_P^2nZe?}EPQEQEQE/?+f_kPQE|EP̿4ۧ֯+ٗft} _=+\3/+?j?jƏƏW:qGOEWqAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_U_eTTW…$eeNV(((iO^^2nZ>( (=e?}_?̿4ۧ֯(J]{n]GW/]GV4~4z_:z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( bV߇iͪ(AEPEPEPEP_W/?+f_kPQE| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77נ|2e S&oٳm^EQE|EP̿4ۧ֯+ٗft} _=+\3/+?j?jƏƏW:qGOEWqAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP[~J5EU((((+ e?xQE/? e?}@|_BWuNJ}W w </z</οgE|QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( nom?nom?nom?nom?nom?nom?nom?nom?nome?}^+Oh}o+fsۥz} ^{ -6"nS0J׵ok<fUoε4d1|ݿn1eJ4= 4WN9ݻt}ב=?C]71(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! V#?O_E\Ģףzz,%=?Cf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! V#?O_E\Ģףzz,%=?Cf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! V#?O_E\Ģףzz,%=?Cf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! V#?O_E\Ģףzz,%=?Cf1(G!^0[~zz`?{~?}(AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPgolang-github-yeqown-go-qrcode-2.2.5/assets/modulo0.jpeg000066400000000000000000001506601521051213400231770ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!2222222222222222222222222222222222222222222222222244" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*v)skEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*9kEqTQ;Z+L,mQEWPW/? (诀+f_kPQEWPW/? (诀+f_kPQEWPW/? (诀+f_kPQEWPW/? (诀+f_kPQEWPW/? (诀+~nVTWEO0vWEc( QG0Xh*9kEqTQ;Z+`\Us֊⨣,vW[~Xڢ)((((+ָ QR0(((((((((%s^- (~ylg;S[E| 5RTU_(KU +nom?f_kWL?ۿyv;{kG*_f_h+f_kQ SwSmn0nۧۼlm>G*_iڨ(e)f_hiO_@Wn0nۧۼlmiڨ k?nomiOG3/MMɹnG7n󽱷xk?ᦿQʗj?nome?}_?ɹnG7n󽱷x?ᦿQʗj+ iڨe)<e?̿77&SyGݻ +iڨG*_<f_he)ٗft|&SyGݻG*_>+ᦿQʗj ٗft2GL?ۿyv;{(ᦿQʗjk +nom?f_kWL?ۿyv;{kG*_f_h+~nVnom_ \&o.V͛lJO`GKETQEQEQEQEQEQEQEQExZĭ[TQEX((((kQE# ( ( ( ( ( ( ( ( ( _/үe2*kq3ƨE52 keo{5W}@|M̭oFihQEQ@?_+ѯV^@}_WWk [xQ@E52 keo{5W}@|M̭oFihQEQ@?_+ѯV^@}_WWk [xQ@E52 keo{5W}@b]_ҶJ(((((((((%m^??֚Lڢ*QEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (e 3Z_0۷դ{-QPPQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET(((((((((+oW?cGϕf9ҺZ_/Ҧ6ᦿQʗjk *{3/MM2_@Q@?ɹnG7n󽱷x?ᦿQʗj[x{4J?RT2^_̿77&SyGݻ [_(KQ 5RTUx̿77 SwSm}E|&SyGݻG*_keo{5_(KQ SwSmx}@?2GL?ۿyv;{珠+keo{4Mԣ/G4J?RUP2G3/MML?ۿyv;{k?ih׀PMԣ/G3/MM| SwSmn0nۧۼlm>ih 5RTU_(KWQ@ SwSm̿77Pn0nۧۼlmiڨV^@ 5RTU̿77׀W3/MMɹnG7n󽱷xV@4J?RTMԣ/^E{3/MM2_@Q@?ɹnG7n󽱷x?ᦿQʗj[x{4J?RT2^_̿77M/_~o+fsۥzb]_ғETQEQEQEQEQEQEQEQExZĭ[TQEX((((kQE# ( ( ( ( ( ( ( ( ( _/үe[ Q_V =[x{3Oj>诀([x{3Oj +(=[x{3Oj>诀([x{3Oj +(=[x{3Oj>诀([x{3Oj +(=[x{3Oj>诀([x{3Oj +(=[x{3Oj>诀(|5^fvڴe* ( ( ( ( ( ( ( ( bV߇iͪ(AEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+oW?cGϕf9ҚL+iڨG*_GQ^ SwSm̿772nZaO#y<_(KP{4J?RT2@^2nZf_hsw<#n{co|4J?RTMԣ/@E{3/MM2@3Ojsw<#n{co|Mԣ/@@W_(KQ SwSmx{3Oj?nomMt^G!j,Mo+ٳgg;Wk']m~_+ѯ.{//{CUAszz-s7Z[6llJ[AsK_=RO( r?O_G#EAs~&_klٳٳ+}Եih׀Qd=K_=G! =?y¹A-|6{6sۥz|M̭oF tk']xYϹףzzڢ |[ /ColnZ[_k( u#}E\^o\eh}V͛=9ҽjVE\RO?}Եj,ܿC=?mQE\_-s7Z[6llJ__-kkeo{5YeROzzj.b?O_Tu ?_wǿuwJM Ģ*FQEQEQEQEQEQEQEQExZĭ[TQEX((((kQE# ( ( ( ( ( ( ( ( ( _/үe[ Q_V =[x{3Oj>诀([x{3Oj +(=[x{3Oj>诀([x{3Oj +(=[x{3Oj>诀([x{3Oj +(=[x{3Oj>诀([x{3Oj +(=[x{3Oj>诀(|5^fvڴe* ( ( ( ( ( ( ( ( bV߇iͪ(AEPEPEPEP\Uv=?&J+ozz-s7Z[6llJ0^5 tk']ashG!^0Es_|[ /ColnZE\Z+ƿ}Ե^0Em?O_^7ſ>_+f͜͞E\hRO?}Ե0QE!ǿgķl?志fNs3K_=G^5 u#YJC«o-/g>g1M =6k?ᦿQʗjW2G3/MM~̿4ۧ֯+7??w64J?RT|^ 5RTU̿77W̿4֣ۧ?aO#y<}E| 5RTU_(KPQ^ SwSm̿772nZaO#y<_(KP{4J?RT2@^2nZf_hsw<#n{co|4J?RTMԣ/@E{3/MM2@3Ojsw<#n{co|Mԣ/@@W_(KQ SwSmx{3Oj?nomMto6 Wk']ZSf;Em?O_G#YJ+W??o寕ffwt?RO,^5 u#YJ+ozz-s7Z[6llJ,KEx/{ tYeףzz,%|Mo+ٳgg;Wk']ashROzz,%m^??֏G!chQ@Q@Q@Q@Q@|M̭oFihQEQ@?_+ѯV^@}_WWk [xQ@eQEG|zx{/ǯiWUa_0 [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ((((((+ ٗft/? (>(f_kW3Oj (iO^^2nZ>(+2b^??ֶİ+{3Oj ٗftQ@QE/? e?}@|_W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@QE/? e?}@|_W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@QE/? e?}@|_W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@QE/? e?}@|_W̿4ۧ֯iO@@QEQEQEQEQEW̿77P̿77&SyGݻ [_(KQ 5RTUx̿77 SwSm}E|&SyGݻG*_keo{5_(KQ SwSmx}@?2GL?ۿyv;{珠+keo{4Mԣ/G4J?RUPTQEfQxo+ģCٳo \4J?RUeyUUkbY_(KQ SwSmx}LnomMte)7??w6@WhG*_iګ(e)f_k (7??w64J?RT~_+ѯG*_f_k+?aO#y<}_?_+Ѡk?ᦿQʗj=?nom(aO#y<_(KQM̭oF=k?nomf_hsw<#n{co||M̭oFiڨG*_f_he)>sw<#n{co|Mԣ/G52 iڨe)nomMte)7??w6@WhG*_iګ(e)f_k (7??w64J?RT~_+ѯG*_f_k+?aO#y<}_?_+Ѡk?ᦿQʗj=?nom(aO#y<_(KQM̭oF=k?nomf_k>|2s_lٿwt@ ( ( ( ( ( (([x{3Oj +(=[x{3Oj>诀([x{3Oj +(+22*V%WWV^^2nZ<((V^^2nZ++ V^^2nZ<((V^^2nZ++ V^^2nZ<((V^^2nZ++ V^^2nZ<((V^^2nZ++ V^^2nZ<((V^^2nZ++ V^^2nZ<((V^^2nZ++ V^^2nZ<((V^^2nZ++ e?}EPEPEPEPEP_W3/MM/?e)7??w6@Q_?Mԣ/G4J?RTW2G3/MM~̿4ۧ֯+7??w64J?RT|^ 5RTU̿77W̿4֣ۧ?aO#y<}E| 5RTU_(KPEF߇kjſ\%o/>V͛lJᦿQʗj[Ϡ+ iڨe)^2nZf_hsw<#n{co|4J?RTMԣ/@E{3/MM2@3Ojsw<#n{co|Mԣ/@@W_(KQ SwSmx{3Oj?nomMte)7??w6@WhG*_iګ(e)f_k (7??w64J?RT~_+ѯG*_f_k+?aO#y<}_?_+Ѡk?ᦿQʗj>ʢ+2kſ\%o/>V͛lJᦿQʗj__/ү[G*_f_k+`| SwSmn0nۧۼlm>ih 5RTU_(KWQ@ SwSm̿77Pn0nۧۼlmiڨV^@ 5RTU̿77׀W3/MMɹnG7n󽱷xV@4J?RTMԣ/^E{3/MM2_@Q@?ɹnG7n󽱷x?ᦿQʗj[x{4J?RT2^_̿77&SyGݻ [_(KQ 5RTUx̿77 SwSm}E|&SyGݻG*_keo{5_(KQ SwSmx}@?2GL?ۿyv;{珠+keo{4Mԣ/G4J?RUP2G3/MML?ۿyv;{k?ih׀PMԣ/G3/MM| SwSmn0nۧۼlm>ih 5RTU_(KWQ@ SwSm̿77Pn0nۧۼlmiڨV^@ 5RTU̿77׀W3/MMɹnG7n󽱷xV@4J?RTMԣ/^E{3/MM2_@Q@?ɹnG7n󽱷x?ᦿQʗj[x{4J?RT2^_̿77&SyGݻ [_(KQ 5RTUx̿77 SwSm}E|&SyGݻG*_keo{5_(KQ SwSmx}@?2^+Oh}o+fsۥzQEQEQEQEQEQE|@k+f_kPQ_@k+f_kW}E|@k+f_kPQ_@UQYxǯiWWܾ,52 ٗftWPE|E{52 ٗft|__P52 ٗftWPE|E{52 ٗft|__P52 ٗftWPE|E{52 ٗft|__P52 ٗftWPE|E{52 ٗft|__P52 ٗftWPE|E{52 ٗft|__P52 ٗftWPE|E{52 ٗft|__P52 ٗftWPE|E{52 ٗft|__PW/? ( ( ( ( ( nomiOG3/MMɹnG7n󽱷xk?ᦿQʗj?nome?}_?ɹnG7n󽱷x?ᦿQʗj+ iڨe)<e?̿77&SyGݻ +iڨG*_=.(6?/[U- (~ylg;W3 5RTUZؖ}_WMԣ/G3/MM ٗft2GL?ۿyv;{(ᦿQʗjk +nom?f_kWL?ۿyv;{kG*_f_h+f_kQ SwSmn0nۧۼlm>G*_iڨ(e)f_hiO_@Wn0nۧۼlmiڨ k?nomiOG3/MMɹnG7n󽱷xk?ᦿQʗj?nome?}_?ɹnG7n󽱷x?ᦿQʗj+ iڨe)<e?̿77&SyGݻ +iڨG*_<f_he)ٗft|&SyGݻG*_>+ᦿQʗj ٗft2GL?ۿyv;{(ᦿQʗjk +nom?f_kWL?ۿyv;{kG*_f_h+f_kQ SwSmn0nۧۼlm>G*_iڨ(e)f_hiO_@Wn0nۧۼlmiڨ k?nomiOG3/MMɹnG7n󽱷xk?ᦿQʗj?nome?}_?ɹnG7n󽱷x?ᦿQʗj+ iڨe)<e?̿77נ|2e S&oٳm@EPEPEPEPEPEP_?_+ѯ+keo{4QE}EPk+ih׀P_52V@EPTQEfQ__^5^eyUUkbXW}LV_@Wh((ih׀W_+ѯ++keo{5|M̭oF<(袊[x{52 +V_@Wh((ih׀W_+ѯ++keo{5|M̭oF<(袊[x{52 +V_@Wh((ih׀W_+ѯ++keo{5|M̭oF<(袊[x{52 +V_@Wh((ih׀W_+ѯ+((((((+ e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠(⨢̣oX,+ ^2nZe?}EPQE{3OjiO_@P_W/?+f_kPQE|EP̿4ۧ֯+ٗft}_P^2nZe?}EPQE{3OjiO_@P_W/?+f_kPQE|EP̿4ۧ֯+ٗft}_P^2nZe?}EPQE{3OjiO_@P_W/?+f_kPQE|EP̿4ۧ֯+ٗft}_P^2nZe?}EPQE{3OjiO_@P_W/?+f_kPQEQEQEQEQE3/MM3/MMɹnG7n󽱷xV@4J?RTMԣ/^E{3/MM2_@Q@?ɹnG7n󽱷x?ᦿQʗj[x{4J?RT2^_̿77&SyGݻ [_(KQ 5RTUxUQYs^- (~ylg;W3 5RTUbzxZؖ{4J?RT2^_f_hsw<#n{co||M̭oFiڨG*_f_he)>sw<#n{co|Mԣ/G52 iڨe)nomMte)7??w6@WhG*_iګ(e)f_k (7??w64J?RT~_+ѯG*_f_k+?aO#y<}_?_+Ѡk?ᦿQʗj=?nom(aO#y<_(KQM̭oF=k?nomf_hsw<#n{co||M̭oFiڨG*_f_he)>sw<#n{co|Mԣ/G52 iڨe)nomMte)7??w6@WhG*_iګ(e)f_k (7??w64J?RT~_+ѯG*_f_k+_ \jCWy[6om+((((((+ V^^2nZ<((V^^2nZ++ V^^2nZ<⨢̣ƾ=̿o?JjmUg0>ih׀W̿4ۧ֠ + (ih׀W̿4ۧ֯( >ih׀W̿4ۧ֠ + (ih׀W̿4ۧ֯( >ih׀W̿4ۧ֠ + (ih׀W̿4ۧ֯( >ih׀W̿4ۧ֠ + (ih׀W̿4ۧ֯( >ih׀W̿4ۧ֠ + (ih׀W̿4ۧ֯( >ih׀W̿4ۧ֠ + (ih׀W̿4ۧ֯( >ih׀W̿4ۧ֠ + (ih׀W̿4ۧ֯( >iO@@QEQEQEQEQEW| SwSmx{3Oj?nomMtV^^M̭oF ih52 (>ʢ+22*__/ү[¾+`52V@EPQE|M̭oF[x|__?_+ѯ+keo{4QE}EPk+ih׀P_52V@EPQE|M̭oF[x|__?_+ѯ+keo{4QE}EPk+ih׀P_52V@EPQE|M̭oF[x|__?_+ѯ+keo{4QE}EPk+ih׀P_52V@EPQE|M̭oF[x|_EPEPEPEPEPEP_W/?+f_kPQE|EP̿4ۧ֯+ٗft}_P^2nZe?}EPEVe~mUa_W0 ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>(((((nom(nomMte)7??w6@WhG*_iګ(̣oW?cGϕf9ҹiګƪijᦿQʗj ?2GL?ۿyv;{珠+keo{4Mԣ/G4J?RUP2G3/MML?ۿyv;{k?ih׀PMԣ/G3/MM| SwSmn0nۧۼlm>ih 5RTU_(KWQ@ SwSm̿77Pn0nۧۼlmiڨV^@ 5RTU̿77׀W3/MMɹnG7n󽱷xV@4J?RTMԣ/^E{3/MM2_@Q@?ɹnG7n󽱷x?ᦿQʗj[x{4J?RT2^_̿77&SyGݻ [_(KQ 5RTUx̿77 SwSm}E|&SyGݻG*_keo{5_(KQ SwSmx}@?2GL?ۿyv;{珠+keo{4Mԣ/G4J?RUP2G3/MML?ۿyv;{k?ih׀PMԣ/G3/MM| SwSmn0nۧۼlm>ih 5RTU_(KWQ@ SwSm̿77Pn0nۧۼlmiڨV^@ 5RTU̿77׀W3/MMɹnG7n󽱷xV@4J?RTMԣ/^E{3/MM2_@Q@?ɹnG7n󽱷x?ᦿQʗj[x{4J?RT2^_̿77נ|2e S&oٳm^EQEQEQEQEQEQ_P52 ٗftWPE|E{52 ٗft|__P52 ٗftWPEVe5eyUU/kjlK>诀)|M̭oFe?xQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW{3Oj(((((f_h+f_kQ SwSmn0nۧۼlm>G*_iڨ(e)f_hiO_@Wn0nۧۼlmiڨ k?nomiOG3/MMɹnG7n󽱷xk?ᦿQʗjK+2y/~&¹J?>߿^|6nMԣ/V%@W_(KQ SwSm0<e?̿77&SyGݻ +iڨG*_<f_he)ٗft|&SyGݻG*_>+ᦿQʗj ٗft2GL?ۿyv;{(ᦿQʗjk +nom?f_kWL?ۿyv;{kG*_f_h+f_kQ SwSmn0nۧۼlm>G*_iڨ(e)f_hiO_@Wn0nۧۼlmiڨ k?nomiOG3/MMɹnG7n󽱷xk?ᦿQʗj?nome?}_?ɹnG7n󽱷x?ᦿQʗj+ iڨe)<e?̿77&SyGݻ +iڨG*_<f_he)ٗft|&SyGݻG*_>+ᦿQʗj ٗft2GL?ۿyv;{(ᦿQʗjk +nom?f_kWL?ۿyv;{kG*_f_h+f_kQ SwSmn0nۧۼlm>G*_iڨ(e)f_hiO_@Wn0nۧۼlmiڨ k?nomiOG3/MM ¹vlg;PQEQEQEQEQEQEWk [xQ@E52 keo{5W}@|M̭oFihQEUQYxǯiWWzxZؖ|_ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( ( ( ( ( ( ( (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (8((mV/kjlK )W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@QE/? e?}@|_W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@QE/? e?}@|_W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@QE/? e?}@|_W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@Q@Q@Q@Q@| SwSm}E| SwSmn0nۧۼlm>ih 5RTU_(KWQ@ SwSm̿77Pn0nۧۼlmiڨV^@ 5RTU̿77׀W3/MMɹnG7n󽱷xV@4J?RTMԣ/^E}EVe׋~&¹J?>߿^|6nMԣ/X_^5V% 5RTU̿77׀W?aO#y<}_?_+Ѡk?ᦿQʗj=?nom(aO#y<_(KQM̭oF=k?nomf_hsw<#n{co||M̭oFiڨG*_f_he)>sw<#n{co|Mԣ/G52 iڨe)nomMte)7??w6@WhG*_iګ(e)f_k (7??w64J?RT~_+ѯG*_f_k+?aO#y<}_?_+Ѡk?ᦿQʗj=?nom(aO#y<_(KQM̭oF=k?nomf_hsw<#n{co||M̭oFiڨG*_f_he)>sw<#n{co|Mԣ/G52 iڨe)nomMte)/W?ڟ7.V͛lJ ((((((>ih׀W̿4ۧ֠ + (ih׀W̿4ۧ֯( >ih׀W̿4ۧ֠8((_/ү|?/[UkbY}E|Lkeo{5/?(keo{5/? keo{5/?(keo{5/? keo{5/?(keo{5/? keo{5/?(keo{5/? keo{5/?(keo{5/? M־V^E.a֊*9kEqTQ<[x}EcZ( |M̭oF.?/M0WP_+ѯiO_@P}E|^2nZ>(((((+/L#(5^2nZB?ᗄ\jh}^V͛9ҕX+uȟj? _֢,|5E{/(_GQ _]ٗfty// ¹N,7sۥz$?]'Z S/H.ǍW̿4ۧ֬_P2l@e/W?ڟo嗕fvwt,z :OӯDQt1(r~3[gޯANT'Z S/HwBU/?/L#*‚?u/gF_?Mԣ/G4J?RT +nom?f_kWL?ۿyv;{kG*_f_h+f_kQ SwSmn0nۧۼlm>G*_iڨ(e)f_hiO_@Wn0nۧۼlmiڨ k?nomiOG3/MMɹnG7n󽱷xk?ᦿQʗj?nome?}_?ɹnG7n󽱷x?ᦿQʗj+ iڨe)<e?̿77&SyGݻ +iڨG*_<f_he)ٗft|&SyGݻG*_>+ᦿQʗj ٗft2GL?ۿyv;{(ᦿQʗjk +nom?f_kWL?ۿyv;{kOiګd4QEHŠ((((?/Xxo+ģCٳo Mn&z4J?RTMԣ/V#(e)f_hiO_@Wn0nۧۼlmiڨ k?nomiOG3/MM ¹vlg;PQEQEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP^5eyU__Mn&xQV#(>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF *5d4QEHŠ((((kkƾ=̿o?JL(GQE|M̭oF[x|_EPEPEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV# (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(*Zd4QEHŠ((((?/XxZkq3j(Q@2nZf_kWW|@{3Oj ٗftQ@Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQExo+ģCٳo ]-xǯiS[__(KQ 5RTUxb=?nom(aO#y<_(KQM̭oF=k?nomf_hsw<#n{co||M̭oFiڨG*_f_he)>sw<#n{co|Mԣ/G52 iڨe)nomMte)7??w6@WhG*_iګ(e)f_k (7??w64J?RT~_+ѯG*_f_k+?aO#y<}_?_+Ѡk?ᦿQʗj=?nom(aO#y<_(KQM̭oF=k־ʩQE# ( ( ( ( [7QlٷwtkͯiڨG*_ SwSm̿77Pn0nۧۼlmiڨV^@ 5RTU̿77׀W3/MM ¹vlg;WQ@Q@Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQE__^[~>AE|E{52 ٗft|__P52 ٗftWPE|E{52 ٗft|__P52 ٗftWPE|E{52 ٗft|__P52 ٗftWPE|E{52 ٗft|__P52 ٗftWPE|E{52 ٗft|_eWk\UL(QEQEQEQEW|z{-m^??֚Ljk+f_kW}E|@_W̿4ۧ֠(((((+ָ QR0(((((((((%s^- (~ylg;S[E| 5RTU_(KU +nom?f_kWL?ۿyv;{kG*_f_h+f_kQ SwSmn0nۧۼlm>G*_iڨ(e)f_hiO_@Wn0nۧۼlmiڨ k?nomiOG3/MMɹnG7n󽱷xk?ᦿQʗj?nome?}_?ɹnG7n󽱷x?ᦿQʗj+ iڨe)<e?̿77&SyGݻ +iڨG*_<f_he)ٗft|&SyGݻG*_>+ᦿQʗj ٗft2GL?ۿyv;{(ᦿQʗjk +nom?f_kWL?ۿyv;{kOiګٿפщEm?O_^7ſ>_+f͜͞Sf:Z+ƿ}Ե__-k.{-=?Cf1(ko\eh}V͛=9ҼK_= Ex/{Cf1+o?O_\g|{ ?%ڟ^g|2s_lٿwt@(((((*Zd4QEHŠ(((((((((kkƾ=̿o?JL(GQE|M̭oF[x|__?_+ѯ+keo{4QE}EPk+ih׀P_52V@EPQE|M̭oF[x|__?_+ѯ+keo{4QE}EPk+ih׀P_52V@EPQE|M̭oF[x|__?_+ѯ+keo{4QE}EPk+ih׀P_52V@EPQE|M̭oF[x|_EPEPEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV# (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? ( ( ( ( ( ⫵*CAET(((((((((+oW?cGϕf9ҺZ_/Ҧ6ᦿQʗjk *{3/MM2_@Q@?ɹnG7n󽱷x?ᦿQʗj[x{4J?RT2^_̿77&SyGݻ [_(KQ 5RTUx̿77 SwSm}E|&SyGݻG*_keo{5_(KQ SwSmx}@?2GL?ۿyv;{珠+keo{4Mԣ/G4J?RUP2G3/MML?ۿyv;{k?ih׀PMԣ/G3/MM| SwSmn0nۧۼlm>ih 5RTU_(KWQ@ SwSm̿77Pn0nۧۼlmiڨV^@ 5RTU̿77׀W3/MMɹnG7n󽱷xV@4J?RTMԣ/^E{3/MM2_@Q@?ɹnG7n󽱷x?ᦿQʗj[x{4J?RT2^_̿77&SyGݻ [_(KQ 5RTUx̿77 SwSm}E|&SyGݻG*_keo{5_(KQ SwSmx}@?2GL?ۿyv;{珠+keo{4Mԣ/G4J?RUP2G3/MML?ۿyv;{k?ih׀PMԣ/G3/MM| SwSmz/_?o+]7nPEPEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@xǯiW߇iφQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW|M̭oFe?xQ_Q@M̭oFe?}@WW{3Oj(((((kzzM V#?O_Sf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! V#?O_E\Ģףzz,%=?Cf1(G!^0[~zz`?{~?}(GW2G3/MM~̿4ۧ֯+|2s_lٿwt@f_h+f_kQ SwSmz/_?o+]7nQE|E{3/MM2@3Oj/W?ڟ7.V͛lJ + e)<e?̿77נ|2e S&oٳm@EPW2G3/MM~̿4ۧ֯+|2s_lٿwt@f_h+f_kQ SwSmz/_?o+]7nQE|E{3/MM2@3Oj/W?ڟ7.V͛lJ + e)<e?̿77נ|2e S&oٳm@EPW2G3/MM~̿4ۧ֯+|2s_lٿwt@f_h+f_kQ SwSmz/_?o+]7nQE|E{3/MM2@3Oj/W?ڟ7.V͛lJ + e)<e?̿77נ|2e S&oٳm@EPW2G3/MM~̿4ۧ֯+|2s_lٿwt@f_h+f_kQ SwSmz/_?o+]7nQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEgolang-github-yeqown-go-qrcode-2.2.5/assets/modulo1.jpeg000066400000000000000000001073241521051213400231770ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!2222222222222222222222222222222222222222222222222244" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*v)skEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*9kEqTQ;Z+2*i(#+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ _0۷աQS;QG0Xh*9kEqTQ;Z+`\Us֊⨣,vWEc( V߇i6b ( ( ( ( ⫵*CAET(((((((((+ƾ=̿o?J2?gymqiϖe)f_jx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx{/_?j3/MMxK+C?ٳwmIh((((((((?/XxZkq3j(QEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP[~J5EU(((((((((((((((((((((((+X bQEQ@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ(((((((((kkƾ=̿o?JL(AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^fvڵU`oIZ(((((((((%m^??֚Lڢ*QEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEW5߆_oo7~1߭txZkq3nom?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MMxK+C?ٳwm^X bQEQ@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ(((((((((?/X__Mn&}5E|EX诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀({/_?j{=((((((((((+o[~6Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQE__^\׋~M]~gTW2G3/MMb<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)</kk%?olٻwttQEAAEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0(((((((((%m^??֚Lڢ*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEwJڬ_˿ R{1(((((((((?/XxZkq3j(QEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0(((((((((~36csکV߇i#?O_[TUY /#?O_[TQd1ףzzڢ =?CY_G!^.b?O_G#EAszz?׭( C=?mQE\^G!j,/#?O_[TQd1ףzzڢ =?CY_G!^.b?O_G#EAszz?׭( C=?mQE\^G!j,/#?O_[TQd1ףzzڢ =?CY_G!^.b?O_G#EAszz?׭( C=?mQE\^<ߟ1z+ET((((((((+o[~6Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQExZį2*kq3+ *}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}E|E}X ~nVQEAAEPEPEPEPEPEPEPEP[~J5EU((((+ֱפщEm?O_G#6as^G! V#?O_E\Ģףzz,%=?Cf1(G!^0Em?O_G#YJ(Šo?{f?9}##^G! ___@?O_\g~oϱ}O3~coM >M?nomW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MM`o[_̿77g/_hlٳwg9R`lQ[C=?MbQ[C=?as^G! V#?O_E\Ģףzz,%=?Cf1(G!^0Em?O_G#YJ+ozz?ע.bV߇h^<ߏ1ziv(QEQEQEQEQEQEQEQEQEQEQEQEQEF߇kj|?/[UkbXQE(((((((((((((((((((((((((((((((((((((((((+ (((((((̣ƾ=̿o?Jjƪİ)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW̿4ۧ֯iO@@QEQEQEQEQEW̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}EqTQEfQx,o?߿okl\3/MM,?nom(̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSmz/_?o+]7nPEPEPEPEPEPE}E|E}E|E}E|E}E|E}E|E}E|E}E|E}EVe~ƪij+ ){3Oj(((((f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h袊̣ƾ=̿o?Jjo/Xc7˷~ֹf_jij(e)f_iW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MM/?e)/W?ڟ7.V͛lJ ( ( ( ( ( ( ( ( ( ( ( ( (8((mV/kjlK (Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|_QEQEQEQEQEQEQEUQYxǯiWWzxZؖQE0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ٗft/? ( ( ( ( ( ?nom(nom?nom(nom?nom(nom?nom(*(92?gymqke)V%?2G3/MM?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom@eM>˷f9ҽ((((((诀(诀(诀(诀(诀(诀(诀(̣o_2zxZؖ}E|E0>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>iO@@QEQEQEQEQEW| SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmz]QYxǯiWWԾ-e 7vw=3 SwSmZؖx̿77 SwSm0<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<e?̿77נ|2e S&oٳm@EPEPEPEPEPEPEPEPEPEPEPEPEPEVe~mUaES(((((((((((((((((((((((((((((((((((((((((+ ( ( ( ( ( ( (>ʢ+22*__/ү[Š(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^2nZe?}EPEPEPEPEP_?2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MMQEG5߆_oo7~1߭s?̿77׳x^??ֶijf_he)?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM ¹vlg;WQ@Q@Q@Q@Q@Q@WUQYm^??ֶ__/ү[Ͽ诀(WPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPW/? ( ( ( ( ( nom?nom?nom?nom?nom?nom?nom?nomK+22*ſ c}&`.n\cgZnom[?nomQ^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77W̿4֣ۧ_ \jCWy[6om((((((((((((((⨢̣oX,(`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE}_PEPEPEPEPEPEPEPTQEfQ__^5^eyUUkbXQE(((((((((((((((((((((((((((((((((((+f_kWW̿4ۧ֠(((((+f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)8(([7o ߷6{goZؖ| SwSm̿77Sf_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>e)/W?ڟ7.V͛lJ ((((((>>>>>>>>ʢ+2|eyUUkbYe?}EPEPEPEPEP_W3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMW2G3/MMtQEfQ__^5_R,o?߿okl\3/MMkbYW2G3/MM +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom +nom ٗft2^+Oh}o+fsۥzQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@UQYm^??ֶV%QL((((((((((((((((((((((((((((((((((((((((( (((((((*(_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_Q@_WTQKv;Z+`\Us֊⨣,vWEc_/ҦXjb>>>>iO@@QEQEQEQEQEW| _\/L#( S/HWAcƨe S/H?B?TW…$eeEX+B?P2l,xeG(_GQtZ?nomW2G3/MMW2G3/MMW2G3/MM/?e)/W?ڟ7.V͛lJ ( ( ( ( ( ⫵*CAET(((((((((+o[~6Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@qUS!*FQEQEQEQExZĭ[TQEX(((((((((kQE# ( ( ( ( ( ( ( ( ( _/үe2*kq3ƨQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}_U2 (aEPEPEPEP^5eyU__Mn&xQV (((iO^^2nZ>(((((*Zd4QEHŠ(((((((((2?gymqk[3 SwSm̿77U?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nom?nom(nomkQE# ( ( ( ( [7o ߷6{?/Mn&x3/MM2_@QV#f_he)>e)f_k (f_he)>e)/W?ڟ7.V͛lJ ((((((*Zd4QEHŠ(((((((((?/X__Mn&}5E|EX诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(诀(늯k쪙 QR0((((%xǯiS[MQ_QV#+ (+ (+ (+ ٗftQ@Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQE__^\׋~M]~gTW2G3/MMb<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<f_he)<ʯ4e)zzM V#?O_Sf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?askG!/My/o߷miɴW2G3/MMB<f_he)<f_he)<f_he)<e?̿77נ|2e S&oٳm@EPEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV (((((((((((((((((((((((((((((((((((((((*Zd4QEHŠ(((((((((kkƾ=̿o?JL(AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^2nZe?}EPEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@s^-e 7vw=K[~GWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPWPW/? ( ( ( ( ( ⫵_G!44bQ[C=?M\Ģףzz,%=?Cf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! V#?O_E\Ģףzz,%xǯiWC߄_g_c?߿ocHhe)f_jx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx{3Oj?nom@eM>˷f9Ҁ=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((golang-github-yeqown-go-qrcode-2.2.5/assets/modulo2.jpeg000066400000000000000000000733551521051213400232060ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!2222222222222222222222222222222222222222222222222244" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*v)skEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*9kEqTQ;Z+2*i(#( ( ((+ ٗftQ@Q@52 ((e?}@Q@Wh + (( ( ((+ ٗftQ@Q@52 +06*ah*9kEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*?/M0ESQEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP^5eyU__Mn&xQV#( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>((keo{5k( mV/?)=QEAAEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0(((((((((2*Z_/Ҧ((+ ٗft/? ( (>V^^M̭oF (( (=e?}_?̿4ۧ֯((ih52 (>((+ ٗft/? ( (>V^^M̭oF _˿ Vb]_ғETQEQEQEQEQEQEQEQExZĭ[TQEX((((kQE# ( ( ( ( ( ( ( ( ( _/үe2*kq3ƨEQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WV/?+j|A./IĢ* ( ( ( ( ( ( ( ( bV߇iͪ(AEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@xǯiW׍|z5TQEX袊(+ e?x{3Oj((ih׀W_+ѯ+(((iO_@W/? (+keo{5|M̭oF<(袊(+ e?x{3Oj((ih׀W_+ѯ++X bQEQ@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ((((((((((((((((((((((((((((((((((((((((((((?/XxZkq3j(QEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP\o|{GK~3[{6md;Jƾ=̿o?Jk']Z^5EU}=?CY_G!^.b?O__?k']}5_Qd=K_=>x7((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>(((((+ ٗft/? ( (>V^^M̭oF ((+2b^??ֶİ)Wk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@Q@Q@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}@Q@Q@UQYm^??ֶV%QLV_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(((((+ e?x{3Oj((ih׀W_+ѯ+((⨢̣oX,(`52V@EPQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPEPEPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPEVe~mUaESih52 (>((+ ٗft/? ( (>V^^M̭oF (( (=e?}_?̿4ۧ֯((ih52 (>((+ ٗft/? ( (>V^^M̭oF (( (=e?}_?̿4ۧ֯((ih52 (>((+ ٗft/? ( ( ( ( ( (iO^^2nZ>((keo{5k( ( (8((mV/kjlK (|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}@Q@Q@QE/? e?}@Q@|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}@Q@Q@QE/? e?}@Q@|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQEQEQEQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQEF߇kj|?/[UkbXQE+keo{5|M̭oF<(袊(+ e?x{3Oj((ih׀W_+ѯ+(((iO_@W/? (+keo{5|M̭oF<(袊(+ e?x{3Oj((ih׀W_+ѯ+(((iO_@W/? (+keo{5|M̭oF<(袊(+ e?x{3Oj((((( +f_kWW̿4ۧ֠(([x{52 +((*(6?/[UxZګ[Š(_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQEQEQEQE}_P^2nZe?}EPEPk+ih׀P_QEQEqTQEfQxZڬ_ZؖQE0 [}_?_+Ѡ(( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>(((((+ ٗft/? ( (>V^^M̭oF ((+2b^??ֶİ)Wk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@Q@Q@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}@Q@Q@UQYm^??ֶV%QLV_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(((((+ e?x{3Oj((ih׀W_+ѯ+((⨢̣oX,(`52V@EPQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPEPEPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPEVe~mUaESih52 (>((+ ٗft/? ( (>V^^M̭oF (( (=e?}_?̿4ۧ֯((ih52 (>((+ ٗft/? ( (>V^^M̭oF (( (=e?}_?̿4ۧ֯((ih52 (>((+ ٗft/? ( ( ( ( ( (iO^^2nZ>((keo{5k( ( (8((mV/kjlK (|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}@Q@Q@QE/? e?}@Q@|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}@Q@Q@QE/? e?}@Q@|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQEQEQEQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQEF߇kj|?/[UkbXQE+keo{5|M̭oF<(袊(+ e?x{3Oj((ih׀W_+ѯ+(((iO_@W/? (+keo{5|M̭oF<(袊(+ e?x{3Oj((ih׀W_+ѯ+(((iO_@W/? (+keo{5|M̭oF<(袊(+ e?x{3Oj((((( +f_kWW̿4ۧ֠(([x{52 +((*(6?/[UxZګ[Š(_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQEQEQEQE}_P^2nZe?}EPEPk+ih׀P_QEQEqTQEfQxZڬ_ZؖQE0 [}_?_+Ѡ(( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>(((((+ ٗft/? ( (>V^^M̭oF ((+2b^??ֶİ)Wk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@Q@Q@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}@Q@Q@UQYm^??ֶV%QLV_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(((((+ e?x{3Oj((ih׀W_+ѯ+((⨢̣oX,(`52V@EPQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPEPEPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPEVe~mUaESih52 (>((+ ٗft/? ( (>V^^M̭oF (( (=e?}_?̿4ۧ֯((ih52 (>((+ ٗft/? ( (>V^^M̭oF (( (=e?}_?̿4ۧ֯((ih52 (>((+ ٗft/? ( ( ( ( ( (iO^^2nZ>((keo{5k( ( (8((mV/kjlK (|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}@Q@Q@QE/? e?}@Q@|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}I\Uc( _eQG0XOٗftqTQ;Z+`kƾ=̿o?Jacƨb>((+ ٗft/? ( ( ( ( ( B?U/?/L#+>xKwelٿݳ)]Z _֣uȟj. :OӯDQt(((((*Zd4QEHŠ(((((((((kkƾ=̿o?JL(GQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPk+ih׀P_eWƵUL(QEQEQEQEW|z{-xǯiS[5EU(( +f_kWW̿4ۧ֠(((((+ָ QR0(((((((((2*Z_/Ҧ((+ ٗft/? ( ( ( ( ( ⫵*CAET(((((((((+ƾ=̿o?Jk*}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[xU|k_eTh(Q@Q@Q@Q@xǯiW׍|z5TQEX袊(+ e?x{3Oj(((((kQE# ( ( ( ( ( ( ( ( ( _/үe2*kq3ƨEQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_U2 (aEPEPEPEP^5eyU__Mn&xQV#( ( (iO^^2nZ>(((((*Zd4QEHŠ(((((((((kkƾ=̿o?JL(GQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPk+ih׀P_eWƵ/#1(G!^.bQ[C=?as__-kK_= Es_ [ S?Ww~Cf1(G!^0^5eyU#៴VF{ڿǕM <6(Q@Q@|_W̿4ۧ֯iO@@QEQEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP^5eyU__Mn&xQV#( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>(((((*Zd4QEHŠ(((((((((kkƾ=̿o?JL(GQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@xǯiW׍|z5TQEX袊(+ e?x{3Oj((ih׀W_+ѯ+(((iO_@W/? (+keo{5|M̭oF<(袊(+ e?x{3Oj((ih׀W_+ѯ+(((iO_@W/? (+keo{5|M̭oF<(袊(+ e?x{3Oj(((((kQE# ( ( ( ( ( ( ( ( ( _/үe2*kq3ƨEQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@Q@Q@Q@qU/#1(G!^.bQ[C=?as^G! V#?O_E\Ģףzz,%=?Cf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?askG!/My/o߷miɴW2G3/MMB>((+ ٗft2^+Oh}o+fsۥzQ@Q@?_+ѯ&2y߳6{?e)<nom((( +nom?f_kW ¹vlg;WPEP_?_+ѯ+&2y߳6{(e)f_h ( ( nomiOG3/MM ¹vlg;PQEQE52 o/X7.n?\cgZf_h+ ( (>?nome?}^+Oh}o+fsۥzQE52o/X7.n?\cgZf_he)>((+ ٗft2^+Oh}o+fsۥzQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@golang-github-yeqown-go-qrcode-2.2.5/assets/modulo3.jpeg000066400000000000000000001265051521051213400232030ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!2222222222222222222222222222222222222222222222222244" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*v)skEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*9kEqTQ;Z+2*i(#( ( ((+ ٗftQ@Q@52 ((e?}@Q@Wh + (( ( ((+ ٗftQ@Q@52 +06*ah*9kEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*?/M0ESQEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP^5eyUx,o?߿oklMn&|E{3/MM2V# ( +&Mslٳwt?G*_>+ᦿQʗj ٗft2^+Oh}o+fsۥzQ@4J?RTMԣ/@52 8ݾOwv'3/MM| SwSm}@WM /%oٳg @E| 5RTU_(KPQ^ SwSm̿772nZ?eM>˷f9ҽ (ᦿQʗj+keo{4Mԣ/GgK_n';c?nom((?7_J?>ϕf9ҼkG*_f_h+f_kQ SwSmz/_?o+]7nQEW_(KQ 5RTUk+?^?{v>̿77W3/MMwJڬ_˿ R{1(((((((((?/XxZkq3j(QEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP[~J5EU([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(|A./[UwJO`F%QPPQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET(((((((((+o[~6QE/? e?}@Q@|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}@Q@Q@QE/? e?}@Q@|M̭oFihQEQ@Q@|_Wݿx{/_?j{=((((((((((+o[~6Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQExo+ģCٳo ]-xǯiS[__(KQ 5RTUxb=?nom(?eM>˷f9ҽ(ᦿQʗj+ iڨ{ ?wls/?e)f_k ((&Mslٳwt?G*_keo{5_(KQ SwSmx}@?2^+Oh}o+fsۥzQE4J?RTMԣ/^E{gK_n';c?f_kW3/MMP^7o+h}+f͟6sۥz|M̭oFiڨG*_f_he)</W?ڟ7.V͛lJ (G*_(ᦿQʗjN3/{oݱπW̿4ۧ֠?nom((?7_J?>ϕf9Ҽk?ih׀PMԣ/G3/MM| SwSmte 7~vlg;WV/?)=QEAAEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0(((((((((2*Z5b ( +keo{5|E}@W̿4ۧ֯((keo{5/? (V@@Q_Q@3Oj(>ih׀W̿4ۧ֠ ( +keo{5|E}@W̿4ۧ֯((keo{5/? +X bQEQ@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ(((((((((?/XxZkq3j(Q_?Mԣ/G4J?RT~_+ѯ{ ?wlr2@_̿77QEy߉Q7^|6nW_(KQ 5RTUx̿77 SwSm/? _ \jCWy[6om+(kVG4J?RTԽo~~}9 +nom(\eģCo[6la+ᦿQʗj+ iڨe)<e?̿77נ|2e S&oٳm@EPE| 5RTU_(KPM̭oFN3/{oݱ SwSmx}_?2_@PE~&¹Gylg;PQ_?Mԣ/G4J?RTW2G3/MM~̿4ۧ֯+|2s_lٿwt@+iڨ x4J?RUxKo,oģ??߿w lIh((((((((?/XxZkq3j(QEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP[~J5EU(iO_@W/? (+keo{5|M̭oF<(袊(+ e?x{3Oj((ih׀W_+ѯ+(((iO_@W/? (+keo{5|M̭oF<(袊(+ /kƫ~nVQEAAEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0((((((((((((((((((((((((((((((((((((((((((((%m^??֚Lڢ*QEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEU?Oݛ19sToЃzz?׭*szz?׭( K7ſ>_+f͜͞^ uM̭oF Z_@?O__ WY_G!^.b?O_G#EAs___-kK_=ƨ.}Kſ𱿵?_7~ˌl^=?x3Oj =?CY_G!&_klٳٳ+֫keo{4Y___-kK_=ƨ.}=?CY_G!^.b?O__?k']}5_Qd=K_=>x7iO_@QEQ_P52 ٗftWPEPE|M̭oF>( ٗftQEQ_Q@M̭oFe?}@WQ@Wh + (>iO_@QEQ_PwJj/i=ETQEQEQEQEQEQEQEQExZĭ[TQEX((((k___-kWk']z/A-|.1߭M\hG!^0Em?O_G#YJ+W??o寕ffwt?RO,^5 u#YJ+ozz?ע.bQ[C=?as(0ُsj=?;Ģףzz,%m^??֏G!UgķSKGe3E| 5RTU_(KU +nom?f_kW ¹vlg;WPE4J?RT|M̭oFiڨ{ ?wlrW2G3/MMQ@~&¹Gylg;WMԣ/@@W_(KQ SwSmx{3Oj?nom@eM>˷f9Ҁ=(k?ᦿQʗj[x{gK_n';c e)+&Mslٳwt@G*_iڨ(e)f_hiO_@W2e S&oٳm^@W_(KP52?ᦿQʗjN3/{oݱQ^ SwSm̿77QEWM /%oٳg ^ 5RTU}_WMԣ/G3/MM`o[_̿77g/_hlٳwg9R`lQ[C=?MbQ^5 tk']ashkᗋcjgnֽzz,%=?Cf1(G!&_klٳٳ( -_ZG/{f=^G! V#?O_E\Ģׯ}Ե0쵷xZK_=~x~G7?֚@zmQT ((((+ ٗft/? ( (>V^^M̭oF ((+2b^??ֶİ)Wk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@Q@Q@Q@Q@Q@Q@QE/? e?}@Q@|M̭oFihQEUQYm^??ֶV%|_+f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((((((oW?(/>V͛?lJ [_(KQ 5RTUx̿77 SwSm}Ey/_?o+]7nQ@| 5RTU}_PMԣ/GgK_n';ciO@3/MM2_@Q@UQYs^- (~ylg;W3 5RTUbzxZؖ{4J?RT2^_f_k>|2s_lٿwt@ (>G*_iګ({ ?wlr2G3Oj>e)+&Mslٳwt@ih 5RTU_(KWQ@ SwSm̿77P2e S&oٳm^EW_(KW{4J?RTԽo~~}9 ٗft2G3/MMQE~&¹Gylg;WMԣ/G52 iڨe)nom@eM>˷f9ҽ(k?ᦿQʗj=N3/{oݱ SwSm/? (?7_J?>ϕf9ҽV@4J?RTMԣ/^E{3/MM2_@Q@+Oh}o+fsۥzP_?Mԣ/_@W_(KQ'R۷+f_kP SwSm̿77PEPM /%oٳg ^ 5RTUk(ᦿQʗj >e)/W?ڟ7.V͛lJ ((iڨG*_8ݾOwv'3/MM~̿4ۧ֯(f_k (((((((+ V^^2nZ<((ih׀P|^2nZ (8((_/ү|?/[UkbY}E(V@@Q_Q@3Oj(>ih׀W̿4ۧ֠ ( +keo{5|E}@W̿4ۧ֯((keo{5/? (V@@Q_Q@3Oj(>ih׀W̿4ۧ֠ ( +keo{5|E}@W̿4ۧ֯((keo{5/? (V@@Q_Q@3Oj(>iO@@QEQEQEQEQEW| SwSmx{3Oj?nom@eM>˷f9Ҁ=(k?ᦿQʗj[x{gK_n';c e)+&Mslٳwt@G*_iڨ袊̣oX,(G*_@WhG*_8ݾOwv E{3/MM2@@QEQ^7o+h}+f͟6sۥy4J?RT|^ 5RTU̿77W̿4֣ۧ_ \jCWy[6om(((ᦿQʗjk?ih׀WԽo~~}9?nomf_k (oW?(/>V͛?lJ +iڨG*_<f_he)ٗfty/_?o+]7nQE| 5RTU}_?_+ѣk??^?{v>x̿77 SwSm}EPEy߉Q7^|6n_(KP{4J?RT2@^2nZf_k>|2s_lٿwt@(G*_iڨV^^'R۷e)<nom(\eģCo[6la((ᦿQʗjk +nom?f_kW ¹vlg;WPE4J?RT|M̭oFiڨ{ ?wlrW2G3/MMQ@~&¹Gylg;WMԣ/@@W_(KQ SwSmx{3Oj?nom@eM>˷f9Ҁ=(((((((((ٗft|2nZ(V_@Wh(*(6?/[UxZګ[¾ `/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPEPEPEPEPEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEqTQEfQ__^5^eyUUkbXW}L(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(((((((G*_(ᦿQʗjN3/{oݱπW̿4ۧ֠?nom((?7_J?>ϕf9Ҽk?ih׀PMԣ/G3/MM| SwSmz/_?o+]7nPEPEVe׋~M]~2^xZګ[ϟnom(y߉Q7^|6n52?ᦿQʗjk (nom_ \jCWy[6om+( kG*_8ݾOwv>^2nZf_he) (<oW?(/>V͛?lJiڨV^@ 5RTU̿77׀W3/MM ¹vlg;WQ@Q@?Mԣ/G4J?RUPԽo~~}9?nome?}@?2_@QE~&¹Gylg;WWhG*_iګ(e)f_k (|2s_lٿwt@+iګ =k??^?{v>{3Oj?nom(\eģCo[6la+ᦿQʗj[x{4J?RT2^_̿77נ|2e S&oٳm^EQE| 5RTU_(KWQ@'R۷e)ٗft| SwSm}EWM /%oٳg ^_?_+Ѡk?ᦿQʗj=?nom(?eM>˷f9ҽ(ᦿQʗj+ iګ>|My_߿6{+f_kPQEQEQEQEQE}E|^2nZ ( + (ih׀W̿4ۧ֯( ([}E|E}EVe~mUaE0>ih׀W̿4ۧ֠ ( +keo{5|E}@W̿4ۧ֯((keo{5/? (V@@Q_Q@3Oj(>ih׀W̿4ۧ֠ ( +keo{5|E}@W̿4ۧ֯((keo{5/? (V@@Q_Q@3Oj(>ih׀W̿4ۧ֠ ( +keo{5|E}@W̿4ۧ֯(((((((+&Mslٳwt@G*_iڨ(e)f_hiO_@W2e S&oٳm^@W_(KP52?ᦿQʗjN3/{oݱQ^ SwSm̿77EF߇kjſ\%o/>V͛lJᦿQʗj[Ϡ+ iڨe)^2nZf_k>|2s_lٿwt@(G*_iڨV^^'R۷e)<nom(\eģCo[6la((ᦿQʗjk +nom?f_kW ¹vlg;WPE4J?RT|M̭oFiڨ{ ?wlrW2G3/MMQ@~&¹Gylg;WMԣ/@@W_(KQ SwSmx{3Oj?nom@eM>˷f9Ҁ=(k?ᦿQʗj[x{gK_n';c e)+&Mslٳwt@G*_iڨ(e)f_hiO_@W2e S&oٳm^@W_(KP52?ᦿQʗjN3/{oݱQ^ SwSm̿77QEWM /%oٳg ^ 5RTU}_WMԣ/G3/MM/?e)/W?ڟ7.V͛lJ ( +iڨG*_keo{5q/aߟ߽||Of_h+ ( ( ( ( ( ( ( [}_?_+Ѡ(( ( (iO^^2nZ>(+22*__/ү[¾+`QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQE52V@EPQEQE}_P^2nZe?}EPEPk+ih׀P_QEQE|EP̿4ۧ֯+ٗftQEQEQEQEQEQEQE}_P^2nZe?}EPEPk+ih׀P_QEQEqTQEfQxZڬ_ZؖQE0 [}_?_+Ѡ(( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>(((((nom(nom@eM>˷f9ҽ(k?ᦿQʗj=N3/{oݱ SwSm/? (?7_J?>ϕf9ҽV@4J?RTMԣ/^E}EVe~mUa_?Mԣ/_@Wiڨ{ ?wls/?e)f_k ((&Mslٳwt?G*_keo{5_(KQ SwSmx}@?2^+Oh}o+fsۥzQE4J?RTMԣ/^E{gK_n';c?f_kW3/MMP^7o+h}+f͟6sۥz|M̭oFiڨG*_f_he)</W?ڟ7.V͛lJ (G*_(ᦿQʗjN3/{oݱπW̿4ۧ֠?nom((?7_J?>ϕf9Ҽk?ih׀PMԣ/G3/MM| SwSmz/_?o+]7nPEP_(KQ 5RTUxq/aߟ߽||Of_hiO_@P̿77Q@y߉Q7^|6n52?ᦿQʗjk (nom_ \jCWy[6om+( kG*_8ݾOwv>^2nZf_he) (<oW?(/>V͛?lJiڨV^@ 5RTU̿77׀W3/MM ¹vlg;WQ@Q@Q@Q@Q@Q@Q@Wh + (>iO_@QEQ_P52 ٗftWPEVe~ƪijW̿4ۧ֯((keo{5/? (V@@Q_Q@3Oj(>ih׀W̿4ۧ֠ ( +keo{5|E}@W̿4ۧ֯((keo{5/? (V@@Q_Q@3Oj(>ih׀W̿4ۧ֠ ( +keo{5|E}@W̿4ۧ֯((keo{5/? (((((((G*_>ih 5RTUq/aߟ߽||@<f_he)>(oW?(/>V͛?lJiڨ k?nomiOG3/MM ¹vlg;PQEQEG|zx}K߆_oo7~1߭s?̿77խgW3/MM0 (?7_J?>ϕf9Ҁ=k?ᦿQʗj?nome?}^+Oh}o+fsۥzQ_?Mԣ/@@WhG*_8ݾOwv E{3/MM2@@QEQ^7o+h}+f͟6sۥy4J?RT|^ 5RTU̿77W̿4֣ۧ_ \jCWy[6om(((ᦿQʗjk?ih׀WԽo~~}9?nomf_k (oW?(/>V͛?lJ +iڨG*_<f_he)ٗfty/_?o+]7nQE| 5RTU}_?_+ѣk??^?{v>x̿77 SwSm}EPEy߉Q7^|6n_(KP{4J?RT2@^2nZf_k>|2s_lٿwt@(G*_iڨV^^'R۷e)<nom(\eģCo[6la((ᦿQʗjk +nom?f_kW ¹vlg;WPE4J?RT4J?RU &G{3Oj?nom(\eģCo[6la+ᦿQʗj[x{4J?RT2^_̿77נ|2e S&oٳm^EQE| 5RTU_(KWQ@'R۷e)ٗft| SwSm}EWM /%oٳg ^_?_+Ѡk?ᦿQʗj=?nom(?eM>˷f9ҽ(ᦿQʗj+ iڨ{ ?wls/?e)f_k ((&Mslٳwt?G*_keo{5_(KQ SwSmx}@?2^+Oh}o+fsۥzQE4J?RTMԣ/^E{gK_n';c?f_kW3/MMPEPEPEPEPEPEPE}_?_+ѯiO@E}EQEWk(>iO_@Q@Q@UQYxǯiWWܾ,`Q_?_+Ѡ((e?}EQE|@k+f_kPQ_@Q@52 +f_kWPEPE|E{52 ٗft|_EQ_?_+Ѡ((e?}EQE|@k+f_kPQ_@Q@52 +f_kWPEPE|E{52 ٗft|_EQ_?_+Ѡ((e?}EQE|@_W̿4ۧ֠(((((+ e)<e?̿77נ|2e S&oٳm@EPE| 5RTU_(KPM̭oFN3/{oݱ SwSmx}_?2_@PE~&¹Gylg;PQ_?Mԣ/G4J?RTtQEfQxZڬ_ZؖQ_?Mԣ/L+keo{4Mԣ/GgK_n';c?nom((?7_J?>ϕf9ҼkG*_f_h+f_kQ SwSmz/_?o+]7nQEW_(KQ 5RTUk+?^?{v>̿77W3/MMQ^7o+h}+f͟6sۥz4J?RTMԣ/@E{3/MM2@3Oj/W?ڟ7.V͛lJ (G*_>ih 5RTUq/aߟ߽||@<f_he)>(oW?(/>V͛?lJiڨ k?nomiOG3/MM ¹vlg;PQEQ_?Mԣ/G4J?RT~_+ѯ{ ?wlr2@_̿77QEy߉Q7^|6nW_(KQ 5RTUx̿77 SwSm/? _ \jCWy[6om+(kVG4J?RTԽo~~}9 +nom(\eģCo[6la+ᦿQʗj+ iڨe)<e?̿77נ|2e S&oٳm@EPEPEPEPEPEPEPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EVe~mUa_W0 ٗft/? ( (>V^^M̭oF (( (=e?}_?̿4ۧ֯((ih52 (>((+ ٗft/? ( (>V^^M̭oF (( (=e?}_?̿4ۧ֯((ih52 (>((+ ٗft/? ( (>V^^M̭oF (((((((ih52 (>((+ ٗft/? (8((_/үe2*񪵱,+EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEPEPEPEPEPEPEP_?Mԣ/_@W_(KQ'R۷+f_kP SwSm̿77PEPM /%oٳg ^ 5RTUk(ᦿQʗj >e)/W?ڟ7.V͛lJ ((+2kſ c}&`.n\cgZnomfmUg̿77QLoW?(/>V͛?lJ [_(KQ 5RTUx̿77 SwSm}Ey/_?o+]7nQ@| 5RTU}_PMԣ/GgK_n';ciO@3/MM2_@Q@Q@7o+h}+f͟6sۥy4J?RT~_+ѯG*_f_k+_ \jCWy[6om+((ᦿQʗjk (?^?{v>̿772nZnom( \eģCo[6la++keo{4Mԣ/G4J?RUP2G3/MM ¹vlg;WQE4J?RU|@ 5RTUq/aߟ߽|||e?̿77 SwSm}EQEy߉Q7^|6n_(KQM̭oF=k?nomf_k>|2s_lٿwt@ (>G*_iګ({ ?wlr2G3Oj>e)+&Mslٳwt@ih 5RTU_(KWQ@ SwSm̿77P2e S&oٳm^EW_(KW{4J?RU &GiO_@Q@Q@k+f_kW}EQE|M̭oF>>ʢ+2b^??ֶİk+f_kPQ_@Q@52 +f_kWPEPE|E{52 ٗft|_EQ_?_+Ѡ((e?}EQE|@k+f_kPQ_@Q@52 +f_kWPEPE|E{52 ٗft|_\U&kEqTR֊⨣,|kE}Ec?f_kWQG0Xh*9k_?_+ѯKL,|5E}E1Q@52 +f_kWPEPEPEPEPEPE :Oj'ZH?"]+uȟj? _֢,|5E{/(_GQ _]ٗfty// ¹N,7sۥz$?]+uȟj? _֢,mWkٿ _֯?/X`嗛~u6{,|E{/(_GQ _]e* 6?/[UV͛?lJ +iڨG*_<f_he)ٗfty/_?o+]7nQE| 5RTU}_?_+ѣk??^?{v>x̿77 SwSm}EPEy߉Q7^|6n_(KP{4J?RT2@^2nZf_k>|2s_lٿwt@(G*_iڨV^^'R۷e)<nom(\eģCo[6la((ᦿQʗjk +nom?f_kW ¹vlg;WP\UvTh(Q@Q@Q@Q@m^??ֱ+ofQV G*_iڨV^^'R۷e)<nom(((((((*Zd4QEHŠ(((((((((?/XxZkq3j(Q@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW]qU2 (aEPEPEPEP[~J5EU(iO_@W/? (((((((+ָ QR0(((((((((2*Z_/Ҧ((+ ٗft/? ( ( ( ( ( ⫵*CAET(((((((((+o/Xc7˷~ֺZ5?̿77 SwSm}EX(?7_J?>ϕf9Ҽk?ih׀PMԣ/G3/MM| SwSmz/_?o+]7nPEP_(KQ 5RTUxq/aߟ߽||Of_hiO_@P̿77Q@y߉Q7^|6n52?ᦿQʗjk (nom_ \jCWy[6om+( kG*_8ݾOwv>^2nZf_he) (<oW?(/>V͛?lJiڨV^@ 5RTU̿77׀W3/MM ¹vlg;WQ@Q@?Mԣ/G4J?RUPԽo~~}9?nome?}@?2^]qU2 (aEPEPEPEP\׋~M]~߇ie)f_k *QEy߉Q7^|6n_(KQM̭oF=k?nomf_k>|2s_lٿwt@ ( ( ( ( ( ⫵*CAET(((((((((+o[~6k+f_kW}EQE|M̭oF> +(ٗftPE}_?_+ѯiO@E}EQEWk(>iO_@Q@Q@k+f_kW}EQE|M̭oF> +(ٗftP\UvTh(Q@Q@Q@Q@m^??ֱ+ofQV =[x{3Oj>袀 ( ( ( ( ( ( ⫵*CAET(((((((((+o\׋~&¹J?>߿^|6ngQ_?Mԣ/G4J?RUb<f_he)ٗfty/_?o+]7nQE| 5RTU}_?_+ѣk??^?{v>x̿77 SwSm}EPEy߉Q7^|6n_(KP{4J?RT2@^2nZf_k>|2s_lٿwt@(G*_iڨV^^'R۷e)<nom(\eģCo[6la((ᦿQʗjk +nom?f_kW ¹vlg;WPE4J?RT|M̭oFiڨ{ ?wlrW2G3/MMQ@~&¹Gylg;WMԣ/@@W^i 5RTU{7#1(G!^.bQ[C=?as__-kK_= Es_ [ S?Ww~Cf1(G!^0[~zz<{U-?忑{l=_?Mԣ/G4J?RUB<f_he)ٗfty/_?o+]7nQE| 5RTU}E| 5RTUz/𱿵?Q+^|~QEQEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEW|z{-xǯiS[5EU(( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(([x{52 +(((ٗft|2nZ(V_@Wh((( +f_kWW̿4ۧ֠(((((+ָ QR0(((((((((%m^??֚Lڢ*QE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV#iڨG*_8ݾOwv'3/MM~̿4ۧ֯(f_k (oW?(/>V͛?lJ [_(KQ 5RTUx̿77 SwSm}Ey/_?o+]7nQ@| 5RTU}_PMԣ/GgK_n';ciO@3/MM2_@Q@Q@7o+h}+f͟6sۥy4J?RT~_+ѯG*_f_k+_ \jCWy[6om+((ᦿQʗjk (?^?{v>̿772nZnom( \eģCo[6la++keo{4Mԣ/G4J?RUP2G3/MM ¹vlg;WQE4J?RU|@ 5RTUq/aߟ߽|||e?̿77 SwSm}EQEy߉Q7^|6n_(KQM̭oF=k?nomf_k>|2s_lٿwt@ (>G*_iګ({ ?wlr2G3Oj>e)((((((+ָ QR0(((((((((%xǯiS[MQ_QV >iO_@QEQ_P52 ٗftWPEPE|M̭oF>( ٗftQEQ_Q@M̭oFe?}@WQ@Wh + (>iO_@QEQ_P52 ٗftWPEPE|M̭oF>( ٗftQEQ_Q@M̭oFe?}@WQ@Wh + (>iO_@QEQ_PW/? ( ( ( ( ( ⫵_G!44bQ[C=?M\Ģףzz,%=?Cf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! V#?O_E\Ģףzz,%xǯiWC߄_g_c?߿ocHhe)f_j}EPEP_W3/MM/?e)/W?ڟ7.V͛lJ ( (>V^__Me /&`߿gkl^ SwSmx}_?2_@PEPEPW2G3/MM~̿4ۧ֯+|2s_lٿwt@(V_@WMe /&`߿gkl@ Q^ SwSm̿77QEQE}_?2@^2nZf_k>|2s_lٿwt@((keo{5߆_𱿲o7]~̿77W3/MMQEQE|E{3/MM2@3Oj/W?ڟ7.V͛lJ (+keo{5y߆_𱿲o7]~̿77 SwSm}EPEP_W3/MM/?e)/W?ڟ7.V͛lJ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?golang-github-yeqown-go-qrcode-2.2.5/assets/modulo4.jpeg000066400000000000000000000577371521051213400232160ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!2222222222222222222222222222222222222222222222222244" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*v)skEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*9kEqTQ;Z+L,mQEQEQEQ_PWPWPWPW/? (((((诀(诀(诀+f_kPQEQEQEQ_PWPWPWPW/? ((|A./Cj⨩֊⨣,vWEc( QG0Xh*9kEqTQ;Z+`\Us֊o TQE1Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQExZĭ[TQEX(( (((ٗft|2nZ((((((+f_kWW̿4ۧ֠(((+ (((iO_@W/? (+X bQEQ@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ(((((((((?/XxZkq3j(QEQEW|@Q@Q@Q@2nZf_kWQEQEQEQ@Q@Q@{3Oj ٗftQ@Q@Q@|_QEQEQE/? e?}@Q@b]_ҶJ(((((((((%m^??֚Lڢ*QEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEW|z{-xǯiS[5EU((+(((ih׀W_+ѯ(((袊((+keo{5|M̭oF<(((+((([x{52 (+~nVj/i=ETQEQEQEQEQEQEQEQExZĭ[TQEX((((kQE# ( ( ( ( ( ( ( ( ( _/үe2*kq3ƨQ@Q@}_WQEQEQE52 keo{5QEQEQEQ@Q@Q@|M̭oFihQEQEQEW}@Q@Q@Q@?_+ѯV^@Q@{/_?j׍Wݿ'#h((((((((?/XxZkq3j(QEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP^5eyU쵷xZkq3+*|E}E|E}E|__PWPWPWP_+ѯiO_@PWPWPWPE|E}E|E}E|E}_?_+ѯiO@E}E|E}E|E}E|__PWPWPWP_+ѯiO_@PWP`o_MV/?)=QEAAEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0(((((((((%m^??֚Lڢ*QEQE}_PEPEPEP̿4ۧ֯+ٗftQEQEQE|EPEPEP^2nZe?}EPEPEP_WQEQEQE{3OjiO_@PEPX '#((((((((((+o[~6Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQExZĭ[TQEX(( (((ٗft|2nZ((((((+f_kWW̿4ۧ֠(((+ (((iO_@W/? (+X bQEQ@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ((((((((((((((((((((((((((((((((((((((((((((?/XxZkq3j(QEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP\o|{GK~3[{6md;Jƾ=̿o?Jk']Z^5EU{//{ uTQd=K_=RO( u#}E\^G!j,/#?O_[TQd1ףzzڢ |[ /ColnZ[_k( tk']xYeRO?}Եj,k']Z^5EAs_G!^.b?O_G#EAszz?׭( CןMo+ٳgg;WWh ZG/{׍QE\___-kK_=ƨ.{//{ uTQd=K_=G! =?CY_G!^.b?O_G#EAs~&_klٳٳ+}Եih׀Qd=K_=RO( u ǿhķ_c忙~F1~nVC=(QEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET(((((((((+ƾ=̿o?J?/Mn&|5E}EX((++ keo{5/? ((诀(诀(keo{5/?(((++ keo{5/? /k'#((((((((((+o[~6Q@Q@Q@Q@qU̿ZIhRO?}Ե.{-_ZG/{f=__-kK_= Es_ [ S?Ww~Cf1(G!^0Em?O_G#YJ+ozz?ע.bQEW߶^͛9Ҹ__-kaEx/{ tYeZ^ǿlķ_c?忙6hQ@Q@|_QEQEQE/? e?}@Q@Q@Q@QEQEQEW̿4ۧ֯iO@@QEQEQEW|@Q@Q@Q@2nZf_kWQEV/?+jjٟsjL^^G!ls__-kK_= Ex/{ tYekK_=RO,^5 u [ S?Ww~YΖ^G! V#?O_E\Ģףzz,%=?| tYeZ^ǿlķ_c?忙6hQ@Q@Q@Q@|_QEQEQE/? e?}@Q@Q@Q@UQYxǯiWWzxZؖQE0 ٗft/? ( ( ( ((((f_kW3Oj ( ( (>(((iO^^2nZ>(((+ ( ( (=e?}_?̿4ۧ֯(((( ( ( ( ٗft/? ( ( ( (iO^^2nZ>(((((((((keo{5k((((((mV/kjlK (|M̭oFihQEQEQEW}@Q@Q@Q@?_+ѯV^@Q@Q@Q@EQEQEWk [xQ@Q@Q@}_WQEQEQE52 keo{5QEQEQEQ@Q@Q@|M̭oFihQEQEQEW}@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@?_+ѯV^@Q@Q@Q@eQEF߇kj|?/[UkbXQE+keo{5|M̭oF<(((+((([x{52 ((((((V_@Wh(((+(((ih׀W_+ѯ(((袊((+keo{5|M̭oF<(((+(((((((诀(诀(诀(V^^2nZ(((*(6?/[U/ǯiWUgWS[x{3Oj +( +( +( >>>=[x{3Oj>>> + (+ (+ ([x{3Oj +( +( +( >>>=[x{3Oj>>> + (+ (+ ([x{3Oj +( +( +( >iO@@QEQEQEQEQEW|@Q@Q@Q@2nZf_kWQEQEQEQEG|zx{/ǯiWUaESiO^^2nZ>(((+ ( ( (=e?}_?̿4ۧ֯(((( ( ( ( ٗft/? ( ( ( ((((f_kW3Oj ( ( (>(((iO^^2nZ>(((+ ٗft/? ( ( ( ( ( ((((f_kW3Oj ( ( (8((_/үe2*񪵱,(`/?+f_kPQEQEQE}_PEPEPEP̿4ۧ֯+ٗftQEQEQE|EPEPEP^2nZe?}EPEPEP_WQEQEQE{3OjiO_@PEPEPEPQEQEQE/?+f_kPQEQEQE}_P^2nZe?}EPEPEPEPEPEPEPEPEPk+ih׀PEPEPEPTQEfQxZڬ_ZؖQE0 [}_?_+Ѡ((( ( ( (>V^^M̭oF ( ( (>(((ih52 ( ( ( (((keo{5k((((( ( ( [}_?_+Ѡ((( ( ( ( ( ( ( ( ( ( (>V^^M̭oF ( ( (>ʢ+2b^??ֶİ)Wk [xQ@Q@Q@}_WQEQEQE52 keo{5QEQEQEQ@Q@Q@|M̭oFihQEQEQEW}@Q@Q@Q@?_+ѯV^@Q@Q@Q@EQEQEWk [xQ@Q@Q@}_WQEQEQEQEQEQEQE|@_Q@_Q@_Q@M̭oFe?}@Q_@Q_@Q_@UQYm^??ֶ__/ү[Ͽ诀(52 ٗftWPWPWP}E|E}E|E}E|E{52 ٗft|E}E|E}E|E}EWPWPWP52 ٗftWPWPWP}E|E}E|E}E|E{52 ٗft|E}E|E}E|E}EWPWPWP52 ٗftWPWPWP}E|^2nZ>(((((+ ( ( (=e?}_?̿4ۧ֯((((+22*__/ү[Š(^2nZe?}EPEPEP_WQEQEQE{3OjiO_@PEPEPEPQEQEQE/?+f_kPQEQEQE}_PEPEPEP̿4ۧ֯+ٗftQEQEQE|EPEPEP^2nZe?}EPEPEP_W/?+f_kPQEQEQEQEQE}_PEPEPEP̿4ۧ֯+ٗftQEQEQEqTQEfQ__^5^eyUUkbXQE+f_kWW̿4ۧ֠(((+ (((iO_@W/? ((((((e?x{3Oj((( (((ٗft|2nZ((((((+f_kWW̿4ۧ֠(((+ e?x{3Oj(((((((((ih׀W_+ѯ(((̣oX,(`52V@EPEPEP_QEQEQE|M̭oF[xQEQEQE}EPEPEP_?_+ѯ+keo{4QEQEQE|_EPEPEPk+ih׀PEPEPEPQEQEQE52V@EPEPEP_QEQEQEQEQEQEQEQEQEQE|M̭oF[xQEQEQE}EVe~mUaESih52 ( ( ( (((keo{5k((((( ( ( [}_?_+Ѡ((( ( ( (>V^^M̭oF ( ( (>(((ih52 ( ( ( ((((((>>>=[x{3Oj>>>8((mW̿_^5V%_QLkeo{5/?(((++ keo{5/? ((诀(诀(keo{5/?(((++ keo{5/? ((诀(诀(keo{5/?(((++ e?}EPEPEPEPEP_WQEQEQE{3OjiO_@PEPEPEPEVe5eyUU_^5V%QLe?x{3Oj((( (((ٗft|2nZ((((((+f_kWW̿4ۧ֠(((+ (((iO_@W/? ((((((e?x{3Oj((( +f_kWW̿4ۧ֠(((((+ (((iO_@W/? (((⨢̣ƾ=̿o?Jjƪİ)W̿4ۧ֯iO@@QEQEQEW|@Q@Q@Q@2nZf_kWQEQEQEQ@Q@Q@{3Oj ٗftQ@Q@Q@|_QEQEQE/? e?}@Q@Q@Q@QEQEQEW̿4ۧ֯iO@@QEQEQEW|@{3Oj ٗftQ@Q@Q@Q@Q@Q@Q@Q@Q@?_+ѯV^@Q@Q@Q@eQEF߇kj|?/[UkbXQE+keo{5|M̭oF<(((+((([x{52 ((((((V_@Wh(((+(((ih׀W_+ѯ(((袊((+keo{5|M̭oF<(((+(((((((((([x{52 (((*(6?/[UxZګ[Š(_?_+ѯ+keo{4QEQEQE|_EPEPEPk+ih׀PEPEPEPQEQEQE52V@EPEPEP_QEQEQE|M̭oF[xQEQEQE}EPEPEP_?_+ѯ+keo{4QEQEQE|_EPEPEPEPEPEPE}E|E}E|E}E|E{52 ٗft|E}E|E}E|E}EqTQEfQxZگ~=̿o?JjlK>k+f_kPQ_@Q_@Q_@WWk+f_kWQ_Q@_Q@_Q@k+f_kPQ_@Q_@Q_@WWk+f_kWQ_Q@_Q@_Q@k+f_kPQ_@Q_@Q_@WW{3Oj((((( (((ٗft|2nZ(((*((((+ ( ( (=e?}_?̿4ۧ֯(((( ( ( ( ٗft/? ( ( ( ((((f_kW3Oj ( ( (>(((iO^^2nZ>(((+ ٗft/? ( ( ( ( ( ( ( ( (>V^^M̭oF ( ( (>ʢ+2b^??ֶİ)Wk [xQ@Q@Q@}_WQEQEQE52 keo{5QEQEQEQ@Q@Q@|M̭oFihQEQEQEW}@Q@Q@Q@?_+ѯV^@Q@Q@Q@EQEQEWk [xQ@Q@Q@}_WQEQEQEQEQEQEQEQEQEQE52 keo{5QEQEQEUQYm^??ֶV%QLV_@Wh(((+(((ih׀W_+ѯ(((袊((+keo{5|M̭oF<(((+((([x{52 ((((((V_@Wh(((+((((((+ keo{5/? ⨢̣o_2zxZؖ}E|E0>ih׀W̿4ۧ֠>>>诀(+ (+ (+ (ih׀W̿4ۧ֯( +( +( +(>>>ih׀W̿4ۧ֠>>>诀(+ (+ (+ (ih׀W̿4ۧ֯( +7`>5ʢ0|kE}Ec( QG0Xh*9k_?_+ѯKL,|5E}E1Q_@Q_@WW{3Oj(((((_P2lxeG(_GR 5E{/(_GQ _]/L#( S/H.3Ojᗄ\jh}^V͛9ҽuȟj. :OӯDQt6_H?"'ZEbANG$?]J(ƾ=̿o?Jj7ؾ3~ co\g(_GU&#ƨe S/H?B?Ьx{3Oj S/H߄^#g&_mg,<V^^M̭oF ( ( (>(((ih52 ( ( ( (((keo{5k(Z*CAET((((+ƾ=̿o?Jk*QEQE|_EPEPEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@xǯiW׍|z5TQEX((+((([x{52 ((((((V_@Wh(((+(((ih׀W_+ѯʯk쪙 QR0((((2*Z_/ҦGWPWP}E|E}E|E}E|E{52 ٗft|E}E|E}E|E}EWPWPWP52 ٗftWPWPWP}E|E}E|E}E|E{52 ٗft|_eWk\UL(QEQEQEQEW|z{-m^??֚LjQ_@Q_@WW{3Oj(((((kQE# ( ( ( ( ( ( ( ( ( bV߇iͪ(AEPEP_WQEQEQE{3OjiO_@PEPEPEPQEQEQE/?+f_kPQEQEQE}_PEPEPEP̿4ۧ֯+ٗftWkXChhĢףzz0Em?O_G#YJ+ƿ}Ե__-k.{-_ZG/{f=__-kK_= [~}Ե77oؾ3~3miEB ( ( (iO^^2nZ>(((((*Zd4QEHŠ(((((((((?/XxZkq3j(QEQEW|@Q@Q@Q@2nZf_kWQEQEQEQ@Q@Q@{3Oj ٗftQ@Q@Q@|_QEQEQE/? e?}@Q@Q@Q@QEQEQEW̿4ۧ֯iO@@QEQEQEW|@{3Oj ٗftQ@Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQE__^^5eyTgQEb ( ( (((keo{5k((((( ( ( [}_?_+Ѡ((( ( ( (>V^^M̭oF ( ( (>(((ih52 ( ( ( ((((((*Zd4QEHŠ(((((((((kkƾ=̿o?JL(AEPEP_QEQEQE|M̭oF[xQEQEQE}EPEPEP_?_+ѯ+keo{4QEQEQE|_EPEPEPk+ih׀PEPEPEPQEQEQE52V@EPEPEP_QEQEQEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEW|z{-m^??֚LjQ_@Q_@WWk+f_kWQ_Q@_Q@_Q@k+f_kPQ_@Q_@Q_@WWk+f_kWQ_Q@_Q@_Q@k+f_kPQ_@Q_@Q_@WW{3Oj(((((kzzM V#?O_Sf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! V#?O_E\Ģףzz,%=?Cf1(G!^0[~zz`?{~?}(AEPEP_W3/MMW2G3/MMW2G3/MMW2G3/MM~̿4ۧ֯+|2s_lٿwt@((((e)f_h(e)f_h(e)f_h+f_kQ SwSmz/_?o+]7nQEQEQE}_?2@E{3/MM2@E{3/MM2@E{3/MM2@3Oj/W?ڟ7.V͛lJ (((f_he)<f_he)<f_he)<e?̿77נ|2e S&oٳm@EPEPEP_W3/MM/?e)/W?ڟ7.V͛lJ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?golang-github-yeqown-go-qrcode-2.2.5/assets/modulo5.jpeg000066400000000000000000001125671521051213400232100ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!2222222222222222222222222222222222222222222222222244" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*v)skEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*9kEqTQ;Z+2*i(#+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ _0۷աQS;QG0Xh*9kEqTQ;Z+`\Us֊⨣,vWEc( V߇i6b ( ( ( ( ⫵*CAET(((((((((+ƾ=̿o?J2?gymqiϖe)f_jx̿77 SwSmx̿77 SwSmx̿77׀PE G*_iګ({ ?wlr2G3Oj>e)iګ =k_cjģ?Waqk ٗftQ@QE/? e?}@| 5RTU}_PMԣ/GgK_n';ciO@3/MM2_@Q@?Mԣ/G4J?RUP &G̿772nZnomkG*_o |Mggaqk_0۷դ{-QPPQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET(((((((((+o^5eyTgTWU(f_kWQ@|_W̿4ۧ֯iO@@QE3OjV^@W{3Oj((iO_@W/? + e?}_?_+Ѡ((e?}EW|@{3Oj ٗftQ@Q_@?̿4ۧ֯+keo{5|E}@Wݿ}5X bQEQ@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ(((((((((kko/Xc7˷~֚Ljf_he)GQEQE}_P^2nZe?}EPEPk+ ce?oymqknomf_k (((iO_@W/? (+keo{5y߆_𱿲o7]~̿77 SwSm}EPEP_W/?+f_kPQEQE|M̭oF7_M˷~ּ e)|A./[UwJO`F%QPPQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET(((((((((+o[~6Q@Q@|_W̿4ۧ֯iO@@QEQEQEQEQEQEQ@2nZf_kWQEQEQEQEQEW|@{3Oj ٗftQ@Q@Q@Q@b]_ҶJ(((((((((%m^??֚Lڢ*QEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET(((((((((*͘9UxZhA=?CVB=?CY_G!^.b?O__?k']}5_Qd=K_=>x7Xڟ(/>n\cgZ + e?x{3Oj(k?ᦿQʗj[x{gK_n';c e)iڨ x4J?RU ǿ??[?7ǗR`lQ[C=?MbQ^5 tk']ashkᗋcjgnֽzz,%=?| tYekK_=>x7((+ ٗft/? ( (>V^^M̭oF (( (=e?}_?̿4ۧ֯((ih52 (>((+ ٗft/? ( (>V^^M̭oF (( (=e?}_?̿4ۧ֯((ih52 (>((+ ٗft/? ( ( ( ( ( (iO^^2nZ>((&2y߳6{?e)>e)((⨢̣oX,(`~>>>>>>ʢ+2|eyUUkbY+f_kWQ@_Q@_Q@_Q@_Q@_Q@_Q@Q@2nZ(诀(诀(诀(诀(诀( (e?xQE/? +f_kWW̿4ۧ֠(((((+ +>|2y_߿6{??nom?nom?nom?nom?nom?nomK+22*ſ c}&`.n\cgZnom[?nomQ^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSm̿77Q^ SwSmxQ^,oOgo7~1߭y̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmx̿77 SwSmxQ@ (f_kW3Oj ( ( ( ( ( (iO^^2nZ>(((((( (=e?}_?̿4ۧ֯((((((+ ٗft/? ( ( ( ( ( (iO^^2nZ>((keo{5k( ( (8((mV/kjlK (|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}@Q@Q@QE/? e?}@Q@|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQE52 keo{5W}@Q@Q@QE/? e?}@Q@|M̭oFihQEQ@Q@|_W̿4ۧ֯iO@@QEQEQEQEQEW|@{3Oj ٗftQ@?Mԣ/G4J?RUPԽo~~}9?nome?}@?2G4J?RU|@ 5RTUz/𱿵?Q+^|~{3Oj(*(6?/[UxZګ[¾G*_)_(KQ'R۷+f_kP SwSm̿77P_(KQ 5RTUx/𱿵?Q+^|~3Oj (iO^^2nZ>(iڨG*_8ݾOwv'3/MM~̿4ۧ֯(f_hG*_(ᦿQʗj@e77J?ϛ~־@iO@@QEQ@2nZf_kWW_(KW{4J?RTԽo~~}9 ٗft2G3/MM4J?RTMԣ/^E}o,oOg7~.1߭z|2nZ +f_kWW̿4ۧ֠(k?ᦿQʗj=N3/{oݱ SwSm/? ?ᦿQʗj+ iګ>|My_߿6{+f_kPQE|EP̿4ۧ֯+ٗft4J?RU|@ 5RTUq/aߟ߽|||e?̿77 SwSm}E| 5RTU_(KWQ@_2 S%`߿ l^_?̿4ۧ֯(+ ٗft/? ( ( ( ( ( (iO^^2nZ>( +(ٗft|M̭oF>( ٗftQEQEF߇kj|?/[UkbXWe?}_?_+Ѡ((e?}EW|@{3Oj ٗftQ@Q_@?̿4ۧ֯+keo{5|E}@W̿4ۧ֯(((ٗft|2nZ+f_kW52(f_kWQ@|_W̿4ۧ֯iO@@QE3OjV^@W{3Oj((iO_@W/? + e?}_?_+Ѡ((e?}EW|@{3Oj ٗftQ@Q@Q@Q@Q@|_W̿4ۧ֯iO@@QEQE52 o/X7.n?\cgZf_h+ ( (8((mV/kjlK (|M̭oF?7_M˷~ր>@?nom((+ e?x{3Oj((ih׀W~@?nom((+ e?x{3Oj((((( +f_kWW̿4ۧ֠((((((⨢̣oX,(`QEQEQEQE}_P^2nZe?}EPEPEPEPEPEPQE{3OjiO_@PEPEPEPEPEP_W/?+f_kPQEQEQEQEQEQE|EP̿4ۧ֯+ٗftQEQEQEQEQE}_P^2nZe?}EPEPEPEPEP_WQEQEQEQEQEQEQE}EVe5eyUU_^5V%QL(((((((((((((((((((((((((((((((((((e?x{3Oj((((( +>|2y_߿6{?iO@3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MMQEG5߆_oo7~1߭s?̿77׳x^??ֶijf_he)?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2^_W|2e S&`߿kl^^2nZf_he)>e)f_k (f_he)>e)f_k (f_he)>e)f_k ( (=/Xڟ7.n\cgZnome?}@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM|@z/_𱿵?o+]~/?e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_he)>(>|2y_߿6{?f_kW3/MM2_@Q@?2G3/MM3/MM2_@Q@?2G3/MM3/MM2_@Q@?2^_W̿4ۧ֯iO@@QEQEQEQEQEW|@{3Oj ٗftQ@Q@52 ((*(6?/[UxZګ[Š(E52(( +f_kWW̿4ۧ֠(((ih׀PWQEQE|EP̿4ۧ֯+ٗftQEQ_?_+Ѡ((袊(+ e?x{3Oj(([x}E|_EPEPQE{3OjiO_@PEPE52(( +f_kWW̿4ۧ֠(((((+ e?x{3Oj(k?ᦿQʗj[x{gK_n';c e)iڨ +iګ>|My_߿6{@(+2b^??ֶİk`}_?_+ѣk??^?{v>x̿77 SwSm}E| 5RTU_(KPW2 S%`߿ l^@|_W̿4ۧ֯iO@@QEQ_?Mԣ/G4J?RT~_+ѯ{ ?wlr2@_̿77 5RTU}E| 5RTUz/𱿵?Q+^|~QE|EP̿4ۧ֯+ٗftQ_?Mԣ/@@WhG*_8ݾOwv E{3/MM2@@Q_?Mԣ/G4J?RT &G̿77W3/MMMԣ/@@Q_?Mԣ/^o,oOg7~.1߭zQ@QE/? e?}@W_(KP52?ᦿQʗjN3/{oݱQ^ SwSm̿77W_(KQ 5RTU}Ey/𱿵?Q+^|~W|@{3Oj ٗftQ@Q@Q@Q@Q@|_W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@UQYm^??ֶV%|_+f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj((((( +f_kWW̿4ۧ֠(([x{52 +((*(6?/[UxZګ[Š(_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQE|M̭oF[x|_EPEPQE{3OjiO_@PEP_?_+ѯ+keo{4QE}EPEP_W/?+f_kPQEQEQEQEQE}_P^2nZe?}EPEPMe /&`߿gkl^ SwSm}E| SwSm}EQEQEQEF߇kj|?/[UkbXQE+&2y߳6{@>e)f_k (((+ ٗft/? ( (<o/X7.n?\cgZf_k (f_k ((((ٗft|2nZ(o/X7.n?\cgZ (f_he) ( ( (iO^^2nZ>((&2y߳6{?e)>e)(((iO_@W/? (+&2y߳6{@>e)f_k (((+ ٗft/? ( ( ( ( ( (iO^E}E|E}E|E}E|E}E|E}E|E}E|E}EVe~ƪij+ )|EW̿4ۧ֯>>>>>> (=e?}_Q@_Q@_Q@_Q@_Q@_Q@Q@{3Oj (+ (+ (+ (+ (+ (+ ((f_kW|EW̿4ۧ֯iO@@QEQEQEQEQEW|@W|2e S&`߿kl@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@EVe5eyUU/~M]~2V%E{3/MM2L?nom?nom?nom?nom (/Xڟ7.n\cgZ+nom +nom +nom +nom +nom +nom ( +>|2y_߿6{ +nom +nom +nom +nom +nom +nom+>|2y_߿6{??nom?nom?nom?nom?nom?nom(/Xڟ7.n\cgZnom?nom?nom?nom?nom?nom +f_kWW̿4ۧ֠(((((+ e?x{3Oj((((((*(6?/[UxZګ[Š(EPEPEPEP_W/?+f_kPQEQEQEQEQEQE|EP̿4ۧ֯+ٗftQEQEQEQEQE}_P^2nZe?}EPEPEPEPEPEPQE{3OjiO_@PEPEPEPEPEP_W/?+f_kPQEQEQEQEQE}_P^2nZe?}EPEPk+ih׀P_QEQEqTQEfQxZڬ_ZؖQE0 [}_?_+Ѡ(( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>((keo{5k( ( (>(f_kW3Oj ( [}_?_+Ѡ(( ( (iO^^2nZ>(((((+ ٗft/? (>G*_iګ({ ?wlr2G3Oj>e)iګ =k_cjģ?Waqk ٗftQ@UQYm^??ֶV%| 5RTU}_SᦿQʗjN3/{oݱπW̿4ۧ֠?nom(ᦿQʗjk (_cjģ?Waqk+ٗft}_P^2nZe?}EP_(KQ 5RTUxq/aߟ߽||Of_hiO_@P̿77 5RTU}_PMԣ/^o,oOg7~.1߭|^2nZ>( (=e?}_?̿4ۧ֯(ᦿQʗj+ iڨ{ ?wls/?e)f_k (iڨG*_Xڟ(/>n\cgZ e?}@|_W̿4ۧ֯iO@@QE4J?RTMԣ/^E{gK_n';c?f_kW3/MMMԣ/_@W_(KW|2 S%`߿ l_ W̿4ۧ֠((iO_@W/? +iګ =k??^?{v>{3Oj?nomk?ᦿQʗj>e77J?ϛ~ֽiO_@P_W/?+f_kPQEQEQEQEQE}_P^2nZe?}EPWP/? [x}_Q_/? ((+2b^??ֶİ+){3OjV@@Q_Q@3Oj(+ ٗft/? (>>iO_@Wk(>iO_@Q@Q@QE/? e?}@|_@W̿4ۧ֯+keo{4Q_@?̿4ۧ֯( (iO^^2nZ>( +(ٗft|M̭oF>(7`>5iO^E.ah*9ƴWTQe?}EW|@{3Oj ٗftQ@Q@Q@Q@Q@|_̿eEٗftՋ _ % S;CWlnǭQXӯDQ :OAcj'ZH?" 3M̭oF/X`嗛~u6{? S/H.ǍW/(_GWӯDQt6_H?"'ZEbANG$?]J(o\},cӯDU&#j'ZH?" |M̭oFuȟj<{/Z2?凟y\c}&^ SwSm̿77 ( ( (iO^^2nZ>((keo{5߆_𱿲o7]~̿77W3/MMQEQE|EP̿4ۧ֯+ٗftQE52o/X7.n?\cgZf_he)>((+ ٗft/? ( (>V^__Me /&`߿gkl^ SwSmx}^i SwSmz]L(QEQEQEQEW|z{-s^-e 7vw=[-Q^ SwSm̿77Ո(( +f_kWW̿4ۧ֠(((((+ָ QR0(((((((((%m^??֚Lڢ*QEQE}_P^2nZe?}EPEPEPEPEPEPQE{3OjiO_@PEPEPEPEPEP_W/?+f_kPQEQEQEWk\UL(QEQEQEQEV߇k?/Mn&mQEb ( ( (iO^^2nZ>(((((*Zd4QEHŠ(((((((((kkƾ=̿o?JL(AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_eWƵUL(QEQEQEQEW|z{-xǯiS[5EU(((+f_kWW̿4ۧ֠(((((+ָ QR0(((((((((kſ c}&`.n\cgZkog2G3/MMb>e)f_k (f_he)>e)(@e7M˷~ּe?̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E| SwSm̿77PQEz/_𱿵?o+]~2G3Oj>e)f_k (f_he)>e)f_k (f_he)>e)f_k (f_k+ _ cj?Wymqkf_kP SwSm̿77P̿77 SwSm}E| SwSm̿77P̿77ץk\UL(QEQEQEQEW5߆_oo7~1߭txZkq3nom?2G3/MM3/MM2_@Q@?2^_W̿4ۧ֯iO@@QEQEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP[~J_/Ҧ>GQEQE}_P^2nZe?}EPEPE|M̭oF>(( (=e?}_?̿4ۧ֯(([}E|E}EPEP_W/?+f_kPQEQEWk(Z*CAET((((+o^5eyTgTWU(( +f_kWW̿4ۧ֠(((((+ָ QR0(((((((((2*Z[7o ߷6{>Z?nom4J?RTMԣ/@@Q^o,oOg7~.1߭z}_P^2nZe?}EPE| 5RTU_(KPM̭oFN3/{oݱ SwSmx}_?2G4J?RT4J?RU &Gx̿77 SwSm}E| 5RTU_(KPW2 S%`߿ l^@|_W̿4ۧ֯iO@@QEQ_?Mԣ/G4J?RT~_+ѯ{ ?wlr2@_eW2XZIhRO^-+Z\cgZ0[C=?as__-kK_= Es_ [ S?Ww~Cf1(G!__-k.{-xǯiQ uwO~q{wlrhe)f_j}E| 5RTU_(KPW2 S%`߿ l^@|_W̿4ۧ֯iO@@QEQEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP[~J5EU(iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj(((((kQE# ( ( ( ( ( ( ( ( ( _/үe2*kq3ƨEQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@?_+ѯV^@}_WQEQEQ@2nZf_kWQEWk [xQ@EQEW|@{3Oj ٗftQ@Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQEx,o?߿okl]-m^??֚Lf_he)AEPEP_W/?+f_kPQEQEy߆_𱿲o7]~̿77P̿77Q@Q@Q@QE/? e?}@Q@y߆_𱿲o7]~P̿77 SwSm}EQEQE}_P^2nZe?}EPEPMe /&`߿gkl^ SwSm}E| SwSm}EQEQEQ@2nZf_kWQEWMe /&`߿gkl^E| SwSm̿77PEPEP_W/?+f_kPQEQEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEV߇kkϦ(|EW̿4ۧ֯>>>>>> (=e?}_Q@_Q@_Q@_Q@_Q@_Q@Q@{3Oj (+ (+ (+ (+ (+ (+ ((f_kW|EW̿4ۧ֯iO@@QEQEQEQEQEW]b?O_I^G!l%=?Cf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! V#?O_E\Ģףzz,%=?Cf1+ƾ=̿o?J^"?'b.f֚@|E{3/MM2T#(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h(e)f_h+f_kQ SwSmz/_?o+]7nQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEgolang-github-yeqown-go-qrcode-2.2.5/assets/modulo6.jpeg000066400000000000000000001134371521051213400232060ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!2222222222222222222222222222222222222222222222222244" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*v)skEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*9kEqTQ;Z+2*i(#+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ _0۷աQS;QG0Xh*9kEqTQ;Z+`\Us֊⨣,vWEc( V߇i6b ( ( ( ( ⫵*CAET(((((((((+ƾ=̿o?J2?gymqiϖe)f_jx̿77 SwSmx̿77 SwSmx̿77׀PEPEPEPEz/_𱿵?o+]~2@E{3/MM2@E{3/MM2@E{3/MM2@EPEPEPE Z?nom4J?RTMԣ/@52 ceģ?oaqk(iO^^2nZ>( +nom +nom e)iڨ [_(KW7o,og7~.1߭yQ@Q@2nZf_kWW| SwSmx̿77 SwSmx̿77 SwSm}E| 5RTU_(KPM̭oFoX(/>n?\cgZ(+f_kWW̿4ۧ֠(f_he)<f_he)<nomk|A./^3 5RTUt (yw={:Z(((((((((%m^??֚Lڢ*QEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb>(((iO^^2nZ>(((+ ( ( (=e?}_?̿4ۧ֯(((( ( ( ( ٗft/? ( ( ( (e 3Z_0۷դ{-QPPQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET((((((((((((((((((((((((((((((((((((((((((((+o[~6Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQEwO~fsU*4 ^G!j!\^G!j,/#?O_[TQd1ׯ}Ե( tk']xYeRO?}Եj,k']Z^5EAs_^-+Z\cgZG!f_kWY_G!^.b?O_G#EAszz?׭( 2k']Z^5EAs}Ե__-k ZG/{׍QE\___-k@eXڟ?`寛~e6{f_kQd=zz?׭( C=?mQE\^G!j,/#/{UAs}Ե__-k ZG/{׍QE\___-kK_=ƨ.}Kſ𱿵?_7~ˌl^=?x3Oj =?CY_G!ꎡc|A./IQEHŠ((((((((?/XxZkq3j(QEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP[~J_/Ҧ>GWPW/? + ((e?}_?_+ѯ诀(诀+f_kPQE|EPEPE|^2nZihWPWPW/? + ((e?}_?_+ѯ诀({/_?j{=((((((((((+o[~6Q@Q@Q@Q@qU̿ZIhRO^-+Z\cgZ0[C=?as__-kK_= Es_ [ S?Ww~Cf1(G!__-k.{-_Z^ſ𱿵?_7~ˌlE\hG!^0ERQWt?gvl9Ͽ^^bQ[CZE\Z_/ңK_=?{Wg6^ SwSm̿77 (=e?}_?̿4ۧ֯(+ (@e7M˷~ր<f_he)>G*_iڨV^^'R۷e)<f_k(iO^^2nZ>( ( +>|2y_߿6{ e)iڨ [_(KQ'R۷(e)f_h(ٗft|2nZ (/Xڟ7.n\cgZ+nomk?ᦿQʗj[x{gK_n';c +nom/kƫܿg]?~fϲs7ړ(G!^w1(RO?}Ե0W5ſ𱿵?_7~ˌl^=?as^RO,^5 u [ S?Ww~YΖ^G! Wk']ZE\Z+eXڟ?`寛~e6{@^0Em?O__?k']asko/{צ"&?-oo14(AEPEPEPEP_W/?+f_kPQE|EP̿4ۧ֯+ٗft}_P^2nZe?}EPEVe~mUa_W0 ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (>(f_kW3Oj (iO^^2nZ>(((((+ ٗft/? (>(( [}_?_+Ѡ(((mV/kjlK )QEQEQ@?_+ѯV^@Q@{3Oj ٗftQ@QEQEW}@|M̭oFihQEQE/? e?}@|_QEQEQ@?_+ѯV^@Q@{3Oj ٗftQ@QEQEW}@|M̭oFihQEQE/? e?}@|_QEQEQ@?_+ѯV^@Q@{3Oj ٗftQ@Q@Q@Q@Q@|_W̿4ۧ֯iO@@QE3/MM2_@Q@?2G3/MM3/MMMԣ/_@W_(KW7o,og7~.1߭yQEUQYm^??ֶV%| SwSm}E0>e)f_k (f_he)>G*_iګ(@77_J?ϛ~ּ((iO^^2nZ>(f_he)>e)f_k (f_hG*_(ᦿQʗjoX(/>n?\cgZ(((f_kW3Oj ?nom(nomk?ᦿQʗj=oX(/>n?\cgZ((e?x{3Oj(nom?nom(nomkG*_ceģ?oaqk((iO_@W/? +f_k (f_he)>e)f_k (iڨG*_ceģ?oaqk袀 ( ٗft/? ( ( ( ( ( (iO^E}E|E}E|E}E|E}_QEQEQE}EVe~ƪij+ )QEQEQEW̿4ۧ֯>>>>( ( ( (=e?}_Q@_Q@_Q@_Q@Q@Q@Q@{3Oj (+ (+ (+ (((((f_kWQEQEQEW̿4ۧ֯iO@@QEQEQEQEQEW|@Q@Q@Q@ |2y_߿6{ +nom +nom +nom ( ( ( (@e7M˷~ր<f_he)<f_he)<f_he)<f_k(iO^^2nZ>(((((+ ( ( (=e?}_?̿4ۧ֯((((+22*__/ү[Š(^2nZe?}EPEPEP_WQEQEQE{3OjiO_@PEPEPEPQEQEQE/?+f_kPQEQEQE}_PEPEPEP̿4ۧ֯+ٗftQEQEQE|EPEPEP^2nZe?}EPEPEP_W/?+f_kPQEQEQEQEQE}_PEPEPQE|M̭oF[xQE/?+f_kPQEqTQEfQ__^5^eyUUkbXW}LV_@Wh((ٗft|2nZ (((ih׀W_+ѯ(e?x{3Oj(((+V_@Wh((ٗft|2nZ (((ih׀W_+ѯ(e?x{3Oj(((+V_@Wh((ٗft|2nZ +f_kWW̿4ۧ֠(((((+ /Xڟ7.n\cgZٗft2G3/MM4J?RTMԣ/^E{gK_n';c?f_kW3/MM|@{3Oj ٗftQ@UQYs^-e 7vw=3 SwSm{7kjlK>e)iګ  5RTUq/aߟ߽|||e?̿77 SwSm}E|EP̿4ۧ֯+ٗft}_P^,oOgo7~1߭y{3Oj?nomk?ᦿQʗj=N3/{oݱ SwSm/?  e?x{3Oj((_ cj?Wymqke)ٗft| SwSm_(KW{4J?RTԽo~~}9 ٗft2G3/MMQ@2nZf_kWW|@z/_𱿵?o+]~/?e)f_k (iڨG*_8ݾOwv'3/MM~̿4ۧ֯(f_k+ ٗft/? (>(>|2y_߿6{?f_kW3/MMMԣ/_@W_(KQ'R۷+f_kP SwSm̿77PQE{3OjiO_@P_W/?+f_kPQEQEQEQEQE}_P^2nZe?}EPQE{3Oj>( ٗft|M̭oF>>ʢ+2b^??ֶİ+{3Oj (+ (>iO_@Wk((iO^^2nZ>( (=e?}_Q@W{3OjV@@Q_Q@Q@2nZf_kWW|@{3Oj (+ (>iO_@Wk((iO^^2nZ>( (=e?}_Q@W{3OjV@@Q_Q@Q@2nZf_kWW|@{3Oj (+ (>iO_@Wk((iO^^2nZ>(((((+ ٗft/? (>?nom?nomf_hG*_>ih 5RTUp~&Gn?\cgZ( (=e?}_?̿4ۧ֯(+ +nom +nomk?ᦿQʗj[xz߉𱿲Q7^|~QEW̿4ۧ֯iO@@QE̿77 SwSmx̿77 SwSmx}_?2G4J?RT|M̭oFiګ77_J?ϛ~ր<((iO_@W/? + e)<f_he)<f_he)>G*_iڨV^^7o,og7~.1߭yQE/?+f_kPQEQEQEQEQE}_P^2nZe?}EPEPEP_WQEQE}EVe~mUaES(( ( ( ( ٗft/? ( ( ( ((((f_kW3Oj ( ( (>(((iO^^2nZ>(((+ ( ( (=e?}_?̿4ۧ֯(((( ( ( ( ٗft/? ( ( ( ( ( ((((((((((_/үe2*񪵱,(`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE/?+f_kPQEQEQEQEQE}_PEPEPEP|2e S&`߿kl]3/MM~̿4ۧ֯(f_he)>e)f_k (f_he)8((_/үe2*񪵱,(` (/Xڟ7.n\cgZnomf_hG*_>ih 5RTUq/aߟ߽||@<f_he)<(iO_@W/? + +>|2y_߿6{??nom(ᦿQʗjk?ih׀WԽo~~}9?nom +f_kWW̿4ۧ֠((_ cj?Wymqke)<nomkVG4J?RTԽo~~}9 +nom (=e?}_?̿4ۧ֯(+ ٗft/? ( ( ( ( ( (iO^^2nZ>( (=e?}_?̿4ۧ֯(+ ٗft/? (8((mV/kjlK )W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@QE/? e?}@|_W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@QE/? e?}@|_W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@QE/? e?}@|_W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@Q@Q@Q@Q@|_W̿4ۧ֯iO@@QEQ@Q@}_WWk [xQ@eQEF߇kj|?/[UkbXW|L((袊[x{52 (+f_kWW̿4ۧ֠(((++keo{5|M̭oF<((iO_@W/? + ((袊[x{52 (+f_kWW̿4ۧ֠(((++keo{5|M̭oF<((iO_@W/? + ((袊[x{52 (+f_kWW̿4ۧ֠(((((+ e?x{3Oj(nom?nom(nomkG*_ceģ?oaqk(̣oX,+f_k )3/MM2_@Q@?2G3/MM4J?RTMԣ/^Ez߉𱿲Q7^|~Q@Q@{3Oj ٗftQ@?2G3/MM3/MM2_@Q@?2G4J?RU|@ 5RTUp~&G(((iO^^2nZ>(((+ ( ( (=e?}_?̿4ۧ֯(((( ( ( ( ٗft/? ( ( ( (iO^^2nZ>(((((+ ( (>(keo{5k((iO^^2nZ>(+22*__/ү[¾+`52V@EPEP̿4ۧ֯+ٗft}_PEPEPQE|M̭oF[xQE/?+f_kPQE|EPEP_52V@EPEP̿4ۧ֯+ٗft}_PEPEPQE|M̭oF[xQE/?+f_kPQE|EPEP_52V@EPEP̿4ۧ֯+ٗft}_P^2nZe?}EPEPEPEPEP_W ̿772nZnom +f_kWW̿4ۧ֠(⨢̣o/Xc7˷~ֹf_kټ?/[UkbY3/MMMԣ/_@Wiڨ{ ?wls/?e)f_k ( (=e?}_?̿4ۧ֯(+ _ cj?Wymqkf_kP SwSm̿77P_(KQ 5RTUxq/aߟ߽||Of_hiO_@P̿77׀W/?+f_kPQE|EP|2e S&`߿kl]3/MM~̿4ۧ֯(f_hG*_(ᦿQʗjN3/{oݱπW̿4ۧ֠?nom((ٗft|2nZ +>|2y_߿6{?iO@3/MM2_@Q@?Mԣ/G4J?RUPԽo~~}9?nome?}@?2^_W̿4ۧ֯iO@@QEQ@,oOgo7~1߭w̿772nZnomkG*_8ݾOwv>^2nZf_he)>(f_kW3Oj (iO^^2nZ>(((((+ ٗft/? (>(f_kW|E}@W̿4ۧ֯+keo{4UQYm^??ֶV%|_+f_kWQ@_Q@3OjV^@Q@{3Oj ٗftQ@QE/? +f_kW52(ٗft|2nZ +f_kWQ@_Q@3OjV^@Q@{3Oj ٗftQ@QE/? ʤֽ݀e?z]c( _eQG0XOٗftqTQ;Zʢ`{3Oj_/ҦXjb +(ٗft|M̭oF>( ٗft/? ( ( ( ( ( B?U/?/L#+>xKwelٿݳ)]Z _֣uȟj.TW…$eeEX+B?P2l,x}_2…$e} :OAcjV^ :Oy N,{1߭Ac+B?P2l,{-QPQxZڮ_O>~~1{H?"_WܿӯDWeNV&My߳6{?(e?x{3Oj((e)f_h(e)f_h+?ᦿQʗj+keo{4Mԣ/\߉𱿲Q7^|~QEQE{3OjiO_@P_W3/MMW2G3/MMW2G3/MM4J?RTMԣ/@52 ceģ?oaqk(iO^^2nZ>( +nom +nom * QR0((((2*Z[7o ߷6{>Z?nom4J?RTMԣ/@52 ceģ?oaqk(iO^^2nZ>(((((*Zd4QEHŠ(((((((((?/XxZkq3j(Q@Q@Q@{3Oj ٗftQ@Q@Q@|_QEQEQE/? e?}@Q@Q@Q@QEQEQEW̿4ۧ֯iO@@QEQEQEW]qU2 (aEPEPEPEP[~J5EU(((e?x{3Oj(((((kQE# ( ( ( ( ( ( ( ( ( _/үe2*kq3ƨQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}_U2 (aEPEPEPEP^5eyU__Mn&xQV (((iO^^2nZ>(((((*Zd4QEHŠ(((((((((2?gymqk[3 SwSm̿77U?nom(nom (((@e7M˷~ֻf_hiO_@P̿77 SwSm}E| SwSm̿77P̿77 SwSm}E|EPEPEP^,oOgo7~1߭y{3Oj?nom?nom(nom (((@e7M˷~ֻf_hiO_@P̿77ץk\UL(QEQEQEQEW5߆_oo7~1߭txZkq3nom?2G3/MM3/MM2_@Q@?2^_W̿4ۧ֯iO@@QEQEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP[~J_/Ҧ>GWPW/? + ((e?}_?_+ѯ诀(诀+f_kPQE|EPEPE|^2nZihWPWPW/? + ((e?}_?_+ѯ늯k쪙 QR0((((%xǯiS[MQ_QV#+ (+ٗft}_P^2nZe?}EPEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@xǯiW5߆_oo7~1߭5̿77 SwSmX(f_kW3Oj (_ cj?Wymqhe)f_h +iڨG*_keo{5q/aߟ߽||Of_h(e) ٗft/? (>(/Xڟ7.n\cgZnomf_hG*_>ih 5RTUq/aߟ߽||@<f_he)<(iO_@W/? + +>|2y_߿6{??nom(ᦿQʗjk?ih׀WԽo~~}9?nom?nom___-kWk']z/A-|.1߭M\hG!^0Ex/{ tYe^-+Z\cgZG! V#/{f=kRO|ab~yM9iW2G3/MMB<(iO_@W/? + e?x{3Oj(((((kQE# ( ( ( ( ( ( ( ( ( bV߇iͪ(GQE{3OjiO_@P_W/?+f_kPQE|EP̿4ۧ֯+ٗft}_P^2nZe?}EPQE{3OjiO_@P_W/?+f_kPQE|EP̿4ۧ֯+ٗft}_P^2nZe?}EPQE{3OjiO_@P_W/?+f_kPQE|EP̿4ۧ֯+ٗft}_P^2nZe?}EPQE{3OjiO_@P_W/?+f_kPQEQEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEW|z{-xǯiS[5EU(ih׀W_+ѯ(e?x{3Oj(((+V_@Wh((ٗft|2nZ (((ih׀W_+ѯ(e?x{3Oj(((+V_@Wh((ٗft|2nZ (((ih׀W_+ѯ(e?x{3Oj(((((kQE# ( ( ( ( ( ( ( ( ( [7o ߷6{?/Mn&x3/MM2_@QV#iڨG*_ceģ?oaqk袀 ( ٗft/? (>e)f_k (f_he)>e)iګ =k>&My߳6{? ( (=e?}_?̿4ۧ֯(nom(nom?nom(ᦿQʗjk (>&My߳6{?(+f_kWW̿4ۧ֠(?nom(nom?ᦿQʗj+ iګ77_J?ϛ~ּ((ٗft|2nZe)>e)f_k (f_he)>G*_iګ(@77_J?ϛ~ּ((iO^^2nZ>(((((*Zd4QEHŠ(((((((((?/X__Mn&}5E|EX(((e?x|EQEQEQE/? (((+f_kWQ@_Q@_Q@_Q@Q@Q@Q@Q@2nZ(诀(诀(诀((((e?x{3Oj(((((kzzM V#?O_Sf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! V#?O_E\Ģףzz,%=?Cf1(G!^0^5eyU#x&<t76+nomڡE{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@E{3/MM2@^2nZf_k>|2s_lٿwt@(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((golang-github-yeqown-go-qrcode-2.2.5/assets/modulo7.jpeg000066400000000000000000001206131521051213400232010ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!2222222222222222222222222222222222222222222222222244" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (*v)skEqTQ;Z+`\Us֊⨣,vWEc( QG0Xh*9kEqTQ;Z+L,mQEWPW/? (诀+f_kPQEWPW/? (诀+f_kPQEWPW/? (诀+f_kPQEWPW/? (诀+f_kPQEWPW/? (诀+~nVTWEO0vWEc( QG0Xh*9kEqTQ;Z+`\Us֊⨣,vW[~Xڢ)((((+ָ QR0(((((((((%s^- (~ylg;S[E| 5RTU_(KU (=e?}_ |2 S%oٳ ]4J?RT|^ 5RTU̿77W̿4֣ۧ_ \jCWy[6om((f_he)ٗft|&SyGݻG*_>+ᦿQʗje?xz/?Q+^|7n4J?RTMԣ/@E{3/MM2@3Oj/W?ڟ7.V͛lJ + e)<e?̿77&SyGݻ +iڨG*_<(iO_@W &¹Gylg;W 5RTU}_WMԣ/G3/MM/?e)/W?ڟ7.V͛lJ (>?nome?}_?ɹnG7n󽱷x?ᦿQʗj+ iګ(e 3Z_0۷դ{-QPPQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET(((((((((+ƾ=̿o?Jk*QEQE|_EPEPEPk+ih׀PEPEPEPQEQEQE52V@EPEPEP_QEQEQE|M̭oF[xQE`o^5^fvڴe* ( ( ( ( ( ( ( ( bV߇iͪ(AEPEPEPEP\UvTh(Q@Q@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV# ( ( ( ٗft/? ( ( ( ((((f_kW3Oj ( ( (>(((iO^^2nZ>(((+ _0۷կe 3ZO`GEQ@Q@Q@Q@Q@Q@Q@Q@m^??ֱ+ofQV ((((*Zd4QEHŠ(((((((((Ms?h}[6ma+2*kq3kk?ᦿQʗjG2G3/MM߆_o7]6nk(e)nomMtV͛?lJiڨV^@ 5RTU̿77׀W3/MM|Me /&oٳgm__h(f_he)>sw<#n{co|Mԣ/G52 iګ oW?(/>V͛?lJ [_(KQ 5RTUx̿77 SwSm}E|7+h}o+f͟sۥy{52 +nomf_hsw<#n{co||M̭oFiڨG*_(?7_J?>ϕf9Ҽk?ih׀PMԣ/G3/MM| SwSmte 7~vlg;WV/?)=QEAAEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0(((((((((2*Z5b (>V^_@WW|M̭oF(keo{5/? +keo{5Q_Q@M̭oF( ([x{3Oj +((keo{5}E|@k((诀(V^^2nZ+(|A./[UwJO`F%QPPQEQEQEQEQEQEQEQEV߇k?/Mn&mQEb ( ( ( ( ⫵*CAET(((((((((+o\׋~&¹J?>߿^|6ngQ_?Mԣ/G4J?RUb>((+ +nomo/W?7.V͛?lJ( (=e?}_ |2 S%oٳ ]4J?RT4J?RUQEQE|E{3/MM2@Ez߆_o7]6nQEW̿4ۧ֯@e7J?>ϕf9Ҁ>G*_iڨ ( ( nom>&2slٳwt?((f_kW/?Q+^|7nMԣ/@@Q_?Mԣ/_@PX '#((((((((((+o[~6Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQE__^^5eyTgQEb>(((ih52 ( ( ( (((keo{5k((((( ( ( [}_?_+Ѡ((( mV/?)=QEAAEPEPEPEPEPEPEPEP[~J5EU((((+ָ QR0((((((((((((((((((((((((((((((((((((((((((((%m^??֚Lڢ*QEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEW߶^͛9һ*_/ҦZG/{׍QUd+ tk']xYeRO?}Եj,k']}=?|5_d1ףzzڢ =?CY_G!^.y/¹A-|6{6sۥy/{52 ,k']Z^5EAs}Ե__-k ZG/{׍QE\zz?׭( C=?mQE\^G!j,/#|[ /ColnU52,//{ uTQd=K_=RO( tk']xYeROzzj.b?O_G#EAszz?׭( C=?mQE\_-s7Z[6llJ__-kkeo{5YeRO?}Եj,k']v~&-oo߻mkz_0۷դe*FQEQEQEQEQEQEQEQExZĭ[TQEX((((kQE# ( ( ( ( ( ( ( ( ( _/үe[ Q_V# ( ( >iO@@QEQE52 ((诀(诟f_kWQEWk ( +( ( ( >iO@@QEQE52 /kƫ~nVQEAAEPEPEPEPEPEPEPEP[~J5EU((((+ֱפщEm?O_^7ſ>_+f͜͞Sf:Z+ƿ}Ե__-k.{-=?Cf1(ko\eh}V͛=9ҼK_= Ex/{Cf1(G!&_klٳٳ( -_ZG/{f=(0glw~k'];Z+ƿ}Ե^0[~zz<{U-?忑{l=_?Mԣ/G4J?RUB<f_he)< \eCoy[6lm+f_h+f_kQ SwSmn0nۧۼlm>G*_iڨ ( +&Mslٳwt?G*_>+ᦿQʗj +nomo/W?7.V͛?lJ( +nom?f_kWL?ۿyv;{kk (?7_J?>ϕf9Ҁ=k?ᦿQʗj?nomo/W?7.V͛?lJ( ٗft2GL?ۿyv;{(ᦿQʗjk(\eģCo[6la+ᦿQʗj+ iڨe)</kkڥi𠼿nmg~8}}xLXkK_=RO1Z+ozz?ע.bQ\¹A-|6{6sۥy/{f=__-k?ע.bQ[CןMo+ٳgg;Qf:Z+ƿ}Ե__-k.{-=?Cf1(ko\eh}V͛=9ҼK_= Ex/{Cf1+o?O_Wt?gwϿ4EU(((((+keo{5|M̭oF<(袊[x{52 +V_@Wh(*((((iO^^2nZ>(((+ ( ( (=e?}_?̿4ۧ֯(((( ( ( ( ٗft/? ( ( ( (iO^^2nZ>(((((nom(nomo/W?7.V͛?lJV@EPEP|2 S%oٳ ]4J?RUPMԣ/_@WQEQEqTQEfQ__^5^eyUUkbXQE+>|Ms_lٿwt?=k?ᦿQʗj>((nom(nomo/W?7.V͛?lJV@EPEP|2 S%oٳ ]4J?RUPMԣ/_@WQEQE| SwSm̿77P~¹vlg;W׿_+ѯ(W?ڟ(/>V͛lJ(ᦿQʗjk (( ( >&2slٳwtkeo{4QEQEz/?Q+^|7nMԣ/^E{4J?RU|_EPEP̿77 SwSm}E|7+h}o+f͟sۥy{52 (+>|Ms_lٿwt?=k?ᦿQʗj>((nom(nom@eM>˷f9ҽ((((((keo{5/?(((iO_@P}E|^2nZ>(+22*V%Q_(e?xQ_Q@_?̿4ۧ֯(>ih׀W̿4ۧ֠>(e?}@WW{3Oj(keo{5/? +f_kPQ_@3Oj (([x{3Oj +( ( +f_kW}E|@_W̿4ۧ֠(((V^^2nZ( (e?xQ_Q@_?̿4ۧ֯(>iO@@QEQEQEQEQEW| SwSmx{3Oj?nom@eM>˷f9Ҁ=((e)f_hiO_@Wn0nۧۼlmiڨ k +f_kWW|2 S%oٳ @__?Mԣ/G4J?RTtQEfQxZڬ_Zؖ}_?2LiOG3/MMɹnG7n󽱷xk?ᦿQʗj(f_kW/?Q+^|7nMԣ/@@W_(KQ SwSmx{3Oj?nom@eM>˷f9Ҁ=((e)f_hiO_@Wn0nۧۼlmiڨ k +f_kWW|2 S%oٳ @__?Mԣ/G4J?RTW2G3/MM~̿4ۧ֯+|2s_lٿwt@f_h+f_kQ SwSmn0nۧۼlm>G*_iڨ(ٗft|o+Oh}+f6sۥw_(KP{4J?RT2@^2nZf_k>|2s_lٿwt@( +nom?f_kWL?ۿyv;{kG*_ ٗft &¹Gylg;PW_(KQ 5RTUx̿77 SwSm/? _ \jCWy[6om+(+ ٗft2GL?ۿyv;{(ᦿQʗjk (=e?}_ |2 S%oٳ ]4J?RT|^ 5RTU̿77W̿4֣ۧ_ \jCWy[6om(((((((((([x{52 (((*(6?/[UxZګ[Š(_?_+ѯ+keo{4QEQEQE|_EPEPEPk+ih׀PEPEPEPQEQEQE52V@EPEPEP_QEQEQE|M̭oF[xQEQEQE}EPEPEP_?_+ѯ+keo{4QEQEQE|_EPEPEPEPEPEP_W/?+f_kPQEQEQE}_PEPEPTQEfQxZڬ_ZؖQE0 ( (>(((iO^^2nZ>(((+ ( ( (=e?}_?̿4ۧ֯(((( ( ( ( ٗft/? ( ( ( ((((f_kW3Oj ( ( (>(((iO^^2nZ>(((((nom(nomMtV͛?lJiڨV^@ 5RTU̿77׀W3/MM|Me /&oٳgm__h(*(9Ms?h}[6ma+G*_~=̿o?JjlK=kWM /%oٳg ^_?_+Ѡk?ᦿQʗj=?nom(>&2slٳwt?V^@{3/MM| SwSmn0nۧۼlm>ih 5RTU_(KWQ@E~&¹Gylg;WMԣ/G52 iڨe)nomo/W?7.V͛?lJV@EP2G3/MML?ۿyv;{k?ih׀PMԣ/_@W~&¹Gylg;WWhG*_iګ(e)f_k ( \eCoy[6lm+ih׀P^ SwSmx}@?2GL?ۿyv;{珠+keo{4Mԣ/G4J?RUPQEy߉Q7^|6n_(KQM̭oF=k?nomf_k_M>˷f9ҾihQE̿77 SwSm}E|&SyGݻG*_keo{5_(KW}@y߉Q7^|6n52?ᦿQʗjk (nomo/W?7.V͛?lJkeo{5W2^_̿77נ|2e S&oٳm^EQEQEQEQEQEQ_P52 ((+ (ih׀W̿4ۧ֯( (ihPWPEVe5eyUU_^5V%}_QLkeo{5/?((ih׀WP}_?_+ѯ (>=[x{3Oj>袀 [}E|E}EWP_+ѯ+V^^2nZ<([x}E|__P52 ((+ (ih׀W̿4ۧ֯( (ihPWPE|E{52 ((keo{5/?((ih׀WP}E|^2nZ>(((((+ +nomo/W?7.V͛?lJ( (=e?}_ |2 S%oٳ ]4J?RT4J?RUQEQEqTQEfQ__^5^eyUUkbXQE+f_kWW|2 S%oٳ @__?Mԣ/G4J?RTQ@Q@|_̿77Q^ SwSmp~¹vlg;PEQE/? W?ڟ(/>V͛lJᦿQʗj(ᦿQʗj((( +nom +>&2slٳwt?(e?xz/?Q+^|7n4J?RTMԣ/@@QEQEW| SwSmx̿777+h}o+f͟sۥyQ@Q@2nZ>|Ms_lٿwtkk ( (>?nomo/W?7.V͛?lJ(+f_kWW|2 S%oٳ @__?Mԣ/G4J?RTQ@Q@|_̿77W̿4֣ۧ_ \jCWy[6om(((((((+keo{5|M̭oF<(((+((⨢̣ƾ=̿o?Jjƪİ)QEQEQ@Q@Q@|M̭oFihQEQEQEW}@Q@Q@Q@?_+ѯV^@Q@Q@Q@EQEQEWk [xQ@Q@Q@}_WQEQEQE52 keo{5QEQEQEQ@Q@Q@Q@Q@Q@Q@Q@Q@|_W̿4ۧ֯iO@@QEQ@2nZf_kWW|@{3Oj ٗftQ@UQYm^??ֶV%|_+f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj((ٗft|2nZ +f_kWW̿4ۧ֠((iO_@W/? + e?x{3Oj(((((e)>e)/W?ڟ7.V͛lJ ((f_he)>sw<#n{co|Mԣ/G52 iګ( _\jģCW[6oa+G*_iګ(̣oX,+f_k )3/MMɹnG7n󽱷xV@4J?RTMԣ/^EQEz/?Q+^|7nMԣ/^E{4J?RT2^_̿77נ|2e S&oٳm^EQE| SwSm̿77Pn0nۧۼlmiڨV^@ 5RTUxP^o+Oh}+f6sۥy_(KQ 5RTUx̿77 SwSm}Ey/_?o+]7nQ@| SwSm}E| SwSmn0nۧۼlm>ih 5RTU_(KWQ@Q@o+Oh}+f6sۥw_(KWQ@ 5RTU̿77׀W3/MM ¹vlg;WQ@Q@?2G3/MML?ۿyv;{k?ih׀PMԣ/^EW|2 S%oٳ ^E{4J?RTMԣ/^E{3/MM2_@Q@+Oh}o+fsۥzP_?2_@Q@?2GL?ۿyv;{珠+keo{4Mԣ/G4J?RUPEP|2 S%oٳ ]4J?RUPMԣ/G3/MM| SwSmz/_?o+]7nPEPEPEPEPEPE}E|^2nZ>((keo{5|@Q@Q@eQEF߇kj|?/[UkbXQE+keo{5Q@Q@}_Q@_W̿4ۧ֠(([x}E|E}_PEPEPWPW/? (+keo{5Q@Q@}_Q@_W̿4ۧ֠(([x}E|E}_PEPEPWPW/? (+keo{5Q@Q@}_Q@_W̿4ۧ֠(((((+ e)<e?̿77&SyGݻ +iڨG*_>(oW?(/>V͛?lJiڨ k?nom>&2slٳwt?(((mWo+ģCٳo \4J?RUkbY4J?RU0 (?7_J?>ϕf9Ҁ=k?ᦿQʗj?nomo/W?7.V͛?lJ( ٗft2GL?ۿyv;{(ᦿQʗjk(\eģCo[6la+ᦿQʗj+ iڨe)<f_k_M>˷f9Ҁ<(f_he)ٗft|&SyGݻG*_>G*_+&Mslٳwt@G*_iڨ(e)f_h(@_M>˷f9Ҽ (e)<e?̿77&SyGݻ +iڨG*_>(oW?(/>V͛?lJiڨ k?nom>&2slٳwt?(?nome?}_?ɹnG7n󽱷x?ᦿQʗj(ᦿQʗj(\eģCo[6la((ᦿQʗjk +nom +>&2slٳwt?+nomiOG3/MM ¹vlg;PQEQEQEQEQEQEWk [xQ@E52 keo{5W}@|M̭oFihQEUQYxǯiWWzxZؖ|_ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( ( ( ( ( ( ( ((((f_kW3Oj ( ( (8((_/үe2*񪵱,(`/?+f_kPQEQEQE}_PEPEPEP̿4ۧ֯+ٗftQEQEQE|EPEPEP^2nZe?}EPEPEP_WQEQEQE{3OjiO_@PEPEPEPQEQEQE/?+f_kPQEQEQE}_P^2nZe?}EPEPEPEPEP_?2_@Q@?2\߆_o7]6n|M̭oF<((@e7J?>ϕf9һiګ(G*_+((⨢̣ƾ=̿o?Jjƪİ)W|2 S%oٳ ^E{4J?RTMԣ/^E}EPEP_?2_@Q@?2\߆_o7]6n|M̭oF<((@e7J?>ϕf9һiګ(G*_+((?nom(>&2slٳwt?V^@Q@z/?Q+^|7nPMԣ/G4J?RUPQEQE3/MM3/MM|Me /&oٳgm__h((_\jģCW[6oa+G*_iګ ((nomo/W?7.V͛?lJkeo{5QEW|2 S%oٳ ^E{4J?RTMԣ/^E}EPEP_?2_@Q@?2^+Oh}o+fsۥzQEQEQEQEQEQE|@k+f_kPQ_@QEQ^2nZ++ e?}EPEVe5eyUU/kjlK>)QE{3Oj +(>iO_@PE}_?_+ѯiO@E}E|EPE{3Oj>诀(+ ٗftQ@k+f_kW|@W̿4ۧ֠ + (+ٗftQ_P52 ٗftWPQEW̿4ۧ֯( >iO@@QEQ_Q@M̭oFe?}@Q_QE{3Oj +(>iO_@PE}E|^2nZ>(((((+ ٗft2^+Oh}o+fsۥzQ@Q^ SwSm̿772nZaO#y<_(KP{4J?RUW̿4ۧ֯@e7J?>ϕf9Ҁ>G*_iڨ袊̣oX,+ e)^2nZf_hsw<#n{co|4J?RTMԣ/@EP̿4ۧ֯+_\jģCW[6oa+G*_>+ᦿQʗj ٗft2^+Oh}o+fsۥzQ@Q^ SwSm̿772nZaO#y<_(KP{4J?RUW̿4ۧ֯@e7J?>ϕf9Ҁ>G*_iڨ(e)f_hiO_@W2e S&oٳm^@|_̿77W̿4֣ۧ?aO#y<}E| 5RTU_(KPQE/? W?ڟ(/>V͛lJᦿQʗj+ iڨe)<e?̿77נ|2e S&oٳm@EPW2G3/MM~̿4ۧ֯+7??w64J?RT|^ 5RTUx/?+>|Ms_lٿwt诟ᦿQʗjk +nom?f_kW ¹vlg;WP_W3/MM/?e)7??w6@Q_?Mԣ/G4J?RTQE{3Oj@e7J?>ϕf9һiڨ k?nomiOG3/MM ¹vlg;PQEQEQEQEQEQEQEQEQE52 keo{5QEQEQEUQYm^??ֶV%QLV_@Wh(((+(((ih׀W_+ѯ(((袊((+keo{5|M̭oF<(((+((([x{52 ((((((V_@Wh(((+(((((( +f_kWW̿4ۧ֠(((+ ((̣oX,(`QEQE|EPEPEP^2nZe?}EPEPEP_WQEQEQE{3OjiO_@PEPEPEPQEQEQE/?+f_kPQEQEQE}_PEPEPEP̿4ۧ֯+ٗftQEQEQE|EPEPEP^2nZe?}EPEPEPEPEP_?2_@Q@?2GL?ۿyv;{珠+keo{4Mԣ/G4J?RUPQEy߉Q7^|6n_(KQM̭oF=k?nomf_k_M>˷f9ҾihQEUQYs^- (~ylg;W3 5RTUbzxZؖ{4J?RU|_?7_J?>ϕf9ҽV@4J?RTMԣ/^E{3/MM2_@Q@ |Me /&oٳgm^^M̭oF f_k+?aO#y<}_?_+Ѡk?ᦿQʗj>(&Mslٳwt?G*_keo{5_(KQ SwSmx}@?2\߆_o7]6n|M̭oF<(e)f_k (7??w64J?RT~_+ѯG*_++&Mslٳwt@ih 5RTU_(KWQ@ SwSm̿77P~¹vlg;W׿_+ѯ >e)7??w6@WhG*_iګ(袊\eģCo[6la+ᦿQʗj[x{4J?RT2^_̿777+h}o+f͟sۥ}_?_+Ѡ(nomMt˷f9ҽ((((((keo{5PEPWP_+ѯiO_@PP_?_+ѯ((*(&2slٳwt?((f_kW/?Q+^|7nMԣ/@@Q_?Mԣ/_@PEPEPW2G3/MMW|Me /&oٳgm^@Q@{3Oj _\jģCW[6oa(+iڨG*_>((+ +nomo/W?7.V͛?lJ( (=e?}_ |2 S%oٳ ]4J?RTqU_(KWh(Q@Q@Q@Q@m^??ֱ+oW?cGϕf9ҚL+iڨG*_GQEQE}_?2@^2nZf_k>|2s_lٿwt@(((((*Zd4QEHŠ(((((((((kkƾ=̿o?JL(GQEQEQE52V@EPEPEP_QEQEQE|M̭oF[xQEQEQE}EPEPEP_?_+ѯ+keo{4QEQEQEU|k_eTh(Q@Q@Q@Q@xǯiW׍|z5TQEX袊((((((((+ָ QR0(((((((((%m^??֚Lڢ*|EP̿4ۧ֯+ٗft}_P^2nZe?}EPQE{3OjiO_@P_W/?+f_kPQE|EP̿4ۧ֯+ٗft}_P^2nZe?}EPQE{3OjiO_@P_W/?+f_kPQE|EP̿4ۧ֯+ٗftWk\UL(QEQEQEQEV߇k?/Mn&mQEb>(f_kW3Oj (iO^^2nZ>(((((*Zd4QEHŠ(((((((((Ms?h}[6ma+2*kq3kk?ᦿQʗjAEP|2 S%oٳ ]4J?RUPMԣ/G3/MM| SwSmz/_?o+]7nPEP̿77 SwSm}E|&SyGݻG*_keo{5_(KWQE &¹Gylg;W@ 5RTU_(KWQ@ SwSm̿77P2e S&oٳm^EW̿77P̿77&SyGݻ [_(KQ 5RTUxQE &¹Gylg;W 5RTUx_(KQ SwSmx}@?2^+Oh}o+fsۥzQE3/MM2_@Q@?ɹnG7n󽱷x?ᦿQʗj[x{4J?RUu}S!*FQEQEQEQExo+ģCٳo ]-xǯiS[__(KQ 5RTUxb (=W?ڟ(/>V͛lJᦿQʗj=k?nomf_k>|2s_lٿwt@ ( ( ( ( ( ⫵*CAET(((((((((+ƾ=̿o?J?/Mn&|5E}EX((+e?}EPEPk+( + ( (>>iO_@PEP_?_+ѯ((((+e?}EPEPk+( *Zd4QEHŠ((((kkogTWU(((诀+f_kPQEQEQEQEQEWk\UL(QEQEQEQEQEQEQEQEQEV߇kMs?h}[6ma)ZG*_iڪx̿77 SwSmx~¹vlg;WE̿77W̿4֣ۧ?aO#y<}E| 5RTU_(KPQEWM /%oٳg ^ 5RTU}_WMԣ/G3/MMW2\߆_o7]6nQEW2G3/MM~̿4ۧ֯+7??w64J?RT4J?RUQ^7o+h}+f͟6sۥz4J?RTMԣ/@E{3/MM2@Ez߆_o7]6nQE{3/MM/?e)7??w6@Q_?Mԣ/G4J?RTQ@~&¹Gylg;WMԣ/@@W^i 5RTU{7#1(G!&_klٳٳ*lKEx/{ tYeףzz,%|Mo+ٳgg;Wk']ashROzz,%m^??֏G!UgķSKGe3E| 5RTU_(KU +nom +>&2slٳwt?+nomiOG3/MM ¹vlg;PQEQEQEQEQEW]qU2 (aEPEPEPEPEPEPEPEPEP^5eyU__Mn&xQV#(>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ih52 (>(keo{5k( [}_?_+Ѡ((>V^^M̭oF ((((((*Zd4QEHŠ(((((((((?/XxZkq3j(QEQEW|@Q@Q@Q@2nZf_kWQEQEQEQ@Q@Q@{3Oj ٗftQ@Q@Q@|_QEQEQE/? e?}@Q@Q@Q@QEQEQEW̿4ۧ֯iO@@QEQEQEW|@{3Oj ٗftQ@Q@Q@Q@Q@qUS!*FQEQEQEQEQEQEQEQEQExo+ģCٳo ]-xǯiS[__(KQ 5RTUxb>((nom(nomo/W?7.V͛?lJV@EPEP|2 S%oٳ ]4J?RUPMԣ/_@WQEQE| SwSm̿77P~¹vlg;W׿_+ѯ(W?ڟ(/>V͛lJ(ᦿQʗjk (( ( >&2slٳwtkeo{4QEQEz/?Q+^|7nMԣ/^E{4J?RU|_EPEP̿77 SwSm}E|7+h}o+f͟sۥy{52 (+>|Ms_lٿwt?=k?ᦿQʗj>((nom(nom@eM>˷f9ҽ(((((+ָ QR0(((((((((2*Z5b + (+ٗftQ_P52 ٗftWPQEW̿4ۧ֯( >iO@@QEQ_Q@M̭oFe?}@Q_QE{3Oj +(>iO_@PE}_?_+ѯiO@E}E|EPE{3Oj>诀(+ ٗftQ@k+f_kW|@W̿4ۧ֠ + (+ٗftQ_PW/? ( ( ( ( ( ⫵_G!44bQ[C=?M\Ģףzz,%=?Cf1(G!^0Em?O_G#YJ+ozz?ע.bQ[C=?as^G! V#?O_E\Ģףzz,%m^??֏G!chQ^ SwSm̿772nZ?eM>˷f9ҽ nomiOG3/MM ¹vlg;PQE̿77 SwSm/? _ \jCWy[6om+(+ ٗft2^+Oh}o+fsۥzQ@Q^ SwSm̿772nZ?eM>˷f9ҽ nomiOG3/MM ¹vlg;PQE̿77 SwSm/? _ \jCWy[6om+(+ ٗft2^+Oh}o+fsۥzQ@Q^ SwSm̿772nZ?eM>˷f9ҽ nomiOG3/MM ¹vlg;PQE̿77 SwSm/? _ \jCWy[6om+(+ ٗft2^+Oh}o+fsۥzQ@Q^ SwSm̿772nZ?eM>˷f9ҽ nomiOG3/MM ¹vlg;PQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEgolang-github-yeqown-go-qrcode-2.2.5/assets/repository_qrcode.png000066400000000000000000002414131521051213400252300ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((+ (+ (+ (+ (+ (+ (+ (+ (+ qyVO{Q@Q@V~'ypo3g=EhQT[MmK-/W(Z̲lTq*V4Ķ%ѡ')$r_Ĭ AVQEQEQEQEQEQX,ޙy%4Kc '# uoż9#`FApA椠(((*g%|#Ee$+/M.5ӪhnV 2Bq}jPEe^%tk56v@DrF@b2ϱ7zwp]ɝA G@(n".4H&gbpI(((((+ (^ ԼyͥsC0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x))Or\Ҥٽ Bs Xw7jEE_0WC²訨((u; ??v=㧂|E ?eGۻg;[t YK5(gݮERp6oZ( x[Yo,5?]I<ʞjI1:(>Xg~2//2P\r4TFAkz((((((p^#jN._BŠxgrWP?n4vwV}3&vơGEQEQEQEWKD|GVt_OqoTݶdcMvPw\Ҿk&)2HF'ʽ(5;Weg_kOHYxq$;ч^D|9IukAyoWۺgaʒ vP_,xOhwkk[3E,p'=QEQE/2}[VtoXrݶS8#G"v7gt; ]>p;]cP#Jآ ( ( ow:@%{]'<*擦ͬ6:]FGoHHPA8':+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƫ` F^?^8C?'>(((((+ J`?lU=CRب( ( ( ( ( (<ow:$](@jEE_0WC²訨((` F_O=CRث(w-}[o7CnWv<8ɯp+վxWYoKCYYn$c 385QEQEQE3I[uVo.yc8q^^W𮍬\Gq4EK#0q+(Wտ]X;n1o,oOg7~.1߭nxZo4htR{`n]Ueܬ1=*~hs}7ۼ3n=sڀ; ( ( (<oW?(/>V͛?lJqXտݵ#n1xƏ7߷9ܭ炼FK绚 n՘1U\ Aր:J( ( ( ( ( ( (<?}>^ѫ,׵zm{Lռ'֑\[lށ83\?~ xo#/uXoH% ڊOEttmKi +xi,U(' z ]<=OIn|wBs/OOL|_c9?ywllwu^i:5p,[ѐ+RFA5[৆#;MrU~ĞXr`cހ="(@%{]'>6^I?P5a[_AO(~Z~(((((( +?g(zѱWװ~?PIb袊((((+ q*Ox{%PT6*~(>)|R>#N'ˋ찾УY 6^I?@tCI[(?vC$~!Vn]a+7G.߈0䕿?>ƧO2OghԱdҶ+' *E-t$:Du$P**jEE@EPQE{%PT6*~` F]'#:3yX3=ŠZT.]NDY.iX/,II85Q_xƞ*׈mKZGw򪢉Xlgf{KA!3r2 yg/ώMoRtcyT7 H 4]WΟ|Kh:J#vRl$)8gPtWS[^_wu'i2;byN ( +>ږ[/P8ѤbTV$ڭo/w.q=Š((((+xV: u`SHUTQ+ W~L[X]iuh$1xFA#ugW_@d]<͈d$g. +O%״oXzޥciGkt)o6Q3+_j tk6^I?P5a[_AO(~Z~(ox;Pھ~97m8^A  ?%oV^@  ?%ouPCI[?vC$y~!Vn]a+7^E}oS:ϋy^}=AW< 2Տ^^?8(((((+ J`?lU=CRب(>@%{]'ow:(((O<5`_W?O'UZ(6!J#+Huw҈ +IaY?TU}?8xk^Ѽu}qh H%իĥ؎`p DZ袀 ( yᵷX$/$0UE$xs\]iͅZ̟du$0LzV>K&iu=N[+8>2yHw2f$3w?Q ߃kc_0’BN?I|C{'m}? ߃kcG'~C?U| K ;o+'1kd!2e #ʀ>51ס*P>z<}}\j7mbpG Eh’BNס*Zoj:q6V < NھXk 8˫RSp 2x$uh[^ڶ{<2_BwB8W$@P5h:4MJ$ERlG8tQ@WRo5[Y=|Ⱦ3ܡ*<(mg'kuM #r0N# b ( ԼK okzm;䌀dcZ%OT6Z^S Y3h$#`pÃ*y/$:Db4F]exfONvd&=((((>/Sm,2T$sFJ`dր;( ( (#xmm常8` $Q@$יRt|8մUu;'ɲIl͵8Ubp8xIu`%%{B';O^״o_\j&ci"uj)o6#Xqk(@%{]'>6^I?P5a[_AO(~Z~(ih׀W_+ѯ(((g'dQWW?O5 ` +?g(zѱWװ~?PIb袊((((+ q*Ox{%PT6*~(>6^I?@%{]' ( ( (>' *E-tI熿k Huw҈ ow: qyVO|_O?O5 `((((C/nkWxkoiơ4WH)b zC/nkWQEWYMxVwVInu#푵c;ײWG 6OE~c.{Qw&VnCWq@=vXcڼyfݲ2} nzw>t/h*5KCFh,acRQ3]PEP^৉<]K\ң$mꧽ{6mºFpѴVPђT RF@8EQ\Ow/_1=;WMԣ/@㯈?k[_M3"#cfs/L>,M犭uM. `-nUv1jOceģ?oaqk>k߄| wZVn(һ =v._TY ٮ#Y ܰˢ>u |kߋGiYj]oAH{Wh_P~5=STh%[u[TV`Yw2aJ᣼@sChiEK_0Pn~!Gx?ט|8? <;;W_ SwSmtn~! կ_e)P5a[_Q@Q@W뿴?'u='o;7rywrgMX>ӬXO(5`cRHHPXdN;wSĞޛ_RZ d.wD0 `ua޼cP5a[_QE+5Լ[]SKiKv[fP6Z?Xmc|/fs;qO h.ӣ,keO5À@9BF?Wǂ|;`icV;Inv8@x?O~$-J!s$s$ |=b}[VѾ}>2_LQ¸7<5MWH.50Bt @'>ShKu5 pAG6fmagkkC n'j(FO'_zuͅ~eO ɸzP'}cޱkm3SK`/U]G<ӭu>Uh |b [IѾ}._Lw)S9G" CÍ7Mnϵ66yx_Z h><֩]P۪ȊB#dF9˞M̭oFIaY?TT8?ZWΞ%aѼUv#Ae{5m!A_usyyWR?,p$to VS\FMRȅ8dzO_W/xy+OWwx擩Mk6:\Gq R8 #W;OxM촨nRbw&B:^!;}OZ~e֡o ɸ(a'}o|-o55m'F=~3ܥO  (+Wwxow:< %_ѫ\t ՠ袊[x{52 (((qyVO{x$P** + q*Ox{%PT6*~((((( +?g(zѱWװ~?PIb袊Ǿ;//?]IOe 8« 4?CAEsx?M4 4?CAEsx?M4 4?CAEsx?M4 4?CAEGoop8*(<ow:$](@jEE_0WC²訨(((+友,&KYik/d0FN O_S'MO△yaVO#dYI"6 08 €־RCS;XZV J2Bq}zƅhkiWwټۼ[2:z{YՍƗjW.4*e8%A8Wwx?/·^džiLy$&gcI+I5 0S\tM}&/"-HR"PAA?k¶5kgf{KA!3r2 |O(~Z~>t]{YW.#wWO*b#>澋+Wwxow:< %_ѫ\t ՠ袊-[򿵴'>_]qgA<B(OЩ&A<B(OЩ&A<B(OЩ&A<B( zno03haX r(+ J`?lU=CRب( ( ( ( ( (H)>2/>k&O&\ 7>tyCI\oJ ?%q (]?a+7G.߇0(v<$?~Wn@>tyCI\oJ ?%q (_??h,ɻlǖ@M|EWC²訫 qyVO{Q@ ?%qu"xWڌ32}XN]@󮢾` F_O\~K'umgm",Ϸrx k>6^Iub5=F].HaON7;dIk< %_ѫ@oEw$ݷcr>5Fw;ϵǧ,SLJHHÀz0V^@G-|8t[Y=wf}vx k,/=:O2$F` FAkO<5`_V~յk̗c>pZ ?%qu?SxNC]rY$a=~u^?82yHw2f$3|-[/|Gum[F=w/ڡ}u+y p+ %_ѫ_okhvkPI<ԏ# ua'O_?j97mܽ}k[AS'|# sU%Ԛ̩yd*]?a+7_ Q@{_[zueI4/8<:A3ZLkEK}O'UZ(?[hڵ`Kn 8PI?oJInQ|@_yCI\<7tc6^I? [2$mu y}EKN=+oJ ?%q (]?a+7G.߇0(v<$?~Wn@>tyCI\oJ ?%q (]?a+7G.߇0(v<$?|EW~?PIb` F@OEQEQEQEQEWx3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|_O?O5 ??jx+M6w455ӫ0bUF0tQE|E}? k5G3%p=CRثA6SO-[HK+dmE9P_ |mۿ__kAO(~Z'tmfT5;I*Y0Q@EPk+|8 }Z_;;:c|gZoUksIptQ @}O'UZ<7iכ 0lOE6FF;xB E 8.WmCۿG^X)ݟ9w𭮩SO-[HJ;dmE9ƏgZ_;rLwOjEE^\߂FK绚 n՘1U\ AֺJ+ ??j>`` F]3%t MYT)ݭnFP6Z(ow:Wwx5 ºυtRPV{(n$X(g@ N2}Mx?k¶5kP5a[_52O>5Լ[]SKiKv[fP6Z_`ֶ>gDuo@}Q@oI熿k SIF6KE ĀgWAᯏ*|Uiw~^o#G $fB3h6!J#+n;[W$GjgK\jEEG3%w V=m/Kh%kkV`Up6aoZ(֛#Ki mh )# /??j8J`?lUp~ MYT)ݭnFP6Z(>6^I㯯SS~.޹{uuzA,aT2z(@$Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0W~?PIb??jO|&|ͪiwznR#(RQNrwQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+xq$`я^}aggiݬ AS,=Ghwj 鑋i3Px%IU8߅|]i_k! % a:#׮o*NaC^?D4hi:M`Žn,ybIɭ _j tkޙy凇Kh, # xOx?;1ɻo77OZ)g />uIGSд}oҬokIvgqt7Fk}/OGk ĥHPpϰ>6^IwizkkC }%2p_WxOz䗗ҮGlXU  h4FBeIvTj-oQÍ[Vn>}˱_nO <9U{ =NK;H.dgHʞ>kzſh8-(6,fWD ~Y`sӁ^ K ;q+|5 qmK[TdaZнrR_?^ۏ9^Ey)//< j6zuk*M sԂp@]QEQEQEEƙ_ZʓBAAS{Gߊ^2}'IյXy}ݶaʠ#pCu[EK$ȡʠ+ oLUy4QAHhb(((((((((((((((((yV?-{x$O*Z(((e?x{3Oj(xn⸷9$l]H #kj6v|$[qGOQRi۵ƗZ_@QeP#8 WtOch}{wy{~ kt|# rRj2e qr*ßƞĺ43$K ܯzqj03Y.X ,@85r_x6C]zLxA΀;3]7'Uq}%ٜ;IpzЯx;{Oھ97m7}8^@,ޙy%4Kc '# ֤uoż9#`FApAt^#jN._BŠxgrWNLnayuk2nkjdppA@(xO~$e:[;]B{)#EfwbUI_Wzvv Ү`GlNOG,n5?qWZ}07;FFO$ ~ß[VѾcK_n]G H >((((((ow: Huw҈ ( ( (((((((ς/xVK紆xRTG\ 9qֻ(gKC?|aA-ƫ&Mslٳwt:[;M[y^"6_@!  ho5G3?%}?^؞!Emhm߱ǖqg48ZQ  ho5_O?o l/7ݺEOnN>0Uklfwݱw*|tz>|`' M\ksEۍ=((OV_T4ekI ܰSY>0U3?%>0U3?%{oj^֗Oi4޽µ(R;NrwPEx:϶}ۼۣWY7cj Sy>Oۭ"nٽmqg4(((((';_/ot{ݞqn4/y6sn6/P((?BCi?y?nݳ{ݏ,g2+(((u?Ojz}[+v8phBt:#cWyv|^Q^7o+h}+f͟6sۥh|8,\j`ngjj(?]ovb9j (/m/֋s]n673>':3ol{9۞(((?}>^ѫ,׵zm{Lռ'֑\[lށ83@QEQEQEW뿴?'u='o;7rywrgM{W?o l/7ݺEOnN8 7O/?ڼ۶6n:`(((((((?_4`ֹ>gGEoW<7z4^=Kp NmU޵Q@y^ ºγ}\j{q%ċ XOT O]˽I㵺ٽ`muqATv(WmzڦwM}˱_nO <9.߈0䕿诐?vC${O>.my_H8@V?))x\cٽ 0j* =wIaѴk.ݤh,㷍 TP3*QEQEQEQE ×zku{8:\߂h>f4Jikv[)el9Aֻ(((^ѵRPZ{+#Y&d`F2=Ez|  ?%otyokkGll񍬿=sڼCo?J?x?e>]Ocnn3Ҁ=; vh7C(?᣼a@MjZ΍}i2{o%2 T+6<-K\ .wIԔ;F=?᣼a@Mk_`ֶ>gDuoW<g^6iA-\3]Fmu޵@ o;^WjSk:p\H3bI85Nh7COƿx×zR]\`ꣵyx+ƺM. IݭnBVsk迃?0Ȏg;:c|]ٻګ= ( i:5p,[ѐ+RFA5rY}qx7\˺&6*px8 u?<7kV$PFC#.߈0䕿G)^.冹==T5(+xV: u`SHUTQ+ QEQEQEQE? Ongai=ԞF`' 98¾X*k.~jEE^'?T?]7_Eu-wc;jr:u D|@`2ϱ,i;j!HsdA$5_ILy$3I$I'QEQEQE|JnOGOx^!. jw)qʪ%`b; z f⫟=c?h} G?ҬlXYk;H.dxĚ-ݬ~gDlA!Rpp@?z[RѼ cqv344LWʔ { R?xuoOmV7f|q8OA^_8~IyfpoǛn#8+; z a珋,&KYik/d0FN O_E.y 닉dytgI;IyG ߃kcG'~C?UtW? ߃kcG'~C?UtW? ߃kcG'~C?UtW? ߃kcG'~C?U|Ox^!. jw)qʪ%`bîס*NC^y|-o,.紺4s<`# ז|.T+L;Cy Čs^ ߃kcG'~C?Ut7moRݣx( @?0Tw?P? Onyw=Ԟ~,y8»; z a51<O]x%f]N$KY]L #Wuw?Q ߃kc@w?W~9?i>pϕ'h+ (˳̑ݝ}FszU|Du5WRD&T5;z<qyrdݵ9r+M3Q|Y^쓝 J7i%կ2tFKCW-Ek@w,#8>>뢼; ??vh7\ +᣼@sChuğ<+F; sU%ԑ >,BH(uSVƉ#մXϻ˗c&T#_&|YZ\p["푵c;y_#M7CdwFP`õ}\=jz]]JŸdnv (L :/ ;_:xkRFV\,7,`*p=E}Ey5o#,Xy ڌ$HOE=(()x7ÚN d_ePÕB gyCI\Wwx{k =w̺!>8@Q$u[hڵ`Kn 8PI<5CxH.F0 G @8'ƿ aeuuly *9Oj]?a+7]i7hɻl(Agƺo"x;Եؓ6Ĉr#EPdž-QC]q<ԏX~uc [G&n|&?]jsA-۪ڢ.c{V?ok~kD\=qڀ< oGi:7,gSv*xgrW^_#M7CdwFP`õx}ƙ^GZ̛HaWOP>*Ku`5]pH((+AONм[h_p 8/GZ |}]#Ky8b*Y)#2A@:QEQExoߊ]I_kS ?"$a?:MGÚNo{6oW۹CTx k>|Y|[/TԦ[׸VBEs=+K?xR,#;[+bN8!{/EPEPEPa|-x5m'FE~ nO An4F?.WdRC =+>k߄| wZVn(һ =v._TY ٮ#Y ܰacq6qWR07;d2H]F^յm0m%T/s+y p+?P5a[_O xa$]y[v!QHSڀ>(jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7U:KJ]rYxp#aq  ho5^Z+uM0T8ZPoϋ,4;?GHN\Շ]G)//[M^MRM lVGf ]'r(d?I|C{'mqމsXIխ}2-w(aʒ }^৉<]K\ң$mꧽzǁ?xkV)kbLӮo$mby}EҩkMF𮑥4m=64d,2=%f|+v{e5m!!C:C@z'/XIu_Oˋ&Xɮ¼OxGzn{IkkH%1Շz((((((+_X~ݭϛy:sQ@?2G3/MM|`|?ɶv/=S7u/xVT x^VTDl9sҀ< wLwnv߱N3&+վxWYoKCYYn$c 3843%s> xo>Ե VK_+bO,eQ@{]oiqn4/y6sn6/P<]KzڦnH̡K+dme9GxWƺ<+ujZC*4?FX/oaP]’3!5]QEQ^_<#KCҤ [q 29_D[kjN{7yrg۹J<9Q@s'O|c_?eH9ڽ}+17m:t-d漙r'.I+友,&KYik/d0FN O@>/Lagv0 ;Qd`%2p^OROxp(c/Exo'#IadS3'.@Ԟ?* o[|GOjho.MT(@袀;; w̵>܌a(c~)|#}H,RI$0?*x?e>]Ocnn3ҹ((((ǍE`jcV;1ɻnv8UIgڌwB$x@Iz(:]mbHaO@vdNk ( ( ( ( ( ( ( ( (: DWt,4=W얲JfdxLm/.T\kN ֻ((oo|GOj7/Kv 8WpWaEW4k 8[XSq;Q@ 2y8uSӮl/#-nxfMnF0dҬQ@~ մnTϷr<3x$r+(((((((B5G?t'>g-]򱝠8=} n|u-wc;jr:u D|@`2ϱT ( ( ( ( ~ U=qqf"I$UJJ9}EV~յk̗c>p\.߇0@>>k^|ucq蚕 F%ʡN PFpAǸKuxo:7/;ϵ)xFч@_X^iYOiu7_-q# [rum7YՍƗZ_@dhZ̲o6STq+D[/jNyrݵ9?xkV)k i /#txfMuC =+b8f{<Nrp?|xk^ѭT5+,V8'ƾ7mg u2yG '.@( [G&sQEp@wIԵz}-+!A8>d-cD򿵴;>_-q #v<$?yOxw??>;2GwvOJ( ( OZxT-,`m2DY.X,@85tP~9?i>pϕ'k袀 (7<<6:ıZ$QDI$澋  u;iWwRy!9S;XZV J2Bq}aI_XyfnoǛn8+(X?jvy&I`~=&/"-HR"PAAEQEQEQEQEQEQEQEQEQEQEQEQEQEW?|+6:]CPA8dJ xS}++?nn|Ìow:$](@jEE_0WC²訨(jP5p4V\HX)bH[_];MU~Ǟ( rDSڻwLOۭ%vٽ Fq"?} >~>^Ѳ}0ӵw5=STh%[u[TV`Yw2aJ?@O/Mi;vy{)u{tw?±k>|Ms_lٿwtj߆<#M7C .|tz0Ux5oy7mmynp۳cvQEQEqu w뵶+Gm1ހ95760>Uz|_j^aI&[uVve YrP[G*_?`xVhW;W;PEPEPEP^o$w-5 *;[yd6!Ozzt;:#l/y{H|n^z6iw Oeq%%K#$dA_sڔ:6}\,,`*Xp=E|9~!o'uܷ>V7m3W)OG>ߵ}|ݜdgȠ7hvZwW[WFo?Yi$"3 8·_5᣼@sCk~.&Yj]y[x6ʎrDSڼ(((+W/k3iz\\3];* X.;z7]Ï¿ ƭ:ѭ?]vv1w_5`ֹgGv͹_\}z߉𱿲Q7^|~)Oxr\ң߱'@kTVfѵ.i$$dbq+<X}g#?1{W뺟߈u=[~w-ϕv[np38EP]~k>sc|3n=qڸ_\jģCW[6oa(ƾ ԼåMϲۤg8u]y^ºγc{qm$1  OTпgO隷%>wn81 k]7z4:Kp궨deOoɶ>_EoG&n|#n7/_ \jCWy[6om((((((((((((ox;Pھ~97m8[2_Zɧ̟gL@N]IH[>#qڵ/v*n3@; (1S?xrCxnox]\`GU|A-sƫ(q^ |Ms ptQ ]%Q_8|R/|Gմ'Y=Oa}F<y$k'}q7C̺5,p8$ "x>Եؓ(wJrWmCۿG@>xν/Ta+VՋe1=+SÍ?a<:.wo^_].my_H8@V?zE]JmºnVS\FT!`8___ާ\^keO H`C 'u0n~&ν/Ta+VՋe1=*N}'Iխc?Ev]*Ax5)//(I|<{'n?нr>@%’yBN((+ |?Nhh%TɻlΣp|]?k¶5j,mkqv0vFO'7ٵ=2[93SFѶ8eq4W ~)x'V~c?EXSv]*@<> (<'ƿxGzaeIkkly␹9ՏjM[RYoKgE2IOow:(&?N[;̋{&T9h_ÿ GwK5ɔ1HñT~UQ^S߅|]sJ]z¯c a:Z&ψ'ˋ{>УXy$h(&?N[;̋{&T9kR_?^ۏ9@ Q__’yBN?I|<{'n?yÿw4rUސKAWAc'8?ZWh& 'I=ŏ,I}˱_nO <9>"x25_ǧʟg<80QAx((X~2/52Pd$r4d&FA=+z(7g> >u&I&P!#~6}Ocn3wQ^QEQEQEQEQEQEQEQEQQ<6\K0DF dOhJ+Ş#wu&vCr;`p ؠ OB+[Js%ٜgp:z Mtݭ>r+!@>®Q@a \KqqirI%LJynV4Ķ%ѡ')$r_Ĭ APU{=2K--cFI V^]Yk}/[oT.$ d$$ Ԡ KZpNdIX.I, I85rL KX#pIj]F[}S[lgd]$LW$d cgyawݬ4 H8a~b(Huw҈ jEE@}? w^_J9b2pjA6[0D#5 `*J(Ɠk_[$3Ŧ\rFYDG kKxSݬ Hʓ+x·^ tiLH&gc I%ywRgd0Fdv$G'P|tgWi}:u ʡ؆@`FpHϹ  k>xk^Ѽu}qh H%իĥ؎`p DZ{D򿵵[;>_-q# 4'MѭK,`g.±)l3+O,&KYik/d0FN OQ}մgV7^i}鑣Ik2ʡN RFpAǸ~$㼰wk&vM#`p`? ߌ?k?c7__ 4?CԞ k_z)!-2$E*%y1[c? 闑XxJ;&8r8`22 lU{=2K--cFINC^(?h}wGlodIvgv5zofݮ4R\IkjlTq(+ 2K;I.gʞFA SCt?Mp'3nya*?#dYGg0ƾt\ jv$0UE$sס*> p4-[[J~%ٟ783V:ρlmoMu8ݣIX/( IH}'T][6zevvZZǝ$ O^' ĺ[}S[lgmNGX&+D2qF}z'~C?UI?+uq-dži$3;I+I5<[oqsA*92<G ặXTeu# 8 sDko-ıH^I$`I$2|'2;VQdYGA FA#DZg;d7O|ϲ\$3c;Ipz=7ĺn^X]x @ G7Í'WWStiv껝cU'_2i׵vMJr%ʡ PFpAǸxMs4 SCt?Mx?M5 0S\tMs=7^Gya*< (u $~5_| >)hחpZZyh@2ǁ@kNC^(3]7'Uq}%ٜ;IpzРǾg,AZ]G{n9Ƶ x-h%@WR2#4%y$:DuQEQE$kqżCk\yu av]* h:5\iz&c;!F"bWÖ6vvIO^ ZSDԬ`m2DY.^%-p 3N=}ExAѮTwWI8#>ƀ5(7zwp]ɝA GV(V+ hH"VF  krn".4H&gbpIdV6v<ϲ[[ghO_SRjZ[ƩZXdbR'8zf~oNc%K9v4EPEPEPEPEPEPEPEPX,XY]]i›< :߅2}'VմoyۺQ¹'(+| ާ-rB-n 7#HN d־ )hjNo.-꛶̌ybɮŠU^_W-dE&\SWQEx?ƿ~*w=+v ?"$`z0>蚏>i:No{<2-wL9RAŠ(Huw҈ _'<]MKC;l$z)^  ho5@?_O?O5 j7/VK'yo^Zٔ)D\ʧ9CҀ;(>@%%{B' ?J㧂|E ?eGۻg;[{)//蚏>i:No{<2-wL9RAŠ+v<$?z|@GR8մ'YEOfMfF<8k (O GK5Sɔ1)TUPaK[ӼGVմXrdݶSG EqQ@Q@tOc ?e~8߾9=+P?Gm}7ۼ/숍fs{O k>c,u$BeO5$@9BGU?c׼xwQy i9 Lq9ASC .vox;\`F<RՏXj~ ,,.aMnvIj?xkV)k>->#:};̗Pк<8}PtOch}{wy{~ kt|# rRj2e qr*(\[7m']G>:twKY%)2^iEK_0PEPEPa[Ӽ9IյkygۺQ‚O$}OῈv%8̟g< P:>xMMR mQYF1=(:UYzWcEI!#aפx>6>ֈ߻?nsƓg"ޯtÕ$<(>X24/.Pg\j,X>N=+z(7mg u2yG '.@~ Ov3wcn^PEPEPEPEPEPEPEPEPEPEPM /%oٳg Z1=;WAX)ݟ9w˷f9Ҽ?j gٿwf\cO^3%|E}? k5G3%rOV >W~3^^|}V_iw~^o#G $fB3k(>|`' u\kEۍ=1}?Ǜmvz>ߋ wW^nX =wg' *E-hk'=[i-ϕn[npqc85&ãh:]HY[oHAbA8gQi:5p,[ѐ+RFA4~ tG>3n6퍟c9ێ+-S~a{ukbO,ed90z1^@WYxV^iIpu.끵c;z6wG>_/nn_gݎ Uo&_e߼ٿ3^1^xwzpGuuz@ ڊz(_cI熿k5Լ[]SKiKv[fP6Z_`ֶ>gDuo@ 5RTU_(KWQ@OV|]snݳ{ۜ 8{<bx{Sտ)i-ϕ~->aqׇתj|U]Ɵ,[(`IC_ce?q{Fqڽk (ᦿQʗjhOV߿)?9_uiz]455nQ @~6!/>ϲۣW8u__I熿k8O/<];r8#ٽ RmEAI=wIF6KE ĀgPzOV|Ksnۿbۜg y~:cϱۼͻcgXvzM[MYѯ`F]J2<7kV$PFC#G<+`h'cRQEQEx'@g~6퍟g;q׽v¿:myX;n1[ėa]Zؓ(w#!{I_:4htRMZ7V,sCiO]Coa}δ[7~V2qx~#mc7ۼ3h퍛=sڽ_~II=OHcP$ٕ0c cW7۶FONV?7gZhvO%;sǵlP_?߈t'o'q[yop9E{y^ º6c[Oeqk$,GT(?}>^ѫ,׵{y~ xo#/uXoH% ڊOEе?i++v6gp(u?Ojz}[+v8pjM'MFѬtv6QBpVatk.X/m䷑ 0WR3h}^gm?s{װW[৆#;MrU~ĞXr`c޽" ( ( ( ( ( (?O5|Cqo,rdaA9 +叄,&KFwk'dHFT_SEx'#:3yX3>jږ[SPu9d`TG'$QEQEQEQ_:|}.xK+L;[Ky a^S[^_wu'i2;byN(?▷sƭi7gدtȧ o?J׿mCۿG_ PCI[?vC$yzmZ%ةj(pWAMO]]iLknvK'<'Ony*O?|G#' 8½R!($ qUE81@QEQEx'#:3yX3=¾@%{]'k>5 SKV Dp qN=x+ x[Fw,5?ǧʞkLJFz1?KFO?|3$F<_YtkM6vB%Dr P2ǰ ~O| ?j~I7m߾=k(| &rBtvN ־Xw$Ŀ M_PEP__CI_ VŏkAѼ cqmƍ%D|N P2ǰ(7-ѯ/?]I{(v#'PV ^!8`SHB(VQ^ Iu_[} H+*b#><BOG?t;>g--򱝠g=}Mx}W<'Ony*O?|G#' 8¾t6G jw)qUEq׮o*,&KFwk'dHFT@G<+`-'MmT/WBl3k/OЩ&> S:KL;XV%-2B3}y]W~ _n 닏 hO.lI%L%$W$k(+IaY?TUji%״kvJrĥHRpϰFO?|dv<]QEW}յ-7^wc;jqIk3D|N R2ǰ?]5I?['_]s8={WYM3△ga V?#d0^.`(8$ƀ><^IJM"xW:vK"*}Y2QH[ӼGi7hw.MX#G"4+<+u_Fyt˔8fv10$1R__&^k]լ IRC |zfsyyvk?gof}0P]E[_ZDBH܌S#X(Oo;տ̒nۍqN1zA_ |mۿ_So:7/;ϵ)xFч_,|mۿ@EP^8C?'D5i:M/ŽSv,ybɯ`qj? uB-+!A8>? k)>2/>k&O&\ wtfZ5}݌;Z&+2qF}SH2>kOI!#7 $_ K]syZ襭}3N˵JEq'/XIu_Oˋ&Xɮ€ +?;ocV'2In7}8V<7tc/SnagWZ}0'`%02H_,PEP[>&g凇[Y3h,VtX0(F蚏>i:No{<2-wL9RA O5|=oqlG"da<ƐMu_$˦\qƥ$+rOЩo&^״ku4MJp%իĥN`p DZh'cRQEQEt կ [2$mu y}EKN=+}◃|GA:/Yv,ydp a_?_+ѯ+keo{4QEWqazmgyQ$п*p_# Xjz~eԩ ) < :z:p^w}:v dq])//G)^}M=WDRȇ0OE?x 0S\tMxMs5r$_1k.Lyd@9E#ʀ>0/$rAŠa}oryQ$о7#T2V(((((((((0|8> cd?[mVթZ+uMV7m3W_'t[;7q\_wpsg WwSĞޛ_RZ d.wD0 `ua޽x_kcg|y^*}cvzvG*_>G*_Cǎ`xzVvW;W;PD)OxR,/tn<bD92:^6mºFpѴVPђT RF@8EQE>k?nla}s6pj (MK~I&[׸Vve QrP'Oxza{GkulI8!Oz([MFoF2GuxJ+uZ>>;uސ(.wD0 |Y¶^iCgZoy_k?nla}s6pjMK~I&[׸Vve QrP( wxS}[+?n[n|Ì(g'dQWW?O5 `(yV?-{x$O*Z( :$cWvNOImۿc݌gMGk:͎nѬ3PN85 x>;u*K[_7zA,;׌xJ+kVߠÍc7M͌?aϵwxo^E|I_j^aI&[uVve YrPn*?-x}ᯏѼ+iw~YCo#G EK"$f@q+#_UxH.5 EiKG @`gWQEWYMxVwVInu#푵c;ײQ@ÿ xGn$]Z%] aڼsĿUW- `5iCw,dgtPGx?Dž5o#,Xy ڌ$HOE=5ڞ OIn|!m3g>';:_3otl{ݞ+|`' M\ksEۍ=(SĞ.ޥX^Qy[yd6ĈrduS޽֛6]#Kh{+(mh*Y)# dz Ԣ((((((((63}>֎Yzj|& j۪ڣ*.{VOgw?=0v_J hӤk$fO5ː9rOElQEW/ė&XGVVĝICTC=N>[}d[7m`Õ @<uxK-4`cubpw; aoJJ7¾d]Iɔ$0GUuWkףkC~k&2})2I9u'ʼ#[ڵ/KSv 8P{/ >5KCYYlc 385I熿k Huw҈ ow: qyVO|_O?O5 `(/ĺ7u}Rci쬦ddBq+k'wwZTv^n);!Tvp [q 29_D[kjN{7yrg۹J<9QEQE·_5xSno4/2Wg\s%dҹ| &rBtvN ր>X((5 ºυtRPV{(n$X(g@ N2}M|]ŇuПdE(L:[%|GiXGV$JrE{džIyQ( ;XicȤF2q+q}y477}>UzpNFKRDagL uQW2 M˿fi8ɠ O xVT.(gmdERw#JG>k@4;L3y%mT0Qz׻o7t,4;?Z)y2N\GXXVմo_O̗S&p jSk>5KgE2IOĺ7u}Rci쬦ddBq*免[XYЛڊQ6sayku2n#r0!G# 5;t;-*;[7{؝ ;WW|-o55m'F=~3ܥO  (((*E5|v~.ޛ𭮩SO-[HJ;dmE9ux']GajkQ2:IaY?TUG"x:tKY%32})2N]I]a+7@__ CI[?vC$}/ė&XGVVĝICTC='Gw0v_JR_?^ۏ9@/$:D·_55KCYYlc 385^Lӭ,mbHaME(֬P/ė&XGVVĝICTC=7ŝ{Ǟ*KM6"{kXXt\sҽS[4:,gEv 9R ;u/=+RDagDe ;G@EQ@Q@*j|U]Ɵ,[(`IvWKo|9Vմy>\jAȠWu/3j\O-[#2,(;#?asw3ptzBe?}EPEPEPEPEPEPEPEPEH&/mi.R8Rb`IE|~$>)hחm-c= @kz(-c[s'J~}ٟ+3-'RѼ }oiv3#wPLWʈd J( ( ]4OG?u[;>g.-򱝤g=}M{|M̭oF<3Rյ-fn5MBu@%+88'澛A?  tkWwRy9noqg=}MhQ@W'MO△yaVO#dYI"6 08 €>־RCi:[}SO9cbTC 0gQE|yO^!ֳ4w/Jeb!pA>n巸9 I]H#W_υ凇KAen0pdd?( +;IaXTQEQ[ _xzX-NF U$xs@,,?Z5vy1"6  ?toiz&c;jqIkj1_*STq+?; z a>A| cozmJ|FHRN2@ϸ5cDu[;g.-3'NaC^ 䗗sIO!<_]/~/.<5M5 SKV Dp qN=zx_/:7oMoM9cH AA57zwp]ɝA G@(i^ RMxOĚg-~~4\ b02H}O@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|M̭oFihW_W/$:DQEgzޝ}[V=|v3G <8yCI\>6!J#(]?a+7]GSxNC]rY$a=~u}?8WYlt}?YYn# q!85Q\ߍ|kFT nV1VḷCҩ>6>ֈ߻k߄|Gwj]ZEC ;PQTJgF-E;@u #8>PEPEPEPEYG×zskkz@:@ƿ k>.mgH99rVxG)//gA6jP\3]FC*mv9ˎ޵P$F; rRD&TRL$$uSV={%OT6ZOxÖ<]ꧽy>0UzN6v{qm!!C;C@`q?7j< ~$.fAs ua޹|Y|yͥv3n QPʸ]r㷭wQEQEQE52MAw4-+0b;F0|>&g;ck7\v/ !пJ$+>k߄| wZVn(һ =vzNX"{ok SFChڥY[q"b gP+-~.aeuucag9"Bz)^@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@¿:m?Qvv1w>&My߳6{_iEK_0P|8? <;;W !>ϲۤg8u^8fݱ}0g;sӽzbx{L|;6[yv؁wc'qZPEPEPEP뿳߈u=['r_ors 8{PEP^_,ۿ`m';_^Es !>ϲۤg8u]P_'t[;7q\_wpsg {P<=ohɻ[7suۍ=?/W?ڟ7.V͛lJ (L|_}G?ylj{^EgZg''inv2qg5EQEQEQEW?o c cW+۶E^Q@_+jۿo'6oc^E &myûn1x'xB@g>~n׵tP^~؞!5oJ|sg߱mϘqc85PEPEP_&>/#ڼ}۶5O nzwPдOiO}+o7n.d82kB(+&2y߳6{@8'Gu\G.nog9]P뿳߈u=['r_ors 8{P?o c cW+۶E^8? 7Fc.;;רQ@Q@Q@Q@&n|#n7/>&2slٳwtÍ?osns[;WygZoUksIptQ \}O'UZtjzO[o7nЮdg2+?O<5`_P'_!/#g|}ݺ6Ocvzv`(((((((65wcv/oSnnS:ϋy^}=AW< 2Տ]ƧhߕX9n38=I:nn^ic9vK` a@(+>qjM|v+2)G" }aggiݬ AS>"xtvX*}(QA^F-Ɨi348%@8¾tg'dQWW?O5 `X~2/52Pd$r4d&FA=+zÃ~Z43; ܢ((((((|_ޙ-r]mu aO@vFJdֱvC$s;_ ֨7^:QI]L Ab=So/x>,gȾ n P^:τ|g}MA!gLBFG]7^Gya*< (u $~5sRtfmM>p+*#>>LudV6w|ϲ[[c;@2z=7ĺn^X]x @]'~0\U}/.%i-I$bbRI'I4EPkNwdPHY(cuQV?x?>'1Ƿw(v_JMKIuu4KìwPdgLд}Ҭls$G^[|GIյk_OyTݶgQ€nj^u4M6u@%ժJrN`N2Iǹ6zevvZZǝ$ O@((((eƙrO.OXةּ#o/x>,gȾ n P_E7VEJ$E `+.~/#iuvMqpdd?آ((|_ޙ-r]mu aO@vFJd־9[n.<5M<^I$؜I\O9)kz>jڶq{<.]wLx`Aȯ7)^.冹==T߰4k 8[XSq;Q@ 2y8u_\i /t}uj?5ׁ|=qq,O.lI#gcI,ާy43/c'V|o9Iյm0ydjpI(9i[[mj7`~ \@GExAѮTwWI8#>ƾLgRo,.໵4 `WQGCoGi:7,gSv*xgrP\ UռWfTJFA.#u;3~]ծo ɸalPEPEPkן׸|R[/Gյm'FEO/ڡMaE<39r+n4F?.WdRC =(z+MOQ|˫RS쓍)GZ(((((?St}ll<kH3um7Yk/P\Ik2ʡ RFpAǸ+xOg~~8[<-G.eO5$ TT?<+kq-ljthgI+#-A_,x?kzku\M F*p_# =W,伿+ |;W|eyi_dOxUs$d #O^@Q@Q@SԵm7F[SP"u2ĥNbp DZ-vfO5#X~ti:3 .N3օx'ɻo17/_Z (yᵷX$/$0UE$xsYv>,ާy43/c'QO兜~e֟q ) ѰQ#xG߅2}'VմoyۺQ¹'>O]O+[U"ߌg2:zЯxOg~~8@nn^i}FeC`qW+ x[Yo,5?]I<ʞjI1:(xV[{9/VF[ +rXg~2//2P\r4TFAkz}gYywx4r@c ~5OM.5ӪhnV 2Bq}aR58մ&>\[7m'^oSߊ#+sJ%{¯˙# a*ԼK okzm;䌀dcZ2ǧ,h<8BFp㼰L $0? \QÍ'Iխ}E_n靇*H<x5PEPYWcag]E7dt_?_+ѠS>: KLKYU pJ3=pv>&g凇[Y3h,V=}KIoQ%t k_z)!-2$E*%y1[Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yo웛~kw\=qڽBjgKC~jgKC~jgKC~j7/VK'yo^Zٔ)D\ʧ9Cһ((᣼@sChu(gA6jP\3]FC*mv9ˎ޵W=CRث*?-z/$:Dw=?Qk !пJ$@?]oevcs9z PKa[|O ,u^g<3n>s=;ח뿳߈u=['r_ors 8x?k¶5kP5a[_W_=og}λ[o+vݝc?Xڟ(/>n\cgZ ( (wSy>wm%m߱ m3g4(OOL|_c9?ywllwu^@Q@Q@W?o l/7ݺEOnNQ^_,i?_`m_:.l_9^@0¿ :n|ߵX˺sx'B_~6푓`g;sӽtQ^~~!4E]mhnٽǖ3QEQEQEV~bx{Sռ;6[؅3^ 5RTU}\#m}7ۼ/숍s̿3޼k??^?{v>tn~!Gx?׈|G/+??o|[wM[y_dsFݝc s(/~O7>y~3q@@QY3V|ZEsnݳzۜ 8hPEPEPEPEPEPEPE.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC${O>.my_H8@V?zEQ@Q__’yBN?I|<{'n?y%PT6*63}>֎Yzuw_2_zW.d v#ʼ[y'|kxYT xVTfl9sҾ%$B(@ !пJ$ [ufT5K9 ر1S^EQEW_5uMRRxVDU*'r1\#MI䵵߱`\vsX(< %_ѫ_ofmg'uk*M kN ~)x'V~c?EXSv]*@<+MOw \-µ`;0緥S/Ínow}ѱv1W{WaEQEOVatk.X/m䷑ 0WR3j)\d߱'2r2=H((Xg2,,.P$j,dNhzO]˽I㵺ٽ`muqATv?vC$~!Vn>WmzڦwM2_Zɧ̟gL@N]Ix@tCI[վ>Yѯ?FX/m䷑P]J3!5tWaDӼGIukXyodݶaʐG  qx>63}>֎ٻ=R_?^ۏ9G)// lk[X#":f_5uMRRxVDU*'r1\<1ox;_ճrn۝}N1zA  ?%o xn>$K[]vg9 Տjد?vC$~!Vn8'RFluKu5pAG?I]wZTv[7Hmuqd#|-4GtZ3d[7mr@]KzڦnH̡K+dme9~W%_؛>vwo7RzR_?^ۏ9]<}Oڶy߾Ms77OZ^ |Ms ptQ \ߊ~ xo#/uXoH% ڊOE( zNXv#Aeom!AW( ( ( ( ( ( ( (:p^w}:v dq@讃OЩo&AxĚ-ݬ~gDlA!Rpp@?}OEQExLxU F#' I'+y%I$Y$I'yJnO}?O'UZ?  k? uVQ&8s<`$~5/?+?gwG?$llg.-򱝤g=}M|jږpw}:EfĜdsZxMs5_-'RѼ }oiv3#wPLWʈd R_+u_\\xkFytgI,"fv1)$$s]~/n-5C ^пI?@%%{B'>(;J`l|5k>:MJ#FPl#8 WX^iYOiu7m}|3h=qڀֈYzj|&·Z^iMz<}}\j7mbpG Ev>0U7yiIukx;w$чj?vQ K ;o+( |eψNhg%T/t.rO$}EQEb}'V~}2/w(aʡ }ON̵&GZKxhH@ %IS@8(_W/xy+> ^пI袊+Wwxow:azmgyQ$п*p_# =x_>WF𮑥iOee 1,Gt(|Du5WRD&Tk?gof}0P]x?O$w-rJؓ q$C##mg'kuM #r0N# _[u]O4ϴ8zU? ih4F2Gĺlυu}.ݣYl$(gBqhDi:Nyq}dݵKYy5W;)OM/t-m|;t0:^@Q@Q@Q@Q@Q@|_W~?PIb` F@OE6wG>_/nn_gݎG*_WwxᦿQʗjk (ᦿQʗjk (ᦿQʗjk ( Sy>Oۭ"nٽmqg+' *E-t$:Du$P**jEE@EP̿77 SwSm}E|+[ۿo'ocY &¹Gylg;WO4 0?Gs}|/쎋fs[;?_V7m3V}j؞!5o' W>V8mq׷Mԣ/^E{4J?RTMԣ/^yZohnow}ѱ6|jᦿQʗjk (ᦿQʗjk ֛#Ki mh )# |t#cWyvȯ|^> xo>Ե VK_+bO,eQ@{ZoT{Cbx{Li~ Yqd_ k5G3%g_?߈t'o'q[yop9Ev կ6!J#+f_kWWa_dX/Z;cfck/\7u/xVT x^VTDl9sһ((?>5Լ[]SKiKv[fP6Z(/?Xmc|/fs;רP_xJ+uZ'ƿxGzaeIkkly␹9ՏjM[RYoKgE2IO 4-3o:fy?nۻf s??} >~>^Ѳ}0ӵ|٤Sh͎nWFT0`85;t;-*;[7{؝ ;PQEyokkGll񍬿=sڀ=B1} >fݱ}0g;sӽt kx·Z3z궨ʥB#df9˞POImۿc݌gM{CmL~wf X3dWxJ+uZCmjW/ė&XGVVĝICTC=7ŝ{Ǟ*KM6"{kXXt\sҀ=+,Y׼]/Kf[$fكu1h(_߉/<]M7\lz(]EQEWgƺ+kipZM)hw>#No{<.-wBybIɮ>;//?]IOe 8« 4?CQE{%PT6*'þ1/ϲ}${wcwa^fjZ5\iz݌KY&+pJq=jwPнrpii:M`| 1'O&; z fS{1i2;`2Ǔ(X5k9s$G^1 ߌ?k?c7Yzk7 qjwӪY.iX.I,II84oQÍ'Vծ>}?KSvٝG 8W>,&g5[KX/d$$~ kzY&]2F,%$y$s@v< j6zuk*M sԂp@]Fi#ukXϷ̋{&rZP’yBN 4w邏v/ocnn|M̭oF:IaY?TU]{Fk}/[Ԭ`g.6^I?@%{]'>%㕡|-o55m'F=~3ܥO  ('þ1/ϲ}${wcwa^Q@:K 얲Jfd^L$QVP;_ ֣P5a[_xJ+uZCmjމxGIխc>2-웶aʐG  co߅|#_d# ?%(H$a؎?*(|;𯋵+wQ!WD$ #Տ]Ehw4x4&0nϷs<$IօPEP?<-xN\]r<׏=u_ [(?g(zѱW%PT6*~ ( (8f{<Nrp?yg/ k75MRdx,85]WΟ|5k>:MJ#FPl#8 WtPL[YOiu1yʞFA((-c[s'J~}ٟ+3׸Q@ 5M'?T?]7_o@~ k_z)!-2$E*%y1_WuLkE|zPcayGgai=ԙ  8Q5h:4MJ$ERlG8ם-|GumZ0ydp_GyCI\h} Xүdyvgv5 IԴo[}݌-8#>Ƶ?v<$?uN:Kvag<8aQ@p/5?͝wRy!3#'( (>xk^Ѽu}qh H%իĥ؎`p DZ袀 ow:p^#jN._BŠxgrP^8`Sy$(I$]ƙ^GZ̛HaW; z a>A| cozmJ|FHRN2@ϸ(iO^٩xAѮTwWI8#>ƾto;{PھI7m7}8XSxVwc)É$$a=~t~SX]wk'h$#b#8<⫫x-59#Ԍ\G9:O<5`_QEQEQEW|@,l/5;-';!3#' 98½WXd]ZJ[͈g{ ^пI䯯((/V:dž`Sy$UTQ*I+5P}u-g6^w}:qGk J|FHPN2@ϸ?B4OI?;_-sg=E{W'MO△yaVO#dYI"6 08 ¾0־RC~n׵tzO :͎o+=v3PN$'>R?B?vg6 p OJu?Ojz}[+v8phgKC?|aA-ƫk?ᦿQʗj0Íc?lfwݱnsW{׷?O5 77_J?ϛ~ֽqyVO{Q@Q@Q@~,>aKMJi[kXє)f\Χ9CҺO x,#;[ud9Oz#}[wMy_dsvݝcO?϶}#?7cjOV_T4ekI ܰSY>0Ux~CmL~wf X3dP!  ho5\ߍ~kѡ5K6h%[u[Y1VlȣCҾî??`xzIv>o{PW2G3/MMx[৉<]MrJ~ĞYrduS޾֛6]#Kh{+(mh*Y)# dz  l/+ݺFn^PEPEPEP|+k7]ƟW[RIdz Rgz%>Oۮlq €:~$r9䵵w : @ý}7ோ:5.Rx4U*Wk\v<L|_c}j?yvr3޾qn5o߷֍m}]vw1wP((u.OV{ۈi!(g`HN2} zx~<bxLտ)wϕ~ >aq׸PEPEPEPEPEPEPEPEPEP_W=CRث?g(zѱPQEy~ xo#/uXoH% ڊOE??jgK\?|A-sƫ(q??jgK\?|A-sƫ( zNXv#Aeom!AW(<ow:$](@jEE_0WC²訨((` F_O=CRث((ڋ#)Z +>qjM|v+2)G"OxWXSGF(=tQEQEQEWkNwdPHY(cuQV?x?>'1Ƿw(v_J (>)|R>#N'ˋ찾УY s$G^[|GIյk_OyTݶgQ€v?k¶5k>xLm/.T\kN ր;(7g> >u&I&P!#H_ECe?ۻg;W{W)xßm'I~cX_nQ,I< \j~ $.y}nvKI=(beƙrO.OXةּ#o/x>,gȾ n P@GExOx?;1ɻo77OZ + xYwo/ϵG<*RG@:( // K}CYi쬦d" q8Iu>8/<#;Mr8$߱'RPFC=|Y׼y⫭/Ta+'VՋE1=+JJ`?lTWkC~k&2})2I9u'ʀ=zi:q2]8P€ + _ާ-]-n xfO@7#HBddҾ((+ŗgu9<]>h_h;]cbZآp[K^#:2/›9TrQEQEQEQEQEW|@{%PT6*(+ (+ (+ (+ (+ (+ (Huw҈ (jEE_0WC²訨(q*O}?EQE?+uq-dži$3;I+I5E^S Y1#`2*Fk/Dlgd(ZڤLW { }gYywx4r@c ~5OM.5ӪhnV 2Bq}jQEe^%tk56v@DrF@b2ϱ J*gvgdH$F U(8pq8=} hV=7Iy*Lo{(ve~EGoop8*x!(T)$r(eu#x 1RQ@ SCt?My_ h:7ln4M8ѤH)*@8PfhoN}ac%ſvd5 ߌ?k?c7_oΟ|5k>:MJ#FPl#8 P חsIy ؞@2Ǔ+rV[ hO+I,"fv'$W$kAޙy凇Kh, # V~hߕX9n38=hQ@'MѭK,`g.±)l3+O,&KYik/d0FN OV?h(zѲ׏A ߌ?k?c7__Iu w$Ŀ M@W~?PIb'#L̎( π^״o_\j&ci"uj)o6#XqhԼ57 qhmKTdsZxAѮTwWI8#>ƀ.XYqZAikvCb4\Np2I?X7zwp]ɝA GV(V+ hH"VF  kr(Z[ƩZXdbR'8zf~oNc%K9v4EPQ7VEJ$E `*J(~/#iuvMqpdd?آ(((((+ `q?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7g'dQW  ho5^Z+uM>24Zɧ*hL2x UYzWcEI!#a׼Q@QÍ'Iխ}E_n靇*H<x5QE|?;i7hɻl(A?|aA-ƨq?7Gi /5.Od$kjd&=+Cmjנ8ZVxFV\j3Ae{ ċҖ*袊(x>i:7,g|~ n )#^;3~]ծo ɸalQ@Q@$N:;r얲J!WLSW/ ?%qO> Լy[]/KKkeRp6oZgKC2>kOI!#}oGi:7,gSv*xgrWa  ho5^w&VnCWq@=v?I|C{'m}?'%Uj+/ĺlυu}.ݣYl$(gBqhOޝψN\};̗c>кy p+ D𯋵,4=WwQfd<Շ^  ho5]oUujzlKd궲;0b;F0{%x?ƿ~*w=+v ?"$`z0(?nsƓg"ޯtÕ$<( (<_x6C]zLxAα'^?M|q1zװQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@golang-github-yeqown-go-qrcode-2.2.5/cmd/000077500000000000000000000000001521051213400202025ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/cmd/qrcode/000077500000000000000000000000001521051213400214575ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/cmd/qrcode/README.md000066400000000000000000000034651521051213400227460ustar00rootroot00000000000000## `qrcode` CLI Application The `qrcode` is a command line application that generates QR codes. ### Usage ```sh $ qrcode -h NAME: qrcode - qrcode [options] [source text] USAGE: qrcode [global options] command [command options] [arguments...] VERSION: v2.0.0-beta DESCRIPTION: QR code generator AUTHOR: yeqown COMMANDS: help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --terminal --terminal (default: false) --output value, -o value --output= (default: qrcode.jpg) --block value, -s value --block= (default: 5) --borders value, -b value --borders= (default: 0,0,0,0) --circle --circle (default: false) --help, -h show help (default: false) --version, -v print the version (default: false) COPYRIGHT: Copyright (c) 2018 yeqown Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. ``` ### Examples Provides some examples of how to use the `qrcode` command. ```sh # Generate a QR code into file as default qrcode "Hello, World!" # Generate a QR code into file with block size and borders (unit: pixel) qrcode -o qrcode.png -s 20 -b 20,20,20,20 -m "Hello, World!" # Generate a QR code into terminal qrcode --terminal "Hello, World!" ```golang-github-yeqown-go-qrcode-2.2.5/cmd/qrcode/app.go000066400000000000000000000116731521051213400225760ustar00rootroot00000000000000package main import ( "path/filepath" "strconv" "strings" "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/standard" "github.com/yeqown/go-qrcode/writer/terminal" "github.com/pkg/errors" "github.com/urfave/cli/v2" ) var copyright = `Copyright (c) 2018 yeqown Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. ` func newApp() *cli.App { app := cli.NewApp() app.Name = "qrcode" app.Description = "QR code generator" app.Version = "v2.0.1" app.Authors = []*cli.Author{ { Name: "yeqown", Email: "yeqown@gmail.com", }, } app.Usage = "qrcode [options] [source text]" app.Copyright = copyright app.Flags = prepareFlags() app.Action = func(c *cli.Context) error { genCtx := parseGenerateContextFrom(c) return generate(genCtx) } return app } func generate(ctx *generateContext) error { qrc, err := qrcode.New(ctx.text) if err != nil { return errors.Wrap(err, "generate QRCode failed") } var w qrcode.Writer // construct a writer based generateContext switch ctx.mode { case writerMode_TERMINAL: w = terminal.New() default: w, err = standard.New(ctx.FOO.output, ctx.FOO.applyOptions()...) } if err != nil { return errors.Wrap(err, "initialize writer failed") } return qrc.Save(w) } type writerMode uint8 const ( _ writerMode = iota writerMode_FILE writerMode_TERMINAL ) // generateContext generate qrcode from context type generateContext struct { text string mode writerMode FOO *fileOutputOptions TOO *terminalOutputOptions } type fileOutputOptions struct { output string outputSuffix string blockSize uint8 borders [4]int isCircleShape bool transparent bool halftoneImage string } func (foo fileOutputOptions) applyOptions() []standard.ImageOption { options := []standard.ImageOption{ standard.WithQRWidth(foo.blockSize), standard.WithBorderWidth(foo.borders[:]...), } switch foo.outputSuffix { case "png": options = append(options, standard.WithBuiltinImageEncoder(standard.PNG_FORMAT)) case "jpg", "jpeg": fallthrough default: options = append(options, standard.WithBuiltinImageEncoder(standard.JPEG_FORMAT)) } if foo.isCircleShape { options = append(options, standard.WithCircleShape()) } if foo.transparent { options = append(options, standard.WithBgTransparent()) } if foo.halftoneImage != "" { options = append(options, standard.WithHalftone(foo.halftoneImage)) } return options } type terminalOutputOptions struct{} func parseGenerateContextFrom(c *cli.Context) *generateContext { genCtx := &generateContext{ text: c.Args().First(), mode: writerMode_FILE, FOO: &fileOutputOptions{ output: c.String("output"), outputSuffix: strings.TrimPrefix(filepath.Ext(c.String("output")), "."), blockSize: uint8(c.Uint("block")), borders: [4]int{}, isCircleShape: c.Bool("circle"), transparent: c.Bool("transparent"), halftoneImage: c.String("halftone"), }, TOO: &terminalOutputOptions{}, } // writer mode if c.Bool("terminal") { genCtx.mode = writerMode_TERMINAL } // parse borders borders := c.String("borders") arr := strings.Split(borders, ",") if len(arr) != 4 { panic("invalid borders format, want: uint8,uint8,uint8,uint8") } for i, s := range arr { v, err := strconv.ParseUint(s, 10, 8) if err != nil { panic("invalid borders format, want: uint8") } genCtx.FOO.borders[i] = int(v) } return genCtx } func prepareFlags() []cli.Flag { return []cli.Flag{ &cli.BoolFlag{ Name: "terminal", Usage: "--terminal", Value: false, DefaultText: "false", }, &cli.StringFlag{ Name: "output", Aliases: []string{"o"}, Usage: "--output=", Value: "qrcode.jpg", DefaultText: "qrcode.jpg", }, &cli.UintFlag{ Name: "block", Aliases: []string{"s"}, Usage: "--block=", Value: 5, DefaultText: "5", }, &cli.StringFlag{ Name: "borders", Aliases: []string{"b"}, Usage: "--borders=", Value: "0,0,0,0", DefaultText: "0,0,0,0", }, &cli.BoolFlag{ Name: "circle", Usage: "--circle", Value: false, DefaultText: "false", }, &cli.BoolFlag{ Name: "transparent", Usage: "--transparent", Value: false, DefaultText: "false", }, &cli.StringFlag{ Name: "halftone", Usage: "--halftone=", Value: "", DefaultText: "", }, } } golang-github-yeqown-go-qrcode-2.2.5/cmd/qrcode/go.mod000066400000000000000000000016561521051213400225750ustar00rootroot00000000000000module github.com/yeqown/go-qrcode/cmd/qrcode go 1.17 require ( github.com/pkg/errors v0.9.1 github.com/urfave/cli/v2 v2.3.0 github.com/yeqown/go-qrcode/v2 v2.2.2 github.com/yeqown/go-qrcode/writer/standard v1.2.0 github.com/yeqown/go-qrcode/writer/terminal v1.1.0 ) require ( github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect github.com/nsf/termbox-go v1.1.1 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/yeqown/reedsolomon v1.0.0 // indirect golang.org/x/image v0.18.0 // indirect ) //replace ( // github.com/yeqown/go-qrcode/v2 v2.0.1 => ../../ // github.com/yeqown/go-qrcode/writer/standard v1.0.0 => ../../writer/standard //) golang-github-yeqown-go-qrcode-2.2.5/cmd/qrcode/main.go000066400000000000000000000002061521051213400227300ustar00rootroot00000000000000package main import ( "os" ) func main() { app := newApp() if err := app.Run(os.Args); err != nil { println(err.Error()) } } golang-github-yeqown-go-qrcode-2.2.5/cmd/wasm/000077500000000000000000000000001521051213400211515ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/cmd/wasm/README.md000066400000000000000000000015041521051213400224300ustar00rootroot00000000000000## WebAssembly support This part provide support to compile and run WebAssembly code. ```javascript let option = { encodeVersion: 0, // 0 - 40 encodeMode: 2, // 0 - 3 encodeECLevel: "Q", // L, M, Q, H outputBgColor: "#123123", // #000000 - #ffffff outputBgTransparent: false, // true - false outputQrColor: "#666666", // #000000 - #ffffff outputQrWidth: 20, // 0 - 256 outputCircleShape: true, // true - false outputImageEncoder: "png", // png, jpeg, jpg outputMargin: 20, // 0 - 256 } let r = generateQRCode("content", option) // output: // { "success": true, "error": "", "base64EncodedImage": "iVBORw0KGgoAAAANSUhEUgAAAmwAAAJ... more" } ``` ## build wasm binary ```bash cd $PATH/to/go-qrcode/cmd/wasm GOOS=js GOARCH=wasm go build -o com.github.yeqown.goqrcode.wasm . ```golang-github-yeqown-go-qrcode-2.2.5/cmd/wasm/build.sh000066400000000000000000000001121521051213400225760ustar00rootroot00000000000000#!/bin/sh GOOS=js GOARCH=wasm go build -o com.github.yeqown.goqrcode.wasmgolang-github-yeqown-go-qrcode-2.2.5/cmd/wasm/go.mod000066400000000000000000000005701521051213400222610ustar00rootroot00000000000000module wasm go 1.18 require ( github.com/pkg/errors v0.9.1 github.com/yeqown/go-qrcode/v2 v2.0.2 github.com/yeqown/go-qrcode/writer/standard v1.1.1 ) require ( github.com/fogleman/gg v1.3.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/yeqown/reedsolomon v1.0.0 // indirect golang.org/x/image v0.10.0 // indirect ) golang-github-yeqown-go-qrcode-2.2.5/cmd/wasm/main.go000066400000000000000000000033601521051213400224260ustar00rootroot00000000000000//go:build js && wasm package main import ( "bytes" "fmt" "syscall/js" "github.com/pkg/errors" qrcode "github.com/yeqown/go-qrcode/v2" stdw "github.com/yeqown/go-qrcode/writer/standard" ) func main() { js.Global().Set("generateQRCode", js.FuncOf(genqrcode)) fmt.Println("com.github.yeqown.goqrcode.wasm loaded") select {} } // genqrcode generates a qrcode image and returns the base64 encoded string. // args should be a string array with length of 2 at most. the first one is the // content string which will be encoded to qrcode, the second one is the encoding // option, which is optional. // // let result = generateQRCode("content", { // qrWidth: 200, // qrMargin: 10, // qrColor: "#000000", // qrBackColor: "#ffffff", // encLevel: "H", // encVersion: 7, // }) // more options refer to the `genOption` struct func genqrcode(_ js.Value, args []js.Value) (v interface{}) { var ( srcContent = "" r = new(genResult) opt = new(genOption) ) defer func() { v = r.JSValue() }() switch len(args) { case 0: r.setError(errors.New("no args")) return case 1: srcContent = args[0].String() case 2: fallthrough default: srcContent = args[0].String() opt = optionFromJSValue(args[1]) } //if err := opt.validate(); err != nil { // r.setError(errors.Wrap(err, "invalid option")) // return //} qrc, err := qrcode.NewWith(srcContent, opt.encodeOptions()...) if err != nil { r.setError(errors.Wrap(err, "genqrcode qrcode")) return } buf := bytes.NewBuffer(nil) wr := nopCloser{Writer: buf} w := stdw.NewWithWriter(wr, opt.outputOptions()...) err = qrc.Save(w) if err != nil { r.setError(errors.Wrap(err, "apply output option")) return } // apply image to result r.setImage(buf) return } golang-github-yeqown-go-qrcode-2.2.5/cmd/wasm/types.go000066400000000000000000000121171521051213400226460ustar00rootroot00000000000000//go:build js && wasm package main import ( "bytes" "encoding/base64" "io" "syscall/js" "github.com/yeqown/go-qrcode/v2" stdw "github.com/yeqown/go-qrcode/writer/standard" ) // encodeOption refers to github.com/yeqown/go-qrcode/v2.encodingOption type encodeOption struct { version int // encodeVersion mode uint8 // encodeMode specifies which encMode to use (0/1/2/3). ecLevel string // encodeECLevel specifies which ecLevel to use (L/M/Q/H) } // outputOption refers to github.com/yeqown/go-qrcode/writer/standard.outputImageOptions type outputOption struct { bgColor string // outputBgColor is the background color of the QR code image. bgTransparent bool // outputBgTransparent indicates whether the background color is transparent. qrColor string // outputQrColor is the foreground color of the QR code. qrWidth uint8 // outputQrWidth is the width of the QR code. circleShape bool // outputCircleShape indicates whether to draw the qr block in circle shape. imageEncoder string // outputImageEncoder specifies file format would be encoded the QR image. (jpg/jpeg/png) margin int // outputMargin is the border width of the output image. } // genOption is a type of option for generating code. type genOption struct { encodeOption outputOption } // optionFromJSValue converts js.Value to genOption. func optionFromJSValue(option js.Value) *genOption { //fmt.Println(option.Type().String()) if option.IsNull() || option.IsUndefined() || option.Type().String() != "object" { // option must be an object, otherwise return default empty option. return nil } return &genOption{ encodeOption: encodeOption{ version: option.Get("encodeVersion").Int(), mode: uint8(option.Get("encodeMode").Int()), ecLevel: option.Get("encodeECLevel").String(), }, outputOption: outputOption{ bgColor: option.Get("outputBgColor").String(), bgTransparent: option.Get("outputBgTransparent").Bool(), qrColor: option.Get("outputQrColor").String(), qrWidth: uint8(option.Get("outputQrWidth").Int()), circleShape: option.Get("outputCircleShape").Bool(), imageEncoder: option.Get("outputImageEncoder").String(), margin: option.Get("outputMargin").Int(), }, } } // validate genOption. func (o *genOption) validate() error { if o == nil { return nil } return nil } func (o *genOption) encodeOptions() []qrcode.EncodeOption { if o == nil { return nil } out := make([]qrcode.EncodeOption, 0, 4) if o.encodeOption.version != 0 { out = append(out, qrcode.WithVersion(o.encodeOption.version)) } switch o.encodeOption.mode { case uint8(qrcode.EncModeAlphanumeric): out = append(out, qrcode.WithEncodingMode(qrcode.EncModeAlphanumeric)) case uint8(qrcode.EncModeNumeric): out = append(out, qrcode.WithEncodingMode(qrcode.EncModeNumeric)) case uint8(qrcode.EncModeByte): out = append(out, qrcode.WithEncodingMode(qrcode.EncModeByte)) case uint8(qrcode.EncModeJP): out = append(out, qrcode.WithEncodingMode(qrcode.EncModeJP)) } switch o.encodeOption.ecLevel { case "L": out = append(out, qrcode.WithErrorCorrectionLevel(qrcode.ErrorCorrectionLow)) case "M": out = append(out, qrcode.WithErrorCorrectionLevel(qrcode.ErrorCorrectionMedium)) case "Q": out = append(out, qrcode.WithErrorCorrectionLevel(qrcode.ErrorCorrectionQuart)) case "H": out = append(out, qrcode.WithErrorCorrectionLevel(qrcode.ErrorCorrectionHighest)) } return out } func (o *genOption) outputOptions() []stdw.ImageOption { if o == nil { return nil } out := make([]stdw.ImageOption, 0, 8) if o.outputOption.bgColor != "" { out = append(out, stdw.WithBgColorRGBHex(o.outputOption.bgColor)) } if o.outputOption.bgTransparent { out = append(out, stdw.WithBgTransparent()) } if o.outputOption.qrColor != "" { out = append(out, stdw.WithFgColorRGBHex(o.outputOption.qrColor)) } if o.outputOption.qrWidth != 0 { out = append(out, stdw.WithQRWidth(o.outputOption.qrWidth)) } if o.outputOption.circleShape { out = append(out, stdw.WithCircleShape()) } switch o.outputOption.imageEncoder { case "jpg", "jpeg": out = append(out, stdw.WithBuiltinImageEncoder(stdw.JPEG_FORMAT)) case "png": fallthrough default: out = append(out, stdw.WithBuiltinImageEncoder(stdw.PNG_FORMAT)) } if o.outputOption.margin != 0 { out = append(out, stdw.WithBorderWidth(o.outputOption.margin)) } return out } // genResult is result contains generated code image or error message. type genResult struct { Success bool `json:"success"` Error string `json:"error"` Base64EncodedImage string `json:"base64EncodedImage"` } func (r *genResult) setError(err error) { r.Success = false r.Error = err.Error() } func (r *genResult) setImage(buf *bytes.Buffer) { r.Success = true r.Base64EncodedImage = base64.StdEncoding.EncodeToString(buf.Bytes()) } func (r *genResult) JSValue() js.Value { return js.ValueOf(map[string]any{ "success": r.Success, "error": r.Error, "base64EncodedImage": r.Base64EncodedImage, }) } type nopCloser struct { io.Writer } func (nopCloser) Close() error { return nil } golang-github-yeqown-go-qrcode-2.2.5/cmd/wasm/types_test.go000066400000000000000000000007521521051213400237070ustar00rootroot00000000000000package main import ( "encoding/json" "testing" ) func Test_genOption(t *testing.T) { o := genOption{ encodeOption: encodeOption{ version: 0, mode: 0, ecLevel: "", }, outputOption: outputOption{ bgColor: "", bgTransparent: false, qrColor: "", qrWidth: 0, circleShape: false, imageEncoder: "", margin: 0, }, } byts, err := json.MarshalIndent(o, "", " ") if err != nil { t.Error(err) } t.Log(string(byts)) } golang-github-yeqown-go-qrcode-2.2.5/debug.go000066400000000000000000000043551521051213400210630ustar00rootroot00000000000000package qrcode import ( "fmt" "image" "image/color" "image/jpeg" "io" "log" "os" "sync" ) var ( // _debug mode switch, true means enable debug mode, false means disable. _debug = false _debugOnce sync.Once ) func debugEnabled() bool { // load debug switch from environment only once. _debugOnce.Do(func() { switch os.Getenv("QRCODE_DEBUG") { case "1", "true", "TRUE", "enabled", "ENABLED": _debug = true } }) return _debug } // SetDebugMode open debug switch, you can also enable debug by runtime // environments variables: QRCODE_DEBUG=1 [1, true, TRUE, enabled, ENABLED] which is recommended. func SetDebugMode() { _debug = true } func debugLogf(format string, v ...interface{}) { if !debugEnabled() { return } log.Printf("[qrcode] DEBUG: "+format, v...) } func debugDraw(filename string, mat Matrix) error { if !debugEnabled() { return nil } fd, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) if err != nil { return fmt.Errorf("debugDraw open file %s failed: %w", filename, err) } defer func(fd *os.File) { _ = fd.Close() }(fd) return debugDrawTo(fd, mat) } func debugDrawTo(w io.Writer, mat Matrix) error { if !debugEnabled() { return nil } // width as image width, height as image height padding := 10 blockWidth := 10 width := mat.Width()*blockWidth + 2*padding height := width img := image.NewGray16(image.Rect(0, 0, width, height)) rectangle := func(x1, y1 int, x2, y2 int, img *image.Gray16, c color.Gray16) { for x := x1; x < x2; x++ { for y := y1; y < y2; y++ { img.SetGray16(x, y, c) } } } // background rectangle(0, 0, width, height, img, color.Gray16{Y: 0xff12}) mat.iter(IterDirection_COLUMN, func(x int, y int, v qrvalue) { sx := x*blockWidth + padding sy := y*blockWidth + padding es := (x+1)*blockWidth + padding ey := (y+1)*blockWidth + padding // choose color, false use black, others use black on white background var gray color.Gray16 switch v.qrbool() { case false: gray = color.White default: gray = color.Black } rectangle(sx, sy, es, ey, img, gray) }) // save to writer err := jpeg.Encode(w, img, nil) if err != nil { return fmt.Errorf("debugDrawTo: encode image in JPEG failed: %v", err) } return nil } golang-github-yeqown-go-qrcode-2.2.5/encoder.go000066400000000000000000000172631521051213400214160ustar00rootroot00000000000000// Package qrcode ... // encoder.go working for data encoding package qrcode import ( "fmt" "log" "github.com/yeqown/reedsolomon/binary" ) // encMode ... type encMode uint const ( // a qrbool of EncModeAuto will trigger a detection of the letter set from the input data, EncModeAuto = 0 // EncModeNone mode ... EncModeNone encMode = 1 << iota // EncModeNumeric mode ... EncModeNumeric // EncModeAlphanumeric mode ... EncModeAlphanumeric // EncModeByte mode ... EncModeByte // EncModeJP mode ... EncModeJP ) var ( paddingByte1, _ = binary.NewFromBinaryString("11101100") paddingByte2, _ = binary.NewFromBinaryString("00010001") ) // getEncModeName ... func getEncModeName(mode encMode) string { switch mode { case EncModeNone: return "none" case EncModeNumeric: return "numeric" case EncModeAlphanumeric: return "alphanumeric" case EncModeByte: return "byte" case EncModeJP: return "japan" default: return "unknown" } } // getEncodeModeIndicator ... func getEncodeModeIndicator(mode encMode) *binary.Binary { switch mode { case EncModeNumeric: return binary.New(false, false, false, true) case EncModeAlphanumeric: return binary.New(false, false, true, false) case EncModeByte: return binary.New(false, true, false, false) case EncModeJP: return binary.New(true, false, false, false) default: panic("no indicator") } } // encoder ... data to bit stream ... type encoder struct { // self init dst *binary.Binary data []byte // raw input data // initial params mode encMode // encode mode ecLv ecLevel // error correction level // self load version version // QR version ref } func newEncoder(m encMode, ec ecLevel, v version) *encoder { return &encoder{ dst: nil, data: nil, mode: m, ecLv: ec, version: v, } } // Encode ... // 1. encode raw data into bitset // 2. append _defaultPadding data // func (e *encoder) Encode(byts []byte) (*binary.Binary, error) { e.dst = binary.New() e.data = byts // append mode indicator symbol indicator := getEncodeModeIndicator(e.mode) e.dst.Append(indicator) // append chars length counter bits symbol e.dst.AppendUint32(uint32(len(byts)), e.charCountBits()) // encode data with specified mode switch e.mode { case EncModeNumeric: e.encodeNumeric() case EncModeAlphanumeric: e.encodeAlphanumeric() case EncModeByte: e.encodeByte() case EncModeJP: panic("this has not been finished") } // fill and _defaultPadding bits e.breakUpInto8bit() return e.dst, nil } // 0001b mode indicator func (e *encoder) encodeNumeric() { if e.dst == nil { log.Println("e.dst is nil") return } for i := 0; i < len(e.data); i += 3 { charsRemaining := len(e.data) - i var value uint32 bitsUsed := 1 for j := 0; j < charsRemaining && j < 3; j++ { value *= 10 value += uint32(e.data[i+j] - 0x30) bitsUsed += 3 } e.dst.AppendUint32(value, bitsUsed) } } // 0010b mode indicator func (e *encoder) encodeAlphanumeric() { if e.dst == nil { log.Println("e.dst is nil") return } for i := 0; i < len(e.data); i += 2 { charsRemaining := len(e.data) - i var value uint32 for j := 0; j < charsRemaining && j < 2; j++ { value *= 45 value += encodeAlphanumericCharacter(e.data[i+j]) } bitsUsed := 6 if charsRemaining > 1 { bitsUsed = 11 } e.dst.AppendUint32(value, bitsUsed) } } // 0100b mode indicator func (e *encoder) encodeByte() { if e.dst == nil { log.Println("e.dst is nil") return } for _, b := range e.data { _ = e.dst.AppendByte(b, 8) } } // Break Up into 8-bit Codewords and Add Pad Bytes if Necessary func (e *encoder) breakUpInto8bit() { // fill ending code (max 4bit) // depends on max capacity of current version and EC level maxCap := e.version.NumTotalCodewords() * 8 if less := maxCap - e.dst.Len(); less < 0 { err := fmt.Errorf( "wrong version(%d) cap(%d bits) and could not contain all bits: %d bits", e.version.Ver, maxCap, e.dst.Len(), ) panic(err) } else if less < 4 { e.dst.AppendNumBools(less, false) } else { e.dst.AppendNumBools(4, false) } // append `0` to be 8 times bits length if mod := e.dst.Len() % 8; mod != 0 { e.dst.AppendNumBools(8-mod, false) } // _defaultPadding bytes // _defaultPadding byte 11101100 00010001 if n := maxCap - e.dst.Len(); n > 0 { debugLogf("maxCap: %d, len: %d, less: %d", maxCap, e.dst.Len(), n) for i := 1; i <= (n / 8); i++ { if i%2 == 1 { e.dst.Append(paddingByte1) } else { e.dst.Append(paddingByte2) } } } } // 字符计数指示符位长字典 var charCountMap = map[string]int{ "9_numeric": 10, "9_alphanumeric": 9, "9_byte": 8, "9_japan": 8, "26_numeric": 12, "26_alphanumeric": 11, "26_byte": 16, "26_japan": 10, "40_numeric": 14, "40_alphanumeric": 13, "40_byte": 16, "40_japan": 12, } // charCountBits func (e *encoder) charCountBits() int { var lv int if v := e.version.Ver; v <= 9 { lv = 9 } else if v <= 26 { lv = 26 } else { lv = 40 } pos := fmt.Sprintf("%d_%s", lv, getEncModeName(e.mode)) return charCountMap[pos] } // v must be a QR Code defined alphanumeric character: 0-9, A-Z, SP, $%*+-./ or // :. The characters are mapped to values in the range 0-44 respectively. func encodeAlphanumericCharacter(v byte) uint32 { c := uint32(v) switch { case c >= '0' && c <= '9': // 0-9 encoded as 0-9. return c - '0' case c >= 'A' && c <= 'Z': // A-Z encoded as 10-35. return c - 'A' + 10 case c == ' ': return 36 case c == '$': return 37 case c == '%': return 38 case c == '*': return 39 case c == '+': return 40 case c == '-': return 41 case c == '.': return 42 case c == '/': return 43 case c == ':': return 44 default: log.Panicf("encodeAlphanumericCharacter() with non alphanumeric char %c", v) } return 0 } // analyzeEncFunc returns true is current byte matched in current mode, // otherwise means you should use a bigger character set to check. type analyzeEncFunc func(byte) bool // analyzeEncodeModeFromRaw try to detect letter set of input data, // so that encoder can determine which mode should be use. // reference: https://en.wikipedia.org/wiki/QR_code // // case1: only numbers, use EncModeNumeric. // case2: could not use EncModeNumeric, but you can find all of them in character mapping, use EncModeAlphanumeric. // case3: could not use EncModeAlphanumeric, but you can find all of them in ISO-8859-1 character set, use EncModeByte. // case4: could not use EncModeByte, use EncModeJP, no more choice. // func analyzeEncodeModeFromRaw(raw []byte) encMode { analyzeFnMapping := map[encMode]analyzeEncFunc{ EncModeNumeric: analyzeNum, EncModeAlphanumeric: analyzeAlphaNum, EncModeByte: nil, EncModeJP: nil, } var ( f analyzeEncFunc mode = EncModeNumeric ) // loop to check each character in raw data, // from low mode to higher while current mode could bearing the input data. for _, byt := range raw { reAnalyze: if f = analyzeFnMapping[mode]; f == nil { break } // issue#28 @borislavone reports this bug. // FIXED(@yeqown): next encMode analyzeVersionAuto func did not check the previous byte, // add goto statement to reanalyze previous byte which can't be analyzed in last encMode. if !f(byt) { mode <<= 1 goto reAnalyze } } return mode } // analyzeNum is byt in num encMode func analyzeNum(byt byte) bool { return byt >= '0' && byt <= '9' } // analyzeAlphaNum is byt in alpha number func analyzeAlphaNum(byt byte) bool { if (byt >= '0' && byt <= '9') || (byt >= 'A' && byt <= 'Z') { return true } switch byt { case ' ', '$', '%', '*', '+', '-', '.', '/', ':': return true } return false } //// analyzeByte is byt in bytes. //func analyzeByte(byt byte) qrbool { // return false //} golang-github-yeqown-go-qrcode-2.2.5/encoder_option.go000066400000000000000000000031661521051213400230030ustar00rootroot00000000000000package qrcode type EncodeOption interface { apply(option *encodingOption) } // DefaultEncodingOption with EncMode = EncModeAuto, EcLevel = ErrorCorrectionQuart func DefaultEncodingOption() *encodingOption { return &encodingOption{ EncMode: EncModeAuto, EcLevel: ErrorCorrectionQuart, } } type encodingOption struct { // Version of target QR code. Version int // EncMode specifies which encMode to use EncMode encMode // EcLevel specifies which ecLevel to use EcLevel ecLevel // PS: The version (which implicitly defines the byte capacity of the qrcode) is dynamically selected at runtime } type fnEncodingOption struct { fn func(*encodingOption) } func (f fnEncodingOption) apply(option *encodingOption) { f.fn(option) } func newFnEncodingOption(fn func(*encodingOption)) fnEncodingOption { return fnEncodingOption{fn: fn} } // WithEncodingMode sets the encoding mode. func WithEncodingMode(mode encMode) EncodeOption { return newFnEncodingOption(func(option *encodingOption) { if name := getEncModeName(mode); name == "" { return } option.EncMode = mode }) } // WithErrorCorrectionLevel sets the error correction level. func WithErrorCorrectionLevel(ecLevel ecLevel) EncodeOption { return newFnEncodingOption(func(option *encodingOption) { if ecLevel < ErrorCorrectionLow || ecLevel > ErrorCorrectionHighest { return } option.EcLevel = ecLevel }) } // WithVersion sets the version of target QR code. func WithVersion(version int) EncodeOption { return newFnEncodingOption(func(option *encodingOption) { if version < 1 || version > _VERSION_COUNT { return } option.Version = version }) } golang-github-yeqown-go-qrcode-2.2.5/encoder_test.go000066400000000000000000000072611521051213400224520ustar00rootroot00000000000000package qrcode import ( "testing" ) // func init() { // load(defaultVersionCfg) // } func TestEncodeNum(t *testing.T) { enc := encoder{ ecLv: ErrorCorrectionLow, mode: EncModeNumeric, version: loadVersion(1, ErrorCorrectionLow), } b, err := enc.Encode([]byte("12312312")) if err != nil { t.Errorf("could not encode: %v", err) t.Fail() } t.Log(b, b.Len()) } func TestEncodeAlphanum(t *testing.T) { enc := encoder{ ecLv: ErrorCorrectionLow, mode: EncModeAlphanumeric, version: loadVersion(1, ErrorCorrectionLow), } b, err := enc.Encode([]byte("AKJA*:/")) if err != nil { t.Errorf("could not encode: %v", err) t.Fail() } t.Log(b, b.Len()) } func TestEncodeByte(t *testing.T) { enc := encoder{ ecLv: ErrorCorrectionQuart, mode: EncModeByte, version: loadVersion(5, ErrorCorrectionQuart), } b, err := enc.Encode([]byte("http://baidu.com?keyword=123123")) if err != nil { t.Errorf("could not encode: %v", err) t.Fail() } t.Log(b, b.Len()) } func Test_analyzeNum(t *testing.T) { type args struct { byt byte } tests := []struct { name string args args want bool }{ { name: "case 0", args: args{byt: '0'}, want: true, }, { name: "case 1", args: args{byt: 'a'}, want: false, }, { name: "case 2", args: args{byt: 'A'}, want: false, }, { name: "case 3", args: args{byt: '9'}, want: true, }, { name: "case 4", args: args{byt: '*'}, want: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := analyzeNum(tt.args.byt); got != tt.want { t.Errorf("analyzeNum() = %v, want %v", got, tt.want) } }) } } func Test_analyzeAlphanum(t *testing.T) { type args struct { byt byte } tests := []struct { name string args args want bool }{ { name: "case 0", args: args{byt: '0'}, want: true, }, { name: "case 1", args: args{byt: 'a'}, want: false, }, { name: "case 2", args: args{byt: 'A'}, want: true, }, { name: "case 3", args: args{byt: '9'}, want: true, }, { name: "case 4", args: args{byt: '*'}, want: true, }, { name: "case 5", args: args{byt: '?'}, want: false, }, { name: "case 6", args: args{byt: '&'}, want: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := analyzeAlphaNum(tt.args.byt); got != tt.want { t.Errorf("analyzeAlphaNum() = %v, want %v", got, tt.want) } }) } } func Test_anlayzeMode(t *testing.T) { type args struct { raw []byte } tests := []struct { name string args args want encMode }{ { name: "case 0", args: args{raw: []byte("123120899231")}, want: EncModeNumeric, }, { name: "case 1", args: args{raw: []byte(":/1231H208*99231FBJO")}, want: EncModeAlphanumeric, }, { name: "case 2", args: args{raw: []byte("hahah1298312hG&^FBJO@jhgG*")}, want: EncModeByte, }, { name: "case 3", args: args{raw: []byte("JKAHDOIANKQOIHCMJKASJ")}, want: EncModeAlphanumeric, }, { name: "case 4", args: args{raw: []byte("https://baidu.com?keyword=_JSO==GA")}, want: EncModeByte, }, { name: "case 5", args: args{raw: []byte("这是汉字也应该是EncModeByte")}, want: EncModeByte, }, { name: "case 6 (swedish letter)", args: args{raw: []byte("Övrigt aksldjlk Övrigt should JP encMode?")}, want: EncModeByte, }, { name: "issue#28", args: args{raw: []byte("a")}, want: EncModeByte, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := analyzeEncodeModeFromRaw(tt.args.raw); got != tt.want { t.Errorf("analyzeEncodeModeFromRaw() = %v, want %v", got, tt.want) } }) } } golang-github-yeqown-go-qrcode-2.2.5/example/000077500000000000000000000000001521051213400210725ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/example/go.mod000066400000000000000000000012701521051213400222000ustar00rootroot00000000000000module example go 1.19 require ( github.com/yeqown/go-qrcode v1.5.10 github.com/yeqown/go-qrcode/v2 v2.2.4 github.com/yeqown/go-qrcode/writer/file v0.0.0-20250211110803-2fa59f4d4375 github.com/yeqown/go-qrcode/writer/standard v1.2.4 github.com/yeqown/go-qrcode/writer/terminal v1.1.1 ) require ( github.com/fogleman/gg v1.3.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/nsf/termbox-go v1.1.1 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/yeqown/reedsolomon v1.0.0 // indirect golang.org/x/image v0.24.0 // indirect ) golang-github-yeqown-go-qrcode-2.2.5/example/main.go000066400000000000000000000010211521051213400223370ustar00rootroot00000000000000package main import ( "fmt" "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/standard" ) func main() { repo() } func repo() { qrc, err := qrcode.New("https://github.com/yeqown/go-qrcode") if err != nil { fmt.Printf("could not generate QRCode: %v", err) return } w, err := standard.New("../assets/repo-qrcode.jpeg") if err != nil { fmt.Printf("standard.New failed: %v", err) return } // save file if err = qrc.Save(w); err != nil { fmt.Printf("could not save image: %v", err) } } golang-github-yeqown-go-qrcode-2.2.5/example/migrating-from-v1/000077500000000000000000000000001521051213400243405ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/example/migrating-from-v1/main.go000066400000000000000000000025231521051213400256150ustar00rootroot00000000000000package main import ( qrv2 "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/standard" qrv1 "github.com/yeqown/go-qrcode" ) func main() { // draw a QRCode image with // - "https://github.com/yeqown/go-qrcode" source text // - circle shape // - blue foreground color // - white background color // - 20 pixel block width // - 20 pixel border width // - The Highest error correction level v1() v2() } func v1() { encodeConfig := &qrv1.Config{ EcLevel: qrv1.ErrorCorrectionHighest, EncMode: qrv1.EncModeAuto, } qrc, err := qrv1.NewWithConfig("https://github.com/yeqown/go-qrcode", encodeConfig, qrv1.WithCircleShape(), qrv1.WithFgColorRGBHex("#0000ff"), qrv1.WithBgColorRGBHex("#ffffff"), qrv1.WithQRWidth(20), qrv1.WithBorderWidth(20), ) if err != nil { panic(err) } err = qrc.Save("v1.jpeg") if err != nil { panic(err) } } func v2() { qrc, err := qrv2.NewWith("https://github.com/yeqown/go-qrcode", qrv2.WithErrorCorrectionLevel(qrv2.ErrorCorrectionHighest), ) if err != nil { panic(err) } w, err := standard.New("v2.jpeg", standard.WithCircleShape(), standard.WithFgColorRGBHex("#0000ff"), standard.WithBgColorRGBHex("#ffffff"), standard.WithQRWidth(20), standard.WithBorderWidth(20), ) if err != nil { panic(err) } err = qrc.Save(w) if err != nil { panic(err) } } golang-github-yeqown-go-qrcode-2.2.5/example/simple/000077500000000000000000000000001521051213400223635ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/example/simple/main.go000066400000000000000000000020021521051213400236300ustar00rootroot00000000000000package main import ( "bytes" "encoding/base64" "fmt" "io" "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/standard" ) func main() { qrc, err := qrcode.NewWith("github.com/yeqown/go-qrcode", qrcode.WithEncodingMode(qrcode.EncModeByte), qrcode.WithErrorCorrectionLevel(qrcode.ErrorCorrectionQuart), ) if err != nil { panic(err) } // save into file w, err := standard.New("./simple.png", standard.WithQRWidth(40)) if err != nil { panic(err) } if err = qrc.Save(w); err != nil { panic(err) } // get bytes buf := bytes.NewBuffer(nil) wr := nopCloser{Writer: buf} w2 := standard.NewWithWriter(wr, standard.WithQRWidth(40)) if err = qrc.Save(w2); err != nil { panic(err) } // copy base64 content to converter, then you can get the picture // https://codebeautify.org/base64-to-image-converter fmt.Printf("encoded base64 image:\n%s", base64.StdEncoding.EncodeToString(buf.Bytes())) } type nopCloser struct { io.Writer } func (nopCloser) Close() error { return nil } golang-github-yeqown-go-qrcode-2.2.5/example/use-file-writer/000077500000000000000000000000001521051213400241155ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/example/use-file-writer/main.go000066400000000000000000000004321521051213400253670ustar00rootroot00000000000000package main import ( "os" "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/file" ) func main() { qrc, err := qrcode.New("with_file_writer") if err != nil { panic(err) } w := file.New(os.Stdout) if err = qrc.Save(w); err != nil { panic(err) } } golang-github-yeqown-go-qrcode-2.2.5/example/use-terminal-writer/000077500000000000000000000000001521051213400250115ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/example/use-terminal-writer/main.go000066400000000000000000000004571521051213400262720ustar00rootroot00000000000000package main import ( "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/terminal" ) func main() { qrc, err := qrcode.New("with_terminal") if err != nil { panic(err) } w := terminal.New() if err = qrc.Save(w); err != nil { panic(err) } //time.Sleep(5 * time.Second) } golang-github-yeqown-go-qrcode-2.2.5/example/webassembly/000077500000000000000000000000001521051213400234075ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/example/webassembly/.gitignore000066400000000000000000000000541521051213400253760ustar00rootroot00000000000000com.github.yeqown.goqrcode.wasm wasm_exec.jsgolang-github-yeqown-go-qrcode-2.2.5/example/webassembly/README.md000066400000000000000000000007311521051213400246670ustar00rootroot00000000000000## WebAssembly Example This example demonstrates how to use the `go-qrcode/wasm` pre-compiled `wasm` to generate QRCode image in Web browser. ```bash cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" . cp "$PATH/go-qrcode/wasm/com.github.yeqown.goqrcode.wasm" . # then serve the index.html in browser python3 -m http.server # it serves the index.html on http://localhost:8000, you can use another way too. ``` after that, you can visit http://localhost:8000 to see the demo.golang-github-yeqown-go-qrcode-2.2.5/example/webassembly/index.html000066400000000000000000000035451521051213400254130ustar00rootroot00000000000000

WebAssembly Demo



golang-github-yeqown-go-qrcode-2.2.5/example/with-custom-shape/000077500000000000000000000000001521051213400244535ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/example/with-custom-shape/main.go000066400000000000000000000023261521051213400257310ustar00rootroot00000000000000package main import ( "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/standard" ) type smallerCircle struct { smallerPercent float64 } func (sc *smallerCircle) DrawFinder(ctx *standard.DrawContext) { backup := sc.smallerPercent sc.smallerPercent = 1.0 sc.Draw(ctx) sc.smallerPercent = backup } func newShape(radiusPercent float64) standard.IShape { return &smallerCircle{smallerPercent: radiusPercent} } func (sc *smallerCircle) Draw(ctx *standard.DrawContext) { w, h := ctx.Edge() x, y := ctx.UpperLeft() color := ctx.Color() // choose a proper radius values radius := w / 2 r2 := h / 2 if r2 <= radius { radius = r2 } // 80 percent smaller radius = int(float64(radius) * sc.smallerPercent) cx, cy := x+float64(w)/2.0, y+float64(h)/2.0 // get center point ctx.DrawCircle(cx, cy, float64(radius)) ctx.SetColor(color) ctx.Fill() } func main() { shape := newShape(0.7) qrc, err := qrcode.New("with-custom-shape") // qrc, err := qrcode.New("with-custom-shape", qrcode.WithCircleShape()) if err != nil { panic(err) } w, err := standard.New("./smaller.png", standard.WithCustomShape(shape)) if err != nil { panic(err) } err = qrc.Save(w) if err != nil { panic(err) } } golang-github-yeqown-go-qrcode-2.2.5/example/with-halftone/000077500000000000000000000000001521051213400236435ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/example/with-halftone/README.md000066400000000000000000000016551521051213400251310ustar00rootroot00000000000000## with-halftone > 🚧 Notice that could not use another shape except for the rectangle since > the gap between qr blocks could mislead the recognizer. ```go var ( transparent = flag.Bool("transparent", false, "set background to transparent") ) func main() { qrc, err := qrcode.New("https://github.com/yeqown/go-qrcode") if err != nil { panic(err) } options := []standard.ImageOption{ standard.WithHalftone("./test.jpeg"), standard.WithQRWidth(21), } filename := "./halftone-qr.png" if *transparent { options = append( options, standard.WithBuiltinImageEncoder(standard.PNG_FORMAT), standard.WithBgTransparent(), ) filename = "./halftone-qr-transparent.png" } w0, err := standard.New(filename, options...) handleErr(err) err = qrc.Save(w0) handleErr(err) } ``` #### input image #### output image golang-github-yeqown-go-qrcode-2.2.5/example/with-halftone/halftone-qr-transparent.png000066400000000000000000000153321521051213400311340ustar00rootroot00000000000000PNG  IHDR%eZyIDATxю㶚9+g $.)m*do?@PqB '@PqB '@PqB '@PqB '@PqB '@PqB '@PqB '@PqB '@PqB '@PqB ~ϧ8~.[qRqB '@PqBM$rUwl5y/k^S)>e''@PqB '@܄3 »l;I '@PqB >dJ(4n8OyoqRqB '@PqBU+I\ծ^N2I '@PqB (wI N(8SI>|z:>~ N(8 N%)rU9w|s){ɺ9)8 N(8T,+׼K]s%^W@PqB '@Pq*IjOW^H G-؃' N N(8 N(8:ZQ߿ UOלXTÜ@PqB '@Pq*IbΦ\s)\aų9e> N(8SI>U!*WߍwKjVwI '@PqB 28W%ܩq}wow} 8)8 N(8TB ~OWa4g;%{ N(8P1vUC߱b؟^^^^SIֿ@PqB '@PqB '@PqB '@PqB '@PqB Ox7?;ssb>+O;a/yV`#N N(8 N(8_tߔ)\:ϻբW'uBU2I '@PqB  x+e0jX؈ N(8 |ȊJ)VԼMOw{]~3lI '@PqB W$rUS%۔qלb|޽ N(8z]UnŚO~]Ͱ)''@PqB '@ N(8 l菋k2Sƹ”RSv8)8 N(8& tUc|grRqB '@PqBĩWcW+wIE(;΂=vRqB '@PqBĽ>=_pUuߜp+ +N qcz~mrͧ^8''@PqB '@܄ʨl̝]~d;}8)8 N(8&T*߷SqRqB '@PqBMbzV{x+~+L)\ߔ\[@PqB '@Pqck~N[|iO>I '@PqB .pєg a;N N(8 N(קƻUg+*VskP|W=SO>zv>zZ޿I '@PqB 76㭨|.q ?v{~I '@PqB VT7 N(8 N%]U7<|rսpW~6Wϝ9Ŕ{iwzVN\q''@PqB '@*&< <w{ٻgc8)8 N(8^՛tWcQ3pRqB '@PqBĩ$e꿝j2W{9SW2e}{is;9r^_ N(8SĮVM+jwSEakMyON N(8 N(8uY'Ԏ^]VNI '@PqB 6tUvBl5W2<:ʔë'׼i>6,^: N(8 NSNc9| NW>I '@PqB ]{z?][yBMNUujw}{i:pAN N(8 N(ק𛞮k8\tjGttN{kܕ*POKeO諾^ ''@PqB '@z'vt];t-TaNaξoʻY;5qRqB '@PqBĽ>=k.qE] N}"\58)8 N(8T۔/|Nu+J+ON5;͝re|^V;Q޿I '@PqB 76 n۔ghZ+;Uad>2'NbmNx N(8 T+vϫOӺ[[pRqB '@PqBTwU{[q)v+5Z+Sʔʔ=eۧ)N>I '@PqB Oکt;UMYʔ|7کv%I '@PqB 8 85hLbZ>Ϛj8)8 N(8T۔{{ZyWX_VXwWvzܵ\`ĕuSi N(8S;ܭ,pBӞ|m;ev+;Uv5eO0N N(8 N(קOW~jXf|O N(8 N%Mi;NvZuw])+4 l=Ly6W)~$''@PqB '@z'nӕlw5p's[Qo1)''@PqB '@zU`<\Yj>}orRqB '@PqBĽ>=tU]uj58N0eˊ*ŝʔwݔkTyה{)޻ N(8 nlmݭ۳W);~YI '@PqB V%~{*SHsRqB '@PqBĩ$e|Ŝ@PqB '@PqjzVz~B j._I '@PqB xjZQjzsRqB '@PqBĩ$*vۻ;Ϋ;}>Oާ\sCO?|.I '@PqB  ~ϔλUOn:Lr$I '@PqB W$U͵)Uu+ižCjή}J1 N(8 ZI 5ڼ)5'O'+Lk9)8 N(8T~:c;UkOWdzX\0N N(8 N(8szڕ#~ъ{KWEļA}hNwruJ])I '@PqB f[5˦qT|N++iNsRqB '@PqBMbZQuw|ڔ߹gop{lp+C|I '@PqB `8թ{;g+ozԻ>O I '@PqB XaE=k>]tNoZλܩvpwOFSSqN N(8 N(8 +*ּ͔{Rzהq^YQs0O2gSSqN N(8 N(8纪ͻ\Qwyd/Oi,Ü@PqB '@Pq*I VSŠ+-{B{))9)8 N(8T++_sr} OWSWyFS/rRqB '@PqBĩ$}\$+ׄ}<+| N(8 N%)\7e>WԎX){i8gS:ޝ@PqB '@Pqj^S}8];9{ڊ5lI '@PqB >dEMᨹ޻3ٟ5"I '@PqB W$ֺ[Qiy5Ow{WM瑜@PqB '@PqꝦT XﳯX۝t;8)8 N(8ʜ@PqB '@PqB '@PqB '@PqB '@PqB '@PqB '@PqB '@PqB '@PqB '@PqB_O9 IENDB`golang-github-yeqown-go-qrcode-2.2.5/example/with-halftone/halftone-qr.png000066400000000000000000002414131521051213400265760ustar00rootroot00000000000000    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((+ (+ (+ (+ (+ (+ (+ (+ (+ qyVO{Q@Q@V~'ypo3g=EhQT[MmK-/W(Z̲lTq*V4Ķ%ѡ')$r_Ĭ AVQEQEQEQEQEQX,ޙy%4Kc '# uoż9#`FApA椠(((*g%|#Ee$+/M.5ӪhnV 2Bq}jPEe^%tk56v@DrF@b2ϱ7zwp]ɝA G@(n".4H&gbpI(((((+ (^ ԼyͥsC0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x>0T8ZP^  ho5G3?%x))Or\Ҥٽ Bs Xw7jEE_0WC²訨((u; ??v=㧂|E ?eGۻg;[t YK5(gݮERp6oZ( x[Yo,5?]I<ʞjI1:(>Xg~2//2P\r4TFAkz((((((p^#jN._BŠxgrWP?n4vwV}3&vơGEQEQEQEWKD|GVt_OqoTݶdcMvPw\Ҿk&)2HF'ʽ(5;Weg_kOHYxq$;ч^D|9IukAyoWۺgaʒ vP_,xOhwkk[3E,p'=QEQE/2}[VtoXrݶS8#G"v7gt; ]>p;]cP#Jآ ( ( ow:@%{]'<*擦ͬ6:]FGoHHPA8':+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƫ` F^?^8C?'>(((((+ J`?lU=CRب( ( ( ( ( (<ow:$](@jEE_0WC²訨((` F_O=CRث(w-}[o7CnWv<8ɯp+վxWYoKCYYn$c 385QEQEQE3I[uVo.yc8q^^W𮍬\Gq4EK#0q+(Wտ]X;n1o,oOg7~.1߭nxZo4htR{`n]Ueܬ1=*~hs}7ۼ3n=sڀ; ( ( (<oW?(/>V͛?lJqXտݵ#n1xƏ7߷9ܭ炼FK绚 n՘1U\ Aր:J( ( ( ( ( ( (<?}>^ѫ,׵zm{Lռ'֑\[lށ83\?~ xo#/uXoH% ڊOEttmKi +xi,U(' z ]<=OIn|wBs/OOL|_c9?ywllwu^i:5p,[ѐ+RFA5[৆#;MrU~ĞXr`cހ="(@%{]'>6^I?P5a[_AO(~Z~(((((( +?g(zѱWװ~?PIb袊((((+ q*Ox{%PT6*~(>)|R>#N'ˋ찾УY 6^I?@tCI[(?vC$~!Vn]a+7G.߈0䕿?>ƧO2OghԱdҶ+' *E-t$:Du$P**jEE@EPQE{%PT6*~` F]'#:3yX3=ŠZT.]NDY.iX/,II85Q_xƞ*׈mKZGw򪢉Xlgf{KA!3r2 yg/ώMoRtcyT7 H 4]WΟ|Kh:J#vRl$)8gPtWS[^_wu'i2;byN ( +>ږ[/P8ѤbTV$ڭo/w.q=Š((((+xV: u`SHUTQ+ W~L[X]iuh$1xFA#ugW_@d]<͈d$g. +O%״oXzޥciGkt)o6Q3+_j tk6^I?P5a[_AO(~Z~(ox;Pھ~97m8^A  ?%oV^@  ?%ouPCI[?vC$y~!Vn]a+7^E}oS:ϋy^}=AW< 2Տ^^?8(((((+ J`?lU=CRب(>@%{]'ow:(((O<5`_W?O'UZ(6!J#+Huw҈ +IaY?TU}?8xk^Ѽu}qh H%իĥ؎`p DZ袀 ( yᵷX$/$0UE$xs\]iͅZ̟du$0LzV>K&iu=N[+8>2yHw2f$3w?Q ߃kc_0’BN?I|C{'m}? ߃kcG'~C?U| K ;o+'1kd!2e #ʀ>51ס*P>z<}}\j7mbpG Eh’BNס*Zoj:q6V < NھXk 8˫RSp 2x$uh[^ڶ{<2_BwB8W$@P5h:4MJ$ERlG8tQ@WRo5[Y=|Ⱦ3ܡ*<(mg'kuM #r0N# b ( ԼK okzm;䌀dcZ%OT6Z^S Y3h$#`pÃ*y/$:Db4F]exfONvd&=((((>/Sm,2T$sFJ`dր;( ( (#xmm常8` $Q@$יRt|8մUu;'ɲIl͵8Ubp8xIu`%%{B';O^״o_\j&ci"uj)o6#Xqk(@%{]'>6^I?P5a[_AO(~Z~(ih׀W_+ѯ(((g'dQWW?O5 ` +?g(zѱWװ~?PIb袊((((+ q*Ox{%PT6*~(>6^I?@%{]' ( ( (>' *E-tI熿k Huw҈ ow: qyVO|_O?O5 `((((C/nkWxkoiơ4WH)b zC/nkWQEWYMxVwVInu#푵c;ײWG 6OE~c.{Qw&VnCWq@=vXcڼyfݲ2} nzw>t/h*5KCFh,acRQ3]PEP^৉<]K\ң$mꧽ{6mºFpѴVPђT RF@8EQ\Ow/_1=;WMԣ/@㯈?k[_M3"#cfs/L>,M犭uM. `-nUv1jOceģ?oaqk>k߄| wZVn(һ =v._TY ٮ#Y ܰˢ>u |kߋGiYj]oAH{Wh_P~5=STh%[u[TV`Yw2aJ᣼@sChiEK_0Pn~!Gx?ט|8? <;;W_ SwSmtn~! կ_e)P5a[_Q@Q@W뿴?'u='o;7rywrgMX>ӬXO(5`cRHHPXdN;wSĞޛ_RZ d.wD0 `ua޼cP5a[_QE+5Լ[]SKiKv[fP6Z?Xmc|/fs;qO h.ӣ,keO5À@9BF?Wǂ|;`icV;Inv8@x?O~$-J!s$s$ |=b}[VѾ}>2_LQ¸7<5MWH.50Bt @'>ShKu5 pAG6fmagkkC n'j(FO'_zuͅ~eO ɸzP'}cޱkm3SK`/U]G<ӭu>Uh |b [IѾ}._Lw)S9G" CÍ7Mnϵ66yx_Z h><֩]P۪ȊB#dF9˞M̭oFIaY?TT8?ZWΞ%aѼUv#Ae{5m!A_usyyWR?,p$to VS\FMRȅ8dzO_W/xy+OWwx擩Mk6:\Gq R8 #W;OxM촨nRbw&B:^!;}OZ~e֡o ɸ(a'}o|-o55m'F=~3ܥO  (+Wwxow:< %_ѫ\t ՠ袊[x{52 (((qyVO{x$P** + q*Ox{%PT6*~((((( +?g(zѱWװ~?PIb袊Ǿ;//?]IOe 8« 4?CAEsx?M4 4?CAEsx?M4 4?CAEsx?M4 4?CAEGoop8*(<ow:$](@jEE_0WC²訨(((+友,&KYik/d0FN O_S'MO△yaVO#dYI"6 08 €־RCS;XZV J2Bq}zƅhkiWwټۼ[2:z{YՍƗjW.4*e8%A8Wwx?/·^džiLy$&gcI+I5 0S\tM}&/"-HR"PAA?k¶5kgf{KA!3r2 |O(~Z~>t]{YW.#wWO*b#>澋+Wwxow:< %_ѫ\t ՠ袊-[򿵴'>_]qgA<B(OЩ&A<B(OЩ&A<B(OЩ&A<B( zno03haX r(+ J`?lU=CRب( ( ( ( ( (H)>2/>k&O&\ 7>tyCI\oJ ?%q (]?a+7G.߇0(v<$?~Wn@>tyCI\oJ ?%q (_??h,ɻlǖ@M|EWC²訫 qyVO{Q@ ?%qu"xWڌ32}XN]@󮢾` F_O\~K'umgm",Ϸrx k>6^Iub5=F].HaON7;dIk< %_ѫ@oEw$ݷcr>5Fw;ϵǧ,SLJHHÀz0V^@G-|8t[Y=wf}vx k,/=:O2$F` FAkO<5`_V~յk̗c>pZ ?%qu?SxNC]rY$a=~u^?82yHw2f$3|-[/|Gum[F=w/ڡ}u+y p+ %_ѫ_okhvkPI<ԏ# ua'O_?j97mܽ}k[AS'|# sU%Ԛ̩yd*]?a+7_ Q@{_[zueI4/8<:A3ZLkEK}O'UZ(?[hڵ`Kn 8PI?oJInQ|@_yCI\<7tc6^I? [2$mu y}EKN=+oJ ?%q (]?a+7G.߇0(v<$?~Wn@>tyCI\oJ ?%q (]?a+7G.߇0(v<$?|EW~?PIb` F@OEQEQEQEQEWx3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|E}? k5G3%|_O?O5 ??jx+M6w455ӫ0bUF0tQE|E}? k5G3%p=CRثA6SO-[HK+dmE9P_ |mۿ__kAO(~Z'tmfT5;I*Y0Q@EPk+|8 }Z_;;:c|gZoUksIptQ @}O'UZ<7iכ 0lOE6FF;xB E 8.WmCۿG^X)ݟ9w𭮩SO-[HJ;dmE9ƏgZ_;rLwOjEE^\߂FK绚 n՘1U\ AֺJ+ ??j>`` F]3%t MYT)ݭnFP6Z(ow:Wwx5 ºυtRPV{(n$X(g@ N2}Mx?k¶5kP5a[_52O>5Լ[]SKiKv[fP6Z_`ֶ>gDuo@}Q@oI熿k SIF6KE ĀgWAᯏ*|Uiw~^o#G $fB3h6!J#+n;[W$GjgK\jEEG3%w V=m/Kh%kkV`Up6aoZ(֛#Ki mh )# /??j8J`?lUp~ MYT)ݭnFP6Z(>6^I㯯SS~.޹{uuzA,aT2z(@$Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0Q_O8?ZQ k5@0W~?PIb??jO|&|ͪiwznR#(RQNrwQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+xq$`я^}aggiݬ AS,=Ghwj 鑋i3Px%IU8߅|]i_k! % a:#׮o*NaC^?D4hi:M`Žn,ybIɭ _j tkޙy凇Kh, # xOx?;1ɻo77OZ)g />uIGSд}oҬokIvgqt7Fk}/OGk ĥHPpϰ>6^IwizkkC }%2p_WxOz䗗ҮGlXU  h4FBeIvTj-oQÍ[Vn>}˱_nO <9U{ =NK;H.dgHʞ>kzſh8-(6,fWD ~Y`sӁ^ K ;q+|5 qmK[TdaZнrR_?^ۏ9^Ey)//< j6zuk*M sԂp@]QEQEQEEƙ_ZʓBAAS{Gߊ^2}'IյXy}ݶaʠ#pCu[EK$ȡʠ+ oLUy4QAHhb(((((((((((((((((yV?-{x$O*Z(((e?x{3Oj(xn⸷9$l]H #kj6v|$[qGOQRi۵ƗZ_@QeP#8 WtOch}{wy{~ kt|# rRj2e qr*ßƞĺ43$K ܯzqj03Y.X ,@85r_x6C]zLxA΀;3]7'Uq}%ٜ;IpzЯx;{Oھ97m7}8^@,ޙy%4Kc '# ֤uoż9#`FApAt^#jN._BŠxgrWNLnayuk2nkjdppA@(xO~$e:[;]B{)#EfwbUI_Wzvv Ү`GlNOG,n5?qWZ}07;FFO$ ~ß[VѾcK_n]G H >((((((ow: Huw҈ ( ( (((((((ς/xVK紆xRTG\ 9qֻ(gKC?|aA-ƫ&Mslٳwt:[;M[y^"6_@!  ho5G3?%}?^؞!Emhm߱ǖqg48ZQ  ho5_O?o l/7ݺEOnN>0Uklfwݱw*|tz>|`' M\ksEۍ=((OV_T4ekI ܰSY>0U3?%>0U3?%{oj^֗Oi4޽µ(R;NrwPEx:϶}ۼۣWY7cj Sy>Oۭ"nٽmqg4(((((';_/ot{ݞqn4/y6sn6/P((?BCi?y?nݳ{ݏ,g2+(((u?Ojz}[+v8phBt:#cWyv|^Q^7o+h}+f͟6sۥh|8,\j`ngjj(?]ovb9j (/m/֋s]n673>':3ol{9۞(((?}>^ѫ,׵zm{Lռ'֑\[lށ83@QEQEQEW뿴?'u='o;7rywrgM{W?o l/7ݺEOnN8 7O/?ڼ۶6n:`(((((((?_4`ֹ>gGEoW<7z4^=Kp NmU޵Q@y^ ºγ}\j{q%ċ XOT O]˽I㵺ٽ`muqATv(WmzڦwM}˱_nO <9.߈0䕿诐?vC${O>.my_H8@V?))x\cٽ 0j* =wIaѴk.ݤh,㷍 TP3*QEQEQEQE ×zku{8:\߂h>f4Jikv[)el9Aֻ(((^ѵRPZ{+#Y&d`F2=Ez|  ?%otyokkGll񍬿=sڼCo?J?x?e>]Ocnn3Ҁ=; vh7C(?᣼a@MjZ΍}i2{o%2 T+6<-K\ .wIԔ;F=?᣼a@Mk_`ֶ>gDuoW<g^6iA-\3]Fmu޵@ o;^WjSk:p\H3bI85Nh7COƿx×zR]\`ꣵyx+ƺM. IݭnBVsk迃?0Ȏg;:c|]ٻګ= ( i:5p,[ѐ+RFA5rY}qx7\˺&6*px8 u?<7kV$PFC#.߈0䕿G)^.冹==T5(+xV: u`SHUTQ+ QEQEQEQE? Ongai=ԞF`' 98¾X*k.~jEE^'?T?]7_Eu-wc;jr:u D|@`2ϱ,i;j!HsdA$5_ILy$3I$I'QEQEQE|JnOGOx^!. jw)qʪ%`b; z f⫟=c?h} G?ҬlXYk;H.dxĚ-ݬ~gDlA!Rpp@?z[RѼ cqv344LWʔ { R?xuoOmV7f|q8OA^_8~IyfpoǛn#8+; z a珋,&KYik/d0FN O_E.y 닉dytgI;IyG ߃kcG'~C?UtW? ߃kcG'~C?UtW? ߃kcG'~C?UtW? ߃kcG'~C?U|Ox^!. jw)qʪ%`bîס*NC^y|-o,.紺4s<`# ז|.T+L;Cy Čs^ ߃kcG'~C?Ut7moRݣx( @?0Tw?P? Onyw=Ԟ~,y8»; z a51<O]x%f]N$KY]L #Wuw?Q ߃kc@w?W~9?i>pϕ'h+ (˳̑ݝ}FszU|Du5WRD&T5;z<qyrdݵ9r+M3Q|Y^쓝 J7i%կ2tFKCW-Ek@w,#8>>뢼; ??vh7\ +᣼@sChuğ<+F; sU%ԑ >,BH(uSVƉ#մXϻ˗c&T#_&|YZ\p["푵c;y_#M7CdwFP`õ}\=jz]]JŸdnv (L :/ ;_:xkRFV\,7,`*p=E}Ey5o#,Xy ڌ$HOE=(()x7ÚN d_ePÕB gyCI\Wwx{k =w̺!>8@Q$u[hڵ`Kn 8PI<5CxH.F0 G @8'ƿ aeuuly *9Oj]?a+7]i7hɻl(Agƺo"x;Եؓ6Ĉr#EPdž-QC]q<ԏX~uc [G&n|&?]jsA-۪ڢ.c{V?ok~kD\=qڀ< oGi:7,gSv*xgrW^_#M7CdwFP`õx}ƙ^GZ̛HaWOP>*Ku`5]pH((+AONм[h_p 8/GZ |}]#Ky8b*Y)#2A@:QEQExoߊ]I_kS ?"$a?:MGÚNo{6oW۹CTx k>|Y|[/TԦ[׸VBEs=+K?xR,#;[+bN8!{/EPEPEPa|-x5m'FE~ nO An4F?.WdRC =+>k߄| wZVn(һ =v._TY ٮ#Y ܰacq6qWR07;d2H]F^յm0m%T/s+y p+?P5a[_O xa$]y[v!QHSڀ>(jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7U:KJ]rYxp#aq  ho5^Z+uM0T8ZPoϋ,4;?GHN\Շ]G)//[M^MRM lVGf ]'r(d?I|C{'mqމsXIխ}2-w(aʒ }^৉<]K\ң$mꧽzǁ?xkV)kbLӮo$mby}EҩkMF𮑥4m=64d,2=%f|+v{e5m!!C:C@z'/XIu_Oˋ&Xɮ¼OxGzn{IkkH%1Շz((((((+_X~ݭϛy:sQ@?2G3/MM|`|?ɶv/=S7u/xVT x^VTDl9sҀ< wLwnv߱N3&+վxWYoKCYYn$c 3843%s> xo>Ե VK_+bO,eQ@{]oiqn4/y6sn6/P<]KzڦnH̡K+dme9GxWƺ<+ujZC*4?FX/oaP]’3!5]QEQ^_<#KCҤ [q 29_D[kjN{7yrg۹J<9Q@s'O|c_?eH9ڽ}+17m:t-d漙r'.I+友,&KYik/d0FN O@>/Lagv0 ;Qd`%2p^OROxp(c/Exo'#IadS3'.@Ԟ?* o[|GOjho.MT(@袀;; w̵>܌a(c~)|#}H,RI$0?*x?e>]Ocnn3ҹ((((ǍE`jcV;1ɻnv8UIgڌwB$x@Iz(:]mbHaO@vdNk ( ( ( ( ( ( ( ( (: DWt,4=W얲JfdxLm/.T\kN ֻ((oo|GOj7/Kv 8WpWaEW4k 8[XSq;Q@ 2y8uSӮl/#-nxfMnF0dҬQ@~ մnTϷr<3x$r+(((((((B5G?t'>g-]򱝠8=} n|u-wc;jr:u D|@`2ϱT ( ( ( ( ~ U=qqf"I$UJJ9}EV~յk̗c>p\.߇0@>>k^|ucq蚕 F%ʡN PFpAǸKuxo:7/;ϵ)xFч@_X^iYOiu7_-q# [rum7YՍƗZ_@dhZ̲o6STq+D[/jNyrݵ9?xkV)k i /#txfMuC =+b8f{<Nrp?|xk^ѭT5+,V8'ƾ7mg u2yG '.@( [G&sQEp@wIԵz}-+!A8>d-cD򿵴;>_-q #v<$?yOxw??>;2GwvOJ( ( OZxT-,`m2DY.X,@85tP~9?i>pϕ'k袀 (7<<6:ıZ$QDI$澋  u;iWwRy!9S;XZV J2Bq}aI_XyfnoǛn8+(X?jvy&I`~=&/"-HR"PAAEQEQEQEQEQEQEQEQEQEQEQEQEQEW?|+6:]CPA8dJ xS}++?nn|Ìow:$](@jEE_0WC²訨(jP5p4V\HX)bH[_];MU~Ǟ( rDSڻwLOۭ%vٽ Fq"?} >~>^Ѳ}0ӵw5=STh%[u[TV`Yw2aJ?@O/Mi;vy{)u{tw?±k>|Ms_lٿwtj߆<#M7C .|tz0Ux5oy7mmynp۳cvQEQEqu w뵶+Gm1ހ95760>Uz|_j^aI&[uVve YrP[G*_?`xVhW;W;PEPEPEP^o$w-5 *;[yd6!Ozzt;:#l/y{H|n^z6iw Oeq%%K#$dA_sڔ:6}\,,`*Xp=E|9~!o'uܷ>V7m3W)OG>ߵ}|ݜdgȠ7hvZwW[WFo?Yi$"3 8·_5᣼@sCk~.&Yj]y[x6ʎrDSڼ(((+W/k3iz\\3];* X.;z7]Ï¿ ƭ:ѭ?]vv1w_5`ֹgGv͹_\}z߉𱿲Q7^|~)Oxr\ң߱'@kTVfѵ.i$$dbq+<X}g#?1{W뺟߈u=[~w-ϕv[np38EP]~k>sc|3n=qڸ_\jģCW[6oa(ƾ ԼåMϲۤg8u]y^ºγc{qm$1  OTпgO隷%>wn81 k]7z4:Kp궨deOoɶ>_EoG&n|#n7/_ \jCWy[6om((((((((((((ox;Pھ~97m8[2_Zɧ̟gL@N]IH[>#qڵ/v*n3@; (1S?xrCxnox]\`GU|A-sƫ(q^ |Ms ptQ ]%Q_8|R/|Gմ'Y=Oa}F<y$k'}q7C̺5,p8$ "x>Եؓ(wJrWmCۿG@>xν/Ta+VՋe1=+SÍ?a<:.wo^_].my_H8@V?zE]JmºnVS\FT!`8___ާ\^keO H`C 'u0n~&ν/Ta+VՋe1=*N}'Iխc?Ev]*Ax5)//(I|<{'n?нr>@%’yBN((+ |?Nhh%TɻlΣp|]?k¶5j,mkqv0vFO'7ٵ=2[93SFѶ8eq4W ~)x'V~c?EXSv]*@<> (<'ƿxGzaeIkkly␹9ՏjM[RYoKgE2IOow:(&?N[;̋{&T9h_ÿ GwK5ɔ1HñT~UQ^S߅|]sJ]z¯c a:Z&ψ'ˋ{>УXy$h(&?N[;̋{&T9kR_?^ۏ9@ Q__’yBN?I|<{'n?yÿw4rUސKAWAc'8?ZWh& 'I=ŏ,I}˱_nO <9>"x25_ǧʟg<80QAx((X~2/52Pd$r4d&FA=+z(7g> >u&I&P!#~6}Ocn3wQ^QEQEQEQEQEQEQEQEQQ<6\K0DF dOhJ+Ş#wu&vCr;`p ؠ OB+[Js%ٜgp:z Mtݭ>r+!@>®Q@a \KqqirI%LJynV4Ķ%ѡ')$r_Ĭ APU{=2K--cFI V^]Yk}/[oT.$ d$$ Ԡ KZpNdIX.I, I85rL KX#pIj]F[}S[lgd]$LW$d cgyawݬ4 H8a~b(Huw҈ jEE@}? w^_J9b2pjA6[0D#5 `*J(Ɠk_[$3Ŧ\rFYDG kKxSݬ Hʓ+x·^ tiLH&gc I%ywRgd0Fdv$G'P|tgWi}:u ʡ؆@`FpHϹ  k>xk^Ѽu}qh H%իĥ؎`p DZ{D򿵵[;>_-q# 4'MѭK,`g.±)l3+O,&KYik/d0FN OQ}մgV7^i}鑣Ik2ʡN RFpAǸ~$㼰wk&vM#`p`? ߌ?k?c7__ 4?CԞ k_z)!-2$E*%y1[c? 闑XxJ;&8r8`22 lU{=2K--cFINC^(?h}wGlodIvgv5zofݮ4R\IkjlTq(+ 2K;I.gʞFA SCt?Mp'3nya*?#dYGg0ƾt\ jv$0UE$sס*> p4-[[J~%ٟ783V:ρlmoMu8ݣIX/( IH}'T][6zevvZZǝ$ O^' ĺ[}S[lgmNGX&+D2qF}z'~C?UI?+uq-dži$3;I+I5<[oqsA*92<G ặXTeu# 8 sDko-ıH^I$`I$2|'2;VQdYGA FA#DZg;d7O|ϲ\$3c;Ipz=7ĺn^X]x @ G7Í'WWStiv껝cU'_2i׵vMJr%ʡ PFpAǸxMs4 SCt?Mx?M5 0S\tMs=7^Gya*< (u $~5_| >)hחpZZyh@2ǁ@kNC^(3]7'Uq}%ٜ;IpzРǾg,AZ]G{n9Ƶ x-h%@WR2#4%y$:DuQEQE$kqżCk\yu av]* h:5\iz&c;!F"bWÖ6vvIO^ ZSDԬ`m2DY.^%-p 3N=}ExAѮTwWI8#>ƀ5(7zwp]ɝA GV(V+ hH"VF  krn".4H&gbpIdV6v<ϲ[[ghO_SRjZ[ƩZXdbR'8zf~oNc%K9v4EPEPEPEPEPEPEPEPX,XY]]i›< :߅2}'VմoyۺQ¹'(+| ާ-rB-n 7#HN d־ )hjNo.-꛶̌ybɮŠU^_W-dE&\SWQEx?ƿ~*w=+v ?"$`z0>蚏>i:No{<2-wL9RAŠ(Huw҈ _'<]MKC;l$z)^  ho5@?_O?O5 j7/VK'yo^Zٔ)D\ʧ9CҀ;(>@%%{B' ?J㧂|E ?eGۻg;[{)//蚏>i:No{<2-wL9RAŠ+v<$?z|@GR8մ'YEOfMfF<8k (O GK5Sɔ1)TUPaK[ӼGVմXrdݶSG EqQ@Q@tOc ?e~8߾9=+P?Gm}7ۼ/숍fs{O k>c,u$BeO5$@9BGU?c׼xwQy i9 Lq9ASC .vox;\`F<RՏXj~ ,,.aMnvIj?xkV)k>->#:};̗Pк<8}PtOch}{wy{~ kt|# rRj2e qr*(\[7m']G>:twKY%)2^iEK_0PEPEPa[Ӽ9IյkygۺQ‚O$}OῈv%8̟g< P:>xMMR mQYF1=(:UYzWcEI!#aפx>6>ֈ߻?nsƓg"ޯtÕ$<(>X24/.Pg\j,X>N=+z(7mg u2yG '.@~ Ov3wcn^PEPEPEPEPEPEPEPEPEPEPM /%oٳg Z1=;WAX)ݟ9w˷f9Ҽ?j gٿwf\cO^3%|E}? k5G3%rOV >W~3^^|}V_iw~^o#G $fB3k(>|`' u\kEۍ=1}?Ǜmvz>ߋ wW^nX =wg' *E-hk'=[i-ϕn[npqc85&ãh:]HY[oHAbA8gQi:5p,[ѐ+RFA4~ tG>3n6퍟c9ێ+-S~a{ukbO,ed90z1^@WYxV^iIpu.끵c;z6wG>_/nn_gݎ Uo&_e߼ٿ3^1^xwzpGuuz@ ڊz(_cI熿k5Լ[]SKiKv[fP6Z_`ֶ>gDuo@ 5RTU_(KWQ@OV|]snݳ{ۜ 8{<bx{Sտ)i-ϕ~->aqׇתj|U]Ɵ,[(`IC_ce?q{Fqڽk (ᦿQʗjhOV߿)?9_uiz]455nQ @~6!/>ϲۣW8u__I熿k8O/<];r8#ٽ RmEAI=wIF6KE ĀgPzOV|Ksnۿbۜg y~:cϱۼͻcgXvzM[MYѯ`F]J2<7kV$PFC#G<+`h'cRQEQEx'@g~6퍟g;q׽v¿:myX;n1[ėa]Zؓ(w#!{I_:4htRMZ7V,sCiO]Coa}δ[7~V2qx~#mc7ۼ3h퍛=sڽ_~II=OHcP$ٕ0c cW7۶FONV?7gZhvO%;sǵlP_?߈t'o'q[yop9E{y^ º6c[Oeqk$,GT(?}>^ѫ,׵{y~ xo#/uXoH% ڊOEе?i++v6gp(u?Ojz}[+v8pjM'MFѬtv6QBpVatk.X/m䷑ 0WR3h}^gm?s{װW[৆#;MrU~ĞXr`c޽" ( ( ( ( ( (?O5|Cqo,rdaA9 +叄,&KFwk'dHFT_SEx'#:3yX3>jږ[SPu9d`TG'$QEQEQEQ_:|}.xK+L;[Ky a^S[^_wu'i2;byN(?▷sƭi7gدtȧ o?J׿mCۿG_ PCI[?vC$yzmZ%ةj(pWAMO]]iLknvK'<'Ony*O?|G#' 8½R!($ qUE81@QEQEx'#:3yX3=¾@%{]'k>5 SKV Dp qN=x+ x[Fw,5?ǧʞkLJFz1?KFO?|3$F<_YtkM6vB%Dr P2ǰ ~O| ?j~I7m߾=k(| &rBtvN ־Xw$Ŀ M_PEP__CI_ VŏkAѼ cqmƍ%D|N P2ǰ(7-ѯ/?]I{(v#'PV ^!8`SHB(VQ^ Iu_[} H+*b#><BOG?t;>g--򱝠g=}Mx}W<'Ony*O?|G#' 8¾t6G jw)qUEq׮o*,&KFwk'dHFT@G<+`-'MmT/WBl3k/OЩ&> S:KL;XV%-2B3}y]W~ _n 닏 hO.lI%L%$W$k(+IaY?TUji%״kvJrĥHRpϰFO?|dv<]QEW}յ-7^wc;jqIk3D|N R2ǰ?]5I?['_]s8={WYM3△ga V?#d0^.`(8$ƀ><^IJM"xW:vK"*}Y2QH[ӼGi7hw.MX#G"4+<+u_Fyt˔8fv10$1R__&^k]լ IRC |zfsyyvk?gof}0P]E[_ZDBH܌S#X(Oo;տ̒nۍqN1zA_ |mۿ_So:7/;ϵ)xFч_,|mۿ@EP^8C?'D5i:M/ŽSv,ybɯ`qj? uB-+!A8>? k)>2/>k&O&\ wtfZ5}݌;Z&+2qF}SH2>kOI!#7 $_ K]syZ襭}3N˵JEq'/XIu_Oˋ&Xɮ€ +?;ocV'2In7}8V<7tc/SnagWZ}0'`%02H_,PEP[>&g凇[Y3h,VtX0(F蚏>i:No{<2-wL9RA O5|=oqlG"da<ƐMu_$˦\qƥ$+rOЩo&^״ku4MJp%իĥN`p DZh'cRQEQEt կ [2$mu y}EKN=+}◃|GA:/Yv,ydp a_?_+ѯ+keo{4QEWqazmgyQ$п*p_# Xjz~eԩ ) < :z:p^w}:v dq])//G)^}M=WDRȇ0OE?x 0S\tMxMs5r$_1k.Lyd@9E#ʀ>0/$rAŠa}oryQ$о7#T2V(((((((((0|8> cd?[mVթZ+uMV7m3W_'t[;7q\_wpsg WwSĞޛ_RZ d.wD0 `ua޽x_kcg|y^*}cvzvG*_>G*_Cǎ`xzVvW;W;PD)OxR,/tn<bD92:^6mºFpѴVPђT RF@8EQE>k?nla}s6pj (MK~I&[׸Vve QrP'Oxza{GkulI8!Oz([MFoF2GuxJ+uZ>>;uސ(.wD0 |Y¶^iCgZoy_k?nla}s6pjMK~I&[׸Vve QrP( wxS}[+?n[n|Ì(g'dQWW?O5 `(yV?-{x$O*Z( :$cWvNOImۿc݌gMGk:͎nѬ3PN85 x>;u*K[_7zA,;׌xJ+kVߠÍc7M͌?aϵwxo^E|I_j^aI&[uVve YrPn*?-x}ᯏѼ+iw~YCo#G EK"$f@q+#_UxH.5 EiKG @`gWQEWYMxVwVInu#푵c;ײQ@ÿ xGn$]Z%] aڼsĿUW- `5iCw,dgtPGx?Dž5o#,Xy ڌ$HOE=5ڞ OIn|!m3g>';:_3otl{ݞ+|`' M\ksEۍ=(SĞ.ޥX^Qy[yd6ĈrduS޽֛6]#Kh{+(mh*Y)# dz Ԣ((((((((63}>֎Yzj|& j۪ڣ*.{VOgw?=0v_J hӤk$fO5ː9rOElQEW/ė&XGVVĝICTC=N>[}d[7m`Õ @<uxK-4`cubpw; aoJJ7¾d]Iɔ$0GUuWkףkC~k&2})2I9u'ʼ#[ڵ/KSv 8P{/ >5KCYYlc 385I熿k Huw҈ ow: qyVO|_O?O5 `(/ĺ7u}Rci쬦ddBq+k'wwZTv^n);!Tvp [q 29_D[kjN{7yrg۹J<9QEQE·_5xSno4/2Wg\s%dҹ| &rBtvN ր>X((5 ºυtRPV{(n$X(g@ N2}M|]ŇuПdE(L:[%|GiXGV$JrE{džIyQ( ;XicȤF2q+q}y477}>UzpNFKRDagL uQW2 M˿fi8ɠ O xVT.(gmdERw#JG>k@4;L3y%mT0Qz׻o7t,4;?Z)y2N\GXXVմo_O̗S&p jSk>5KgE2IOĺ7u}Rci쬦ddBq*免[XYЛڊQ6sayku2n#r0!G# 5;t;-*;[7{؝ ;WW|-o55m'F=~3ܥO  (((*E5|v~.ޛ𭮩SO-[HJ;dmE9ux']GajkQ2:IaY?TUG"x:tKY%32})2N]I]a+7@__ CI[?vC$}/ė&XGVVĝICTC='Gw0v_JR_?^ۏ9@/$:D·_55KCYYlc 385^Lӭ,mbHaME(֬P/ė&XGVVĝICTC=7ŝ{Ǟ*KM6"{kXXt\sҽS[4:,gEv 9R ;u/=+RDagDe ;G@EQ@Q@*j|U]Ɵ,[(`IvWKo|9Vմy>\jAȠWu/3j\O-[#2,(;#?asw3ptzBe?}EPEPEPEPEPEPEPEPEH&/mi.R8Rb`IE|~$>)hחm-c= @kz(-c[s'J~}ٟ+3-'RѼ }oiv3#wPLWʈd J( ( ]4OG?u[;>g.-򱝤g=}M{|M̭oF<3Rյ-fn5MBu@%+88'澛A?  tkWwRy9noqg=}MhQ@W'MO△yaVO#dYI"6 08 €>־RCi:[}SO9cbTC 0gQE|yO^!ֳ4w/Jeb!pA>n巸9 I]H#W_υ凇KAen0pdd?( +;IaXTQEQ[ _xzX-NF U$xs@,,?Z5vy1"6  ?toiz&c;jqIkj1_*STq+?; z a>A| cozmJ|FHRN2@ϸ5cDu[;g.-3'NaC^ 䗗sIO!<_]/~/.<5M5 SKV Dp qN=zx_/:7oMoM9cH AA57zwp]ɝA G@(i^ RMxOĚg-~~4\ b02H}O@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|M̭oFihW_W/$:DQEgzޝ}[V=|v3G <8yCI\>6!J#(]?a+7]GSxNC]rY$a=~u}?8WYlt}?YYn# q!85Q\ߍ|kFT nV1VḷCҩ>6>ֈ߻k߄|Gwj]ZEC ;PQTJgF-E;@u #8>PEPEPEPEYG×zskkz@:@ƿ k>.mgH99rVxG)//gA6jP\3]FC*mv9ˎ޵P$F; rRD&TRL$$uSV={%OT6ZOxÖ<]ꧽy>0UzN6v{qm!!C;C@`q?7j< ~$.fAs ua޹|Y|yͥv3n QPʸ]r㷭wQEQEQE52MAw4-+0b;F0|>&g;ck7\v/ !пJ$+>k߄| wZVn(һ =vzNX"{ok SFChڥY[q"b gP+-~.aeuucag9"Bz)^@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@¿:m?Qvv1w>&My߳6{_iEK_0P|8? <;;W !>ϲۤg8u^8fݱ}0g;sӽzbx{L|;6[yv؁wc'qZPEPEPEP뿳߈u=['r_ors 8{PEP^_,ۿ`m';_^Es !>ϲۤg8u]P_'t[;7q\_wpsg {P<=ohɻ[7suۍ=?/W?ڟ7.V͛lJ (L|_}G?ylj{^EgZg''inv2qg5EQEQEQEW?o c cW+۶E^Q@_+jۿo'6oc^E &myûn1x'xB@g>~n׵tP^~؞!5oJ|sg߱mϘqc85PEPEP_&>/#ڼ}۶5O nzwPдOiO}+o7n.d82kB(+&2y߳6{@8'Gu\G.nog9]P뿳߈u=['r_ors 8{P?o c cW+۶E^8? 7Fc.;;רQ@Q@Q@Q@&n|#n7/>&2slٳwtÍ?osns[;WygZoUksIptQ \}O'UZtjzO[o7nЮdg2+?O<5`_P'_!/#g|}ݺ6Ocvzv`(((((((65wcv/oSnnS:ϋy^}=AW< 2Տ]ƧhߕX9n38=I:nn^ic9vK` a@(+>qjM|v+2)G" }aggiݬ AS>"xtvX*}(QA^F-Ɨi348%@8¾tg'dQWW?O5 `X~2/52Pd$r4d&FA=+zÃ~Z43; ܢ((((((|_ޙ-r]mu aO@vFJdֱvC$s;_ ֨7^:QI]L Ab=So/x>,gȾ n P^:τ|g}MA!gLBFG]7^Gya*< (u $~5sRtfmM>p+*#>>LudV6w|ϲ[[c;@2z=7ĺn^X]x @]'~0\U}/.%i-I$bbRI'I4EPkNwdPHY(cuQV?x?>'1Ƿw(v_JMKIuu4KìwPdgLд}Ҭls$G^[|GIյk_OyTݶgQ€nj^u4M6u@%ժJrN`N2Iǹ6zevvZZǝ$ O@((((eƙrO.OXةּ#o/x>,gȾ n P_E7VEJ$E `+.~/#iuvMqpdd?آ((|_ޙ-r]mu aO@vFJd־9[n.<5M<^I$؜I\O9)kz>jڶq{<.]wLx`Aȯ7)^.冹==T߰4k 8[XSq;Q@ 2y8u_\i /t}uj?5ׁ|=qq,O.lI#gcI,ާy43/c'V|o9Iյm0ydjpI(9i[[mj7`~ \@GExAѮTwWI8#>ƾLgRo,.໵4 `WQGCoGi:7,gSv*xgrP\ UռWfTJFA.#u;3~]ծo ɸalPEPEPkן׸|R[/Gյm'FEO/ڡMaE<39r+n4F?.WdRC =(z+MOQ|˫RS쓍)GZ(((((?St}ll<kH3um7Yk/P\Ik2ʡ RFpAǸ+xOg~~8[<-G.eO5$ TT?<+kq-ljthgI+#-A_,x?kzku\M F*p_# =W,伿+ |;W|eyi_dOxUs$d #O^@Q@Q@SԵm7F[SP"u2ĥNbp DZ-vfO5#X~ti:3 .N3օx'ɻo17/_Z (yᵷX$/$0UE$xsYv>,ާy43/c'QO兜~e֟q ) ѰQ#xG߅2}'VմoyۺQ¹'>O]O+[U"ߌg2:zЯxOg~~8@nn^i}FeC`qW+ x[Yo,5?]I<ʞjI1:(xV[{9/VF[ +rXg~2//2P\r4TFAkz}gYywx4r@c ~5OM.5ӪhnV 2Bq}aR58մ&>\[7m'^oSߊ#+sJ%{¯˙# a*ԼK okzm;䌀dcZ2ǧ,h<8BFp㼰L $0? \QÍ'Iխ}E_n靇*H<x5PEPYWcag]E7dt_?_+ѠS>: KLKYU pJ3=pv>&g凇[Y3h,V=}KIoQ%t k_z)!-2$E*%y1[Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yo웛~kw\=qڽBjgKC~jgKC~jgKC~j7/VK'yo^Zٔ)D\ʧ9Cһ((᣼@sChu(gA6jP\3]FC*mv9ˎ޵W=CRث*?-z/$:Dw=?Qk !пJ$@?]oevcs9z PKa[|O ,u^g<3n>s=;ח뿳߈u=['r_ors 8x?k¶5kP5a[_W_=og}λ[o+vݝc?Xڟ(/>n\cgZ ( (wSy>wm%m߱ m3g4(OOL|_c9?ywllwu^@Q@Q@W?o l/7ݺEOnNQ^_,i?_`m_:.l_9^@0¿ :n|ߵX˺sx'B_~6푓`g;sӽtQ^~~!4E]mhnٽǖ3QEQEQEV~bx{Sռ;6[؅3^ 5RTU}\#m}7ۼ/숍s̿3޼k??^?{v>tn~!Gx?׈|G/+??o|[wM[y_dsFݝc s(/~O7>y~3q@@QY3V|ZEsnݳzۜ 8hPEPEPEPEPEPEPE.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC$~!Vn>@tCI[o?J  ?%o+]a+7G.߈0䕿诐?vC${O>.my_H8@V?zEQ@Q__’yBN?I|<{'n?y%PT6*63}>֎Yzuw_2_zW.d v#ʼ[y'|kxYT xVTfl9sҾ%$B(@ !пJ$ [ufT5K9 ر1S^EQEW_5uMRRxVDU*'r1\#MI䵵߱`\vsX(< %_ѫ_ofmg'uk*M kN ~)x'V~c?EXSv]*@<+MOw \-µ`;0緥S/Ínow}ѱv1W{WaEQEOVatk.X/m䷑ 0WR3j)\d߱'2r2=H((Xg2,,.P$j,dNhzO]˽I㵺ٽ`muqATv?vC$~!Vn>WmzڦwM2_Zɧ̟gL@N]Ix@tCI[վ>Yѯ?FX/m䷑P]J3!5tWaDӼGIukXyodݶaʐG  qx>63}>֎ٻ=R_?^ۏ9G)// lk[X#":f_5uMRRxVDU*'r1\<1ox;_ճrn۝}N1zA  ?%o xn>$K[]vg9 Տjد?vC$~!Vn8'RFluKu5pAG?I]wZTv[7Hmuqd#|-4GtZ3d[7mr@]KzڦnH̡K+dme9~W%_؛>vwo7RzR_?^ۏ9]<}Oڶy߾Ms77OZ^ |Ms ptQ \ߊ~ xo#/uXoH% ڊOE( zNXv#Aeom!AW( ( ( ( ( ( ( (:p^w}:v dq@讃OЩo&AxĚ-ݬ~gDlA!Rpp@?}OEQExLxU F#' I'+y%I$Y$I'yJnO}?O'UZ?  k? uVQ&8s<`$~5/?+?gwG?$llg.-򱝤g=}M|jږpw}:EfĜdsZxMs5_-'RѼ }oiv3#wPLWʈd R_+u_\\xkFytgI,"fv1)$$s]~/n-5C ^пI?@%%{B'>(;J`l|5k>:MJ#FPl#8 WX^iYOiu7m}|3h=qڀֈYzj|&·Z^iMz<}}\j7mbpG Ev>0U7yiIukx;w$чj?vQ K ;o+( |eψNhg%T/t.rO$}EQEb}'V~}2/w(aʡ }ON̵&GZKxhH@ %IS@8(_W/xy+> ^пI袊+Wwxow:azmgyQ$п*p_# =x_>WF𮑥iOee 1,Gt(|Du5WRD&Tk?gof}0P]x?O$w-rJؓ q$C##mg'kuM #r0N# _[u]O4ϴ8zU? ih4F2Gĺlυu}.ݣYl$(gBqhDi:Nyq}dݵKYy5W;)OM/t-m|;t0:^@Q@Q@Q@Q@Q@|_W~?PIb` F@OE6wG>_/nn_gݎG*_WwxᦿQʗjk (ᦿQʗjk (ᦿQʗjk ( Sy>Oۭ"nٽmqg+' *E-t$:Du$P**jEE@EP̿77 SwSm}E|+[ۿo'ocY &¹Gylg;WO4 0?Gs}|/쎋fs[;?_V7m3V}j؞!5o' W>V8mq׷Mԣ/^E{4J?RTMԣ/^yZohnow}ѱ6|jᦿQʗjk (ᦿQʗjk ֛#Ki mh )# |t#cWyvȯ|^> xo>Ե VK_+bO,eQ@{ZoT{Cbx{Li~ Yqd_ k5G3%g_?߈t'o'q[yop9Ev կ6!J#+f_kWWa_dX/Z;cfck/\7u/xVT x^VTDl9sһ((?>5Լ[]SKiKv[fP6Z(/?Xmc|/fs;רP_xJ+uZ'ƿxGzaeIkkly␹9ՏjM[RYoKgE2IO 4-3o:fy?nۻf s??} >~>^Ѳ}0ӵ|٤Sh͎nWFT0`85;t;-*;[7{؝ ;PQEyokkGll񍬿=sڀ=B1} >fݱ}0g;sӽt kx·Z3z궨ʥB#df9˞POImۿc݌gM{CmL~wf X3dWxJ+uZCmjW/ė&XGVVĝICTC=7ŝ{Ǟ*KM6"{kXXt\sҀ=+,Y׼]/Kf[$fكu1h(_߉/<]M7\lz(]EQEWgƺ+kipZM)hw>#No{<.-wBybIɮ>;//?]IOe 8« 4?CQE{%PT6*'þ1/ϲ}${wcwa^fjZ5\iz݌KY&+pJq=jwPнrpii:M`| 1'O&; z fS{1i2;`2Ǔ(X5k9s$G^1 ߌ?k?c7Yzk7 qjwӪY.iX.I,II84oQÍ'Vծ>}?KSvٝG 8W>,&g5[KX/d$$~ kzY&]2F,%$y$s@v< j6zuk*M sԂp@]Fi#ukXϷ̋{&rZP’yBN 4w邏v/ocnn|M̭oF:IaY?TU]{Fk}/[Ԭ`g.6^I?@%{]'>%㕡|-o55m'F=~3ܥO  ('þ1/ϲ}${wcwa^Q@:K 얲Jfd^L$QVP;_ ֣P5a[_xJ+uZCmjމxGIխc>2-웶aʐG  co߅|#_d# ?%(H$a؎?*(|;𯋵+wQ!WD$ #Տ]Ehw4x4&0nϷs<$IօPEP?<-xN\]r<׏=u_ [(?g(zѱW%PT6*~ ( (8f{<Nrp?yg/ k75MRdx,85]WΟ|5k>:MJ#FPl#8 WtPL[YOiu1yʞFA((-c[s'J~}ٟ+3׸Q@ 5M'?T?]7_o@~ k_z)!-2$E*%y1_WuLkE|zPcayGgai=ԙ  8Q5h:4MJ$ERlG8ם-|GumZ0ydp_GyCI\h} Xүdyvgv5 IԴo[}݌-8#>Ƶ?v<$?uN:Kvag<8aQ@p/5?͝wRy!3#'( (>xk^Ѽu}qh H%իĥ؎`p DZ袀 ow:p^#jN._BŠxgrP^8`Sy$(I$]ƙ^GZ̛HaW; z a>A| cozmJ|FHRN2@ϸ(iO^٩xAѮTwWI8#>ƾto;{PھI7m7}8XSxVwc)É$$a=~t~SX]wk'h$#b#8<⫫x-59#Ԍ\G9:O<5`_QEQEQEW|@,l/5;-';!3#' 98½WXd]ZJ[͈g{ ^пI䯯((/V:dž`Sy$UTQ*I+5P}u-g6^w}:qGk J|FHPN2@ϸ?B4OI?;_-sg=E{W'MO△yaVO#dYI"6 08 ¾0־RC~n׵tzO :͎o+=v3PN$'>R?B?vg6 p OJu?Ojz}[+v8phgKC?|aA-ƫk?ᦿQʗj0Íc?lfwݱnsW{׷?O5 77_J?ϛ~ֽqyVO{Q@Q@Q@~,>aKMJi[kXє)f\Χ9CҺO x,#;[ud9Oz#}[wMy_dsvݝcO?϶}#?7cjOV_T4ekI ܰSY>0Ux~CmL~wf X3dP!  ho5\ߍ~kѡ5K6h%[u[Y1VlȣCҾî??`xzIv>o{PW2G3/MMx[৉<]MrJ~ĞYrduS޾֛6]#Kh{+(mh*Y)# dz  l/+ݺFn^PEPEPEP|+k7]ƟW[RIdz Rgz%>Oۮlq €:~$r9䵵w : @ý}7ோ:5.Rx4U*Wk\v<L|_c}j?yvr3޾qn5o߷֍m}]vw1wP((u.OV{ۈi!(g`HN2} zx~<bxLտ)wϕ~ >aq׸PEPEPEPEPEPEPEPEPEP_W=CRث?g(zѱPQEy~ xo#/uXoH% ڊOE??jgK\?|A-sƫ(q??jgK\?|A-sƫ( zNXv#Aeom!AW(<ow:$](@jEE_0WC²訨((` F_O=CRث((ڋ#)Z +>qjM|v+2)G"OxWXSGF(=tQEQEQEWkNwdPHY(cuQV?x?>'1Ƿw(v_J (>)|R>#N'ˋ찾УY s$G^[|GIյk_OyTݶgQ€v?k¶5k>xLm/.T\kN ր;(7g> >u&I&P!#H_ECe?ۻg;W{W)xßm'I~cX_nQ,I< \j~ $.y}nvKI=(beƙrO.OXةּ#o/x>,gȾ n P@GExOx?;1ɻo77OZ + xYwo/ϵG<*RG@:( // K}CYi쬦d" q8Iu>8/<#;Mr8$߱'RPFC=|Y׼y⫭/Ta+'VՋE1=+JJ`?lTWkC~k&2})2I9u'ʀ=zi:q2]8P€ + _ާ-]-n xfO@7#HBddҾ((+ŗgu9<]>h_h;]cbZآp[K^#:2/›9TrQEQEQEQEQEW|@{%PT6*(+ (+ (+ (+ (+ (+ (Huw҈ (jEE_0WC²訨(q*O}?EQE?+uq-dži$3;I+I5E^S Y1#`2*Fk/Dlgd(ZڤLW { }gYywx4r@c ~5OM.5ӪhnV 2Bq}jQEe^%tk56v@DrF@b2ϱ J*gvgdH$F U(8pq8=} hV=7Iy*Lo{(ve~EGoop8*x!(T)$r(eu#x 1RQ@ SCt?My_ h:7ln4M8ѤH)*@8PfhoN}ac%ſvd5 ߌ?k?c7_oΟ|5k>:MJ#FPl#8 P חsIy ؞@2Ǔ+rV[ hO+I,"fv'$W$kAޙy凇Kh, # V~hߕX9n38=hQ@'MѭK,`g.±)l3+O,&KYik/d0FN OV?h(zѲ׏A ߌ?k?c7__Iu w$Ŀ M@W~?PIb'#L̎( π^״o_\j&ci"uj)o6#XqhԼ57 qhmKTdsZxAѮTwWI8#>ƀ.XYqZAikvCb4\Np2I?X7zwp]ɝA GV(V+ hH"VF  kr(Z[ƩZXdbR'8zf~oNc%K9v4EPQ7VEJ$E `*J(~/#iuvMqpdd?آ(((((+ `q?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7jgKC+?|aA-ƨq?7g'dQW  ho5^Z+uM>24Zɧ*hL2x UYzWcEI!#a׼Q@QÍ'Iխ}E_n靇*H<x5QE|?;i7hɻl(A?|aA-ƨq?7Gi /5.Od$kjd&=+Cmjנ8ZVxFV\j3Ae{ ċҖ*袊(x>i:7,g|~ n )#^;3~]ծo ɸalQ@Q@$N:;r얲J!WLSW/ ?%qO> Լy[]/KKkeRp6oZgKC2>kOI!#}oGi:7,gSv*xgrWa  ho5^w&VnCWq@=v?I|C{'m}?'%Uj+/ĺlυu}.ݣYl$(gBqhOޝψN\};̗c>кy p+ D𯋵,4=WwQfd<Շ^  ho5]oUujzlKd궲;0b;F0{%x?ƿ~*w=+v ?"$`z0(?nsƓg"ޯtÕ$<( (<_x6C]zLxAα'^?M|q1zװQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@golang-github-yeqown-go-qrcode-2.2.5/example/with-halftone/main.go000066400000000000000000000015001521051213400251120ustar00rootroot00000000000000package main import ( "flag" "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/standard" ) var ( transparent = flag.Bool("transparent", false, "set background to transparent") ) func main() { flag.Parse() qrc, err := qrcode.New("https://github.com/yeqown/go-qrcode") if err != nil { panic(err) } options := []standard.ImageOption{ standard.WithHalftone("./test.jpeg"), standard.WithQRWidth(21), } filename := "./halftone-qr.png" if *transparent { options = append( options, standard.WithBuiltinImageEncoder(standard.PNG_FORMAT), standard.WithBgTransparent(), ) filename = "./halftone-qr-transparent.png" } w0, err := standard.New(filename, options...) handleErr(err) err = qrc.Save(w0) handleErr(err) } func handleErr(err error) { if err != nil { panic(err) } } golang-github-yeqown-go-qrcode-2.2.5/example/with-halftone/test.jpeg000066400000000000000000000616461521051213400255060ustar00rootroot00000000000000JFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (PE(((((((((((((-^nTe7뎴f(unF]d_5 ߽mXw3/4UM6_鶷mIJM8tU{}>K#]#WfEU݃%j9>-T#y@qVE]siwU3û/^^j1 4XHA|`o\~fm}ek"㏈%ȷЕg#|0}M7vok^^M=1Ћu)~)xQ}߲Mu[sjL\ʬ1 zWCo _DPI@KEQP^^[ZKuu*J]ݏ qo㸁€.E}rf kzgNkHHm?9Sz7[;-&IJɺ2H~_ZEՖי,bHch<_: Ʊa3Kmndv#ڀ7ۆ"?? 0|{(WY|wICf;A?{"4QEdx\þ' R~v b/K#3\\H{ⴾ3jZ 'aλoxcϸB@x*¿?t/唭 ηaJ5‚< :wZڤk]RX yIγvЭ.VGfz=f]j.ѭY|=}1_BG] @6k Oo&"M'qxrB׎y}(?v_8 {frUg5M7Ķ7=PL6Ny{+ހ(((((2=k~=Z_׺\:Fw-y&*s<>MHoV)O@ÍRMq-ˢ\.xÃ|·>e#G#6 ̅粓NILP;𔳼ϡrYl=GK`YʳFH pxǩ@bd @xWD<oy\$fIb H \'?O<[ gbY ,^{F4R?|ה|_Kq g>MtVfMG,lD0Ҡ㾠Jlɖge x~0QZK^~fcQ?a/?+kҴ+>=wM+oǑr9Zc:tִ Okε{x8znaOڪ}bx2(ocPxtz@`W}3▛e#x/aАH5~9 K).f p}Eu2{?fa*w-<6?%yZE4b-:OqPk;jy'P*#@?=;ĐC;W>>J79$3HҖ?60U ^XHQg* :(^(((((Xgc4\G*.Q1 {`W7[-e#i=xǿ(szT:˃RX;˷7)]BEsܬc)= t iI(y<9Bd]ZV\γk_]a.RvNĐ_^HP &]g9ňn 큚f^"K69-ܐ̣׌֨=.v7o\G߶[|~|~5`9,e Hs׊-~4+|GoWBRd .˸^PCio%wc4G^i?Lo^&.4՟-{^.%A&Y'ڽr">XGq3C =0+K |aoAn1X9]OM$#[ʏځZ-5"|?mI٫m[駶ip[̖e,ax#VweT/'8hzg< F%\lU۞'ze@9P^u_YF؟P(`忠kk~1&x($uU-p(cf=C\9b-'r߮WV?X=2<`;5@ GZ$F I}n"ȶ8ז?{c7VxId?||?_}_9פ-}@*@9W[=*g7-d־b5P%aTO-鄬j<=$ 7ImwVuo 2)v'k(lNύa {/Ķmڬ+n\ PE|?5+z۟ m$(;~fe6!8ԎjǧC(b!f.?B:|;_>f,P4m9xz7 3 V`գor#৊Mgk wfm.Rz+_]uWmZtհ`۫I$^GpWvCǾ^ ( ( ( ( ( ߏC D>n4q ~;ޓC5d .>?;񅿃O:ySy .xtmkI?ӯP8?)_. Et<k5?%PCko# WYZmm JG A@3tFG=[ uXMN\j0"0ztѺHсVV?\xCR]_InFCͻ g`5vi jRp8ݟߎ v^+ 5ɞsy ?SW5Z?u{仴YLSSs@>x,Zi/OXXR=+3Z;R:'΀<_-ֿuǀJyo3Ѵax'fx0"3yjq啿J5^A(Ak-wB+y(bJ8wVcEtluky*z؃_UtO.U>\;uǷ<[=ZnxBfRX3_ʢ| >v}hu}E5FѭFOzpp%guZND̝wCQE|r'u3vy_[`(((((Ox;=;5E(7+t 3]]m XFQ+[džp0?uM RۀlPGJӢ*iuf600[*ݤ[\Ē"tqP=i7'Kܑp&((zea- 5ޮQ@O+Ib:ժ$עx{Dúl[9cԓ$֥QEQEQERZ(-PEPEPEP_/K߈;#n"vz@`b}amZKiy Mo(a\|3{fֺ(aC}>8}]Egi5g,cOLѢ((((g~8ҼqI{3)M /=!ӓ(Avmyṣ0 t *yd{5 ide} B>)5(nhïO"7((((((X@OI+QYz4 iR:[ݺ:gǏhov§ݻ񯞼Ooƚ.f(0W__MByqnT>_s,!n$ּkǿ VMSB e<,Oc^7$Z1]i&7C\l],Dy*RP9VƺRr^~Y?@m=7&?]&gTWJiAV6P^0h ƓO*KIAE +|,?u]tas*1_$`PR:+忋F5Դ]NO%br9$O4&}=k7?>z[Qoyr~},$u|3V4QO,:HrZ{3\ROz6Kp I?j4FISv:[K$2eEhQQhu}Kq vq=x‚p \򷨪f֬w+@(QE((P/0}G5 4{>&Y`UbMtY_1.=DgH[kڰ6G ]hwTYJӹ-X`~cO*_3iڠ!٫k6Rn2@p~kæ5\E*ZT9KGEO~3æU?:Qܰ[Xmٮ&X5s+!(~mm3`J X$>}~Zew ?/װOᾍ}7w^%_Nk^qZ/#*ase@U+Όxv>bAqjxKsXlmODWQ]̱Pf2M8IhZtnLH/y<y]h[G;8kp=aY?1WP`V'Ҿw|#4|;4cs==hQ5Vw{z/EKqj-WӢ=O&o?5j"2P}YևxMONO=\j5R]xƖJY5 ;\h~^I +{_TcҢTen⤥aS ?kOK Y?}_ޯiBZRM "XeLW$Nˏ>& GQVFEOG xb]&M:iURO&&Ȃ?*R]tF1mM_A%o²?gY >g/?k(J'7[1IL;m56J@;:_BxZj7!ZHak 9DtaVba*)ƣR ;ZZ<1p%p]z4>Ht?O6A=jR u} 1y!&*k{Y08+'b^3JpQCfhVtߓ9j(?]S sکQZҭ:NvdI'ZҬc6U @,@ҺHD:zyFU5tlTb9Fm!d [չ%FJuV sf4=vd0恭aH%I <ջ5.|xGYڴG!9I}-LsZ) u0p&fQEu;('NG۾m칗J3^mj?xzS?ξ`ӬIt :Ip2C螧ߥ{M9C%hDxB[kr2#}s^]HSFKKWkπ?RBVP/SU Btg̭H5v-@>{~qφ -xui{x]? 5#7F9RQ`}08>"WTIְY/IoUU 7 )v8 'U y#KY>y_]fVb1_]DQN}UZQ+.x–V~5X zze|/^:"{@lr*6nKF,~n+x(z D "(f+SY$<"j{-7X$l2ʗ+;TO}M@Я}u_jX2d̀dk~vյǐ-?ʓq]Gi=⏨94x-Jo&s!BV +tɟW]kgkc(#$ ?!P%)Rov|a5 Qg`@8SrvҔ-zW۬24<]ܲuT*s\Ö)e ][}A=GiS]VjwH~j-t۠$=?_ Z-.+6 #| Wb>T|uX-]9:LׁJ-J;m&Φn8aW+crmnU WeϬӻnyU{9 HX _pOXc񟙾bW ^?Q_mTjJ娢AEPEɥH!ye`f=i6쁻1_/sgB,cϜՏ g<4&>oG?kE/j1kEBQ`W W^Ӵ͠IAyM}*~„i˿=G#ξ2|DOW֓)K_࢑r:[k5r24s <^|!5^!-Ru^}GMU`T]N G,^3[>k_ + ?FS9Tcĺo59F8D5{LmO >4P.%rR1\3R]^hG '?|}ۤ; ;7c#&I.MpbS- ?? }]WqW9mw7KP:+ ӇWKkq ^+>jfm/ٹՎMiip[ ɨu-Rϕ=$]SUH?zc Y=x k[pUR s'I 2&R3s' kg]h,37)P 7"}W|xoĿ 5nVͽ_idmAB!ADUp_tx/Ta/mi~Skh 355\Dz8:\)˿ZtRJWbrI]N3U$>{;Dq(w}~6 OxU._"\LAҾFU+{5q~'ܞ 񽤏 k;&|?SiNB<5^I1S* ^-}7I"?ʽzMUbX%2{v*,y?ݯIVs[w׶==QB Q VOvJ8@QԷkfm6B]D3#BS'oږÚޙ}`eg|5_MK-67G!cֳ*e `asR0 #9[EDV>˘TaQFy--3ͧ_E=7FU ׫x ̺櫦xtL|S1= y9S/UwYҝT)qUӓ|An+)ꚄZVwNmJFIgkT>/D6I [{p~HS5tq *+UA5xGBԓIi[I7qH<jQ2|<|d Ԥ\Mt?uWm.CNN9< ⯏Fu&ʠS:PFߌ8_^I%8̏G*Qn \Jd Jcv]uۃD^XQ=yh`<>oUCum 2d<Ӣf.SwL=G6L{HްR5u "q-#;J{d7eHa)M ^խ$Lq߉z_^\C'@ד|+Zk: "$^+K$Er)V#=wCd~UlG Մzw]0ATutt!u;ςZٵ"F.#_W$ȒpXdZ|Ga@ef\fmonp~Uf*XlTq1W]N6Il `z3NySmy8g֦:hRq5$_z"Ku9V^Cʷ˳^3נj4=EpO ޕG|\T3摵*jl(S@#Xr#MHSј kyhKz0$I(rBk emNHzkV(NEn9(+ȇǿ/XTaxI:Nj5?/ ,Ihڧ崵 =YsGvc_Nx/_4*nt9ھsnu~ Yik0w2ڎbxZ*U*=49MshQؗ4Sf HůQxV}._cŝ)ڑۄaus[ݣ#[/7x 6b{ndh-kqŪ\Ej+mϪ?uW-lglR03IrjE?ÝLKb{_1ZMys m,ҰDE,ǀ+ ز7c5iތ֞$1Iž <)gւ$du~+ԈcF;;[kh`%61Om>/μLgܖЗNcƏi+ (8 or7d[FAuA2^C]8] )3HG#ꂴi̳WZx3+8 7x+7p:v漴54  xnMP6F .|i'ce$|w|^+uRZ@n=A+nSZ1$3c>S)/;F$WɆ\Hlz$ӵ$b !Ǡ<5x!G >h~+ J&ݕ`ldq_Y}ѥm(.fU^"\)Io{'}3XEh$#W ˳ >S"^,rV+6I䙲qSXjڄV͵FK34CWڙ1B}siɨn%=ًy?:Rޢ|)=wn hٌm00>-$vo~,:N:]g<_a,C{r8/`ԂKʸ@55Y6 jŠ()3@#CYC^V&>G5-`= }7CO›mqWA"[˔twQZFbt% xjRg@<ȵkk.`8܏DO&]ǟw,X`B<-mt5sWk#Rmܸ%`g7Fpǒ})\Ŕ ڢ朏ϋ^]ҡƧ4j?ЇWxg7⿵';d '|ˡ]m5q&Dp\}ˤ궺ޗfwoP}dfY1x';U:ԘlI}q^_% ^mJJ ۽F%H,}+ +3[VNR)5I|>>ɍ?ZO4wmyW}?F+Om#/cto_Y!XP?&?* /B4%IXasG+U%"N1 ((֘CPPZC+MQ}gN6:P)j8` I"tq"9XN:?$޵p~/2+xnErMuwVbl!C])lql-u96M<"B#ݬCjvx.ƺ%l*t-r>{t{ NMH-ӢR}Ik9TQniR.YAgk#Q6FEPMq Ӫ&u@~JTXzVNI+yF]v/ ֪kDZh!Ю#+r:*ꏊ-r{Is՜ a'l GP;8^_0e']~Sm/h*6.Jj(HB((@ָs|,Fd ;d껰?" E$qr?ZI|nQ;e# 𐞴HG4+NԠ)s@2U52T**dHDS-BL!¨oERMMm u|?3G*i~?\'7nj޹2˥luWD}sE|ώ:2GjV IGЎ+|;]/:bWX:3ñ7QHע* (ǭ8DNjj@ǭK7[lOZMF#S\$QYOP eJ򕎅;m&ķL*Ѷ do q'QBҡҥV&3d:hSUT5:hH DF uQ@uf̱kVVo+ʲ"&]6-s29۶$^;־ mbIYdY4^yVW )2N=EkH"PIjMͦ",ogTW.6>?ӎ,š>{ƈD 8B= Eg,}Q_ zEPEPiƶRnlYٔU+4PUTGoF`jjCIv }Sk R,O߽|S4V܂PCdg `N*Yڥ$6_etϤ"|of!f;k T\8T\$ۜ'XTF-ɧpQY9QM Rfrd7uR 1죭|^<1 #,R7_-oV8'?ήp m. 119YkRcyɎ+ k20ʰ(po|CӦ@cc?>񟈳.8!ՇZ oҷgiJ$QE`j%F¥4P4VqP8L2+$+}_#z Vm$̵ޯSZهNcrԟVnj3Fu Sk{:n}EiwmXc袴*h2EpU=Zk XSM] TUh ҉h~@M N2^{^Ƒ-}Fq6Ǐ5Zꛣ?3g[ƔS}xGnAjWoוxڀ¼ct|뫇9fbYԚ4{DK´53:ݩvW: a_iwas-g+$LAxvGgW$䰬A ?WwѱִU"FX5J9'>qnm;?/O[?}ǾׂXiYJ[ׇK2 }|$WZ>K_Ol*ұ:MԇďG##+Pa^ۨ;g~%xɗi?ߪtpiT%.דxEo%[Zs^Wz5Mff|9^ڴq8* aIsTvRS(ư),#YߜGbݗ[JvGx~]? ao-Zo6@ܚվ1xcO =WoRB_fmY/U ʩn N LJM)굏dm?~'Ҹ=GWuח7rv>vv~ u4WkzvGOPӏŽexvQt2:Go{ۻ3Ш=I]Ŀ=ϓٛMx61ZUrqf{?i(E>3VG~кm?;?:>J[g '&`~7R{%SU&5E4;Fb>̾\cRQb=ߊ>3v0{B?W;yzf+75RGHͱPW|<}]k_`Zo/%N cSUd&y}pv\L#  ӊs-ŝ "7Z/Z)D~U?Vlg7 -kIѮNK7`y5XWw´ɓѵ7U±|Qh.94Xqu3[TbYxߕu*G"dW)3Ꭸt8፻⾙ɧ!Ѓ֯4kIJfsZ¯l#4QE|QEQEQEQE<1ݥu f?,(}9^oD֓m܏ JJYF[\T[kH|?_,U^|%IkSv뜱 Ms6;?bեS6GQW`uy˻i5v|WһV<UĈrq<~x~r=wON6G9V_:09r1F-ţῌSXeK+5v3$LЍq^"a_ 8Ou6czTr+Fu!lC.I^JQ@h#A#3O[4 ~Z\rl,4=(|x?yd}Uǭmx[Ax KCcfcIKEq@QEPU GZuI/6{(U?'x`8c^qm%*S5Rk+ ls##.|ꭚxmfEiN@Q׊vn'$2/MTEtGY+։'^iKϷkS09HϖA׫6/a Ñm[Pԡ>c|۽;F+F;X'?/+U'IT{0 ">N>(EWɝAEP (((g^rX.ca, 7j+JUeJjq8+3[-o_nfK헊H#P):_̽FxS +EqPЌҪ (zbמrQ9\x?ıj/ā #ibh+l鷵x?'5q #LѴ]:H$y98hirQXQЄϑuŏĻؔ`GH{o5&IчJj.9IPOh2xS֗9͖oC-Omt^y%FQXj͞p8x:z(:ŠBiEQ@fc9i:||Ysk SǩR?q T0 s KlH#R+w|,3(.tQE|aaEPEPEPEPEPEPEP xįbumG۵{u!=4vꌪSZ'hD9xE' gĿ`u?^{siG}l'OMThb%B^{gvOdS+c1Z颾BЀS²l Y7+c!/Ch邊(EPEPEPYڮkpUȽEhMIRjGjwM@~SW|58w%?+v6w0#5KJ_(֋=?5lS] '~x@Dz9Q|wocCYˡݦA F9l.x|E7iFwwv"!p~&?t{]>NН捣81 -5xB˩yҾT-HgG!*@5i-iIce5F|R]\M2xn5 r;k\v}]:trrJ)cU"S xvm9= LWPk1mI=p>#PxVo2*.i&c:* )Ս+c5=|Dk`*@((golang-github-yeqown-go-qrcode-2.2.5/example/with-logosize-multiplier/000077500000000000000000000000001521051213400260625ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/example/with-logosize-multiplier/logo.jpg000066400000000000000000001047471521051213400275410ustar00rootroot00000000000000JFIF$$,Photoshop 3.08BIM$$h5http://ns.adobe.com/xap/1.0/ image/jpeg Print 2022-08-22T13:39:23+06:00 2022-08-22T07:39:28Z 2022-08-22T13:39:23+06:00 Adobe Illustrator 26.0 (Windows) 256 200 JPEG /9j/4AAQSkZJRgABAgEBLAEsAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABABLAAAAAEA AQEsAAAAAQAB/+IMWElDQ19QUk9GSUxFAAEBAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJ AAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAz ZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwA AAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAA A9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RS QwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1Q YWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAS c1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAA AAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNj AAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA AAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAA AAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAA AAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBp biBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4g SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDP FAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAA AAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMA KAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCy ALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIB WQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4 AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oD ZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATT BOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowG nQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiq CL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsL Igs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPUR ExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSL FK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUY ihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzM HPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUh oSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3 JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDks biyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJj Mpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5 BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/i QCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVH e0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9J T5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX 4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2Cq YPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFq SGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQU dHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+ wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZ if6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSV X5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1Erbiu La6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsu u6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJ Osm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc 1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3m lucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe 9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf///+4ADkFkb2JlAGTAAAAAAf/bAIQA BgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8f Hx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f Hx8fHx8fHx8fHx8fHx8f/8AAEQgAyAEAAwERAAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQF AwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMB AgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdU ZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eX p7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUE BQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PS NeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG 1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/a AAwDAQACEQMRAD8A9U4q7FXYq7FULLqMKyGKFWuZ1NGjhAPE/wCWxIRfkTXKzlF0Nz5MTJQuJrtE El7dwadCxCjiVLcuu0soCb06en9OVylIC5ERH46n9SCT1NLLddFuXZVvReyBS0i/WC4K9yY1bgB/ scEfDl/FxfH9HJRR6rYh5TlkWKEWDyMfgRPRLEnwAwR8AmhwfYo4fJpn8oAlWbTwQaEEw1BGJOD+ h9iPR5KssWkQRRz/AFr6rE4HoyLcMkRqKjipb0zt7ZIjHEXdD37fqSaCqE1KNA0M6XiEVAmARiD/ AMWRjjT/AJ5/TkqmOR4vf+sfqTuuj1KEyrBOrW077JHKAAx8EcEox9ga+2EZRdHY+f4peJF5aydi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqjeXlrZ20l1dSrDbxDlJI5oAMj OYiLkaAQSALLzy4/NG2vNet7QK0Ghl+FxPUrK9QQGJG6IGpWm9PuzRy7VEsgHLH17/7HCOrBlX8L 0aCKCKFEt1VIQPgVAAtDvtTbN5EADbk5oYT+b/8AyjVt/wAxqf8AJqXNV2z/AHQ/rfoLia36B70P 5T08W9zfPD5buNJlNlKqXEs7yByStIwHVFBJ3rXtlejx0ZVjMDwne/s3RhhRPp4du9KPLVjF5e1r S7XXdF9G+uJStpqCzljzZuK1jR2joOYH45jaXGMOSIyQqROxv8BqxREJASjv32iPO/lvQf0vYaRp NoE1bUZfVuJvUkfhGSanizld926dBlmv02PjjCA9cjvzZajFHiEQPUUk816rp9/9YthO0UGkLHZ6 RYkMS/BgkkrMBx+ync5iavLGdi6ENoj7y1Zpg2P5uwD1zQL61vtGs7m1f1IGjCq9Cu6fA2zAHZlI zpdNkE8YI5U7LHISiCEZNHDLE8c6q8TCjq4BUj3B2y2QBFHkzLzmP80Lax1+4tArXOhq3CGYEvIp H2mUn7Scq0BNadD2zRDtUQyGPPH9v9jg/mwJV/C9Dsr20vbWO6tJVmt5RyjkQ1BH+fUZu4ZIzHFE 2C5sZAiwrZNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqjeXltZ2st1dSCK3hUvJ I3QAZGcxEGR2AQSALLxHzn5zu/MN3xXlFpsTf6Pb9yenN6dWP4feTyet1ss0u6I5B1GfOZnyY3mA 47LvKf5i6noipaXKm805dljJpJGP8hj2/wAk/hmz0faU8XpPqi5WHVGGx3DN7zVPJfnWwisptQa2 KyiZYSyQy8wrLT94HVtnP2a5tZ5sGqiImVb33FzJSx5RVsq1Cxg1Cwns5mYQXKGNyhoeLDeh3zY5 MYnExPIuRKIIpj2j/lxoem6hHfercXc0Brbi4dWVCOhoqrUjMLD2Zjxy4tyRytphpoxN7lMrbytp 8HmCfXTJNNfTqUAkZSkamgogCqRsKbnL4aSIynJZMizGICXF1b1zyvpOr2L2lwnoozB2lgCI9VNf tFWw59JDLHhO3uTkxCQooW+82+VdBtUt2u0YwqFW3gpJJt4hPhUn3plU9Zhwxq+XQMZZoQHN5x5s /MfUtaje0tVNnp7bMoNZJB/lsOg/yR+OaPWdpzyjhHpi4GbVGWw2DD81jiMi8necbzy9ed5dPlI+ sW9f+HTwYfjmdotbLDLvieYcjBnMD5PcLK9tb60iu7WQS28yho5F6EH/AD6Z1mPIJxEo7gu3jIEW FbJpdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiryP8z/ADY19fHR7R/9DtG/0gj/AHZM Oo+SdPn9Gc12rrOOXBH6Rz9/7HWavNZ4RyYHmncJ2KpqfK+vfV4rhbR3in9L0ClGL+srMnEDc7Ka +HfMj8rkoGudfa2+BKrpSHl/XTG0o0+4MasUZ/TagZSVZSabEEUpkfy+Sr4T8keFLuR9lpvni0kM VlBqEDofiSISpQ0B3C07MMuhj1ETURMe62yMMo5Wjf07+ZFvNBC0t6s05ZbeOSMlnZTRgAynlTvl v5jVRIFys8mXiZhtur/pD8zrm0lullvDHHJ6MiohVwyglvhVQQF40J8cn4mrlEm5c6ZcWYi90qur LzvfcluotQuaH4lk9VwCWK9DX9oUzHnDUT5iZ+bUY5TztBHy5r4jWU6dcCNhVX9J6EAE9aeCk5V+ WyVfCfkw8GfcWrvy9rtpC891p9xBDHTnJJGyqORoKkjucE9PkiLMSB7llikBZCX5S1uxVnP5ZebD p1+NJu3/ANBvGpEx/wB1zHYfQ/Q+9PfNv2XrOCXBL6ZfYXN0majwnkXr+dM7N2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxVIvO2vHRPL9xdRmlzJ+5tf8AjI4Pxf7EAt9GYeu1HhYiRz5Bpz5O CNvBSSSSTUnck5x7pWsCuxVOrfzh5it1gWG7Krben6C8VIX0kaNaAj+VyD498yo6zLGqPL9GzcNR MdeTLrC3/MObTrW8sZbW/tbyT65Lb8Yx+8MgkPqc1jJ+I/snam3QZsscdUYiUSJCR4q253e/Jy4j KQCKN7rPrH5m3DyrCkMf1aWKO4SP0APWARk5VJ3pwG22Di1Zuq2Iv6ee37EXmPchhpX5kySWiNwJ 0otFCGe3ohkVV9N96NyRwAD2OV+DqiQP5m38PXox4M23krJqX5kWkVvZkoJdRllmtbpmgYcVVnkA bdFQ15g/dkxl1UQI/wA4kg7fH9f3J4sood6ta3H5moWgrDGZpTG10wiLIVZ5Gb4KsVJV/wBk96b5 KEtWNttzz28z+tkDm5bNXrfmDaaNePJqMAtNPAR4/TCM8bxilOUanpJTi9DX6MZ/mY4zchwx/Hd5 9Vl4oidxsw+TzXrkmnz6e84NpcLGsqcEqREqInxUr9mNc1h1eQxMb9Jr7P7HEOeRFdEozGaXYq4G m464q948ja/+mvL8M8jVuoP3F1XqXQD4v9kpB+edhoNR4uIE8xsXdafJxxvqyDM1udirsVdirsVd irsVdirsVdirsVdirsVdirsVdiryT83dVM+s2+nI1Y7OPm4/4sl3/wCIBfvzmu2c15BH+aPvdZrZ 3IDuYFmncJ2Ks9n/ACnvmuRDY30cg9JZXM6tGQWYrQBfUr9nrm4l2RK6jIcuu363OOiN7FL2/LXW lvIrRpoRLLBJcLX1KBYglQfg2NZQMpPZmTiEbFkX16V5ebD8pK6tN4PKvn6CX6lDrZjWCCFo1Waf iEkLqqqoX9n0z26Zkx0mpB4RPkB1PW/1Now5RtxLbry15506aJH1woLyR0eRZZ/91wmTk3w1P7uK m3ywT0uogR6/q8z0F/cEHFkifq5tt5W89EoRrfItM6qTNMBzj5nlUrTrF41x/Kaj+f17z5/qT4OX +cpt5E84fWba1GrRMYllFsfXkIRWRS4Xao5B6U8PbI/yfnsR4h1rco/L5LHqWf4W82vKI5tcCNFN G/xyXA43ExCxsnwfEWJIDrtsd8H5TMTRn1HWXM8un2r4OT+cgYtO80arZ3l4uq+rCbkWMtXkX1WP pxB2HEfAVZas/hvvlQxZskTLisXw9d+Q/VzaxGcgTfWmovy51CWUQx3tuZeckZjZZ0YGMKSaNED/ ALsT6DXoDiOzZE0CL+P6vML+UPepn8vtSXS21F7u2WOONpZoyzclRUD9l+KoZaU/mGR/k6fBx3Hv /H2fNH5U1dhi2a9xXYqzv8pNVNvrk2nsT6d7GSq/8WRfEP8AhOWbfsfNw5DH+cPu/Bc3RTqVd713 Omdm7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXz75svDeeZdSuOXMG4dUb/IQ8F/4VRnF6uf FlkfN0meVzJSnMZqdiq/1pa15tWlK1NaYbKbLmmlY1Z2JoRuSdj1xsrZT3y95Q17X4ZZ7IosELCM ySuVBaleIoGOwb8czNNosmYEx5BvxYZzFhNz+VPmxqEzWx8D6rnqKfyZk/yRm7x82z8nk7wqSflj 5zliiikubdo4ARCpleihiWNPg7ljkj2VnIAJG3mk6XIeqmfyp82k1M1vUdD6r/L+TI/yRm7x80fk 8neqD8sfOYtzbi5txAzrIU9V6ckBCn7HYE0yX8lZ6qxXv/Yn8rkqrCSeYfJmvaBbRz3nBreVuHOF ywDEVowIXqBmJqdDkwi5cmnLglAWUh9SSteRrua1PfY5h202VSO7uYopYY5GWOdQkyg7MqkMAfpU YRMgEDqkSIFKORYuxVM/LN79S8w6ddciqx3EfMj+QsFf/hScyNLPgyxPm24ZVMF9C52ru3Yq7FXg X5of85K6x5M89an5at9Ft7uGw9DjcSSurN61vHMagAjYyUxVkv5I/ne/5i3GqWV7YxadfWCRzQxx SM4kiclXb4gCODca/wCsMVV/zu/Ohvy5j0uK0so9Qv8AUTKxhlcoEhiAHI8QTVmag+RxVh/5bf8A OTWs+bvO2l+XZ9Et7WHUHkR7iOV2ZeETybAgD9imKvoHFXYq7FXYq7FXYq7FXYq7FXzXOxaeRj1L MT9JzgzzdBLmp4EOxV2KuxVnGhT+XB+X5sdemvYre/1qJLZdMhup7uS4tViv1SIWUc06/DZszOgB UAkMpoc6bsb+6P8AW/QHaaL6D70k0vyZ+W2j675esn86+adPvdR9P9BWGpG50+GcWcqxrb8ZrS2U NWNVETEMQykD40J27mK/6H/KzRbS+07VPzIvtQ1Oa6iiaztr8S6jFechb8LextVluRMZWoyrGSO4 +GuKteZLL8rL6+t9Hm8+a+lzougpdTtp8k88T6bbxvdfX5biO2nhYvHJ9tX+L4UXdgCqqXGmeQ3f y/fW/nvzBcy6dcG3lsYRc3l9ctc/W7+JprKCA3EbuFeWOZoeLQxgrtxfFU61eztLP8q7O3trm9u4 0uzWfUobq2uiS0hCvFeBZ1CrRU5jdQDU1rmq7Y/uf879bi6z6Hn2cu6l2KuxV2Kro24urfykH7sI SC+ls7x37sVdir4d/wCckf8AydHmL/oz/wCoGDAqp+VOoXn5e/nVZ2d+3poLptKvm+yrRXB4JJv+ xyKSfLFUX+c2p3Pn/wDO59I09uaR3EOh2JA5AFJOEr7fsiZ3Nf5cVSj/AJx8/wDJxeW/+Ms3/UNL ir2b/nIP8+9X8u6q3lPyrILfUIUV9T1LirtGZFDLDEGBUNwYMze9BvhV5dqGt/8AOR3k+2tvMmq3 2sW1lcsvpyXkxuIeTDkqyQSNIsdR+yyDAr3Dy/8AnDeebvyS8xa/ARYeY9Hs7hLow9FnSEvHPGGr RX6gHoQRhVhX/ONn5n+c/MPnq+svMmty3ljHpcs0cVwUVRKtxAoYUC78XbAqj/zkZ+aPnby/5/hs fLuuS2dg1hDK0UBRk9RpJQx3Db0UYqyH83PPvnDSPyV8ka3puqTWuq6lHYm+u0485TLYGV+VQR8T 74VQn5c/njqWk/kxq/mjzNetq+sRarJZaZBMyh5Ga3geNPhC/ApLux8K4FeRXn5qfnZ5vv557LU9 UYx/vHtdG9aGOJDsKrbUPH3cn54qzn8mf+cjvM0HmC00LzhdnUdLvpFt476YAT28jnihZwBzQsfi 5bjrXamKp1OpWeRT1DEH6DnCHm6CXNTwIdirsVdirMNJtPLF15Jto/MMN1eW76zNbwafZKzy3LXu myWU6FI/3rJHZ3M8z+mQ4CVWpHE9N2L/AHR/rfoDtNF9B97HfP8AJ5fjOm6RdWV1oWn29pp+iaok cEhk0vTJ7x7W1a41a9eSzjiKEyMY7eYGaAf6RVIZRuHMYXrmpfpG3sLg30ur6XALOS7bUVuINN06 0/Tc8biy1e0clJbhbYxvd3Fs08sav+8WZ/q+KqHlnRNC5X+vT3s0F1piSa1Z6dasl1JZ3V0Tc6QB NqItWu2soEnu7is6RXEUUDqZkjchVk3k+80adrHyzdaO+u6Q0VzcWEWkSLcXL6fFp+oWNw8l0GM9 xa3lzfv9XV2ie3uJZo5GjWJQ6r0bUbi1n/KLSvq2nHR47d4LM6Q1wl21o1nGbZrdpkaTkYjDx+I8 9vjCvyVdT2x/c/5363F1n0MAzl3UuxV2KuxVci8nVf5iB9+EJAfS2d4792KuxV8O/wDOSP8A5Ojz F/0Z/wDUDBgVkf8AzlH5UfTfM+keZLdOEGs2cayyLX/eq1VUJJHSsRjp8jirf/OK3ld9b/MO68w3 dZY9Fhab1Gqa3V1yjQtXr8HqN86YqxP/AJx8/wDJxeW/+Ms3/UNLiqn+e+n3+n/m35hF0GV57n61 byGorFKoeMqfAD4fmMVR/wDgXV9W0Zbm5/Mzy/JZSosrWl3q10JR0YBraSH1OQ8ONa4q9G/L/wDL 7UvLH5L+ftVl1Kx1PTfMGkiXTprB5nFIIrgScxNFAVNZAKUrUEGlMVeF+SPInmTzrqsuleX4EnvI YGupEkkSICJHSMnk5A+1Iu2KrfOnkjzD5N1ddI16FIL14VuFRJFlHpuWVTyQkdUOKvcfzy/9Z7/L r/jFpv8A3TTirwhPKWvSeU5PNkdvz0OG8/R0twGBKzmNZAGSvILxcfFSldsVe8/841fmr+X/AJZ8 o6hpGu3iaXqAunuzNIjFZ4jGiijIrHknAjh91d6KvHPOt9a+bvzO1C58tW5SLWNQC6bEBwZ3kYIr 0/ZMj/H7VxV775rszZ+ZdSt+PBVuJGRf8hzyX/hWGcZq4cOWQ83SZ41MhKcxmp2KuxV2KspX6o35 V39tdC1RLy9ubRbu8he4EP1jT2ib0URoB686M1tHzuIRWSnNmIjk6fsX+6P9b9AdpovoPvSzyJPa azqN/ZQ+bLTzjrM91d2Dx6pq91dWk0c0dbq8TRRZwQrDEsf7mKGUwuk0sX1mgTNs5jNvKflGzW8s 45LjQtaluNPmtfM188cV1qN9bQpDZWyrMgif0JzbPLcrcGbi/wC5VmQBlVYlon/OP3mry/b6MNO1 SCV9KecywRXN3YCaMLJawJFPxvZLb6xDeXM87KrGKVitt6PqSSlVg/mDTdC0vznpHkS3sbma40tH 0e11C/uf0aj6neNbXovNLmgDWOmNZIkUrPFG00zSrG0MjO0mFXoum/WB+RGhC7+sfpASj9JfXGha 5+ulpDd+t6GyyfWC/ISfva/3373nmp7Y/uf84fpcXWfQxPOXdS7FXYq7FUy8tWYvfMGnWxBZZLiM OB/IGBb/AIUHL9NDiyRHmG3DG5gPobO2d27FXYq8I/Mz/nGi886ed9S8yx6/HZJf+hS1a2aQp6Nv HD9sSpWvp16Yqzz81fyuh8++T7fQmuxZ3VpLFPbXpjMgVo1KMCgZKhkY9/DFWvyd/K2H8uvLtzpn 1sX93d3JuLi7EfpVHFURApZ9lCnv1JxVgH5df84xXnlDzppnmN/MEd4mnu7m2W1aMvzieP7RlalO demKvQfzP/J7yt+YVrF+kg9rqdsCtrqVvT1FU78HDCjpXeh6diKnFXiz/wDOG+siYhPM1u0FdnNs 4fj48RIRX25YKV655e/JyPQfyv1byNbaxNdfpSK4Q3lwg4RPcR8D6UKmqpty48zvXffCqR/k3+QN 1+Xfme61qXWk1JbiykshAtuYSC8sUvPkZH6ejSlO+Kqf5v8A/OPl1+YHmqPXYtbTTlS1jtfQa3Mp Jjd25chInX1OlMVTTz5+Stx5p/Lny35QTVktH0BLZGvDAXEv1a1NvsgdePKvL7RxVE/lx+S9h5Z8 g6p5O1u4j1yx1S6kuJ/3RhHGSKKMKBzchlMPIMDsenTFXmWt/wDOHTNfu+ieYVjsXJMcF3AWkQfy +pGwD/PiMCs6/Kj/AJx08v8AkfUE1m+ujrGtxgi3laMRQwchQtHHVyXoacmPyAwq3+bulGDWrfUV H7u8i4ua/wC7Itj/AMIVzmu2MNZBL+cPudZrYVIHvYHmncJ2KuxV2KsklvbWx/K25vT9U/Slrf3U 2k/pAXbW3OPTJGveS2ZWQn9GC74AkDlTetM6fsX+6P8AW/QHaaL6D72M+RvM+l6F520/TdSluLi3 0ZfVtdc1GW3trOPy9YS3mk6PNBIbWzhlEseqtI83rMjpx9OR5H9Bds5iDl0L8nLTTp7tJ/MaWFzE +oQ6jb3Fk6ziweR7iKzWKUyXAguIZfVMKMkdRMziEpLjSozy1on5TNrNpq9pf+Yk0+K7hibXJpbR 9OFxpUEbyxGdWkdljDbyRAoqLK8b+hHI6tKyCy8wal5n8x2HmfyvqWo3rSXZD6CdHsZfqv6Purkz wz6y8TpbtJYtPFBA1wHElwjc0hkNFUTo3mWXzR+RemeYZrZLW41O/uLi5hiSNI/Wa5n9ZoxGkfwt IGYcqvv8byPV21XbH9z/AJ363F1n0MYzl3UuxV2KuxVnX5SaUbjXpdQYfu7GIhT/AMWS1Uf8Jyzb 9j4uLIZfzR9/4Lm6KFyvuevZ0zs3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqkHnjQTrXl6e 2iXldRUmtR4un7P+yUlcw9fp/FxEDmNw058fHGng5BBoeuce6VrArsVdiqdatZ21/wDlSNPlmk9W 61+AQackM9xHfmGNLia0mjtrTUpeBt4ZZAwhPF0VjsKHp+xf7o/1v0B2mi+g+9jkJ1zyBI+n+X7u yewa3u7jQNLu5L7RtT1GS4S7jgSfSbaG3l+srIpi9aREW442qQNFJWu3cxK4tP8ALDaT5aOiLHqF jooi03XfOdjZXl9dWuuSI9vYxaakdvbw+hBeXYuy1uf3zKDITNIn1lVFeavMWgaPJrV6tw8Nj5aF zoNvY3LCK2v4ZtQbTLuxj00LbNefUtNWIs0WoDl6ds8gVy3BVCa3+XXnS10LWPMVt5iiu9U0SzJ1 O4uHTX0uL9bESazaXRkS4XT54Y7Nrdjx9KeA28D0bmXCvX9WvILr8p9NMMIt1t5YbNoQI1KPaI1u 6lIo7ZEIaI/u/RiZPsvFE4aNdV2x/c/5363F1n0PPs5d1LsVdirgK7Drir3fyHoB0by9DFKvG6uP 39yD1DOBRf8AYrQfOudf2fp/CxAHmdy7nT4+CNdWQ5nN7sVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdiryH8zvKbaffnV7VP9CvGrMB/uuY7n6H6/P6M5ntXR8EuMfTL73WavDR4hyLBc1DhOxV2 Ksj0pfKOqeXf0J5iuprOKK7nulaJSyypd2EunTRPxV2AMNy+60NaEHbN32ZrceKBjM1vbnaXPGMS CneoWv5Y3Wl+X7ODWpbO68sRi30W/S0S5khhUxFUCXtrdRVU20JWTh6gKCjirctn/Kmn/nfYf1OV +ax9/wB6TTeT/wArBqsmo6f5mu9MY31vqdva29lbTQQXNpbG1tzH9csruX04Inb0IvU9OEmsarRa P8qaf+d9h/Uv5rH3/eq6h5S/J+/ubv6xrFw+k6hGkd/ohgIt5ipjkaV7hYF1AzTTwRzTym69SZkT 1GdUVQ/ypp/532H9S/msff8Aeo6f5H/JzS5Iv0Pr9/pdvbyajcW0VpGFeG61SCS1lmguXtXuYvTg kRI0SQJ+6jZlZwWZ/lTT/wA77D+pfzWPv+9MfMupeSLPyvF5d8pxLFZfWpLsQRI8cMJld5JFRXC8 Q0khIVRxUbCgAGa3tPXY8kBGBvdxtTqIyjQYVmjcB2KuxVm35Z+U21PURql0n+gWTVQHpJMN1HyX qfoGbbsvR+JLjP0x+0uZpMPEeI8g9izp3aOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux VRvbK1vbSW0uoxLbzKUkjboQf89jkMkBOJjLcFEogii8P84+Trzy9ed5dPlJ+r3FP+EfwYfjnJ63 RSwy74nkXUZ8BgfJjuYLjuxVm2l6IslvpYh8pPq0NxaPcXWqC7aFfVWZl9EIGHxemtRtQ7DOk0Wg wzxRlKNk+Z/W7TDp4GAJCMHl7Sp5LaWPy3NaSyW9050q4ml9RmgmjjDko7NSjMygH4hTxyObQYhk AjHmD1PeN/gyjp8QyASB4aPLn96668t20SuJPKTQwTQyyRXq3cp9AojMBNHybf4KjenQdcyM/ZuC MJEDcA9T+tZabHVgJFqdo9pr+nadaeVvrOnTWEVzNqLG8fnIyVYhopVjUBtipH8M02th4WLihj4j wj+cffyL0PZ3Yeiy6XxZzrJdcPEB97IJPK+lI97LB5fa8ngsbW4TSRcTQsZJXcShXYseXFdg3h2z Y6DQ4sswMkeC4RNb7E3528/m0uOOWUY+oDlv70tk0uKXTtQa68mTaGYLRp4b9ryWdPUBQCPiwXf4 m6j9n3zM7R7J02LDKUDch7/1tM8EREnhrbvYVnIuudirIfKHlC98wXoABisImH1m58B14rXqx/DM 3R6OWaX9HqW/BgMz5PcLCxtbCzis7SMRW8C8Y0HYf1PUnOtx44wiIx5B3EYgCgr5NLsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdiqje2VpfWslrdxLNbyjjJGwqCP8+mQyY4zHDIWCiUQR ReTebPyyv9OL3ekhryx6tEN5o/oH2x7jf275zms7LlD1Q9UftDrc2kI3juGDEU2PXNQ4SP0y7vDd W1sLmVIGlRCiSMoCswrSh265dinKwLNW2QkbAt6Fq2l3NvrF/Da+ULi6trOGJ7LVf0nNSYyvGroI uZkXgDIzAVJ4dPiXOp/I4r5H38R/W9BPRYBhjMSJyE0Y77ed8Xu6fcgLR9Rm0iOW78hamLxoEa5t hqLcDIySl0XlPyIrGo3H7ftvI6DEeh/00v1uN4EfwSiNXppd7FaW/krVLq2aSOGOeG/fiOfpV+FZ mC8fUfqafAdxXEaDEOh/00v1r4EfwSt8tRTapqaJqHkbUdGWQokl7PqEjgI0TyGvCTkeLqEp4t9G P5DDd0f9NL9aPAj+CWE61c3S6je2guZXto55I0RpGccUcha1Jr0zlc8jxSjZq3VZJGyL2S0Cuw65 Q1M28p/lnqOplLrVA1lYdQh2mkHsp+yPc/QM22j7Llk3n6Y/aXMw6Qy3lsHrdjYWdhax2lnEsFvE KJGvQf1PiTnSY8cYR4Yig7OMQBQV8ml2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2Ksf1/yN5f1rlJPD6F0d/rUFEcn/K2Kt9IrmFqNBiy7kUe8NOTTxnz5sC1X8pNctyW0+aO9 jr8Kk+lJ9zfB/wANmmzdj5I/SRL7Px83CnopDluxy90TzXZcvrVpdxqpoX4uU/4Nar+OYM8GaHMS aJQyDnaXNcXy/aklX5swyniLAyk5bi+b7MkrfJmODiKiUkxs9F813oBtrS8kVjQOFkCf8EaL+OXw wZpchJnGGQ8rZFpX5Sa9cENqEsVjH3UH1ZPuU8P+GzOxdj5JfURH7fx82+GikeezPNA8h+XtGKyx Q/WLtdxcz0dgfFRTiv0Cvvm40/Z+LFuBZ7y5mPTxhy5sizOb3Yq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kDqaYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXn/wCdEXl6fy9YW2uRahLBcXVxHCNM ntrSRSdLvTNJLPdzW0KQx2wmduUlDQKwZCylV5lc6b5UsYbHSr7zD5w07/Fcceq2+syX1ld29qkM rQRPcSafLMscEzXcR9T+6PJPjUqwVpVTzDa/l1pUP1a98x+cLnVLq4XTdOSAXNojzRstq6W1zcRW +nNxEdZpDPxIViDQ40rte8y/l3qPnq9W31vzVNPcaa8qLZXNrHaSE6etuLa2iuWjuWvpDLGv1cJ6 nrsOS7fC0qEjh8pRMmqWnmTzZfy3MM8Nxp11dWykC7hu7pL03ks9nZrAsOn3Rk9KfkrfAxjdXTGl e7eRLlLjyjpbotwFW3jVZLuW3nmmXgCs7S2s11A/rKRICkhFG+jFU+xV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KsQ/Mq+0Cy0/TZtY02PVQbx0trWeWOGAK1l ci9kmadktyiab9aYrMeDfZJWoYKvMfzIjvbZbRNa8tzwaDYx2dt5gFh6NtpkWlma4jP1VrNf0pdr aafJdLIiSxBVpI1uI5HQFXnWpenLPKLa2uIZNMsrK780w6hHBqES6Xa6xLcJbros6x6jZ2KxpFL6 MEwRY/SSRSjfWsVVPJmlaDdW95qEFlNearPbyX2mWen+rYWhvtRF1cQHS1t/r6qdKt7XUHs5DC8n qs0bLDNGiFVPPJnmSOOTQNMis7DWPLesNdXPl2wvHGnWDeja3GkenarcLGn1i9luljvLUmYK/qTx rJ66lFXvv5c3s935RsmubWzsry29Sxu7PTRILOGewc2csUAkSMhEeAqFAKrSis4AdgrJcVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirDPzYvRD5VayeeWGHVWl spxbxwyzSI1pPKYl9ZZ1RZPS4ySfV5uEfJiqqGljVeVflbZeUzrk0fl2eWx1zUZ3Nnr+p6NffpC9 068Rp2vvrl3eTW00t39REtvI8SgPHKwteLOAq9e8ueSb3QotHs7fWZm0rS4pIp7Exo4u+CRQWTSP MZjCYIYKyC39NZZiZKLUoVWC2n/ON2l6fb6clhqitJpr3Dqt5Zo9vcCRVtoI7mG1ks+aLZc4rkIy fW3KvPzVBHirz/zDotzb/mJB5Mg8tw2+nyR/4e/SN5HPqv6StrwLdvd6jKqxX7elFZKLRIuCpLHL xuVit3XCr2v8k7eS0/LLRdOmjWG70yN9PvoVmlueF1ZyNb3KNLKFqVmjYcUrGv2Y2aMKxCs5xV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KsC/O3VY9K8iXN8ZT ZXEBeS11X6pbXq2rx28rvyS6PpJ9biV7JGNavOq0PKmKvJ/yt1t7TzN6uj6Xcaj5RsWmuYvMEJv9 XIsI7iW20nTYlhnv3ge1stReUwmBZfiCyQxhWnYqzOT/AJyQ0T0LKa3sFuzq1vNNodnDc/6ZfyW8 01s8cFu8SFOU1sfS9Zo2lVgIkeblCoVMtM/PK3vLddTk0WeDQKXEr3xc+t9Vs4ILia+S0aNJvqnp XIkSV+JZAPhEskMUirz3Q7m4bUorwXmr6Brbarql5qWm6lrR03RrZra/m1uRGs5pI7mYy2TwRyvF btAsM/rMrOrKVXqv5F63r+u/lfo2seYFkXVr4TT3DS+pWQPM5jmCyFiizR8ZFVaIA37tVj4qFWe4 q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXnX55LYSeV9Ph uFm+tNqcM+nywtGI45LKGa9ma59a90uMwG0tp0k5Tilaj4gCFXj+tWU3l+9079C6m1udbs5x5G0j U7CLVpeV+LmKK3fUluJrBoPWvAIXWaR/9KT6yrRRKcKoOLUNHvtG0PT9FiuZfL2nPZaHq9syWdlr Gr6jqto1lp+oQSX11JP6MdrO09msiKE4oFrGrPbKtec/NOmafceY9djtJIrny1d3el6G9JLmZ/S1 c22pRcuVzp0NvDp+opBD9bsAVEyRoX9JS6qGi/Lvy7J5dvZvJPmwvrVrbGz0tvL8r29xfappNr9f 1KOWOR4pdSiNxHHJbTW3J0acAhooo+IV9J/lnr0eueTLC/jmS4UBrYzRyPOrNasbdm9aSS4aRi0R LN60o5V4zTLSV1WUYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FUq8xeV9F8xW8Fvq0H1iG3keWNOTKtZbeW1kDAGjq8FzIjK1QQcVQl35E8u3GmWOnBLi1i0xD Dp81jdXFlcQwHjWBJ7V4ZBCeCVi5cPhTb4Foqll1+UXkq41G41H0721vLm6bUJGsdQvrFBePEYJL lYbSaCFZpIiVeQJyYE1O5qqq3P5VeSLm9N3PZPIrwQWkmnvNK2nPb2ilbaFtOZjYmOHkXjT0aK5L ijb4qot+Tn5eH1EXTHitpfrjS2MNzcw2ry6hHNDczNbxSJEZXhupIhJx5KlFUqqoFVZdaWNnZpJH aQJbxyySTyJEoRTLMxklcgUHJ3Ysx7sSTucVVsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdir/9k= xmp.iid:fa9090f6-598e-9446-a11e-923241fea52b xmp.did:fa9090f6-598e-9446-a11e-923241fea52b uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf xmp.iid:76c84b10-fd0e-0a43-8102-d8641712ff6b xmp.did:76c84b10-fd0e-0a43-8102-d8641712ff6b uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf saved xmp.iid:99e2142c-0346-aa4d-8231-18477e96321b 2022-08-22T13:36:05+06:00 Adobe Illustrator 26.0 (Windows) / saved xmp.iid:fa9090f6-598e-9446-a11e-923241fea52b 2022-08-22T13:39:23+06:00 Adobe Illustrator 26.0 (Windows) / Print Adobe Illustrator Adobe PDF library 15.00 XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed;     !"7w92v֗x1VXYy:A#$%8 ?ppppppmV'{XoJ!8ybDqVeor@Q>< gm5^W~T{Y;&X6Uw_OO^B5"ʗ^)c go' q'0Q J0 , 8ώ8tz9z)+VWmi_+Y'#¸hĩ͝I.fGIyP˜~A oYnqׁ2HX۴{-s_ Кl9<~'~}HyRSʵ!@s-ixɁ 9>8888~ƿt KnEְH37$D'&Z 䘝RSq&",L  !rpm^uNuu]CgHg+,Mi?s N90f|+Wq]mQNqg6 ٔ`sGedq>@*c2SVd,($XjA c dҒ0#&4%'?tK\~ ؖ/򃛙SxLXvz]~±kynnǖ^MPy QĒ ]{9%fڗP*;,`|bW1/7K3xdb [Bz;]-[VN[.R,*SQlb u dg[z^u%՝]uC#>&LL޽xTAĥt-*3<"SV K;n':;}^&@MM=l-D&VO"F>>9s<{7쇰Ni^ع5HTbHT{1d6ʙ*NYnD9!ϳ< &uOfQȘ՚tX#R{y2h=q$0kQVM$Y 2#=MhK>!{xt:5bآ:̞('.'lGGc,[.X&l(cE d 俦%5uW^̞+sڈ+b)aJElIIX@a!`` B߲Y\IWZC̆0883Ws#o+:;*F#Q,jlBf2_^ۤA{WQʌu[I0JXin~!tLX ;u쭃~ ™5Ft'iy 76XQSYNppeʠ&+&p~ЗN( 4ԪGמFDxIdJ!u'Z钇PqG# ZyY0]$w.t=Jc<{E՟H5?+gȘbOj (?Vf}PU3,xQqZvw:~ֹO:nhty FGz!V(W{q$wci(<ӽ ^\^Kgb;ykVRaև7W*34P\j21 zF(%qP%#4KN2juǼ%Tj̕ѷYcb !BcW$p%:Fb1nnI"Q7 (a1ciG(wIC/bYMvMZHi+%;"BTp<Dٔ9R3Sd1ȓVN%9,NNB̴f4JѸ6La'0e 8q^ۙnTGeM 31HMxݗ(P3pp_9cF`3.HyLwp9ox} tR;4k:Џ5mZߪI05%ۭ p ֒* gF+1Jw)Ohɯ母injzm2)EwW)q!8^Џ>ШXぇW}~@k:S/qGo#dq'8̠iN|fkjX"ajN) S Nh3 ,!˓St;i9'`ϠOef-UX"UT PMN)I8Ԙ@w8Ei 4 qZYDXr3 4@Ye9ȅ}p9~_d3i4;$Z(б@ztBǒҀJ0!gqmi'/AˁR/p]-g͏$F6)#b/t9&}RRݜ w\HFxh@^U=|vClq*N֩\NJn@Y*Q焥rO?ݒ`ZlgTd[sAPΡKf>+g3ݜE+ܷ6Xh|AKiWjvcc2 2M1Gږ4tK Y153AKg8,bRH_XB6l珐@KZ`<^\Y6G"qmYDx~ƿt Kn{_E-5j54.lg!))3׸rDh%hr8gyl &u" w*2\dMrvqF?1*Ǐ`G%kX@ZD TI'q.qꦓ!8O1SHß_?ONľ qnm7:2 bJEOCs$4AONhVFҊuH b5xyOY5-=<-* 8a!N["[FFIx'Csp=DivrsmZs $RS8!V($0O#ExKѯ;K/\bjeµŖ1krĥ%; GdubPΪi3am?z:?u\ 6#8YWoy~UP.H xZѝY%@eP"L5j+;~7pĥŦ,XIpT-K;gK @vΔڪ򿐐vc2\&TC*&JCT>D"rH?pBa 4ucNv{y!LC4ktIs] )ѠO4 6x4~R! m]OJQLU/ iR pXJ )ҒM*zPV /VvC8g|DV18=|JJڭG3# lumX@H< 0にA?v_+vy 32liJBڄ76" A Dqp5sZ}gʝvV]711)WeOfD[p  FQH6<Z1# 1+jp$ngdejN)A(YE!1p0nJVm}][:lJ$3 & @B2쨔H$Ä@`88-zT=+(zfU$%yW I=cg1Ж"~L B4y1 37 ߯;Dwa(n`KF[YMi`1#dd`ń"ioL}L4H䏮M6ʤG0~NosbXPCo҆o1L6 c !D -1xkLb:VsM쌉/"%x< Z{(eWwȪ6J6_0sc\He:\cY.#$GDP2,g!yP5.ٴۦ'ZB-ܒĄRe)+О2N g&1Xsp33<=!jm}`}m\+;;SP5:(N-('pQ @r Q tR\ "ע@!)ETAEXb&!ci…1U3477 0P35z'Kep6=`1"la=G2GQBfvŧL9eA%BcښK`7%i_PW 9fcȒJj䩵՝Qx gfsFkwN]4E^&ljp<aSY,䜖 yC xCbX">b1f$BGBQ35'Hޔ#,s{x{8888888golang-github-yeqown-go-qrcode-2.2.5/example/with-logosize-multiplier/main.go000066400000000000000000000013201521051213400273310ustar00rootroot00000000000000package main import ( "github.com/yeqown/go-qrcode/writer/standard" "github.com/yeqown/go-qrcode/v2" ) func main() { qrc, err := qrcode.NewWith("github.com/yeqown/go-qrcode", qrcode.WithEncodingMode(qrcode.EncModeByte), qrcode.WithErrorCorrectionLevel(qrcode.ErrorCorrectionQuart), ) if err != nil { panic(err) } // Validates logo size as follows qrWidth >= 2*logoWidth && qrHeight >= 2*logoHeight // Instead of default expression qrWidth >= 5*logoWidth && qrHeight >= 5*logoHeight w, err := standard.New( "./simple.png", standard.WithLogoImageFileJPEG("./logo.jpg"), standard.WithLogoSizeMultiplier(2), ) if err != nil { panic(err) } if err = qrc.Save(w); err != nil { panic(err) } } golang-github-yeqown-go-qrcode-2.2.5/go.mod000066400000000000000000000004311521051213400205430ustar00rootroot00000000000000module github.com/yeqown/go-qrcode/v2 go 1.18 require ( github.com/stretchr/testify v1.7.0 github.com/yeqown/reedsolomon v1.0.0 ) require ( github.com/davecgh/go-spew v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect gopkg.in/yaml.v3 v3.0.0 // indirect ) golang-github-yeqown-go-qrcode-2.2.5/go.sum000066400000000000000000000023441521051213400205750ustar00rootroot00000000000000github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/yeqown/reedsolomon v1.0.0 h1:x1h/Ej/uJnNu8jaX7GLHBWmZKCAWjEJTetkqaabr4B0= github.com/yeqown/reedsolomon v1.0.0/go.mod h1:P76zpcn2TCuL0ul1Fso373qHRc69LKwAw/Iy6g1WiiM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= golang-github-yeqown-go-qrcode-2.2.5/go.work000066400000000000000000000002161521051213400207470ustar00rootroot00000000000000go 1.19 use ( . ./.issues ./writer/compressed ./writer/standard ./writer/terminal //./writer/file ./cmd/qrcode ./cmd/wasm example ) golang-github-yeqown-go-qrcode-2.2.5/go.work.sum000066400000000000000000000106271521051213400215610ustar00rootroot00000000000000github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/yeqown/go-qrcode/v2 v2.0.2/go.mod h1:Yy3DxXAv0XbWgniNafyB+6vpbZmUdCpvzeGy0h8ubXw= github.com/yeqown/go-qrcode/v2 v2.2.0/go.mod h1:2Qsk2APUCPne0TsRo40DIkI5MYnbzYKCnKGEFWrxd24= github.com/yeqown/go-qrcode/v2 v2.2.2/go.mod h1:2Qsk2APUCPne0TsRo40DIkI5MYnbzYKCnKGEFWrxd24= github.com/yeqown/go-qrcode/v2 v2.2.4/go.mod h1:uHpt9CM0V1HeXLz+Wg5MN50/sI/fQhfkZlOM+cOTHxw= github.com/yeqown/go-qrcode/writer/file v0.0.0-20250101101152-a2f3943410a2 h1:U3yuXYC0VwlSik09BQXbcx8wNAPHBQCVblOAlgknVcA= github.com/yeqown/go-qrcode/writer/file v0.0.0-20250101101152-a2f3943410a2/go.mod h1:k5q4Y/A4VSAdrU5My6lt6KiT9F7kDy0yFpsni8h4lqI= github.com/yeqown/go-qrcode/writer/standard v1.1.1/go.mod h1:GFrLTV4g3qxHdQesm5nKdNtbPa5cKDpFbmEib51Ofgs= github.com/yeqown/go-qrcode/writer/standard v1.2.0/go.mod h1:ZelyDFiVymrauRjUn454iF7bjsabmB1vixkDA5kq2bw= github.com/yeqown/go-qrcode/writer/terminal v1.0.0-beta/go.mod h1:BVcueLy3tP/ZKrMO2TCk3SLx1tc3Rob8ed4NLnwAJwc= github.com/yeqown/go-qrcode/writer/terminal v1.1.0/go.mod h1:kh1Ru3RkCNKPYLcdmqh2VNNKPETUVDZScT/G9ZW1efs= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ= golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/net v0.6.0 h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= golang-github-yeqown-go-qrcode-2.2.5/kmp_variant.go000066400000000000000000000016661521051213400223120ustar00rootroot00000000000000package qrcode // kmp is variant of kmp algorithm to count the pattern been in // src slice. // DONE(@yeqown): implement this in generic way. func kmp[v comparable](src, pattern []v, next []int) (count int) { if next == nil { next = kmpGetNext(pattern) } slen := len(src) plen := len(pattern) i := 0 // cursor of src j := 0 // cursor of pattern loop: for i < slen && j < plen { if j == -1 || src[i] == pattern[j] { i++ j++ } else { j = next[j] } } if j == plen { if i-j >= 0 { count++ } // reset cursor to count duplicate pattern. // such as: "aaaa" and "aa", we want 3 rather than 2. i -= plen - 1 j = 0 goto loop } return count } func kmpGetNext[v comparable](pattern []v) []int { fail := make([]int, len(pattern)) fail[0] = -1 j := 0 k := -1 for j < len(pattern)-1 { if k == -1 || pattern[j] == pattern[k] { k++ j++ fail[j] = k } else { k = fail[k] } } return fail } golang-github-yeqown-go-qrcode-2.2.5/kmp_variant_test.go000066400000000000000000000013771521051213400233500ustar00rootroot00000000000000package qrcode import ( "testing" "github.com/stretchr/testify/assert" ) func Test_kmp(t *testing.T) { src := binaryToQRValueSlice("11001010010111001010010101011100") type args struct { src []qrvalue pattern []qrvalue } tests := []struct { name string args args wantCount int }{ { name: "test1", args: args{ src: src, pattern: binaryToQRValueSlice("0101"), }, wantCount: 6, }, { name: "test1", args: args{ src: src, pattern: binaryToQRValueSlice("1001010"), }, wantCount: 3, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert.Equalf(t, tt.wantCount, kmp(tt.args.src, tt.args.pattern, nil), "kmp(%v, %v)", tt.args.src, tt.args.pattern) }) } } golang-github-yeqown-go-qrcode-2.2.5/mask.go000066400000000000000000000056431521051213400207310ustar00rootroot00000000000000package qrcode // maskPatternModulo ... // mask Pattern ref to: https://www.thonky.com/qr-code-tutorial/mask-patterns type maskPatternModulo uint32 const ( // modulo0 (x+y) mod 2 == 0 modulo0 maskPatternModulo = iota // modulo1 (x) mod 2 == 0 modulo1 // modulo2 (y) mod 3 == 0 modulo2 // modulo3 (x+y) mod 3 == 0 modulo3 // modulo4 (floor (x/ 2) + floor (y/ 3) mod 2 == 0 modulo4 // modulo5 (x * y) mod 2) + (x * y) mod 3) == 0 modulo5 // modulo6 (x * y) mod 2) + (x * y) mod 3) mod 2 == 0 modulo6 // modulo7 (x + y) mod 2) + (x * y) mod 3) mod 2 == 0 modulo7 ) type mask struct { mat *Matrix // matrix mode maskPatternModulo // mode moduloFn moduloFunc // moduloFn masking function } // newMask ... func newMask(mat *Matrix, mode maskPatternModulo) *mask { m := &mask{ mat: mat.Copy(), mode: mode, moduloFn: getModuloFunc(mode), } m.masking() return m } // moduloFunc to define what's modulo func type moduloFunc func(int, int) bool func getModuloFunc(mode maskPatternModulo) (f moduloFunc) { f = nil switch mode { case modulo0: f = modulo0Func case modulo1: f = modulo1Func case modulo2: f = modulo2Func case modulo3: f = modulo3Func case modulo4: f = modulo4Func case modulo5: f = modulo5Func case modulo6: f = modulo6Func case modulo7: f = modulo7Func } return } // init generate maks by mode func (m *mask) masking() { moduloFn := m.moduloFn if moduloFn == nil { panic("impossible panic, contact maintainer plz") } m.mat.iter(IterDirection_COLUMN, func(x, y int, s qrvalue) { // skip the function modules if v, _ := m.mat.at(x, y); v.qrtype() != QRType_INIT { _ = m.mat.set(x, y, QRValue_INIT_V0) return } if moduloFn(x, y) { _ = m.mat.set(x, y, QRValue_DATA_V1) } else { _ = m.mat.set(x, y, QRValue_DATA_V0) } }) } // modulo0Func for maskPattern function // modulo0 (x+y) mod 2 == 0 func modulo0Func(x, y int) bool { return (x+y)%2 == 0 } // modulo1Func for maskPattern function // modulo1 (y) mod 2 == 0 func modulo1Func(x, y int) bool { return y%2 == 0 } // modulo2Func for maskPattern function // modulo2 (x) mod 3 == 0 func modulo2Func(x, y int) bool { return x%3 == 0 } // modulo3Func for maskPattern function // modulo3 (x+y) mod 3 == 0 func modulo3Func(x, y int) bool { return (x+y)%3 == 0 } // modulo4Func for maskPattern function // modulo4 (floor (x/ 2) + floor (y/ 3) mod 2 == 0 func modulo4Func(x, y int) bool { return (x/3+y/2)%2 == 0 } // modulo5Func for maskPattern function // modulo5 (x * y) mod 2 + (x * y) mod 3 == 0 func modulo5Func(x, y int) bool { return (x*y)%2+(x*y)%3 == 0 } // modulo6Func for maskPattern function // modulo6 (x * y) mod 2) + (x * y) mod 3) mod 2 == 0 func modulo6Func(x, y int) bool { return ((x*y)%2+(x*y)%3)%2 == 0 } // modulo7Func for maskPattern function // modulo7 (x + y) mod 2) + (x * y) mod 3) mod 2 == 0 func modulo7Func(x, y int) bool { return ((x+y)%2+(x*y)%3)%2 == 0 } golang-github-yeqown-go-qrcode-2.2.5/mask_evaluation.go000066400000000000000000000110031521051213400231430ustar00rootroot00000000000000package qrcode import ( "math" ) // evaluation calculate a score after masking matrix. // // reference: // - https://www.thonky.com/qr-code-tutorial/data-masking#Determining-the-Best-Mask func evaluation(mat *Matrix) (score int) { debugLogf("calculate maskScore starting") score1 := rule1(mat) score2 := rule2(mat) score3 := rule3(mat) score4 := rule4(mat) score = score1 + score2 + score3 + score4 debugLogf("maskScore: rule1=%d, rule2=%d, rule3=%d, rule4=%d", score1, score2, score3, score4) return score } // check each row one-by-one. If there are five consecutive modules of the same color, // add 3 to the penalty. If there are more modules of the same color after the first five, // add 1 for each additional module of the same color. Afterward, check each column one-by-one, // checking for the same condition. Add the horizontal and vertical total to obtain penalty score func rule1(mat *Matrix) (score int) { // prerequisites: // mat.Width() == mat.Height() if mat.Width() != mat.Height() { debugLogf("matrix width != height, skip rule1") return math.MaxInt32 } dimension := mat.Width() scoreLine := func(arr []qrvalue) int { lScore, cnt, cur := 0, 0, QRValue_INIT_V0 for _, v := range arr { if !samestate(v, cur) { cur = v cnt = 1 continue } cnt++ if cnt == 5 { lScore += 3 } else if cnt > 5 { lScore++ } } return lScore } for cur := 0; cur < dimension; cur++ { row := mat.Row(cur) col := mat.Col(cur) score += scoreLine(row) score += scoreLine(col) } return score } // rule2 // look for areas of the same color that are at least 2x2 modules or larger. // The QR code specification says that for a solid-color block of size m × n, // the penalty score is 3 × (m - 1) × (n - 1). func rule2(mat *Matrix) int { var ( score int s0, s1, s2, s3 qrvalue ) for x := 0; x < mat.Width()-1; x++ { for y := 0; y < mat.Height()-1; y++ { s0, _ = mat.at(x, y) s1, _ = mat.at(x+1, y) s2, _ = mat.at(x, y+1) s3, _ = mat.at(x+1, y+1) if s0 == s1 && s2 == s3 && s1 == s2 { score += 3 } } } return score } // rule3 calculate punishment score in rule3, find pattern in QR Code matrix. // Looks for patterns of dark-light-dark-dark-dark-light-dark that have four // light modules on either side. In other words, it looks for any of the // following two patterns: 1011101 0000 or 0000 1011101. // // Each time this pattern is found, add 40 to the penalty score. func rule3(mat *Matrix) (score int) { var ( pattern1 = binaryToQRValueSlice("1011101 0000") pattern2 = binaryToQRValueSlice("0000 1011101") pattern1Next = kmpGetNext(pattern1) pattern2Next = kmpGetNext(pattern2) ) // prerequisites: // // mat.Width() == mat.Height() if mat.Width() != mat.Height() { debugLogf("rule3 got matrix but not matched prerequisites") return math.MaxInt32 } dimension := mat.Width() for i := 0; i < dimension; i++ { col := mat.Col(i) row := mat.Row(i) // DONE(@yeqown): statePattern1 and statePattern2 are fixed, so maybe kmpGetNext // could cache result to speed up. score += 40 * kmp(col, pattern1, pattern1Next) score += 40 * kmp(col, pattern2, pattern2Next) score += 40 * kmp(row, pattern1, pattern1Next) score += 40 * kmp(row, pattern2, pattern2Next) } return score } // rule4 is based on the ratio of light modules to dark modules: // // 1. Count the total number of modules in the matrix. // 2. Count how many dark modules there are in the matrix. // 3. Calculate the percent of modules in the matrix that are dark: (darkmodules / totalmodules) * 100 // 4. Determine the previous and next multiple of five of this percent. // 5. Subtract 50 from each of these multiples of five and take the absolute qrbool of the result. // 6. Divide each of these by five. For example, 10/5 = 2 and 5/5 = 1. // 7. Finally, take the smallest of the two numbers and multiply it by 10. // func rule4(mat *Matrix) int { // prerequisites: // // mat.Width() == mat.Height() if mat.Width() != mat.Height() { debugLogf("rule4 got matrix but not matched prerequisites") return math.MaxInt32 } dimension := mat.Width() dark, total := 0, dimension*dimension for i := 0; i < dimension; i++ { col := mat.Col(i) // count dark modules for j := 0; j < dimension; j++ { if samestate(col[j], QRValue_DATA_V1) { dark++ } } } ratio := (dark * 100) / total // in range [0, 100] step := 0 if ratio%5 == 0 { step = 1 } previous := abs((ratio/5-step)*5 - 50) next := abs((ratio/5+1-step)*5 - 50) return min(previous, next) / 5 * 10 } golang-github-yeqown-go-qrcode-2.2.5/mask_evaluation_test.go000066400000000000000000000023651521051213400242150ustar00rootroot00000000000000package qrcode import ( "testing" "github.com/stretchr/testify/assert" ) //func Test_rule3_refactor(t *testing.T) { // qrc, err := newMatrix("baidu.com google.com qq.com sina.com apple.com") // assert.NoError(t, err) // _ = qrc // old := rule3_backup(qrc.mat) // refactor := rule3(qrc.mat) // assert.Equal(t, old, refactor) //} func Benchmark_rule3(b *testing.B) { qrc, err := New("baidu.com google.com qq.com sina.com apple.com") assert.NoError(b, err) b.ResetTimer() for i := 0; i < b.N; i++ { _ = rule3(qrc.mat) } } //func Test_rule1_refactor(t *testing.T) { // qrc, err := newMatrix("baidu.com google.com qq.com sina.com apple.com") // assert.NoError(t, err) // qrc.mat.Print() // // old := rule1_backup(qrc.mat) // refactor := rule1(qrc.mat) // assert.Equal(t, old, refactor) //} func Benchmark_rule1(b *testing.B) { qrc, err := New("baidu.com google.com qq.com sina.com apple.com") assert.NoError(b, err) b.ResetTimer() for i := 0; i < b.N; i++ { _ = rule1(qrc.mat) } } //func Test_rule4_refactor(t *testing.T) { // qrc, err := newMatrix("baidu.com google.com qq.com sina.com apple.com") // assert.NoError(t, err) // //qrc.mat.Print() // // old := rule4_backup(qrc.mat) // refactor := rule4(qrc.mat) // assert.Equal(t, old, refactor) //} golang-github-yeqown-go-qrcode-2.2.5/mask_test.go000066400000000000000000000024331521051213400217620ustar00rootroot00000000000000package qrcode import ( "testing" "github.com/stretchr/testify/require" ) func TestMask(t *testing.T) { qrc := &QRCode{ sourceText: "baidu.com google.com qq.com sina.com apple.com", encodingOption: DefaultEncodingOption(), } err := qrc.init() require.NoError(t, err) var stateInitCnt int qrc.mat.iter(IterDirection_COLUMN, func(x, y int, s qrvalue) { if s.qrtype() == QRType_INIT { stateInitCnt++ } }) t.Logf("all QRType_INIT block count: %d", stateInitCnt) SetDebugMode() cpyMat := qrc.mat.Copy() _ = debugDraw("./testdata/mask_origin.jpeg", *cpyMat) mask0 := newMask(cpyMat, modulo0) _ = debugDraw("./testdata/modulo0.jpeg", *mask0.mat) mask1 := newMask(cpyMat, modulo1) _ = debugDraw("./testdata/modulo1.jpeg", *mask1.mat) mask2 := newMask(cpyMat, modulo2) _ = debugDraw("./testdata/modulo2.jpeg", *mask2.mat) mask3 := newMask(cpyMat, modulo3) _ = debugDraw("./testdata/modulo3.jpeg", *mask3.mat) mask4 := newMask(cpyMat, modulo4) _ = debugDraw("./testdata/modulo4.jpeg", *mask4.mat) mask5 := newMask(cpyMat, modulo5) _ = debugDraw("./testdata/modulo5.jpeg", *mask5.mat) mask6 := newMask(cpyMat, modulo6) _ = debugDraw("./testdata/modulo6.jpeg", *mask6.mat) mask7 := newMask(cpyMat, modulo7) _ = debugDraw("./testdata/modulo7.jpeg", *mask7.mat) } golang-github-yeqown-go-qrcode-2.2.5/matrix.go000066400000000000000000000067561521051213400213100ustar00rootroot00000000000000package qrcode import ( "errors" "fmt" ) var ( // ErrorOutRangeOfW x out of range of Width ErrorOutRangeOfW = errors.New("out of range of width") // ErrorOutRangeOfH y out of range of Height ErrorOutRangeOfH = errors.New("out of range of height") ) // newMatrix generate a matrix with map[][]qrbool func newMatrix(width, height int) *Matrix { mat := make([][]qrvalue, width) for w := 0; w < width; w++ { mat[w] = make([]qrvalue, height) } m := &Matrix{ mat: mat, width: width, height: height, } m.init() return m } // Matrix is a matrix data type // width:3 height: 4 for [3][4]int type Matrix struct { mat [][]qrvalue width int height int } // do some init work func (m *Matrix) init() { for w := 0; w < m.width; w++ { for h := 0; h < m.height; h++ { m.mat[w][h] = QRValue_INIT_V0 } } } // print to stdout func (m *Matrix) print() { m.iter(IterDirection_ROW, func(x, y int, s qrvalue) { fmt.Printf("%s ", s) if (x + 1) == m.width { fmt.Println() } }) } // Copy matrix into a new Matrix func (m *Matrix) Copy() *Matrix { mat2 := make([][]qrvalue, m.width) for w := 0; w < m.width; w++ { mat2[w] = make([]qrvalue, m.height) copy(mat2[w], m.mat[w]) } m2 := &Matrix{ width: m.width, height: m.height, mat: mat2, } return m2 } // Width ... width func (m *Matrix) Width() int { return m.width } // Height ... height func (m *Matrix) Height() int { return m.height } // set [w][h] as true func (m *Matrix) set(w, h int, c qrvalue) error { if w >= m.width || w < 0 { return ErrorOutRangeOfW } if h >= m.height || h < 0 { return ErrorOutRangeOfH } m.mat[w][h] = c return nil } // at state qrvalue from matrix with position {x, y} func (m *Matrix) at(w, h int) (qrvalue, error) { if w >= m.width || w < 0 { return QRValue_INIT_V0, ErrorOutRangeOfW } if h >= m.height || h < 0 { return QRValue_INIT_V0, ErrorOutRangeOfH } return m.mat[w][h], nil } // iterDirection scan matrix direction type iterDirection uint8 const ( // IterDirection_ROW for row first IterDirection_ROW iterDirection = iota + 1 // IterDirection_COLUMN for column first IterDirection_COLUMN ) // Iterate the Matrix with loop direction IterDirection_ROW major or IterDirection_COLUMN major. // IterDirection_COLUMN is recommended. func (m *Matrix) Iterate(direction iterDirection, fn func(x, y int, s QRValue)) { m.iter(direction, fn) } func (m *Matrix) iter(dir iterDirection, visitFn func(x int, y int, v qrvalue)) { // row direction first if dir == IterDirection_ROW { for h := 0; h < m.height; h++ { for w := 0; w < m.width; w++ { visitFn(w, h, m.mat[w][h]) } } return } // column direction first for w := 0; w < m.width; w++ { for h := 0; h < m.height; h++ { visitFn(w, h, m.mat[w][h]) } } } // Row return a row of matrix, cur should be y dimension. func (m *Matrix) Row(cur int) []qrvalue { if cur >= m.height || cur < 0 { return nil } col := make([]qrvalue, m.height) for w := 0; w < m.width; w++ { col[w] = m.mat[w][cur] } return col } // Col return a slice of column, cur should be x dimension. func (m *Matrix) Col(cur int) []qrvalue { if cur >= m.width || cur < 0 { return nil } return m.mat[cur] } // Bitmap outputs the QR Code as a matrix of pixels, each represented by a single bit. func (m *Matrix) Bitmap() [][]bool { table := make([][]bool, m.Height()) for t := range table { table[t] = make([]bool, m.Width()) } m.iter(IterDirection_ROW, func(x, y int, s qrvalue) { table[y][x] = s.qrbool() }) return table } golang-github-yeqown-go-qrcode-2.2.5/matrix_test.go000066400000000000000000000066621521051213400223430ustar00rootroot00000000000000package qrcode import ( "testing" "github.com/stretchr/testify/assert" ) func TestMatrix(t *testing.T) { m := newMatrix(3, 3) m.print() err := m.set(2, 4, QRValue_DATA_V1) assert.Error(t, err) err = m.set(2, 2, QRValue_DATA_V1) assert.NoError(t, err) v, err2 := m.at(2, 2) assert.NoError(t, err2) assert.Equal(t, QRValue_DATA_V1, v) m.print() // m.Reset(2, 2) } func TestMatrix_Copy(t *testing.T) { // pre var ( m1 = newMatrix(3, 3) m2 = newMatrix(3, 3) ) _ = m1.set(1, 1, QRValue_DATA_V0) _ = m1.set(0, 0, QRValue_DATA_V0) _ = m2.set(1, 1, QRValue_DATA_V0) _ = m2.set(0, 0, QRValue_DATA_V0) // do copy got := m1.Copy() // change origin _ = m1.set(2, 2, QRValue_DATA_V1) assert.Equal(t, m2, got) s, err := m1.at(2, 2) assert.NoError(t, err) assert.Equal(t, QRValue_DATA_V1, s) s, err = got.at(2, 2) assert.NoError(t, err) assert.NotEqual(t, QRValue_DATA_V1, s) assert.Equal(t, QRValue_INIT_V0, s) } //func Test_stateSliceMatched(t *testing.T) { // type args struct { // ss1 []qrtype // ss2 []qrtype // } // tests := []struct { // name string // args args // want qrbool // }{ // { // name: "case 0", // args: args{ // ss1: []qrtype{QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V1}, // ss2: []qrtype{QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V1}, // }, // want: true, // }, // { // name: "case 0", // args: args{ // ss1: []qrtype{QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V1}, // ss2: []qrtype{QRValue_DATA_V0, QRValue_DATA_V1, QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V1}, // }, // want: false, // }, // } // for _, tt := range tests { // t.Run(tt.name, func(t *testing.T) { // if got := StateSliceMatched(tt.args.ss1, tt.args.ss2); got != tt.want { // t.Errorf("stateSliceMatched() = %v, want %v", got, tt.want) // } // }) // } //} // go test -run=NONE -bench Benchmark_Iterate -count 10 > old.txt // after change to `m.iter(IterDirection_COLUMN, rowIteration)` // go test -run=NONE -bench Benchmark_Iterate -count 10 > new.txt // benchstat old.txt new.txt func Benchmark_Iterate(b *testing.B) { // initialize size := 100 m := newMatrix(size, size) for i := 0; i < size; i++ { for j := 0; j < size; j++ { _ = m.set(i, j, QRValue_DATA_V1) } } b.ResetTimer() rowIteration := func(x, y int, s qrvalue) { _, _ = x, y _ = s } for i := 0; i < b.N; i++ { //m.iter(IterDirection_ROW, rowIteration) m.iter(IterDirection_COLUMN, rowIteration) } } func Test_Matrix_RowAndCol(t *testing.T) { m := newMatrix(3, 3) for i := 0; i < 3; i++ { _ = m.set(i, 0, QRValue_DATA_V1) _ = m.set(i, i, QRValue_DATA_V1) } // 1 1 1 // 0 1 0 // 0 0 1 tests := []struct { name string rowed bool cur int want []qrvalue }{ { name: "row[1]", rowed: true, cur: 1, want: []qrvalue{QRValue_INIT_V0, QRValue_DATA_V1, QRValue_INIT_V0}, }, { name: "col[2]", rowed: false, cur: 2, want: []qrvalue{QRValue_DATA_V1, QRValue_INIT_V0, QRValue_DATA_V1}, }, { name: "row out", rowed: true, cur: 4, want: nil, }, { name: "col out", rowed: false, cur: 4, want: nil, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var got []qrvalue switch tt.rowed { case true: got = m.Row(tt.cur) default: got = m.Col(tt.cur) } assert.Equal(t, tt.want, got) }) } } golang-github-yeqown-go-qrcode-2.2.5/matrix_type.go000066400000000000000000000067311521051213400223420ustar00rootroot00000000000000package qrcode type QRType = qrtype // qrtype type qrtype uint8 const ( // QRType_INIT represents the initial block state of the matrix QRType_INIT qrtype = 1 << 1 // QRType_DATA represents the data block state of the matrix QRType_DATA qrtype = 2 << 1 // QRType_VERSION indicates the version block of matrix QRType_VERSION qrtype = 3 << 1 // QRType_FORMAT indicates the format block of matrix QRType_FORMAT qrtype = 4 << 1 // QRType_FINDER indicates the finder block of matrix QRType_FINDER qrtype = 5 << 1 // QRType_DARK ... QRType_DARK qrtype = 6 << 1 QRType_SPLITTER qrtype = 7 << 1 QRType_TIMING qrtype = 8 << 1 ) func (s qrtype) String() string { switch s { case QRType_INIT: return "I" case QRType_DATA: return "d" case QRType_VERSION: return "V" case QRType_FORMAT: return "f" case QRType_FINDER: return "F" case QRType_DARK: return "D" case QRType_SPLITTER: return "S" case QRType_TIMING: return "T" } return "?" } type QRValue = qrvalue func (v QRValue) Type() qrtype { return v.qrtype() } func (v QRValue) IsSet() bool { return v.qrbool() } // qrvalue represents the value of the matrix, it is composed of the qrtype(7bits) and the value(1bits). // such as: 0b0000,0011 (QRValue_DATA_V1) represents the qrtype is QRType_DATA and the value is 1. type qrvalue uint8 var ( // QRValue_INIT_V0 represents the value 0 qrvalue(QRType_INIT | 0) QRValue_INIT_V0 = qrvalue(QRType_INIT) // QRValue_DATA_V0 represents the block has been set to false qrvalue(QRType_DATA | 0) QRValue_DATA_V0 = qrvalue(QRType_DATA) // QRValue_DATA_V1 represents the block has been set to TRUE QRValue_DATA_V1 = qrvalue(QRType_DATA | 1) // QRValue_VERSION_V0 represents the block has been set to false qrvalue(QRType_VERSION | 0) QRValue_VERSION_V0 = qrvalue(QRType_VERSION) // QRValue_VERSION_V1 represents the block has been set to TRUE QRValue_VERSION_V1 = qrvalue(QRType_VERSION | 1) // QRValue_FORMAT_V0 represents the block has been set to false qrvalue(QRType_FORMAT | 0) QRValue_FORMAT_V0 = qrvalue(QRType_FORMAT) // QRValue_FORMAT_V1 represents the block has been set to TRUE QRValue_FORMAT_V1 = qrvalue(QRType_FORMAT | 1) // QRValue_FINDER_V0 represents the block has been set to false qrvalue(QRType_FINDER | 0) QRValue_FINDER_V0 = qrvalue(QRType_FINDER) // QRValue_FINDER_V1 represents the block has been set to TRUE QRValue_FINDER_V1 = qrvalue(QRType_FINDER | 1) // QRValue_DARK_V0 represents the block has been set to false qrvalue(QRType_DARK | 0) QRValue_DARK_V0 = qrvalue(QRType_DARK) // QRValue_DARK_V1 represents the block has been set to TRUE QRValue_DARK_V1 = qrvalue(QRType_DARK | 1) // QRValue_SPLITTER_V0 represents the block has been set to false qrvalue(QRType_SPLITTER | 0) QRValue_SPLITTER_V0 = qrvalue(QRType_SPLITTER) // QRValue_SPLITTER_V1 represents the block has been set to TRUE QRValue_SPLITTER_V1 = qrvalue(QRType_SPLITTER | 1) // QRValue_TIMING_V0 represents the block has been set to false qrvalue(QRType_TIMING | 0) QRValue_TIMING_V0 = qrvalue(QRType_TIMING) // QRValue_TIMING_V1 represents the block has been set to TRUE QRValue_TIMING_V1 = qrvalue(QRType_TIMING | 1) ) func (v qrvalue) qrtype() qrtype { return qrtype(v & 0xfe) } func (v qrvalue) qrbool() bool { return v&0x01 == 1 } func (v qrvalue) String() string { t := v.qrtype() if v.qrbool() { return t.String() + "1" } return t.String() + "0" } func (v qrvalue) xor(v2 qrvalue) qrvalue { if v != v2 { return QRValue_DATA_V1 } return QRValue_DATA_V0 } golang-github-yeqown-go-qrcode-2.2.5/matrix_type_test.go000066400000000000000000000105701521051213400233750ustar00rootroot00000000000000package qrcode import ( "testing" "github.com/stretchr/testify/assert" ) func Test_qrtype(t *testing.T) { assert.Equal(t, uint8(0b00000010), uint8(QRType_INIT)) // 1 << 1 assert.Equal(t, uint8(0b00000100), uint8(QRType_DATA)) // 2 << 1 assert.Equal(t, uint8(0b00000110), uint8(QRType_VERSION)) // 3 << 1 assert.Equal(t, uint8(0b00001000), uint8(QRType_FORMAT)) // 4 << 1 assert.Equal(t, uint8(0b00001010), uint8(QRType_FINDER)) // 5 << 1 assert.Equal(t, uint8(0b00001100), uint8(QRType_DARK)) // 6 << 1 assert.Equal(t, uint8(0b00001110), uint8(QRType_SPLITTER)) // 7 << 1 assert.Equal(t, uint8(0b00010000), uint8(QRType_TIMING)) // 8 << 1 } func Test_qrvalue(t *testing.T) { // QRValue_INIT_V0 assert.Equal(t, QRType_INIT, QRValue_INIT_V0.qrtype()) assert.False(t, QRValue_INIT_V0.qrbool()) // QRValue_DATA_V1 assert.Equal(t, QRType_DATA, QRValue_DATA_V1.qrtype()) assert.True(t, QRValue_DATA_V1.qrbool()) // QRValue_DATA_V0 assert.Equal(t, QRType_DATA, QRValue_DATA_V0.qrtype()) assert.False(t, QRValue_DATA_V0.qrbool()) // QRValue_VERSION_V0 assert.Equal(t, QRType_VERSION, QRValue_VERSION_V0.qrtype()) assert.False(t, QRValue_VERSION_V0.qrbool()) // QRValue_VERSION_V1 assert.Equal(t, QRType_VERSION, QRValue_VERSION_V1.qrtype()) assert.True(t, QRValue_VERSION_V1.qrbool()) // QRValue_FORMAT_V0 assert.Equal(t, QRType_FORMAT, QRValue_FORMAT_V0.qrtype()) assert.False(t, QRValue_FORMAT_V0.qrbool()) // QRValue_FORMAT_V1 assert.Equal(t, QRType_FORMAT, QRValue_FORMAT_V1.qrtype()) assert.True(t, QRValue_FORMAT_V1.qrbool()) // QRValue_FINDER_V0 assert.Equal(t, QRType_FINDER, QRValue_FINDER_V0.qrtype()) assert.False(t, QRValue_FINDER_V0.qrbool()) // QRValue_FINDER_V1 assert.Equal(t, QRType_FINDER, QRValue_FINDER_V1.qrtype()) assert.True(t, QRValue_FINDER_V1.qrbool()) // QRValue_DARK_V0 assert.Equal(t, QRType_DARK, QRValue_DARK_V0.qrtype()) assert.False(t, QRValue_DARK_V0.qrbool()) // QRValue_DARK_V1 assert.Equal(t, QRType_DARK, QRValue_DARK_V1.qrtype()) assert.True(t, QRValue_DARK_V1.qrbool()) // QRValue_SPLITTER_V0 assert.Equal(t, QRType_SPLITTER, QRValue_SPLITTER_V0.qrtype()) assert.False(t, QRValue_SPLITTER_V0.qrbool()) // QRValue_SPLITTER_V1 assert.Equal(t, QRType_SPLITTER, QRValue_SPLITTER_V1.qrtype()) assert.True(t, QRValue_SPLITTER_V1.qrbool()) // QRValue_TIMING_V0 assert.Equal(t, QRType_TIMING, QRValue_TIMING_V0.qrtype()) assert.False(t, QRValue_TIMING_V0.qrbool()) // QRValue_TIMING_V1 assert.Equal(t, QRType_TIMING, QRValue_TIMING_V1.qrtype()) assert.True(t, QRValue_TIMING_V1.qrbool()) } func Test_qrvalue_xor(t *testing.T) { type args struct { s1 qrvalue s2 qrvalue } tests := []struct { name string args args want qrvalue }{ { name: "case1", args: args{ s1: QRValue_DATA_V0, s2: QRValue_DATA_V0, }, want: QRValue_DATA_V0, }, { name: "case1", args: args{ s1: QRValue_DATA_V1, s2: QRValue_DATA_V0, }, want: QRValue_DATA_V1, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := tt.args.s1.xor(tt.args.s2); got != tt.want { t.Errorf("XOR() = %v, want %v", got, tt.want) } }) } } func Test_qrtype_String(t *testing.T) { tests := []struct { name string t qrtype want string }{ { name: "case1", t: QRType_INIT, want: "I", }, { name: "case2", t: QRType_DATA, want: "d", }, { name: "case3", t: QRType_VERSION, want: "V", }, { name: "case4", t: QRType_FORMAT, want: "f", }, { name: "case5", t: QRType_FINDER, want: "F", }, { name: "case6", t: QRType_DARK, want: "D", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := tt.t.String(); got != tt.want { t.Errorf("qrtype.String() = %v, want %v", got, tt.want) } }) } } func Test_qrvalue_String(t *testing.T) { tests := []struct { name string s qrvalue want string }{ { name: "data 0", s: QRValue_DATA_V0, want: "d0", }, { name: "data 1", s: QRValue_DATA_V1, want: "d1", }, { name: "version 0", s: QRValue_VERSION_V0, want: "V0", }, { name: "version 1", s: QRValue_VERSION_V1, want: "V1", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := tt.s.String(); got != tt.want { t.Errorf("qrvalue.String() = %v, want %v", got, tt.want) } }) } } golang-github-yeqown-go-qrcode-2.2.5/qrcode.go000066400000000000000000000414461521051213400212540ustar00rootroot00000000000000package qrcode import ( "fmt" "log" "math" "sync" "github.com/yeqown/reedsolomon" "github.com/yeqown/reedsolomon/binary" ) // New generate a QRCode struct to create func New(text string) (*QRCode, error) { dst := DefaultEncodingOption() return build(text, dst) } // NewWith generate a QRCode struct with // specified `ver`(QR version) and `ecLv`(Error Correction level) func NewWith(text string, opts ...EncodeOption) (*QRCode, error) { dst := DefaultEncodingOption() for _, opt := range opts { opt.apply(dst) } return build(text, dst) } func build(text string, option *encodingOption) (*QRCode, error) { qrc := &QRCode{ sourceText: text, sourceRawBytes: []byte(text), dataBSet: nil, mat: nil, ecBSet: nil, v: version{}, encodingOption: option, encoder: nil, } // initialize QRCode instance if err := qrc.init(); err != nil { return nil, err } qrc.masking() return qrc, nil } // QRCode contains fields to generate QRCode matrix, outputImageOptions to Draw image, // etc. type QRCode struct { sourceText string // sourceText input text sourceRawBytes []byte // raw Data to transfer dataBSet *binary.Binary // final data bit stream of encode data mat *Matrix // matrix grid to store final bitmap ecBSet *binary.Binary // final error correction bitset encodingOption *encodingOption encoder *encoder // encoder ptr to call its methods ~ v version // indicate the QR version to encode. } func (q *QRCode) Save(w Writer) error { if w == nil { w = nonWriter{} } defer func() { if err := w.Close(); err != nil { log.Printf("[WARNNING] [go-qrcode] close writer failed: %v\n", err) } }() return w.Write(*q.mat) } func (q *QRCode) Dimension() int { if q.mat == nil { return 0 } return q.mat.Width() } // init fill QRCode instance from settings and sourceText. func (q *QRCode) init() (err error) { // choose encode mode (num, alpha num, byte, Japanese) if q.encodingOption.EncMode == EncModeAuto { q.encodingOption.EncMode = analyzeEncodeModeFromRaw(q.sourceRawBytes) } // choose version if _, err = q.calcVersion(); err != nil { return fmt.Errorf("init: calc version failed: %v", err) } q.mat = newMatrix(q.v.Dimension(), q.v.Dimension()) _ = q.applyEncoder() var ( dataBlocks []dataBlock // data encoding blocks ecBlocks []ecBlock // error correction blocks ) // data encoding, and be split into blocks if dataBlocks, err = q.dataEncoding(); err != nil { return err } // generate er bitsets, and also be split into blocks if ecBlocks, err = q.errorCorrectionEncoding(dataBlocks); err != nil { return err } // arrange data blocks and EC blocks q.arrangeBits(dataBlocks, ecBlocks) // append ec bits after data bits q.dataBSet.Append(q.ecBSet) // append remainder bits q.dataBSet.AppendNumBools(q.v.RemainderBits, false) // initial the 2d matrix q.prefillMatrix() return nil } // calcVersion func (q *QRCode) calcVersion() (ver *version, err error) { var needAnalyze = true opt := q.encodingOption if opt.Version >= 1 && opt.Version <= 40 && opt.EcLevel >= ErrorCorrectionLow && opt.EcLevel <= ErrorCorrectionHighest { // only version and EC level are specified, can skip analyzeVersionAuto needAnalyze = false } // automatically parse version if needAnalyze { // analyzeVersion the input data to choose to adapt version analyzed, err2 := analyzeVersion(q.sourceRawBytes, opt.EcLevel, opt.EncMode) if err2 != nil { err = fmt.Errorf("calcVersion: analyzeVersionAuto failed: %v", err2) return nil, err } opt.Version = analyzed.Ver } q.v = loadVersion(opt.Version, opt.EcLevel) return } // applyEncoder func (q *QRCode) applyEncoder() error { q.encoder = newEncoder(q.encodingOption.EncMode, q.encodingOption.EcLevel, q.v) return nil } // dataEncoding ref to: // https://www.thonky.com/qr-code-tutorial/data-encoding func (q *QRCode) dataEncoding() (blocks []dataBlock, err error) { var ( bset *binary.Binary ) bset, err = q.encoder.Encode(q.sourceRawBytes) if err != nil { err = fmt.Errorf("could not encode data: %v", err) return } blocks = make([]dataBlock, q.v.TotalNumBlocks()) // split bitset into data Block start, end, blockID := 0, 0, 0 for _, g := range q.v.Groups { for j := 0; j < g.NumBlocks; j++ { start = end end = start + g.NumDataCodewords*8 blocks[blockID].Data, err = bset.Subset(start, end) if err != nil { panic(err) } blocks[blockID].StartOffset = end - start blocks[blockID].NumECBlock = g.ECBlockwordsPerBlock blockID++ } } return } // dataBlock ... type dataBlock struct { Data *binary.Binary StartOffset int // length NumECBlock int // error correction codewords num per data block } // ecBlock ... type ecBlock struct { Data *binary.Binary // StartOffset int // length } // errorCorrectionEncoding ref to: // https://www.thonky.com/qr-code-tutorial /error-correction-coding func (q *QRCode) errorCorrectionEncoding(dataBlocks []dataBlock) (blocks []ecBlock, err error) { // start, end, blockID := 0, 0, 0 blocks = make([]ecBlock, q.v.TotalNumBlocks()) for idx, b := range dataBlocks { debugLogf("numOfECBlock: %d", b.NumECBlock) bset := reedsolomon.Encode(b.Data, b.NumECBlock) blocks[idx].Data, err = bset.Subset(b.StartOffset, bset.Len()) if err != nil { panic(err) } // blocks[idx].StartOffset = b.StartOffset } return } // arrangeBits ... and save into dataBSet func (q *QRCode) arrangeBits(dataBlocks []dataBlock, ecBlocks []ecBlock) { if debugEnabled() { log.Println("arrangeBits called, before") for i := 0; i < len(ecBlocks); i++ { debugLogf("ec block_%d: %v", i, ecBlocks[i]) } for i := 0; i < len(dataBlocks); i++ { debugLogf("data block_%d: %v", i, dataBlocks[i]) } } // arrange data blocks var ( overflowCnt = 0 endFlag = false curIdx = 0 start, end int ) // check if bitsets initialized, or initial them if q.dataBSet == nil { q.dataBSet = binary.New() } if q.ecBSet == nil { q.ecBSet = binary.New() } for !endFlag { for _, block := range dataBlocks { start = curIdx * 8 end = start + 8 if start >= block.Data.Len() { overflowCnt++ continue } subBin, err := block.Data.Subset(start, end) if err != nil { panic(err) } q.dataBSet.Append(subBin) debugLogf("arrange data blocks info: start: %d, end: %d, len: %d, overflowCnt: %d, curIdx: %d", start, end, block.Data.Len(), overflowCnt, curIdx, ) } curIdx++ // loop finish check if overflowCnt >= len(dataBlocks) { endFlag = true } } // arrange ec blocks and reinitialize endFlag = false overflowCnt = 0 curIdx = 0 for !endFlag { for _, block := range ecBlocks { start = curIdx * 8 end = start + 8 if start >= block.Data.Len() { overflowCnt++ continue } subBin, err := block.Data.Subset(start, end) if err != nil { panic(err) } q.ecBSet.Append(subBin) } curIdx++ // loop finish check if overflowCnt >= len(ecBlocks) { endFlag = true } } debugLogf("arrangeBits called, after") debugLogf("data bitsets: %s", q.dataBSet.String()) debugLogf("ec bitsets: %s", q.ecBSet.String()) } // prefillMatrix with version info: ref to: // http://www.thonky.com/qr-code-tutorial/module-placement-matrix func (q *QRCode) prefillMatrix() { dimension := q.v.Dimension() if q.mat == nil { q.mat = newMatrix(dimension, dimension) } // add finder left-top addFinder(q.mat, 0, 0) addSplitter(q.mat, 7, 7, dimension) debugLogf("finish left-top finder") // add finder right-top addFinder(q.mat, dimension-7, 0) addSplitter(q.mat, dimension-8, 7, dimension) debugLogf("finish right-top finder") // add finder left-bottom addFinder(q.mat, 0, dimension-7) addSplitter(q.mat, 7, dimension-8, dimension) debugLogf("finish left-bottom finder") // only version-1 QR code has no alignment module if q.v.Ver > 1 { // add align-mode related to version cfg for _, loc := range loadAlignmentPatternLocV2(q.v.Ver) { addAlignment(q.mat, loc.X, loc.Y) } debugLogf("finish align") } // add timing line addTimingLine(q.mat, dimension) // add darkBlock always be position (4*ver+9, 8) addDarkBlock(q.mat, 8, 4*q.v.Ver+9) // reserveFormatBlock for version and format info reserveFormatBlock(q.mat, dimension) // reserveVersionBlock for version over 7 // only version 7 and larger version should add version info if q.v.Ver >= 7 { reserveVersionBlock(q.mat, dimension) } } // add finder module func addFinder(m *Matrix, top, left int) { // black outer x, y := top, left for i := 0; i < 24; i++ { _ = m.set(x, y, QRValue_FINDER_V1) if i < 6 { x = x + 1 } else if i < 12 { y = y + 1 } else if i < 18 { x = x - 1 } else { y = y - 1 } } // white inner x, y = top+1, left+1 for i := 0; i < 16; i++ { _ = m.set(x, y, QRValue_FINDER_V0) if i < 4 { x = x + 1 } else if i < 8 { y = y + 1 } else if i < 12 { x = x - 1 } else { y = y - 1 } } // black inner for x = left + 2; x < left+5; x++ { for y = top + 2; y < top+5; y++ { _ = m.set(x, y, QRValue_FINDER_V1) } } } // add splitter module func addSplitter(m *Matrix, x, y, dimension int) { // top-left if x == 7 && y == 7 { for pos := 0; pos < 8; pos++ { _ = m.set(x, pos, QRValue_SPLITTER_V0) _ = m.set(pos, y, QRValue_SPLITTER_V0) } return } // top-right if x == dimension-8 && y == 7 { for pos := 0; pos < 8; pos++ { _ = m.set(x, y-pos, QRValue_SPLITTER_V0) _ = m.set(x+pos, y, QRValue_SPLITTER_V0) } return } // bottom-left if x == 7 && y == dimension-8 { for pos := 0; pos < 8; pos++ { _ = m.set(x, y+pos, QRValue_SPLITTER_V0) _ = m.set(x-pos, y, QRValue_SPLITTER_V0) } return } } // add matrix align module func addAlignment(m *Matrix, centerX, centerY int) { _ = m.set(centerX, centerY, QRValue_DATA_V1) // black x, y := centerX-2, centerY-2 for i := 0; i < 16; i++ { _ = m.set(x, y, QRValue_DATA_V1) if i < 4 { x = x + 1 } else if i < 8 { y = y + 1 } else if i < 12 { x = x - 1 } else { y = y - 1 } } // white x, y = centerX-1, centerY-1 for i := 0; i < 8; i++ { _ = m.set(x, y, QRValue_DATA_V0) if i < 2 { x = x + 1 } else if i < 4 { y = y + 1 } else if i < 6 { x = x - 1 } else { y = y - 1 } } } // addTimingLine ... func addTimingLine(m *Matrix, dimension int) { for pos := 8; pos < dimension-8; pos++ { if pos%2 == 0 { _ = m.set(6, pos, QRValue_TIMING_V1) _ = m.set(pos, 6, QRValue_TIMING_V1) } else { _ = m.set(6, pos, QRValue_TIMING_V0) _ = m.set(pos, 6, QRValue_TIMING_V0) } } } // addDarkBlock ... func addDarkBlock(m *Matrix, x, y int) { _ = m.set(x, y, QRValue_DARK_V1) } // reserveFormatBlock maintain the position in matrix for format info func reserveFormatBlock(m *Matrix, dimension int) { for pos := 1; pos < 9; pos++ { // skip timing line if pos == 6 { _ = m.set(8, dimension-pos, QRValue_FORMAT_V0) _ = m.set(dimension-pos, 8, QRValue_FORMAT_V0) continue } // skip dark module if pos == 8 { _ = m.set(8, pos, QRValue_FORMAT_V0) // top-left-column _ = m.set(pos, 8, QRValue_FORMAT_V0) // top-left-row _ = m.set(dimension-pos, 8, QRValue_FORMAT_V0) // top-right-row continue } _ = m.set(8, pos, QRValue_FORMAT_V0) // top-left-column _ = m.set(pos, 8, QRValue_FORMAT_V0) // top-left-row _ = m.set(dimension-pos, 8, QRValue_FORMAT_V0) // top-right-row _ = m.set(8, dimension-pos, QRValue_FORMAT_V0) // bottom-left-column } // fix(@yeqown): b4b5ae3 reduced two format reversed blocks on top-left-column and top-left-row. _ = m.set(0, 8, QRValue_FORMAT_V0) _ = m.set(8, 0, QRValue_FORMAT_V0) } // reserveVersionBlock maintain the position in matrix for version info func reserveVersionBlock(m *Matrix, dimension int) { // 3x6=18 cells for i := 1; i <= 3; i++ { for pos := 0; pos < 6; pos++ { _ = m.set(dimension-8-i, pos, QRValue_VERSION_V0) _ = m.set(pos, dimension-8-i, QRValue_VERSION_V0) } } } // fillDataBinary fill q.dataBSet binary stream into q.mat. // References: // - http://www.thonky.com/qr-code-tutorial/module-placement-matrix#Place-the-Data-Bits func (q *QRCode) fillDataBinary(m *Matrix, dimension int) { var ( // x always move from right, left right loop (2 rows), y move upward, downward, upward loop x, y = dimension - 1, dimension - 1 l = q.dataBSet.Len() upForward = true pos int ) for i := 0; pos < l; i++ { // debugLogf("fillDataBinary: dimension: %d, len: %d: pos: %d", dimension, l, pos) set := QRValue_DATA_V0 if q.dataBSet.At(pos) { set = QRValue_DATA_V1 } state, err := m.at(x, y) if err != nil { if err == ErrorOutRangeOfW { break } if err == ErrorOutRangeOfH { // turn around while y is out of range. x = x - 2 switch upForward { case true: y = y + 1 default: y = y - 1 } if x == 7 || x == 6 { x = x - 1 } upForward = !upForward state, _ = m.at(x, y) // renew state qrbool after turn around writing direction. } } // data bit should only be set into un-set block in matrix. if state.qrtype() == QRType_INIT { _ = m.set(x, y, set) pos++ debugLogf("normal set turn forward: upForward: %v, x: %d, y: %d", upForward, x, y) } // DO NOT CHANGE FOLLOWING CODE FOR NOW !!! // change x, y mod2 := i % 2 // in one 8bit block if upForward { if mod2 == 0 { x = x - 1 } else { y = y - 1 x = x + 1 } } else { if mod2 == 0 { x = x - 1 } else { y = y + 1 x = x + 1 } } } debugLogf("fillDone and x: %d, y: %d, pos: %d, total: %d", x, y, pos, l) } // draw from bitset to matrix.Matrix, calculate all mask modula score, // then decide which mask to use according to the mask's score (the lowest one). func (q *QRCode) masking() { type maskScore struct { Score int Idx int } var ( masks = make([]*mask, 8) mats = make([]*Matrix, 8) lowScore = math.MaxInt32 markMatsIdx int scoreChan = make(chan maskScore, 8) wg sync.WaitGroup ) dimension := q.v.Dimension() // fill bitset into matrix cpy := q.mat.Copy() q.fillDataBinary(cpy, dimension) // init mask and mats for i := 0; i < 8; i++ { masks[i] = newMask(q.mat, maskPatternModulo(i)) mats[i] = cpy.Copy() } // generate 8 matrix with mask for i := 0; i < 8; i++ { wg.Add(1) go func(i int) { _ = debugDraw(fmt.Sprintf("draft/mats_%d.jpeg", i), *mats[i]) _ = debugDraw(fmt.Sprintf("draft/mask_%d.jpeg", i), *masks[i].mat) // xor with mask q.xorMask(mats[i], masks[i]) _ = debugDraw(fmt.Sprintf("draft/mats_mask_%d.jpeg", i), *mats[i]) // fill format info q.fillFormatInfo(mats[i], maskPatternModulo(i), dimension) // version7 and larger version has version info if q.v.Ver >= 7 { q.fillVersionInfo(mats[i], dimension) } // calculate score and decide the lowest score and Draw score := evaluation(mats[i]) debugLogf("cur idx: %d, score: %d, current lowest: mats[%d]:%d", i, score, markMatsIdx, lowScore) scoreChan <- maskScore{ Score: score, Idx: i, } _ = debugDraw(fmt.Sprintf("draft/qrcode_mask_%d.jpeg", i), *mats[i]) wg.Done() }(i) } wg.Wait() close(scoreChan) for c := range scoreChan { if c.Score < lowScore { lowScore = c.Score markMatsIdx = c.Idx } } q.mat = mats[markMatsIdx] } // all mask patter and check the maskScore choose the lowest mask result func (q *QRCode) xorMask(m *Matrix, mask *mask) { mask.mat.iter(IterDirection_COLUMN, func(x, y int, v qrvalue) { // skip the empty place if v.qrtype() == QRType_INIT { return } v2, _ := m.at(x, y) _ = m.set(x, y, v2.xor(v)) }) } // fillVersionInfo ref to: // https://www.thonky.com/qr-code-tutorial/format-version-tables func (q *QRCode) fillVersionInfo(m *Matrix, dimension int) { bin := q.v.verInfo() // from high bit to lowest pos := 0 for j := 5; j >= 0; j-- { for i := 1; i <= 3; i++ { if bin.At(pos) { _ = m.set(dimension-8-i, j, QRValue_VERSION_V1) _ = m.set(j, dimension-8-i, QRValue_VERSION_V1) } else { _ = m.set(dimension-8-i, j, QRValue_VERSION_V0) _ = m.set(j, dimension-8-i, QRValue_VERSION_V0) } pos++ } } } // fill format info ref to: // https://www.thonky.com/qr-code-tutorial/format-version-tables func (q *QRCode) fillFormatInfo(m *Matrix, mode maskPatternModulo, dimension int) { fmtBSet := q.v.formatInfo(int(mode)) debugLogf("fmtBitSet: %s", fmtBSet.String()) var ( x, y = 0, dimension - 1 ) for pos := 0; pos < 15; pos++ { if fmtBSet.At(pos) { // row _ = m.set(x, 8, QRValue_FORMAT_V1) // column _ = m.set(8, y, QRValue_FORMAT_V1) } else { // row _ = m.set(x, 8, QRValue_FORMAT_V0) // column _ = m.set(8, y, QRValue_FORMAT_V0) } x = x + 1 y = y - 1 // row skip if x == 6 { x = 7 } else if x == 8 { x = dimension - 8 } // column skip if y == dimension-8 { y = 8 } else if y == 6 { y = 5 } } } golang-github-yeqown-go-qrcode-2.2.5/qrcode_test.go000066400000000000000000000021261521051213400223030ustar00rootroot00000000000000package qrcode import ( "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func Test_NewWith(t *testing.T) { qrc, err := NewWith("1234567", WithEncodingMode(EncModeNumeric), WithErrorCorrectionLevel(ErrorCorrectionLow), WithVersion(7), ) require.NoError(t, err) assert.NotNil(t, qrc) SetDebugMode() _ = debugDraw("./testdata/nw.jpeg", *qrc.mat.Copy()) qrc.mat.print() } // Test_NewWithConfig_UnmatchedEncodeMode NewWith will panic while encMode is // not matched to Config.EncMode, for example: // cfg.EncMode is EncModeAlphanumeric but source text is bytes encoding. func Test_NewWithConfig_UnmatchedEncodeMode(t *testing.T) { assert.Panics(t, func() { _, err := NewWith("abcs", WithEncodingMode(EncModeAlphanumeric)) if err != nil { t.Errorf("could not generate QRCode: %v", err) t.Fail() } }) } func Benchmark_NewQRCode_1KB(b *testing.B) { text := strings.Repeat("abcdefghij", 100) for i := 0; i < b.N; i++ { _, err := New(text) if err != nil { b.Errorf("could not generate QRCode: %v", err) b.Fail() } } } golang-github-yeqown-go-qrcode-2.2.5/utilities.go000066400000000000000000000012361521051213400220030ustar00rootroot00000000000000package qrcode // samestate judge two matrix qrtype is same with binary semantic. // QRValue_DATA_V0/QRType_INIT only equal to QRValue_DATA_V0, other state are equal to each other. func samestate(s1, s2 qrvalue) bool { return s1.qrbool() == s2.qrbool() } func abs(x int) int { if x < 0 { return -x } return x } func min(x, y int) int { if x < y { return x } return y } func binaryToQRValueSlice(s string) []qrvalue { var states = make([]qrvalue, 0, len(s)) for _, c := range s { switch c { case '1': states = append(states, QRValue_DATA_V1) case '0': states = append(states, QRValue_DATA_V0) default: continue } } return states } golang-github-yeqown-go-qrcode-2.2.5/utilities_test.go000066400000000000000000000062541521051213400230470ustar00rootroot00000000000000package qrcode import ( "testing" "github.com/stretchr/testify/assert" ) func Test_min(t *testing.T) { type args struct { x int y int } tests := []struct { name string args args want int }{ { name: "min", args: args{ x: 1, y: 2, }, want: 1, }, { name: "min", args: args{ x: 2, y: 1, }, want: 1, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert.Equalf(t, tt.want, min(tt.args.x, tt.args.y), "min(%v, %v)", tt.args.x, tt.args.y) }) } } func Test_abs(t *testing.T) { type args struct { x int } tests := []struct { name string args args want int }{ { name: "abs", args: args{ x: 1, }, want: 1, }, { name: "abs", args: args{ x: -1, }, want: 1, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert.Equalf(t, tt.want, abs(tt.args.x), "abs(%v)", tt.args.x) }) } } func Test_samestate(t *testing.T) { type args struct { s1 qrvalue s2 qrvalue } tests := []struct { name string args args want bool }{ { name: "case 1", args: args{ s1: QRValue_DATA_V1, s2: QRValue_DATA_V1, }, want: true, }, { name: "case 2", args: args{ s1: QRValue_DATA_V0, s2: QRValue_DATA_V0, }, want: true, }, { name: "case 3", args: args{ s1: QRValue_DATA_V1, s2: QRValue_DATA_V0, }, want: false, }, { name: "case 4", args: args{ s1: QRValue_DATA_V0, s2: QRValue_DATA_V1, }, want: false, }, { name: "case 5", args: args{ s1: QRValue_FINDER_V1, s2: QRValue_FINDER_V1, }, want: true, }, { name: "case 6", args: args{ s1: QRValue_FINDER_V1, s2: QRValue_DATA_V0, }, want: false, }, { name: "case 7", args: args{ s1: QRValue_DATA_V1, s2: QRValue_FINDER_V1, }, want: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert.Equalf(t, tt.want, samestate(tt.args.s1, tt.args.s2), "samestate(%v, %v)", tt.args.s1, tt.args.s2) }) } } func Benchmark_samestate(b *testing.B) { for i := 0; i < b.N; i++ { samestate(QRValue_DATA_V1, QRValue_DATA_V1) samestate(QRValue_DATA_V1, QRValue_VERSION_V1) } } func Test_binaryToStateSlice(t *testing.T) { type args struct { s string } tests := []struct { name string args args want []qrvalue }{ { name: "case 1", args: args{ "1010 0001 101a", }, want: []qrvalue{ // 1010 QRValue_DATA_V1, QRValue_DATA_V0, QRValue_DATA_V1, QRValue_DATA_V0, // 0001 QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V1, // 101a QRValue_DATA_V1, QRValue_DATA_V0, QRValue_DATA_V1, }, }, { name: "case 2", args: args{ "0000 11a1 11x2 x", }, want: []qrvalue{ // 0000 QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V0, QRValue_DATA_V0, // 11a1 QRValue_DATA_V1, QRValue_DATA_V1, QRValue_DATA_V1, // 11x2 QRValue_DATA_V1, QRValue_DATA_V1, // x // nothing }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert.Equalf(t, tt.want, binaryToQRValueSlice(tt.args.s), "binaryToQRValueSlice(%v)", tt.args.s) }) } } golang-github-yeqown-go-qrcode-2.2.5/version.go000066400000000000000000000303161521051213400214560ustar00rootroot00000000000000package qrcode import ( "errors" "log" "strconv" "sync" // "github.com/skip2/go-qrcode/bitset" "github.com/yeqown/reedsolomon/binary" ) func init() { precalculateAlignPatternLocs() } // ecLevel error correction level type ecLevel int const ( // ErrorCorrectionLow :Level L: 7% error recovery. ErrorCorrectionLow ecLevel = iota + 1 // ErrorCorrectionMedium :Level M: 15% error recovery. Good default choice. ErrorCorrectionMedium // ErrorCorrectionQuart :Level Q: 25% error recovery. ErrorCorrectionQuart // ErrorCorrectionHighest :Level H: 30% error recovery. ErrorCorrectionHighest formatInfoBitsNum = 15 // format info bits num verInfoBitsNum = 18 // version info length bits num ) var ( errInvalidErrorCorrectionLevel = errors.New("invalid error correction level") errAnalyzeVersionFailed = errors.New("could not match version! " + "check your content length is in limitation of encode mode and error correction level") errMissMatchedVersion = errors.New("could not match version") errMissMatchedEncodeType = errors.New("could not match the encode type") // versions []version // Each QR Code contains a 15-bit Format Information qrbool. The 15 bits // consist of 5 data bits concatenated with 10 error correction bits. // // The 5 data bits consist of: // - 2 bits for the error correction level (L=01, M=00, G=11, H=10). // - 3 bits for the data mask pattern identifier. // // formatBitSequence is a mapping from the 5 data bits to the completed 15-bit // Format Information qrbool. // // For example, a QR Code using error correction level L, and data mask // pattern identifier 001: // // 01 | 001 = 01001 = 0x9 // formatBitSequence[0x9].qrCode = 0x72f3 = 111001011110011 formatBitSequence = []struct { regular uint32 micro uint32 }{ {0x5412, 0x4445}, {0x5125, 0x4172}, {0x5e7c, 0x4e2b}, {0x5b4b, 0x4b1c}, {0x45f9, 0x55ae}, {0x40ce, 0x5099}, {0x4f97, 0x5fc0}, {0x4aa0, 0x5af7}, {0x77c4, 0x6793}, {0x72f3, 0x62a4}, {0x7daa, 0x6dfd}, {0x789d, 0x68ca}, {0x662f, 0x7678}, {0x6318, 0x734f}, {0x6c41, 0x7c16}, {0x6976, 0x7921}, {0x1689, 0x06de}, {0x13be, 0x03e9}, {0x1ce7, 0x0cb0}, {0x19d0, 0x0987}, {0x0762, 0x1735}, {0x0255, 0x1202}, {0x0d0c, 0x1d5b}, {0x083b, 0x186c}, {0x355f, 0x2508}, {0x3068, 0x203f}, {0x3f31, 0x2f66}, {0x3a06, 0x2a51}, {0x24b4, 0x34e3}, {0x2183, 0x31d4}, {0x2eda, 0x3e8d}, {0x2bed, 0x3bba}, } // QR Codes version 7 and higher contain an 18-bit version Information qrbool, // consisting of a 6 data bits and 12 error correction bits. // // versionBitSequence is a mapping from QR Code version to the completed // 18-bit version Information qrbool. // // For example, a QR code of version 7: // versionBitSequence[0x7] = 0x07c94 = 000111110010010100 versionBitSequence = []uint32{ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, 0x27541, 0x28c69, } ) // capacity struct includes data type max capacity type capacity struct { Numeric int `json:"n"` // num capacity AlphaNumeric int `json:"a"` // char capacity Byte int `json:"b"` // byte capacity (utf-8 also) JP int `json:"j"` // Japanese capacity } // group contains fields to generate ECBlocks // and append _defaultPadding bit type group struct { // NumBlocks num of blocks NumBlocks int `json:"nbs"` // NumDataCodewords Number of data codewords. NumDataCodewords int `json:"ndcs"` // ECBlockwordsPerBlock ... ECBlockwordsPerBlock int `json:"ecbs_pb"` } // version ... type version struct { // version code 1-40 Ver int `json:"ver"` // ECLevel error correction 0, 1, 2, 3 ECLevel ecLevel `json:"eclv"` // Cap includes each type's max capacity (specified by `Ver` and `ecLevel`) // ref to: https://www.thonky.com/qr-code-tutorial/character-capacities Cap capacity `json:"cap"` // RemainderBits remainder bits need to append finally RemainderBits int `json:"rembits"` // groups info to generate // ref to: https://www.thonky.com/qr-code-tutorial/error-correction-table // numGroup = len(Groups) Groups []group `json:"groups"` } // Dimension ... func (v version) Dimension() int { return v.Ver*4 + 17 } // NumTotalCodewords total data codewords func (v version) NumTotalCodewords() int { var total int for _, g := range v.Groups { total = total + (g.NumBlocks * g.NumDataCodewords) } return total } // NumGroups ... need group num. ref to version config file func (v version) NumGroups() int { return len(v.Groups) } // TotalNumBlocks ... total data blocks num, ref to version config file func (v version) TotalNumBlocks() int { var total int for _, g := range v.Groups { total = total + g.NumBlocks } return total } // VerInfo version info bitset func (v version) verInfo() *binary.Binary { if v.Ver < 7 { return nil } result := binary.New() result.AppendUint32(versionBitSequence[v.Ver], verInfoBitsNum) return result } // formatInfo returns the 15-bit Format Information qrbool for a QR // code. func (v version) formatInfo(maskPattern int) *binary.Binary { formatID := 0 switch v.ECLevel { case ErrorCorrectionLow: formatID = 0x08 // 0b01000 case ErrorCorrectionMedium: formatID = 0x00 // 0b00000 case ErrorCorrectionQuart: formatID = 0x18 // 0b11000 case ErrorCorrectionHighest: formatID = 0x10 // 0b10000 default: log.Panicf("Invalid level %d", v.ECLevel) } if maskPattern < 0 || maskPattern > 7 { log.Panicf("Invalid maskPattern %d", maskPattern) } formatID |= maskPattern & 0x7 result := binary.New() result.AppendUint32(formatBitSequence[formatID].regular, formatInfoBitsNum) return result } var emptyVersion = version{Ver: -1} // binarySearchVersion speed up searching target version in versions. // low, high to set the left and right bound of the search range (min:0 to max:159). // compare represents the function to compare the target version with the cursor version. // negative means lower direction, positive means higher direction, zero mean hit. func binarySearchVersion(low, high int, compare func(*version) int) (hit version, found bool) { // left low and high in a valid range if low > high || low > _VERSIONS_ITEM_COUNT || high < 0 { return emptyVersion, false } if low < 0 { low = 0 } if high >= _VERSIONS_ITEM_COUNT { high = len(versions) - 1 } for low <= high { mid := (low + high) / 2 r := compare(&versions[mid]) if r == 0 { hit = versions[mid] found = true break } if r > 0 { // move toward higher direction low = mid + 1 } else { // move toward lower direction high = mid } } return hit, found } // defaultBinaryCompare built-in compare function for binary search. func defaultBinaryCompare(ver int, ec ecLevel) func(cursor *version) int { return func(cursor *version) int { switch r := ver - cursor.Ver; r { case 0: default: // v is bigger return positive; otherwise return negative. return r } return int(ec - cursor.ECLevel) } } // loadVersion get version config by specified version indicator and error correction level. // we can speed up this process, by shrink the range to search. func loadVersion(lv int, ec ecLevel) version { // each version only has 4 items in versions array, // and them are ordered[ASC] already. high := lv*4 - 1 low := (lv - 1) * 4 for i := low; i <= high; i++ { if versions[i].ECLevel == ec { return versions[i] } } panic(errMissMatchedVersion) } // analyzeVersion the raw text, and then decide which version should be chosen // according to the text length , error correction level and encode mode to choose the // closest capacity of version. // // check out http://muyuchengfeng.xyz/%E4%BA%8C%E7%BB%B4%E7%A0%81-%E5%AD%97%E7%AC%A6%E5%AE%B9%E9%87%8F%E8%A1%A8/ // for more details. func analyzeVersion(raw []byte, ec ecLevel, mode encMode) (*version, error) { step := 0 switch ec { case ErrorCorrectionLow: step = 0 case ErrorCorrectionMedium: step = 1 case ErrorCorrectionQuart: step = 2 case ErrorCorrectionHighest: step = 3 default: return nil, errInvalidErrorCorrectionLevel } want, mark := len(raw), 0 for ; step < 160; step += 4 { switch mode { case EncModeNumeric: mark = versions[step].Cap.Numeric case EncModeAlphanumeric: mark = versions[step].Cap.AlphaNumeric case EncModeByte: mark = versions[step].Cap.Byte case EncModeJP: mark = versions[step].Cap.JP default: return nil, errMissMatchedEncodeType } if mark >= want { return &versions[step], nil } } debugLogf("mismatched version, version's length: %d, ec: %v", len(versions), ec) return nil, errAnalyzeVersionFailed } var ( // https://www.thonky.com/qr-code-tutorial/alignment-pattern-locations // DONE(@yeqown): add more version alignPatternLocation = map[int][]int{ 2: {6, 18}, 3: {6, 22}, 4: {6, 26}, 5: {6, 30}, 6: {6, 34}, 7: {6, 22, 38}, 8: {6, 24, 42}, 9: {6, 26, 46}, 10: {6, 28, 50}, 11: {6, 30, 54}, 12: {6, 32, 58}, 13: {6, 34, 62}, 14: {6, 26, 46, 66}, 15: {6, 26, 48, 70}, 16: {6, 26, 50, 74}, 17: {6, 30, 54, 78}, 18: {6, 30, 56, 82}, 19: {6, 30, 58, 86}, 20: {6, 34, 62, 90}, 21: {6, 28, 50, 72, 94}, 22: {6, 26, 50, 74, 98}, 23: {6, 30, 54, 78, 102}, 24: {6, 28, 54, 80, 106}, 25: {6, 32, 58, 84, 110}, 26: {6, 30, 58, 86, 114}, 27: {6, 34, 62, 90, 118}, 28: {6, 26, 50, 74, 98, 122}, 29: {6, 30, 54, 78, 102, 126}, 30: {6, 26, 52, 78, 104, 130}, 31: {6, 30, 56, 82, 108, 134}, 32: {6, 34, 60, 86, 112, 138}, 33: {6, 30, 58, 86, 114, 142}, 34: {6, 34, 62, 90, 118, 146}, 35: {6, 30, 54, 78, 102, 126, 150}, 36: {6, 24, 50, 76, 102, 128, 154}, 37: {6, 28, 54, 80, 106, 132, 158}, 38: {6, 32, 58, 84, 110, 136, 162}, 39: {6, 26, 54, 82, 110, 138, 166}, 40: {6, 30, 58, 86, 114, 142, 170}, } alignPatternCache = map[int][]loc{} // TODO(@yeqown): remove this lock later, if alignPatternCache precalculation works well. alignPatternCacheMu sync.Mutex precalculateOnce sync.Once ) // loc point position(x,y) type loc struct { X int // for width Y int // for height } // loadAlignmentPatternLoc load alignment pattern location by version // @Deprecated func loadAlignmentPatternLoc(ver int) (locs []loc) { if ver < 2 { return } alignPatternCacheMu.Lock() defer alignPatternCacheMu.Unlock() var ok bool if locs, ok = alignPatternCache[ver]; ok { return } dimension := ver*4 + 17 positions, ok := alignPatternLocation[ver] if !ok { panic("could not found align at version: " + strconv.Itoa(ver)) } for _, pos1 := range positions { for _, pos2 := range positions { if !valid(pos1, pos2, dimension) { continue } locs = append(locs, loc{X: pos1, Y: pos2}) } } alignPatternCache[ver] = locs return } func loadAlignmentPatternLocV2(ver int) []loc { if ver < 2 { return nil } if locs, ok := alignPatternCache[ver]; ok { return locs } // Just in case, we need to calculate the alignment pattern locations locs := calcAlignPatternLocs(ver) alignPatternCacheMu.Lock() alignPatternCache[ver] = locs alignPatternCacheMu.Unlock() return locs } // precalculateAlignPatternLocs precalculate all versions' alignment pattern locations which // only need to be calculated once. func precalculateAlignPatternLocs() { precalculateOnce.Do(func() { for ver := 2; ver <= _VERSION_COUNT; ver++ { alignPatternCache[ver] = calcAlignPatternLocs(ver) } }) } func calcAlignPatternLocs(ver int) (locs []loc) { if ver < 2 { return } dimension := ver*4 + 17 positions, ok := alignPatternLocation[ver] if !ok { panic("could not found align at version: " + strconv.Itoa(ver)) } locs = make([]loc, 0, len(positions)*len(positions)) for _, pos1 := range positions { for _, pos2 := range positions { if !valid(pos1, pos2, dimension) { continue } locs = append(locs, loc{X: pos1, Y: pos2}) } } return locs } // x, y center position x,y so func valid(x, y, dimension int) bool { // valid left-top if (x-2) < 7 && (y-2) < 7 { return false } // valid right-top if (x+2) > dimension-7 && (y-2) < 7 { return false } // valid left-bottom if (x-2) < 7 && (y+2) > dimension-7 { return false } return true } golang-github-yeqown-go-qrcode-2.2.5/version_cfg.go000066400000000000000000001647251521051213400223110ustar00rootroot00000000000000package qrcode const ( _VERSION_COUNT = 40 // (40 versions) _VERSIONS_ITEM_COUNT = 160 // (40 versions x 4 error correction level) ) // versions contains information about each QR Code version. // NOTICE: item in version array MUST keep sorted according to // QR Version sequential as the first key and Error Correction Level as the second (ASC). var versions = []version{ { Ver: 1, ECLevel: 1, Cap: capacity{ Numeric: 41, AlphaNumeric: 25, Byte: 17, JP: 10, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 19, ECBlockwordsPerBlock: 7, }, }, }, { Ver: 1, ECLevel: 2, Cap: capacity{ Numeric: 34, AlphaNumeric: 20, Byte: 14, JP: 8, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 16, ECBlockwordsPerBlock: 10, }, }, }, { Ver: 1, ECLevel: 3, Cap: capacity{ Numeric: 27, AlphaNumeric: 16, Byte: 11, JP: 7, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 13, ECBlockwordsPerBlock: 13, }, }, }, { Ver: 1, ECLevel: 4, Cap: capacity{ Numeric: 17, AlphaNumeric: 10, Byte: 7, JP: 4, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 9, ECBlockwordsPerBlock: 17, }, }, }, { Ver: 2, ECLevel: 1, Cap: capacity{ Numeric: 77, AlphaNumeric: 47, Byte: 32, JP: 20, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 34, ECBlockwordsPerBlock: 10, }, }, }, { Ver: 2, ECLevel: 2, Cap: capacity{ Numeric: 63, AlphaNumeric: 38, Byte: 26, JP: 16, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 28, ECBlockwordsPerBlock: 16, }, }, }, { Ver: 2, ECLevel: 3, Cap: capacity{ Numeric: 48, AlphaNumeric: 29, Byte: 20, JP: 12, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 22, ECBlockwordsPerBlock: 22, }, }, }, { Ver: 2, ECLevel: 4, Cap: capacity{ Numeric: 34, AlphaNumeric: 20, Byte: 14, JP: 8, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 16, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 3, ECLevel: 1, Cap: capacity{ Numeric: 127, AlphaNumeric: 77, Byte: 53, JP: 32, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 55, ECBlockwordsPerBlock: 15, }, }, }, { Ver: 3, ECLevel: 2, Cap: capacity{ Numeric: 101, AlphaNumeric: 61, Byte: 42, JP: 26, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 44, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 3, ECLevel: 3, Cap: capacity{ Numeric: 77, AlphaNumeric: 47, Byte: 32, JP: 20, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 17, ECBlockwordsPerBlock: 18, }, }, }, { Ver: 3, ECLevel: 4, Cap: capacity{ Numeric: 58, AlphaNumeric: 35, Byte: 24, JP: 15, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 13, ECBlockwordsPerBlock: 22, }, }, }, { Ver: 4, ECLevel: 1, Cap: capacity{ Numeric: 187, AlphaNumeric: 114, Byte: 78, JP: 48, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 80, ECBlockwordsPerBlock: 20, }, }, }, { Ver: 4, ECLevel: 2, Cap: capacity{ Numeric: 149, AlphaNumeric: 90, Byte: 62, JP: 38, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 32, ECBlockwordsPerBlock: 18, }, }, }, { Ver: 4, ECLevel: 3, Cap: capacity{ Numeric: 111, AlphaNumeric: 67, Byte: 46, JP: 28, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 24, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 4, ECLevel: 4, Cap: capacity{ Numeric: 82, AlphaNumeric: 50, Byte: 34, JP: 21, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 9, ECBlockwordsPerBlock: 16, }, }, }, { Ver: 5, ECLevel: 1, Cap: capacity{ Numeric: 255, AlphaNumeric: 154, Byte: 106, JP: 65, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 108, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 5, ECLevel: 2, Cap: capacity{ Numeric: 202, AlphaNumeric: 122, Byte: 84, JP: 52, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 43, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 5, ECLevel: 3, Cap: capacity{ Numeric: 144, AlphaNumeric: 87, Byte: 60, JP: 37, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 15, ECBlockwordsPerBlock: 18, }, { NumBlocks: 2, NumDataCodewords: 16, ECBlockwordsPerBlock: 18, }, }, }, { Ver: 5, ECLevel: 4, Cap: capacity{ Numeric: 106, AlphaNumeric: 64, Byte: 44, JP: 27, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 11, ECBlockwordsPerBlock: 22, }, { NumBlocks: 2, NumDataCodewords: 12, ECBlockwordsPerBlock: 22, }, }, }, { Ver: 6, ECLevel: 1, Cap: capacity{ Numeric: 322, AlphaNumeric: 195, Byte: 134, JP: 82, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 68, ECBlockwordsPerBlock: 18, }, }, }, { Ver: 6, ECLevel: 2, Cap: capacity{ Numeric: 255, AlphaNumeric: 154, Byte: 106, JP: 65, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 27, ECBlockwordsPerBlock: 16, }, }, }, { Ver: 6, ECLevel: 3, Cap: capacity{ Numeric: 178, AlphaNumeric: 108, Byte: 74, JP: 45, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 19, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 6, ECLevel: 4, Cap: capacity{ Numeric: 139, AlphaNumeric: 84, Byte: 58, JP: 36, }, RemainderBits: 7, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 15, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 7, ECLevel: 1, Cap: capacity{ Numeric: 370, AlphaNumeric: 224, Byte: 154, JP: 95, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 78, ECBlockwordsPerBlock: 20, }, }, }, { Ver: 7, ECLevel: 2, Cap: capacity{ Numeric: 293, AlphaNumeric: 178, Byte: 122, JP: 75, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 31, ECBlockwordsPerBlock: 18, }, }, }, { Ver: 7, ECLevel: 3, Cap: capacity{ Numeric: 207, AlphaNumeric: 125, Byte: 86, JP: 53, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 14, ECBlockwordsPerBlock: 18, }, { NumBlocks: 4, NumDataCodewords: 15, ECBlockwordsPerBlock: 18, }, }, }, { Ver: 7, ECLevel: 4, Cap: capacity{ Numeric: 154, AlphaNumeric: 93, Byte: 64, JP: 39, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 13, ECBlockwordsPerBlock: 26, }, { NumBlocks: 1, NumDataCodewords: 14, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 8, ECLevel: 1, Cap: capacity{ Numeric: 461, AlphaNumeric: 279, Byte: 192, JP: 118, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 97, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 8, ECLevel: 2, Cap: capacity{ Numeric: 365, AlphaNumeric: 221, Byte: 152, JP: 93, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 38, ECBlockwordsPerBlock: 22, }, { NumBlocks: 2, NumDataCodewords: 39, ECBlockwordsPerBlock: 22, }, }, }, { Ver: 8, ECLevel: 3, Cap: capacity{ Numeric: 259, AlphaNumeric: 157, Byte: 108, JP: 66, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 18, ECBlockwordsPerBlock: 22, }, { NumBlocks: 2, NumDataCodewords: 19, ECBlockwordsPerBlock: 22, }, }, }, { Ver: 8, ECLevel: 4, Cap: capacity{ Numeric: 202, AlphaNumeric: 122, Byte: 84, JP: 52, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 14, ECBlockwordsPerBlock: 26, }, { NumBlocks: 2, NumDataCodewords: 15, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 9, ECLevel: 1, Cap: capacity{ Numeric: 552, AlphaNumeric: 335, Byte: 230, JP: 141, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 116, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 9, ECLevel: 2, Cap: capacity{ Numeric: 432, AlphaNumeric: 262, Byte: 180, JP: 111, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 3, NumDataCodewords: 36, ECBlockwordsPerBlock: 22, }, { NumBlocks: 2, NumDataCodewords: 37, ECBlockwordsPerBlock: 22, }, }, }, { Ver: 9, ECLevel: 3, Cap: capacity{ Numeric: 312, AlphaNumeric: 189, Byte: 130, JP: 80, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 16, ECBlockwordsPerBlock: 20, }, { NumBlocks: 4, NumDataCodewords: 17, ECBlockwordsPerBlock: 20, }, }, }, { Ver: 9, ECLevel: 4, Cap: capacity{ Numeric: 235, AlphaNumeric: 143, Byte: 98, JP: 60, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 12, ECBlockwordsPerBlock: 24, }, { NumBlocks: 4, NumDataCodewords: 13, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 10, ECLevel: 1, Cap: capacity{ Numeric: 652, AlphaNumeric: 395, Byte: 271, JP: 167, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 68, ECBlockwordsPerBlock: 18, }, { NumBlocks: 2, NumDataCodewords: 69, ECBlockwordsPerBlock: 18, }, }, }, { Ver: 10, ECLevel: 2, Cap: capacity{ Numeric: 513, AlphaNumeric: 311, Byte: 213, JP: 131, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 43, ECBlockwordsPerBlock: 26, }, { NumBlocks: 1, NumDataCodewords: 44, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 10, ECLevel: 3, Cap: capacity{ Numeric: 364, AlphaNumeric: 221, Byte: 151, JP: 93, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 6, NumDataCodewords: 19, ECBlockwordsPerBlock: 24, }, { NumBlocks: 2, NumDataCodewords: 20, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 10, ECLevel: 4, Cap: capacity{ Numeric: 288, AlphaNumeric: 174, Byte: 119, JP: 74, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 6, NumDataCodewords: 15, ECBlockwordsPerBlock: 28, }, { NumBlocks: 2, NumDataCodewords: 16, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 11, ECLevel: 1, Cap: capacity{ Numeric: 772, AlphaNumeric: 468, Byte: 321, JP: 198, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 81, ECBlockwordsPerBlock: 20, }, }, }, { Ver: 11, ECLevel: 2, Cap: capacity{ Numeric: 604, AlphaNumeric: 366, Byte: 251, JP: 155, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 50, ECBlockwordsPerBlock: 30, }, { NumBlocks: 4, NumDataCodewords: 51, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 11, ECLevel: 3, Cap: capacity{ Numeric: 427, AlphaNumeric: 259, Byte: 177, JP: 109, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 22, ECBlockwordsPerBlock: 28, }, { NumBlocks: 4, NumDataCodewords: 23, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 11, ECLevel: 4, Cap: capacity{ Numeric: 331, AlphaNumeric: 200, Byte: 137, JP: 85, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 3, NumDataCodewords: 12, ECBlockwordsPerBlock: 24, }, { NumBlocks: 8, NumDataCodewords: 13, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 12, ECLevel: 1, Cap: capacity{ Numeric: 883, AlphaNumeric: 535, Byte: 367, JP: 226, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 92, ECBlockwordsPerBlock: 24, }, { NumBlocks: 2, NumDataCodewords: 93, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 12, ECLevel: 2, Cap: capacity{ Numeric: 691, AlphaNumeric: 419, Byte: 287, JP: 177, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 6, NumDataCodewords: 36, ECBlockwordsPerBlock: 22, }, { NumBlocks: 2, NumDataCodewords: 37, ECBlockwordsPerBlock: 22, }, }, }, { Ver: 12, ECLevel: 3, Cap: capacity{ Numeric: 489, AlphaNumeric: 296, Byte: 203, JP: 125, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 20, ECBlockwordsPerBlock: 26, }, { NumBlocks: 6, NumDataCodewords: 21, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 12, ECLevel: 4, Cap: capacity{ Numeric: 374, AlphaNumeric: 227, Byte: 155, JP: 96, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 7, NumDataCodewords: 14, ECBlockwordsPerBlock: 28, }, { NumBlocks: 4, NumDataCodewords: 15, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 13, ECLevel: 1, Cap: capacity{ Numeric: 1022, AlphaNumeric: 619, Byte: 425, JP: 262, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 107, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 13, ECLevel: 2, Cap: capacity{ Numeric: 796, AlphaNumeric: 483, Byte: 331, JP: 204, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 8, NumDataCodewords: 37, ECBlockwordsPerBlock: 22, }, { NumBlocks: 1, NumDataCodewords: 38, ECBlockwordsPerBlock: 22, }, }, }, { Ver: 13, ECLevel: 3, Cap: capacity{ Numeric: 580, AlphaNumeric: 352, Byte: 241, JP: 149, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 8, NumDataCodewords: 20, ECBlockwordsPerBlock: 24, }, { NumBlocks: 4, NumDataCodewords: 21, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 13, ECLevel: 4, Cap: capacity{ Numeric: 427, AlphaNumeric: 259, Byte: 177, JP: 109, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 12, NumDataCodewords: 11, ECBlockwordsPerBlock: 22, }, { NumBlocks: 4, NumDataCodewords: 12, ECBlockwordsPerBlock: 22, }, }, }, { Ver: 14, ECLevel: 1, Cap: capacity{ Numeric: 1101, AlphaNumeric: 667, Byte: 458, JP: 282, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 3, NumDataCodewords: 115, ECBlockwordsPerBlock: 30, }, { NumBlocks: 1, NumDataCodewords: 116, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 14, ECLevel: 2, Cap: capacity{ Numeric: 871, AlphaNumeric: 528, Byte: 362, JP: 223, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 40, ECBlockwordsPerBlock: 24, }, { NumBlocks: 5, NumDataCodewords: 41, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 14, ECLevel: 3, Cap: capacity{ Numeric: 621, AlphaNumeric: 376, Byte: 258, JP: 159, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 11, NumDataCodewords: 16, ECBlockwordsPerBlock: 20, }, { NumBlocks: 5, NumDataCodewords: 17, ECBlockwordsPerBlock: 20, }, }, }, { Ver: 14, ECLevel: 4, Cap: capacity{ Numeric: 468, AlphaNumeric: 283, Byte: 194, JP: 120, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 11, NumDataCodewords: 12, ECBlockwordsPerBlock: 24, }, { NumBlocks: 5, NumDataCodewords: 13, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 15, ECLevel: 1, Cap: capacity{ Numeric: 1250, AlphaNumeric: 758, Byte: 520, JP: 320, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 5, NumDataCodewords: 87, ECBlockwordsPerBlock: 22, }, { NumBlocks: 1, NumDataCodewords: 88, ECBlockwordsPerBlock: 22, }, }, }, { Ver: 15, ECLevel: 2, Cap: capacity{ Numeric: 991, AlphaNumeric: 600, Byte: 412, JP: 254, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 5, NumDataCodewords: 41, ECBlockwordsPerBlock: 24, }, { NumBlocks: 5, NumDataCodewords: 42, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 15, ECLevel: 3, Cap: capacity{ Numeric: 703, AlphaNumeric: 426, Byte: 292, JP: 180, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 5, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 7, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 15, ECLevel: 4, Cap: capacity{ Numeric: 530, AlphaNumeric: 321, Byte: 220, JP: 136, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 11, NumDataCodewords: 12, ECBlockwordsPerBlock: 24, }, { NumBlocks: 7, NumDataCodewords: 13, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 16, ECLevel: 1, Cap: capacity{ Numeric: 1408, AlphaNumeric: 854, Byte: 586, JP: 361, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 5, NumDataCodewords: 98, ECBlockwordsPerBlock: 24, }, { NumBlocks: 1, NumDataCodewords: 99, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 16, ECLevel: 2, Cap: capacity{ Numeric: 1082, AlphaNumeric: 656, Byte: 450, JP: 277, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 7, NumDataCodewords: 45, ECBlockwordsPerBlock: 28, }, { NumBlocks: 3, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 16, ECLevel: 3, Cap: capacity{ Numeric: 775, AlphaNumeric: 470, Byte: 322, JP: 198, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 15, NumDataCodewords: 19, ECBlockwordsPerBlock: 24, }, { NumBlocks: 2, NumDataCodewords: 20, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 16, ECLevel: 4, Cap: capacity{ Numeric: 602, AlphaNumeric: 365, Byte: 250, JP: 154, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 3, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 13, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 17, ECLevel: 1, Cap: capacity{ Numeric: 1548, AlphaNumeric: 938, Byte: 644, JP: 397, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 107, ECBlockwordsPerBlock: 28, }, { NumBlocks: 5, NumDataCodewords: 108, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 17, ECLevel: 2, Cap: capacity{ Numeric: 1212, AlphaNumeric: 734, Byte: 504, JP: 310, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 10, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, { NumBlocks: 1, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 17, ECLevel: 3, Cap: capacity{ Numeric: 876, AlphaNumeric: 531, Byte: 364, JP: 224, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 22, ECBlockwordsPerBlock: 28, }, { NumBlocks: 15, NumDataCodewords: 23, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 17, ECLevel: 4, Cap: capacity{ Numeric: 674, AlphaNumeric: 408, Byte: 280, JP: 173, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 14, ECBlockwordsPerBlock: 28, }, { NumBlocks: 17, NumDataCodewords: 15, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 18, ECLevel: 1, Cap: capacity{ Numeric: 1725, AlphaNumeric: 1046, Byte: 718, JP: 442, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 5, NumDataCodewords: 120, ECBlockwordsPerBlock: 30, }, { NumBlocks: 1, NumDataCodewords: 121, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 18, ECLevel: 2, Cap: capacity{ Numeric: 1346, AlphaNumeric: 816, Byte: 560, JP: 345, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 9, NumDataCodewords: 43, ECBlockwordsPerBlock: 26, }, { NumBlocks: 4, NumDataCodewords: 44, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 18, ECLevel: 3, Cap: capacity{ Numeric: 948, AlphaNumeric: 574, Byte: 394, JP: 243, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 17, NumDataCodewords: 22, ECBlockwordsPerBlock: 28, }, { NumBlocks: 1, NumDataCodewords: 23, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 18, ECLevel: 4, Cap: capacity{ Numeric: 746, AlphaNumeric: 452, Byte: 310, JP: 191, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 14, ECBlockwordsPerBlock: 28, }, { NumBlocks: 19, NumDataCodewords: 15, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 19, ECLevel: 1, Cap: capacity{ Numeric: 1903, AlphaNumeric: 1153, Byte: 792, JP: 488, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 3, NumDataCodewords: 113, ECBlockwordsPerBlock: 28, }, { NumBlocks: 4, NumDataCodewords: 114, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 19, ECLevel: 2, Cap: capacity{ Numeric: 1500, AlphaNumeric: 909, Byte: 624, JP: 384, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 3, NumDataCodewords: 44, ECBlockwordsPerBlock: 26, }, { NumBlocks: 11, NumDataCodewords: 45, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 19, ECLevel: 3, Cap: capacity{ Numeric: 1063, AlphaNumeric: 644, Byte: 442, JP: 272, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 17, NumDataCodewords: 21, ECBlockwordsPerBlock: 26, }, { NumBlocks: 4, NumDataCodewords: 22, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 19, ECLevel: 4, Cap: capacity{ Numeric: 813, AlphaNumeric: 493, Byte: 338, JP: 208, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 9, NumDataCodewords: 13, ECBlockwordsPerBlock: 26, }, { NumBlocks: 16, NumDataCodewords: 14, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 20, ECLevel: 1, Cap: capacity{ Numeric: 2061, AlphaNumeric: 1249, Byte: 858, JP: 528, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 3, NumDataCodewords: 107, ECBlockwordsPerBlock: 28, }, { NumBlocks: 5, NumDataCodewords: 108, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 20, ECLevel: 2, Cap: capacity{ Numeric: 1600, AlphaNumeric: 970, Byte: 666, JP: 410, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 3, NumDataCodewords: 41, ECBlockwordsPerBlock: 26, }, { NumBlocks: 13, NumDataCodewords: 42, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 20, ECLevel: 3, Cap: capacity{ Numeric: 1159, AlphaNumeric: 702, Byte: 482, JP: 297, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 15, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 5, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 20, ECLevel: 4, Cap: capacity{ Numeric: 919, AlphaNumeric: 557, Byte: 382, JP: 235, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 15, NumDataCodewords: 15, ECBlockwordsPerBlock: 28, }, { NumBlocks: 10, NumDataCodewords: 16, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 21, ECLevel: 1, Cap: capacity{ Numeric: 2232, AlphaNumeric: 1352, Byte: 929, JP: 572, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 116, ECBlockwordsPerBlock: 28, }, { NumBlocks: 4, NumDataCodewords: 117, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 21, ECLevel: 2, Cap: capacity{ Numeric: 1708, AlphaNumeric: 1035, Byte: 711, JP: 438, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 17, NumDataCodewords: 42, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 21, ECLevel: 3, Cap: capacity{ Numeric: 1224, AlphaNumeric: 742, Byte: 509, JP: 314, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 17, NumDataCodewords: 22, ECBlockwordsPerBlock: 28, }, { NumBlocks: 6, NumDataCodewords: 23, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 21, ECLevel: 4, Cap: capacity{ Numeric: 969, AlphaNumeric: 587, Byte: 403, JP: 248, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 19, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, { NumBlocks: 6, NumDataCodewords: 17, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 22, ECLevel: 1, Cap: capacity{ Numeric: 2409, AlphaNumeric: 1460, Byte: 1003, JP: 618, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 111, ECBlockwordsPerBlock: 28, }, { NumBlocks: 7, NumDataCodewords: 112, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 22, ECLevel: 2, Cap: capacity{ Numeric: 1872, AlphaNumeric: 1134, Byte: 779, JP: 480, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 17, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 22, ECLevel: 3, Cap: capacity{ Numeric: 1358, AlphaNumeric: 823, Byte: 565, JP: 348, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 7, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 16, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 22, ECLevel: 4, Cap: capacity{ Numeric: 1056, AlphaNumeric: 640, Byte: 439, JP: 270, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 34, NumDataCodewords: 13, ECBlockwordsPerBlock: 24, }, }, }, { Ver: 23, ECLevel: 1, Cap: capacity{ Numeric: 2620, AlphaNumeric: 1588, Byte: 1091, JP: 672, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 121, ECBlockwordsPerBlock: 30, }, { NumBlocks: 5, NumDataCodewords: 122, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 23, ECLevel: 2, Cap: capacity{ Numeric: 2059, AlphaNumeric: 1248, Byte: 857, JP: 528, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, { NumBlocks: 14, NumDataCodewords: 48, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 23, ECLevel: 3, Cap: capacity{ Numeric: 1468, AlphaNumeric: 890, Byte: 611, JP: 376, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 11, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 14, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 23, ECLevel: 4, Cap: capacity{ Numeric: 1108, AlphaNumeric: 672, Byte: 461, JP: 284, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 16, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 14, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 24, ECLevel: 1, Cap: capacity{ Numeric: 2812, AlphaNumeric: 1704, Byte: 1171, JP: 721, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 6, NumDataCodewords: 117, ECBlockwordsPerBlock: 30, }, { NumBlocks: 4, NumDataCodewords: 118, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 24, ECLevel: 2, Cap: capacity{ Numeric: 2188, AlphaNumeric: 1326, Byte: 911, JP: 561, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 6, NumDataCodewords: 45, ECBlockwordsPerBlock: 28, }, { NumBlocks: 14, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 24, ECLevel: 3, Cap: capacity{ Numeric: 1588, AlphaNumeric: 963, Byte: 661, JP: 407, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 11, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 16, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 24, ECLevel: 4, Cap: capacity{ Numeric: 1228, AlphaNumeric: 744, Byte: 511, JP: 315, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 30, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, { NumBlocks: 2, NumDataCodewords: 17, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 25, ECLevel: 1, Cap: capacity{ Numeric: 3057, AlphaNumeric: 1853, Byte: 1273, JP: 784, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 8, NumDataCodewords: 106, ECBlockwordsPerBlock: 26, }, { NumBlocks: 4, NumDataCodewords: 107, ECBlockwordsPerBlock: 26, }, }, }, { Ver: 25, ECLevel: 2, Cap: capacity{ Numeric: 2395, AlphaNumeric: 1451, Byte: 997, JP: 614, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 8, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, { NumBlocks: 13, NumDataCodewords: 48, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 25, ECLevel: 3, Cap: capacity{ Numeric: 1718, AlphaNumeric: 1041, Byte: 715, JP: 440, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 7, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 22, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 25, ECLevel: 4, Cap: capacity{ Numeric: 1286, AlphaNumeric: 779, Byte: 535, JP: 330, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 22, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 13, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 26, ECLevel: 1, Cap: capacity{ Numeric: 3283, AlphaNumeric: 1990, Byte: 1367, JP: 842, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 10, NumDataCodewords: 114, ECBlockwordsPerBlock: 28, }, { NumBlocks: 2, NumDataCodewords: 115, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 26, ECLevel: 2, Cap: capacity{ Numeric: 2544, AlphaNumeric: 1542, Byte: 1059, JP: 652, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 19, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, { NumBlocks: 4, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 26, ECLevel: 3, Cap: capacity{ Numeric: 1804, AlphaNumeric: 1094, Byte: 751, JP: 462, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 28, NumDataCodewords: 22, ECBlockwordsPerBlock: 28, }, { NumBlocks: 6, NumDataCodewords: 23, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 26, ECLevel: 4, Cap: capacity{ Numeric: 1425, AlphaNumeric: 864, Byte: 593, JP: 365, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 33, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, { NumBlocks: 4, NumDataCodewords: 17, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 27, ECLevel: 1, Cap: capacity{ Numeric: 3517, AlphaNumeric: 2132, Byte: 1465, JP: 902, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 8, NumDataCodewords: 122, ECBlockwordsPerBlock: 30, }, { NumBlocks: 4, NumDataCodewords: 123, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 27, ECLevel: 2, Cap: capacity{ Numeric: 2701, AlphaNumeric: 1637, Byte: 1125, JP: 692, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 22, NumDataCodewords: 45, ECBlockwordsPerBlock: 28, }, { NumBlocks: 3, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 27, ECLevel: 3, Cap: capacity{ Numeric: 1933, AlphaNumeric: 1172, Byte: 805, JP: 496, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 8, NumDataCodewords: 23, ECBlockwordsPerBlock: 30, }, { NumBlocks: 26, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 27, ECLevel: 4, Cap: capacity{ Numeric: 1501, AlphaNumeric: 910, Byte: 625, JP: 385, }, RemainderBits: 4, Groups: []group{ { NumBlocks: 12, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 28, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 28, ECLevel: 1, Cap: capacity{ Numeric: 3669, AlphaNumeric: 2223, Byte: 1528, JP: 940, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 3, NumDataCodewords: 117, ECBlockwordsPerBlock: 30, }, { NumBlocks: 10, NumDataCodewords: 118, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 28, ECLevel: 2, Cap: capacity{ Numeric: 2857, AlphaNumeric: 1732, Byte: 1190, JP: 732, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 3, NumDataCodewords: 45, ECBlockwordsPerBlock: 28, }, { NumBlocks: 23, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 28, ECLevel: 3, Cap: capacity{ Numeric: 2085, AlphaNumeric: 1263, Byte: 868, JP: 534, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 31, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 28, ECLevel: 4, Cap: capacity{ Numeric: 1581, AlphaNumeric: 958, Byte: 658, JP: 405, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 11, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 31, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 29, ECLevel: 1, Cap: capacity{ Numeric: 3909, AlphaNumeric: 2369, Byte: 1628, JP: 1002, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 7, NumDataCodewords: 116, ECBlockwordsPerBlock: 30, }, { NumBlocks: 7, NumDataCodewords: 117, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 29, ECLevel: 2, Cap: capacity{ Numeric: 3035, AlphaNumeric: 1839, Byte: 1264, JP: 778, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 21, NumDataCodewords: 45, ECBlockwordsPerBlock: 28, }, { NumBlocks: 7, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 29, ECLevel: 3, Cap: capacity{ Numeric: 2181, AlphaNumeric: 1322, Byte: 908, JP: 559, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 23, ECBlockwordsPerBlock: 30, }, { NumBlocks: 37, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 29, ECLevel: 4, Cap: capacity{ Numeric: 1677, AlphaNumeric: 1016, Byte: 698, JP: 430, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 19, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 26, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 30, ECLevel: 1, Cap: capacity{ Numeric: 4158, AlphaNumeric: 2520, Byte: 1732, JP: 1066, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 5, NumDataCodewords: 115, ECBlockwordsPerBlock: 30, }, { NumBlocks: 10, NumDataCodewords: 116, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 30, ECLevel: 2, Cap: capacity{ Numeric: 3289, AlphaNumeric: 1994, Byte: 1370, JP: 843, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 19, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, { NumBlocks: 10, NumDataCodewords: 48, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 30, ECLevel: 3, Cap: capacity{ Numeric: 2358, AlphaNumeric: 1429, Byte: 982, JP: 604, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 15, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 25, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 30, ECLevel: 4, Cap: capacity{ Numeric: 1782, AlphaNumeric: 1080, Byte: 742, JP: 457, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 23, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 25, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 31, ECLevel: 1, Cap: capacity{ Numeric: 4417, AlphaNumeric: 2677, Byte: 1840, JP: 1132, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 13, NumDataCodewords: 115, ECBlockwordsPerBlock: 30, }, { NumBlocks: 3, NumDataCodewords: 116, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 31, ECLevel: 2, Cap: capacity{ Numeric: 3486, AlphaNumeric: 2113, Byte: 1452, JP: 894, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, { NumBlocks: 29, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 31, ECLevel: 3, Cap: capacity{ Numeric: 2473, AlphaNumeric: 1499, Byte: 1030, JP: 634, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 42, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 1, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 31, ECLevel: 4, Cap: capacity{ Numeric: 1897, AlphaNumeric: 1150, Byte: 790, JP: 486, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 23, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 28, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 32, ECLevel: 1, Cap: capacity{ Numeric: 4686, AlphaNumeric: 2840, Byte: 1952, JP: 1201, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 17, NumDataCodewords: 115, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 32, ECLevel: 2, Cap: capacity{ Numeric: 3693, AlphaNumeric: 2238, Byte: 1538, JP: 947, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 10, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, { NumBlocks: 23, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 32, ECLevel: 3, Cap: capacity{ Numeric: 2670, AlphaNumeric: 1618, Byte: 1112, JP: 684, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 10, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 35, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 32, ECLevel: 4, Cap: capacity{ Numeric: 2022, AlphaNumeric: 1226, Byte: 842, JP: 518, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 19, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 35, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 33, ECLevel: 1, Cap: capacity{ Numeric: 4965, AlphaNumeric: 3009, Byte: 2068, JP: 1273, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 17, NumDataCodewords: 115, ECBlockwordsPerBlock: 30, }, { NumBlocks: 1, NumDataCodewords: 116, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 33, ECLevel: 2, Cap: capacity{ Numeric: 3909, AlphaNumeric: 2369, Byte: 1628, JP: 1002, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 14, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, { NumBlocks: 21, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 33, ECLevel: 3, Cap: capacity{ Numeric: 2805, AlphaNumeric: 1700, Byte: 1168, JP: 719, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 29, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 19, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 33, ECLevel: 4, Cap: capacity{ Numeric: 2157, AlphaNumeric: 1307, Byte: 898, JP: 553, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 11, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 46, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 34, ECLevel: 1, Cap: capacity{ Numeric: 5253, AlphaNumeric: 3183, Byte: 2188, JP: 1347, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 13, NumDataCodewords: 115, ECBlockwordsPerBlock: 30, }, { NumBlocks: 6, NumDataCodewords: 116, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 34, ECLevel: 2, Cap: capacity{ Numeric: 4134, AlphaNumeric: 2506, Byte: 1722, JP: 1060, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 14, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, { NumBlocks: 23, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 34, ECLevel: 3, Cap: capacity{ Numeric: 2949, AlphaNumeric: 1787, Byte: 1228, JP: 756, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 44, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 7, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 34, ECLevel: 4, Cap: capacity{ Numeric: 2301, AlphaNumeric: 1394, Byte: 958, JP: 590, }, RemainderBits: 3, Groups: []group{ { NumBlocks: 59, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, { NumBlocks: 1, NumDataCodewords: 17, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 35, ECLevel: 1, Cap: capacity{ Numeric: 5529, AlphaNumeric: 3351, Byte: 2303, JP: 1417, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 12, NumDataCodewords: 121, ECBlockwordsPerBlock: 30, }, { NumBlocks: 7, NumDataCodewords: 122, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 35, ECLevel: 2, Cap: capacity{ Numeric: 4343, AlphaNumeric: 2632, Byte: 1809, JP: 1113, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 12, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, { NumBlocks: 26, NumDataCodewords: 48, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 35, ECLevel: 3, Cap: capacity{ Numeric: 3081, AlphaNumeric: 1867, Byte: 1283, JP: 790, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 39, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 14, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 35, ECLevel: 4, Cap: capacity{ Numeric: 2361, AlphaNumeric: 1431, Byte: 983, JP: 605, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 22, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 41, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 36, ECLevel: 1, Cap: capacity{ Numeric: 5836, AlphaNumeric: 3537, Byte: 2431, JP: 1496, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 6, NumDataCodewords: 121, ECBlockwordsPerBlock: 30, }, { NumBlocks: 14, NumDataCodewords: 122, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 36, ECLevel: 2, Cap: capacity{ Numeric: 4588, AlphaNumeric: 2780, Byte: 1911, JP: 1176, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 6, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, { NumBlocks: 34, NumDataCodewords: 48, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 36, ECLevel: 3, Cap: capacity{ Numeric: 3244, AlphaNumeric: 1966, Byte: 1351, JP: 832, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 46, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 10, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 36, ECLevel: 4, Cap: capacity{ Numeric: 2524, AlphaNumeric: 1530, Byte: 1051, JP: 647, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 2, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 64, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 37, ECLevel: 1, Cap: capacity{ Numeric: 6153, AlphaNumeric: 3729, Byte: 2563, JP: 1577, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 17, NumDataCodewords: 122, ECBlockwordsPerBlock: 30, }, { NumBlocks: 4, NumDataCodewords: 123, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 37, ECLevel: 2, Cap: capacity{ Numeric: 4775, AlphaNumeric: 2894, Byte: 1989, JP: 1224, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 29, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, { NumBlocks: 14, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 37, ECLevel: 3, Cap: capacity{ Numeric: 3417, AlphaNumeric: 2071, Byte: 1423, JP: 876, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 49, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 10, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 37, ECLevel: 4, Cap: capacity{ Numeric: 2625, AlphaNumeric: 1591, Byte: 1093, JP: 673, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 24, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 46, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 38, ECLevel: 1, Cap: capacity{ Numeric: 6479, AlphaNumeric: 3927, Byte: 2699, JP: 1661, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 4, NumDataCodewords: 122, ECBlockwordsPerBlock: 30, }, { NumBlocks: 18, NumDataCodewords: 123, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 38, ECLevel: 2, Cap: capacity{ Numeric: 5039, AlphaNumeric: 3054, Byte: 2099, JP: 1292, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 13, NumDataCodewords: 46, ECBlockwordsPerBlock: 28, }, { NumBlocks: 32, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 38, ECLevel: 3, Cap: capacity{ Numeric: 3599, AlphaNumeric: 2181, Byte: 1499, JP: 923, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 48, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 14, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 38, ECLevel: 4, Cap: capacity{ Numeric: 2735, AlphaNumeric: 1658, Byte: 1139, JP: 701, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 42, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 32, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 39, ECLevel: 1, Cap: capacity{ Numeric: 6743, AlphaNumeric: 4087, Byte: 2809, JP: 1729, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 20, NumDataCodewords: 117, ECBlockwordsPerBlock: 30, }, { NumBlocks: 4, NumDataCodewords: 118, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 39, ECLevel: 2, Cap: capacity{ Numeric: 5313, AlphaNumeric: 3220, Byte: 2213, JP: 1362, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 40, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, { NumBlocks: 7, NumDataCodewords: 48, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 39, ECLevel: 3, Cap: capacity{ Numeric: 3791, AlphaNumeric: 2298, Byte: 1579, JP: 972, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 43, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 22, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 39, ECLevel: 4, Cap: capacity{ Numeric: 2927, AlphaNumeric: 1774, Byte: 1219, JP: 750, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 10, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 67, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 40, ECLevel: 1, Cap: capacity{ Numeric: 7089, AlphaNumeric: 4296, Byte: 2953, JP: 1817, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 19, NumDataCodewords: 118, ECBlockwordsPerBlock: 30, }, { NumBlocks: 6, NumDataCodewords: 119, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 40, ECLevel: 2, Cap: capacity{ Numeric: 5596, AlphaNumeric: 3391, Byte: 2331, JP: 1435, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 18, NumDataCodewords: 47, ECBlockwordsPerBlock: 28, }, { NumBlocks: 31, NumDataCodewords: 48, ECBlockwordsPerBlock: 28, }, }, }, { Ver: 40, ECLevel: 3, Cap: capacity{ Numeric: 3993, AlphaNumeric: 2420, Byte: 1663, JP: 1024, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 34, NumDataCodewords: 24, ECBlockwordsPerBlock: 30, }, { NumBlocks: 34, NumDataCodewords: 25, ECBlockwordsPerBlock: 30, }, }, }, { Ver: 40, ECLevel: 4, Cap: capacity{ Numeric: 3057, AlphaNumeric: 1852, Byte: 1273, JP: 784, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 20, NumDataCodewords: 15, ECBlockwordsPerBlock: 30, }, { NumBlocks: 61, NumDataCodewords: 16, ECBlockwordsPerBlock: 30, }, }, }, } golang-github-yeqown-go-qrcode-2.2.5/version_test.go000066400000000000000000000136641521051213400225240ustar00rootroot00000000000000package qrcode import ( "math/rand" "reflect" "strings" "sync" "testing" "github.com/stretchr/testify/require" "github.com/stretchr/testify/assert" ) func TestVersion_Dimension(t *testing.T) { r := rand.Intn(len(versions)) d := versions[r].Dimension() assert.Equal(t, versions[r].Ver*4+17, d) } func Test_loadVersion(t *testing.T) { // load(defaultVersionCfg) type args struct { lv int recoveryLv ecLevel } tests := []struct { name string args args want version }{ { name: "case 0", args: args{ lv: 1, recoveryLv: ErrorCorrectionHighest, }, want: version{ Ver: 1, ECLevel: ErrorCorrectionHighest, Cap: capacity{ Numeric: 17, AlphaNumeric: 10, Byte: 7, JP: 4, }, RemainderBits: 0, Groups: []group{ { NumBlocks: 1, NumDataCodewords: 9, ECBlockwordsPerBlock: 17, }, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := loadVersion(tt.args.lv, tt.args.recoveryLv); !reflect.DeepEqual(got, tt.want) { t.Errorf("loadVersion() = %v, want %v", got, tt.want) } }) } } func Test_analyzeVersion(t *testing.T) { v1 := loadVersion(1, ErrorCorrectionMedium) v2 := loadVersion(5, ErrorCorrectionMedium) v3 := loadVersion(23, ErrorCorrectionMedium) type args struct { raw []byte ecLv ecLevel eMode encMode } tests := []struct { name string args args want *version wantErr bool }{ { name: "case 0", args: args{ raw: []byte("TEXT"), ecLv: ErrorCorrectionMedium, eMode: EncModeAlphanumeric, }, want: &v1, wantErr: false, }, { name: "case 1", args: args{ raw: []byte(strings.Repeat("TEXT", 30)), ecLv: ErrorCorrectionMedium, eMode: EncModeAlphanumeric, }, want: &v2, wantErr: false, }, { name: "case 2", args: args{ raw: []byte(strings.Repeat("TEXT", 300)), ecLv: ErrorCorrectionMedium, eMode: EncModeAlphanumeric, }, want: &v3, wantErr: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := analyzeVersion(tt.args.raw, tt.args.ecLv, tt.args.eMode) if (err != nil) != tt.wantErr { t.Errorf("analyzeVersion() error = %v, wantErr %v", err, tt.wantErr) return } if !reflect.DeepEqual(got, tt.want) { t.Errorf("analyzeVersion() = %v, want %v", got, tt.want) } }) } } func Test_binarySearchVersion(t *testing.T) { t.Logf("length of versions: %d", len(versions)) type args struct { low, high int v int ecLv ecLevel } tests := []struct { name string args args v int // the position of the expected version in versions array // [0...159] want int }{ { name: "case 0", args: args{ low: 0, high: _VERSIONS_ITEM_COUNT, ecLv: ErrorCorrectionLow, v: 1, }, want: 0, }, { name: "case 1", args: args{ low: 0, high: _VERSIONS_ITEM_COUNT, ecLv: ErrorCorrectionHighest, v: 40, }, want: 159, }, { name: "case 2", args: args{ low: -1, high: 200, ecLv: ErrorCorrectionHighest, v: 40, }, want: 159, }, { name: "case 3", args: args{ low: 180, high: 0, ecLv: ErrorCorrectionHighest, v: 40, }, want: -1, }, { name: "case 4", args: args{ low: 180, high: 0, ecLv: ErrorCorrectionHighest, v: 40, }, want: -1, }, { name: "case 5", args: args{ low: 0, high: _VERSIONS_ITEM_COUNT, ecLv: ErrorCorrectionLow, v: 3, }, want: 8, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, found := binarySearchVersion(tt.args.low, tt.args.high, defaultBinaryCompare(tt.args.v, tt.args.ecLv)) if tt.want >= 0 && tt.want <= _VERSIONS_ITEM_COUNT { require.True(t, found) require.Equal(t, versions[tt.want], got) return } // could not find require.False(t, found) require.Equal(t, emptyVersion, got) }) } } func Test_binarySearchVersion_all(t *testing.T) { for _, v := range versions { hit, found := binarySearchVersion(0, _VERSIONS_ITEM_COUNT, defaultBinaryCompare(v.Ver, v.ECLevel)) assert.True(t, found) assert.Equal(t, v, hit) // t.Logf("finding: version=%d, ecLevel=%d", v.Ver, v.ECLevel) } } func Test_loadAlignmentPatternLoc_concurrentAccess(t *testing.T) { var wg sync.WaitGroup for ver := 2; ver <= _VERSION_COUNT; ver++ { wg.Add(1) go func(v int) { got := loadAlignmentPatternLocV2(v) assert.NotEmpty(t, got) wg.Done() }(ver) } wg.Wait() } func Benchmark_LoadAlignmentPatternLoc(b *testing.B) { for i := 0; i < b.N; i++ { _ = loadAlignmentPatternLoc(5) } } func Benchmark_LoadAlignmentPatternLocV2(b *testing.B) { for i := 0; i < b.N; i++ { _ = loadAlignmentPatternLocV2(5) } } // go test -run=NONE -bench . -count 10 > new/old.txt func Benchmark_loadVersion_top(b *testing.B) { for i := 0; i < b.N; i++ { loadVersion(2, ErrorCorrectionMedium) loadVersion(5, ErrorCorrectionMedium) } } func Benchmark_loadVersion_waist(b *testing.B) { for i := 0; i < b.N; i++ { loadVersion(25, ErrorCorrectionMedium) loadVersion(15, ErrorCorrectionMedium) } } func Benchmark_loadVersion_bottom(b *testing.B) { for i := 0; i < b.N; i++ { loadVersion(40, ErrorCorrectionHighest) loadVersion(35, ErrorCorrectionHighest) } } func Benchmark_analyzeVersion_short(b *testing.B) { source := []byte("text") for i := 0; i < b.N; i++ { _, _ = analyzeVersion(source, ErrorCorrectionMedium, EncModeByte) } } func Benchmark_analyzeVersion_middle(b *testing.B) { source := []byte(strings.Repeat("text", 30)) for i := 0; i < b.N; i++ { _, _ = analyzeVersion(source, ErrorCorrectionMedium, EncModeByte) } } func Benchmark_analyzeVersion_long(b *testing.B) { source := []byte(strings.Repeat("text", 300)) for i := 0; i < b.N; i++ { _, _ = analyzeVersion(source, ErrorCorrectionMedium, EncModeByte) } } golang-github-yeqown-go-qrcode-2.2.5/writer.go000066400000000000000000000011361521051213400213030ustar00rootroot00000000000000package qrcode // Writer is the interface of a QR code writer, it defines the rule of how to // `print` the code image from matrix. There's built-in writer to output into // file, terminal. type Writer interface { // Write writes the code image into itself stream, such as io.Writer, // terminal output stream, and etc Write(mat Matrix) error // Close the writer stream if it exists after QRCode.Save() is called. Close() error } var _ Writer = (*nonWriter)(nil) type nonWriter struct{} func (n nonWriter) Close() error { return nil } func (n nonWriter) Write(mat Matrix) error { return nil } golang-github-yeqown-go-qrcode-2.2.5/writer/000077500000000000000000000000001521051213400207535ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/writer/README.md000066400000000000000000000047451521051213400222440ustar00rootroot00000000000000## Writer Writer folders contains built-in writers those implement `qrcode.Writer`: ```go // Writer is the interface of a QR code writer, it defines the rule of how to // `print` the code image from matrix. There's built-in writer to output into // file, terminal. type Writer interface { // Write writes the code image into itself stream, such as io.Writer, // terminal output stream, and etc Write(mat matrix.Matrix) error // Close the writer stream if it exists after QRCode.Save() is called. Close() error } ``` ### Implementations - [x] [Standard output file writer](./standard/README.md) - [x] [Terminal output writer](./terminal/README.md) ### How to customize your own writer? As you can see, the writer is a simple interface, you can implement your own writer to fit your needs. The prerequisites are: - Already understand `Writer` interface usage. - Have understood about paint a picture with go (of course you can refer [standard](./standard) implementation). - QR Code matrix is a 2D array of `martix.State`, we can simply divide these states into binary value (0/1), as the following table: | State Expr | value | representation | |:------------:|:-----:|:-----------------------------------------------:| | StateFalse | 0 | unset (data and etc) | | ZERO | 0 | same as `StateFalse` | | StateTrue | 1 | set (data) | | StateInit | 1 | not changed since initialized (temporary state) | | StateVersion | 1 | set (qr version) | | StateFormat | 1 | set (qr format) | | StateFinder | 1 | set (qr finder) | Now, you can implement your own writer to fit your needs, let's use pseudocode to discuss: ```text // define your own writer structure to implement `Writer` interface. object writer {}; writer.Write(matrix.Matrix): // these should be `IMAGE` stream controller, it receives matrix // it decide how to print the image. object paint; // set use BLACK, unset use WHITE. Or provides matrix.State to colors mapping // so that you can control QR Image output intensively. foreach row in matrix: foreach column in row: if column.State in [StateFalse]: // paint a WHITE square block paint.draw(x, y, WHITE); else: // paint a BLACK square block, paint.draw(x, y, BLACK); // loop end; // output paint; ```golang-github-yeqown-go-qrcode-2.2.5/writer/compressed/000077500000000000000000000000001521051213400231175ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/writer/compressed/README.md000066400000000000000000000014001521051213400243710ustar00rootroot00000000000000## Compressed Writer [![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/github.com/yeqown/go-qrcode/writer/compressed) Compressed Writer is a writer that is used to draw QR Code image on a very small scale. Since the compressed writer would only use a two-tone palette to generate the image, and automatically compressed in PNG format. Check codes for more details about compress principle. ### Usage ```go option := compressed.Option{ Padding: 4, // padding pixels around the qr code. BlockSize: 1, // block pixels which represents a bit data. } w, err := compressed.New(name, &option) if err != nil { panic(err) } if err := qrc.Save(w); err != nil { panic(err) } ```golang-github-yeqown-go-qrcode-2.2.5/writer/compressed/go.mod000066400000000000000000000001611521051213400242230ustar00rootroot00000000000000module github.com/yeqown/go-qrcode/writer/compressed go 1.19 require ( github.com/yeqown/go-qrcode/v2 v2.2.2 )golang-github-yeqown-go-qrcode-2.2.5/writer/compressed/writer.go000066400000000000000000000040711521051213400247640ustar00rootroot00000000000000package compressed import ( "image" "image/color" "image/png" "io" "os" "github.com/yeqown/go-qrcode/v2" ) type Option struct { Padding int BlockSize int } // compressedWriter implements issue#69, generating compressed images // in some special situations, such as, network transferring. // https://github.com/yeqown/go-qrcode/issues/69 type compressedWriter struct { fd io.WriteCloser option *Option } var ( backgroundColor = color.Gray{Y: 0xff} foregroundColor = color.Gray{Y: 0x00} ) func New(filename string, opt *Option) (qrcode.Writer, error) { fd, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0644) if err != nil { return nil, err } return compressedWriter{fd: fd, option: opt}, nil } func NewWithWriter(writeCloser io.WriteCloser, opt *Option) qrcode.Writer { return compressedWriter{fd: writeCloser, option: opt} } func (w compressedWriter) Write(mat qrcode.Matrix) error { padding := w.option.Padding blockWidth := w.option.BlockSize width := mat.Width()*blockWidth + 2*padding height := width img := image.NewPaletted( image.Rect(0, 0, width, height), []color.Color{backgroundColor, foregroundColor}, ) bgColor := uint8(img.Palette.Index(backgroundColor)) fgColor := uint8(img.Palette.Index(foregroundColor)) rectangle := func(x1, y1 int, x2, y2 int, img *image.Paletted, color uint8) { for x := x1; x < x2; x++ { for y := y1; y < y2; y++ { pos := img.PixOffset(x, y) img.Pix[pos] = color } } } // background rectangle(0, 0, width, height, img, bgColor) mat.Iterate(qrcode.IterDirection_COLUMN, func(x int, y int, v qrcode.QRValue) { sx := x*blockWidth + padding sy := y*blockWidth + padding es := (x+1)*blockWidth + padding ey := (y+1)*blockWidth + padding if v.IsSet() { rectangle(sx, sy, es, ey, img, fgColor) } //switch v.IsSet() { //case false: // gray = backgroundColor //default: // gray = foregroundColor //} }) encoder := png.Encoder{CompressionLevel: png.BestCompression} return encoder.Encode(w.fd, img) } func (w compressedWriter) Close() error { return w.fd.Close() } golang-github-yeqown-go-qrcode-2.2.5/writer/file/000077500000000000000000000000001521051213400216725ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/writer/file/README.md000066400000000000000000000010611521051213400231470ustar00rootroot00000000000000## File [![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/github.com/yeqown/go-qrcode/writer/file) File Writer is a writer used to draw QR Code images into files using the characters ▀, ▄, █, and space. ### Usage ```go package main import ( "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/file" ) func main() { qrc, _ := qrcode.New("with_file_writer") w := file.New(os.Stdout) if err := qrc.Save(w); err != nil { panic(err) } } ```golang-github-yeqown-go-qrcode-2.2.5/writer/file/go.mod000066400000000000000000000002411521051213400227750ustar00rootroot00000000000000module github.com/yeqown/go-qrcode/writer/file go 1.20 require github.com/yeqown/go-qrcode/v2 v2.2.4 require github.com/yeqown/reedsolomon v1.0.0 // indirect golang-github-yeqown-go-qrcode-2.2.5/writer/file/writer.go000066400000000000000000000025351521051213400235420ustar00rootroot00000000000000package file import ( "errors" "os" "github.com/yeqown/go-qrcode/v2" ) const ( upRune = 9600 // '▀' downRune = 9604 // '▄' upDownRune = 9608 // '█' spaceRune = 32 // ' ' ) var _ qrcode.Writer = (*Writer)(nil) // Writer implements qrcode.Writer. type Writer struct { out *os.File } // Close method to implement qrcode.Writer. func (a *Writer) Close() error { return nil } // Write method to implement qrcode.Writer. func (a *Writer) Write(mat qrcode.Matrix) error { if a.out == nil { return errors.New("nil file") } bm := mat.Bitmap() output := make([][]string, len(bm)/2+len(bm)%2) for t := range output { output[t] = make([]string, len(bm[0])) } for col := range output { for row := range output[col] { var selectedRune rune = spaceRune if bm[col*2][row] { selectedRune = upRune } if col*2+1 < len(bm) { if bm[col*2+1][row] && !bm[col*2][row] { selectedRune = downRune } if bm[col*2+1][row] && bm[col*2][row] { selectedRune = upDownRune } } output[col][row] = string(selectedRune) } } for _, col := range output { for _, row := range col { _, err := a.out.WriteString(row) if err != nil { return err } } _, err := a.out.WriteString("\n") if err != nil { return err } } return nil } func New(f *os.File) *Writer { return &Writer{out: f} } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/000077500000000000000000000000001521051213400225535ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/writer/standard/README.md000066400000000000000000000051531521051213400240360ustar00rootroot00000000000000## Standard Writer [![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/github.com/yeqown/go-qrcode/writer/standard) Standard Writer is a writer that is used to draw QR Code image into `io.Writer`, normally a file. ### Usage ```go options := []standard.ImageOption{ standard.WithBgColorRGBHex("#ffffff"), standard.WithFgColorRGBHex("#000000"), // more ... } // New will create file automatically. writer, err := standard.New("filename", options...) // or use io.WriteCloser var w io.WriterCloser writer2, err := standard.NewWith(w, options...) ``` ### Options ```go // WithBgTransparent makes the background transparent. func WithBgTransparent() ImageOption {} // WithBgColor background color func WithBgColor(c color.Color) ImageOption {} // WithBgColorRGBHex background color func WithBgColorRGBHex(hex string) ImageOption {} // WithFgColor QR color func WithFgColor(c color.Color) ImageOption {} // WithFgColorRGBHex Hex string to set QR Color func WithFgColorRGBHex(hex string) ImageOption {} // WithLogoImage . func WithLogoImage(img image.Image) ImageOption {} // WithLogoImageFilePNG load image from file, PNG is required func WithLogoImageFilePNG(f string) ImageOption {} // WithLogoImageFileJPEG load image from file, JPEG is required func WithLogoImageFileJPEG(f string) ImageOption {} // WithQRWidth specify width of each qr block func WithQRWidth(width uint8) ImageOption {} // WithCircleShape use circle shape as rectangle(default) func WithCircleShape() ImageOption {} // WithCustomShape use custom shape as rectangle(default) func WithCustomShape(shape IShape) ImageOption {} // WithBuiltinImageEncoder option includes: JPEG_FORMAT as default, PNG_FORMAT. // This works like WithBuiltinImageEncoder, the different between them is // formatTyp is enumerated in (JPEG_FORMAT, PNG_FORMAT) func WithBuiltinImageEncoder(format formatTyp) ImageOption // WithCustomImageEncoder to use custom image encoder to encode image.Image into // io.Writer func WithCustomImageEncoder(encoder ImageEncoder) ImageOption // WithBorderWidth specify the both 4 sides' border width. Notice that // WithBorderWidth(a) means all border width use this variable `a`, // WithBorderWidth(a, b) mean top/bottom equal to `a`, left/right equal to `b`. // WithBorderWidth(a, b, c, d) mean top, right, bottom, left. func WithBorderWidth(widths ...int) ImageOption // WithHalftone ... func WithHalftone(path string) ImageOption ``` ### extension - [How to customize QR Code shape](./how-to-use-custom-shape.md) - [How to customize ImageEncoder](./how-to-use-image-encoder.md) golang-github-yeqown-go-qrcode-2.2.5/writer/standard/go.mod000066400000000000000000000010611521051213400236570ustar00rootroot00000000000000module github.com/yeqown/go-qrcode/writer/standard go 1.17 require ( github.com/fogleman/gg v1.3.0 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.7.0 github.com/yeqown/go-qrcode/v2 v2.2.4 golang.org/x/image v0.10.0 ) require ( github.com/davecgh/go-spew v1.1.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/yeqown/reedsolomon v1.0.0 // indirect gopkg.in/yaml.v3 v3.0.0 // indirect ) //replace github.com/yeqown/go-qrcode/v2 => ../../ golang-github-yeqown-go-qrcode-2.2.5/writer/standard/how-to-use-custom-shape.md000066400000000000000000000037221521051213400275160ustar00rootroot00000000000000## How to use custom shape [Source Code](../../example/with-custom-shape/main.go) first step, you must define your own shape to QRCode, which consists of two part: * normal cell (of course, there are many types, separator, timing, alignment patter, data, format and version etc) * finder cell (to help recognizer to locate the matrix's position) ```go type IShape interface { // Draw to fill the IShape of qrcode. Draw(ctx *DrawContext) // DrawFinder to fill the finder pattern of QRCode, what's finder? google it for more information. DrawFinder(ctx *DrawContext) } ``` > Notice: > > if you must be careful to design finder's shape, otherwise qrcode could not be recognized. > Now, if you're define your shape like this: ```go func newShape(radiusPercent float64) qrcode.IShape { return &smallerCircle{smallerPercent: radiusPercent} } // smallerCircle use smaller circle to qrcode. type smallerCircle struct { smallerPercent float64 } func (sc *smallerCircle) DrawFinder(ctx *qrcode.DrawContext) { // use normal radius to draw finder for that qrcode image can be recognized. backup := sc.smallerPercent sc.smallerPercent = 1.0 sc.Draw(ctx) sc.smallerPercent = backup } func (sc *smallerCircle) Draw(ctx *qrcode.DrawContext) { w, h := ctx.Edge() upperLeft := ctx.UpperLeft() color := ctx.Color() // choose a proper radius values radius := w / 2 r2 := h / 2 if r2 <= radius { radius = r2 } // 80 percent smaller radius = int(float64(radius) * sc.smallerPercent) cx, cy := upperLeft.X+w/2, upperLeft.Y+h/2 // get center point ctx.DrawCircle(float64(cx), float64(cy), float64(radius)) ctx.SetColor(color) ctx.Fill() } ``` Finally, you can use your shape. ```go func main() { shape := newShape(0.7) qrc, err := qrcode.New("with-custom-shape", qrcode.WithCustomShape(shape)) if err != nil { panic(err) } err = qrc.Save("./smaller.png") if err != nil { panic(err) } } ```golang-github-yeqown-go-qrcode-2.2.5/writer/standard/how-to-use-image-encoder.md000066400000000000000000000000331521051213400275750ustar00rootroot00000000000000## Customize image encoder golang-github-yeqown-go-qrcode-2.2.5/writer/standard/image_format.go000066400000000000000000000012731521051213400255370ustar00rootroot00000000000000package standard import ( "image" "image/jpeg" "image/png" "io" ) type formatTyp uint8 const ( // JPEG_FORMAT as default output file format. JPEG_FORMAT formatTyp = iota // PNG_FORMAT . PNG_FORMAT ) // ImageEncoder is an interface which describes the rule how to encode image.Image into io.Writer type ImageEncoder interface { // Encode specify which format to encode image into io.Writer. Encode(w io.Writer, img image.Image) error } type jpegEncoder struct{} func (j jpegEncoder) Encode(w io.Writer, img image.Image) error { return jpeg.Encode(w, img, nil) } type pngEncoder struct{} func (j pngEncoder) Encode(w io.Writer, img image.Image) error { return png.Encode(w, img) } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/image_format_test.go000066400000000000000000000015371521051213400266010ustar00rootroot00000000000000package standard import ( "image" "image/color" "os" "testing" "github.com/fogleman/gg" ) func newImage() image.Image { rect := image.Rect(0, 0, 100, 100) rgba := image.NewRGBA(rect) dc := gg.NewContextForRGBA(rgba) dc.DrawRectangle(0, 0, 100, 100) dc.SetColor(color.White) dc.Fill() dc.SetColor(color.Black) dc.DrawString("yeqown", 25, 50) return dc.Image() } func Test_JPEG_Encoder(t *testing.T) { img := newImage() fd, _ := os.OpenFile("./testdata/encoder_JPEG.jpeg", os.O_TRUNC|os.O_CREATE|os.O_RDWR, 0666) err := jpegEncoder{}.Encode(fd, img) if err != nil { t.Error(err) t.FailNow() } } func Test_PNG_Encoder(t *testing.T) { img := newImage() fd, _ := os.OpenFile("./testdata/encoder_PNG.png", os.O_TRUNC|os.O_CREATE|os.O_RDWR, 0666) err := pngEncoder{}.Encode(fd, img) if err != nil { t.Error(err) t.FailNow() } } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/image_option.go000066400000000000000000000113371521051213400255610ustar00rootroot00000000000000package standard import ( "fmt" "image" "image/color" "github.com/yeqown/go-qrcode/v2" ) type ImageOption interface { apply(o *outputImageOptions) } // defaultOutputImageOption default output image background color and etc options func defaultOutputImageOption() *outputImageOptions { return &outputImageOptions{ bgColor: color_WHITE, // white bgTransparent: false, // not transparent qrColor: color_BLACK, // black logo: nil, // logoSizeMultiplier: 5, qrWidth: 20, // shape: _shapeRectangle, // imageEncoder: jpegEncoder{}, borderWidths: [4]int{_defaultPadding, _defaultPadding, _defaultPadding, _defaultPadding}, } } // outputImageOptions to output QR code image type outputImageOptions struct { // bgColor is the background color of the QR code image. bgColor color.RGBA // bgTransparent only affects on PNG_FORMAT bgTransparent bool // qrColor is the foreground color of the QR code. qrColor color.RGBA // logo this icon image would be put the center of QR Code image // NOTE: logo only should have 1 / logoSizeMultiplier size of QRCode image logo image.Image logoSizeMultiplier int // qrWidth width of each qr block qrWidth int // shape means how to draw the shape of each cell. shape IShape // imageEncoder specify which file format would be encoded the QR image. imageEncoder ImageEncoder // borderWidths indicates the border width of the output image. the order is // top, right, bottom, left same as the WithBorder borderWidths [4]int // halftoneImg is the halftone image for the output image. halftoneImg image.Image } func (oo *outputImageOptions) backgroundColor() color.RGBA { if oo == nil { return color_WHITE } if oo.bgTransparent { (&oo.bgColor).A = 0x00 } return oo.bgColor } func (oo *outputImageOptions) logoImage() image.Image { if oo == nil || oo.logo == nil { return nil } return oo.logo } func (oo *outputImageOptions) qrBlockWidth() int { if oo == nil || (oo.qrWidth <= 0 || oo.qrWidth > 255) { return 20 } return oo.qrWidth } func (oo *outputImageOptions) getShape() IShape { if oo == nil || oo.shape == nil { return _shapeRectangle } return oo.shape } // preCalculateAttribute this function must reference to draw function. func (oo *outputImageOptions) preCalculateAttribute(dimension int) *Attribute { if oo == nil { return nil } top, right, bottom, left := oo.borderWidths[0], oo.borderWidths[1], oo.borderWidths[2], oo.borderWidths[3] return &Attribute{ W: dimension*oo.qrBlockWidth() + right + left, H: dimension*oo.qrBlockWidth() + top + bottom, Borders: oo.borderWidths, BlockWidth: oo.qrBlockWidth(), } } var ( color_WHITE = parseFromHex("#ffffff") color_BLACK = parseFromHex("#000000") ) var ( // _STATE_MAPPING mapping matrix.State to color.RGBA in debug mode. _STATE_MAPPING = map[qrcode.QRType]color.RGBA{ qrcode.QRType_INIT: parseFromHex("#ffffff"), // [bg] qrcode.QRType_DATA: parseFromHex("#cdc9c3"), // [bg] qrcode.QRType_VERSION: parseFromHex("#000000"), // [fg] qrcode.QRType_FORMAT: parseFromHex("#444444"), // [fg] qrcode.QRType_FINDER: parseFromHex("#555555"), // [fg] qrcode.QRType_DARK: parseFromHex("#2BA859"), // [fg] qrcode.QRType_SPLITTER: parseFromHex("#2BA859"), // [fg] qrcode.QRType_TIMING: parseFromHex("#000000"), // [fg] } ) // translateToRGBA get color.RGBA by value State, if not found, return outputImageOptions.qrColor. // NOTE: this function decides the state should use qrColor or bgColor. func (oo *outputImageOptions) translateToRGBA(v qrcode.QRValue) (rgba color.RGBA) { // TODO(@yeqown): use _STATE_MAPPING to replace this function while in debug mode // or some special flag. if v.IsSet() { rgba = oo.qrColor return rgba } if oo.bgTransparent { (&oo.bgColor).A = 0x00 // color.RGBA is pre-multiplied by alpha, so set RGB to 0 when fully transparent. (&oo.bgColor).R = 0x00 (&oo.bgColor).G = 0x00 (&oo.bgColor).B = 0x00 } rgba = oo.bgColor return rgba } // parseFromHex convert hex string into color.RGBA func parseFromHex(s string) color.RGBA { c := color.RGBA{ R: 0, G: 0, B: 0, A: 0xff, } var err error switch len(s) { case 7: _, err = fmt.Sscanf(s, "#%02x%02x%02x", &c.R, &c.G, &c.B) case 4: _, err = fmt.Sscanf(s, "#%1x%1x%1x", &c.R, &c.G, &c.B) // Double the hex digits: c.R *= 17 c.G *= 17 c.B *= 17 default: err = fmt.Errorf("invalid length, must be 7 or 4") } if err != nil { panic(err) } return c } func parseFromColor(c color.Color) color.RGBA { rgba, ok := c.(color.RGBA) if ok { return rgba } r, g, b, a := c.RGBA() return color.RGBA{ R: uint8(r), G: uint8(g), B: uint8(b), A: uint8(a), } } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/image_option_api.go000066400000000000000000000126041521051213400264100ustar00rootroot00000000000000package standard import ( "fmt" "image" "image/color" "image/jpeg" "image/png" "os" "github.com/yeqown/go-qrcode/writer/standard/imgkit" ) // funcOption wraps a function that modifies outputImageOptions into an // implementation of the ImageOption interface. type funcOption struct { f func(oo *outputImageOptions) } func (fo *funcOption) apply(oo *outputImageOptions) { fo.f(oo) } func newFuncOption(f func(oo *outputImageOptions)) *funcOption { return &funcOption{ f: f, } } // WithBgTransparent makes the background transparent. func WithBgTransparent() ImageOption { return newFuncOption(func(oo *outputImageOptions) { oo.bgTransparent = true }) } // WithBgColor background color func WithBgColor(c color.Color) ImageOption { return newFuncOption(func(oo *outputImageOptions) { if c == nil { return } oo.bgColor = parseFromColor(c) }) } // WithBgColorRGBHex background color func WithBgColorRGBHex(hex string) ImageOption { return newFuncOption(func(oo *outputImageOptions) { if hex == "" { return } oo.bgColor = parseFromHex(hex) }) } // WithFgColor QR color func WithFgColor(c color.Color) ImageOption { return newFuncOption(func(oo *outputImageOptions) { if c == nil { return } oo.qrColor = parseFromColor(c) }) } // WithFgColorRGBHex Hex string to set QR Color func WithFgColorRGBHex(hex string) ImageOption { return newFuncOption(func(oo *outputImageOptions) { oo.qrColor = parseFromHex(hex) }) } // WithLogoImage image should only has 1/5 width of QRCode at most func WithLogoImage(img image.Image) ImageOption { return newFuncOption(func(oo *outputImageOptions) { if img == nil { return } oo.logo = img }) } // WithLogoImageFileJPEG load image from file, jpeg is required. // image should only have 1/5 width of QRCode at most func WithLogoImageFileJPEG(f string) ImageOption { return newFuncOption(func(oo *outputImageOptions) { fd, err := os.Open(f) if err != nil { fmt.Printf("could not open file(%s), error=%v\n", f, err) return } defer fd.Close() img, err := jpeg.Decode(fd) if err != nil { fmt.Printf("could not open file(%s), error=%v\n", f, err) return } oo.logo = img }) } // WithLogoImageFilePNG load image from file, PNG is required. // image should only have 1/5 width of QRCode at most func WithLogoImageFilePNG(f string) ImageOption { return newFuncOption(func(oo *outputImageOptions) { fd, err := os.Open(f) if err != nil { fmt.Printf("Open file(%s) failed: %v\n", f, err) return } defer fd.Close() img, err := png.Decode(fd) if err != nil { fmt.Printf("Decode file(%s) as PNG failed: %v\n", f, err) return } oo.logo = img }) } // WithQRWidth specify width of each qr block func WithQRWidth(width uint8) ImageOption { return newFuncOption(func(oo *outputImageOptions) { oo.qrWidth = int(width) }) } // WithCircleShape use circle shape as rectangle(default) func WithCircleShape() ImageOption { return newFuncOption(func(oo *outputImageOptions) { oo.shape = _shapeCircle }) } // WithCustomShape use custom shape as rectangle(default) func WithCustomShape(shape IShape) ImageOption { return newFuncOption(func(oo *outputImageOptions) { oo.shape = shape }) } // WithBuiltinImageEncoder option includes: JPEG_FORMAT as default, PNG_FORMAT. // This works like WithBuiltinImageEncoder, the different between them is // formatTyp is enumerated in (JPEG_FORMAT, PNG_FORMAT) func WithBuiltinImageEncoder(format formatTyp) ImageOption { return newFuncOption(func(oo *outputImageOptions) { var encoder ImageEncoder switch format { case JPEG_FORMAT: encoder = jpegEncoder{} case PNG_FORMAT: encoder = pngEncoder{} default: panic("Not supported file format") } oo.imageEncoder = encoder }) } // WithCustomImageEncoder to use custom image encoder to encode image.Image into // io.Writer func WithCustomImageEncoder(encoder ImageEncoder) ImageOption { return newFuncOption(func(oo *outputImageOptions) { if encoder == nil { return } oo.imageEncoder = encoder }) } // WithBorderWidth specify the both 4 sides' border width. Notice that // WithBorderWidth(a) means all border width use this variable `a`, // WithBorderWidth(a, b) mean top/bottom equal to `a`, left/right equal to `b`. // WithBorderWidth(a, b, c, d) mean top, right, bottom, left. func WithBorderWidth(widths ...int) ImageOption { apply := func(arr *[4]int, top, right, bottom, left int) { arr[0] = top arr[1] = right arr[2] = bottom arr[3] = left } return newFuncOption(func(oo *outputImageOptions) { n := len(widths) switch n { case 0: apply(&oo.borderWidths, _defaultPadding, _defaultPadding, _defaultPadding, _defaultPadding) case 1: apply(&oo.borderWidths, widths[0], widths[0], widths[0], widths[0]) case 2, 3: apply(&oo.borderWidths, widths[0], widths[1], widths[0], widths[1]) default: // 4+ apply(&oo.borderWidths, widths[0], widths[1], widths[2], widths[3]) } }) } // WithHalftone ... func WithHalftone(path string) ImageOption { return newFuncOption(func(oo *outputImageOptions) { srcImg, err := imgkit.Read(path) if err != nil { fmt.Println("Read halftone image failed: ", err) return } oo.halftoneImg = srcImg }) } // WithLogoSizeMultiplier used in Writer in validLogoImage method to validate logo size func WithLogoSizeMultiplier(multiplier int) ImageOption { return newFuncOption(func(oo *outputImageOptions) { oo.logoSizeMultiplier = multiplier }) } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/image_option_api_test.go000066400000000000000000000052311521051213400274450ustar00rootroot00000000000000package standard import ( "image/color" "testing" "github.com/stretchr/testify/assert" ) func Test_WithBuiltinImageEncoder(t *testing.T) { oo := defaultOutputImageOption() assert.IsType(t, jpegEncoder{}, oo.imageEncoder) WithBuiltinImageEncoder(JPEG_FORMAT).apply(oo) assert.IsType(t, jpegEncoder{}, oo.imageEncoder) WithBuiltinImageEncoder(PNG_FORMAT).apply(oo) assert.IsType(t, pngEncoder{}, oo.imageEncoder) } func Test_WithCustomImageEncoder(t *testing.T) { oo := defaultOutputImageOption() assert.IsType(t, jpegEncoder{}, oo.imageEncoder) WithCustomImageEncoder(nil).apply(oo) assert.IsType(t, jpegEncoder{}, oo.imageEncoder) } func Test_BgColor_FgColor(t *testing.T) { oo := defaultOutputImageOption() // check assert.Equal(t, color_WHITE, oo.bgColor) assert.Equal(t, color_BLACK, oo.qrColor) // apply color WithBgColor(color_BLACK).apply(oo) assert.Equal(t, color_BLACK, oo.bgColor) assert.Equal(t, color_BLACK, oo.qrColor) // apply color WithBgColor(color_WHITE).apply(oo) WithFgColor(color_WHITE).apply(oo) assert.Equal(t, color_WHITE, oo.bgColor) assert.Equal(t, color_WHITE, oo.qrColor) WithFgColor(color_BLACK).apply(oo) assert.Equal(t, color_WHITE, oo.bgColor) assert.Equal(t, color_BLACK, oo.qrColor) } func Test_defaultOutputOption(t *testing.T) { oo := defaultOutputImageOption() // Apply rgba := color.RGBA{ R: 123, G: 123, B: 123, A: 123, } WithBgColor(rgba).apply(oo) // assert assert.Equal(t, rgba, oo.bgColor) // check default oo2 := defaultOutputImageOption() assert.NotEqual(t, oo2.bgColor, oo.bgColor) } func Test_WithBorderWidth(t *testing.T) { oo := defaultOutputImageOption() // zero parameter WithBorderWidth().apply(oo) assert.Equal(t, [4]int{_defaultPadding, _defaultPadding, _defaultPadding, _defaultPadding}, oo.borderWidths) // one parameter WithBorderWidth(1).apply(oo) assert.Equal(t, [4]int{1, 1, 1, 1}, oo.borderWidths) // two parameters WithBorderWidth(1, 2).apply(oo) assert.Equal(t, [4]int{1, 2, 1, 2}, oo.borderWidths) // three parameters WithBorderWidth(1, 2, 3).apply(oo) assert.Equal(t, [4]int{1, 2, 1, 2}, oo.borderWidths) // four parameters WithBorderWidth(1, 2, 3, 4).apply(oo) assert.Equal(t, [4]int{1, 2, 3, 4}, oo.borderWidths) } func Test_WithBgTransparent(t *testing.T) { oo := defaultOutputImageOption() // check default assert.False(t, oo.bgTransparent) // apply WithBgTransparent().apply(oo) assert.True(t, oo.bgTransparent) } func Test_WithLogoSizeMultiplier(t *testing.T) { oo := defaultOutputImageOption() // check default assert.Equal(t, 5, oo.logoSizeMultiplier) // apply WithLogoSizeMultiplier(2).apply(oo) assert.Equal(t, 2, oo.logoSizeMultiplier) } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/image_option_test.go000066400000000000000000000047761521051213400266310ustar00rootroot00000000000000package standard import ( "image/color" "reflect" "testing" "github.com/yeqown/go-qrcode/v2" ) func Test_stateRGBA(t *testing.T) { oo := defaultOutputImageOption() type args struct { v qrcode.QRValue } tests := []struct { name string args args want color.RGBA }{ { name: "case 1", args: args{v: qrcode.QRValue_DATA_V0}, want: oo.bgColor, }, { name: "case 2", args: args{v: qrcode.QRValue_INIT_V0}, want: oo.bgColor, }, { name: "case 3", args: args{v: qrcode.QRValue_DATA_V1}, want: oo.qrColor, }, { name: "case 4", args: args{v: qrcode.QRValue_FORMAT_V1}, want: oo.qrColor, }, { name: "case 5", args: args{v: qrcode.QRValue_VERSION_V1}, want: oo.qrColor, }, { name: "case 6", args: args{v: qrcode.QRValue(0x0f)}, want: oo.qrColor, }, { name: "case 7", args: args{v: qrcode.QRValue_FINDER_V1}, want: oo.qrColor, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := oo.translateToRGBA(tt.args.v); !reflect.DeepEqual(got, tt.want) { t.Errorf("translateToRGBA() = %v, want %v", got, tt.want) } }) } } func Test_hexToRGBA(t *testing.T) { type args struct { s string } tests := []struct { name string args args want color.RGBA }{ { name: "case 1", args: args{s: "#112233"}, want: color.RGBA{R: 17, G: 34, B: 51, A: 255}, }, { name: "case 2", args: args{s: "#112"}, want: color.RGBA{R: 17, G: 17, B: 34, A: 255}, }, //{ // name: "case 3", // args: args{s: "#1122331"}, // want: color.RGBA{}, //}, // panic //{ // name: "case 4", // args: args{s: "#11"}, // want: color.RGBA{}, //}, // panic } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := parseFromHex(tt.args.s); !reflect.DeepEqual(got, tt.want) { t.Errorf("parseFromHex() = %v, want %v", got, tt.want) } }) } } func Test_parseFromColor(t *testing.T) { type args struct { c color.Color } tests := []struct { name string args args want color.RGBA }{ { name: "case 0", args: args{ c: color.RGBA{R: 17, G: 34, B: 51, A: 255}, }, want: color.RGBA{R: 17, G: 34, B: 51, A: 255}, }, { name: "case 1", args: args{ c: color.Gray16{Y: 17}, }, want: color.RGBA{R: 17, G: 17, B: 17, A: 255}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := parseFromColor(tt.args.c); !reflect.DeepEqual(got, tt.want) { t.Errorf("parseFromColor() = %v, want %v", got, tt.want) } }) } } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/image_qr_shape.go000066400000000000000000000034341521051213400260520ustar00rootroot00000000000000package standard import ( "image/color" "github.com/fogleman/gg" ) var ( _shapeRectangle IShape = rectangle{} _shapeCircle IShape = circle{} ) type IShape interface { // Draw the shape of QRCode block in IShape implemented way. Draw(ctx *DrawContext) // DrawFinder to fill the finder pattern of QRCode, what's finder? google it for more information. DrawFinder(ctx *DrawContext) } // DrawContext is a rectangle area type DrawContext struct { *gg.Context x, y float64 w, h int color color.Color } // UpperLeft returns the point which indicates the upper left position. func (dc *DrawContext) UpperLeft() (dx, dy float64) { return dc.x, dc.y } // Edge returns width and height of each shape could take at most. func (dc *DrawContext) Edge() (width, height int) { return dc.w, dc.h } // Color returns the color which should be fill into the shape. Note that if you're not // using this color but your coded color.Color, some ImageOption functions those set foreground color // would take no effect. func (dc *DrawContext) Color() color.Color { return dc.color } // rectangle IShape type rectangle struct{} func (r rectangle) Draw(c *DrawContext) { // FIXED(@yeqown): miss parameter of DrawRectangle c.DrawRectangle(c.x, c.y, float64(c.w), float64(c.h)) c.SetColor(c.color) c.Fill() } func (r rectangle) DrawFinder(ctx *DrawContext) { r.Draw(ctx) } // circle IShape type circle struct{} // Draw // FIXED: Draw could not draw circle func (r circle) Draw(c *DrawContext) { // choose a proper radius values radius := c.w / 2 r2 := c.h / 2 if r2 <= radius { radius = r2 } cx, cy := c.x+float64(c.w)/2.0, c.y+float64(c.h)/2.0 // get center point c.DrawCircle(cx, cy, float64(radius)) c.SetColor(c.color) c.Fill() } func (r circle) DrawFinder(ctx *DrawContext) { r.Draw(ctx) } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/image_qr_shape_test.go000066400000000000000000000024501521051213400271060ustar00rootroot00000000000000package standard import ( "image" "image/color" "testing" "github.com/fogleman/gg" ) func Test_rectangle_Draw(t *testing.T) { rect := image.Rect(0, 0, 100, 100) rgba := image.NewRGBA(rect) dc := gg.NewContextForRGBA(rgba) dc.DrawRectangle(0, 0, 100, 100) dc.SetColor(color.White) dc.Fill() ctx := &DrawContext{ Context: dc, x: 0.0, y: 0.0, w: 50, h: 50, color: color.Black, } _shapeRectangle.Draw(ctx) err := dc.SavePNG("./testdata/rectangle.png") if err != nil { t.Error(err) t.FailNow() } } func Test_circle_Draw(t *testing.T) { rect := image.Rect(0, 0, 100, 100) rgba := image.NewRGBA(rect) dc := gg.NewContextForRGBA(rgba) dc.DrawRectangle(0, 0, 100, 100) dc.SetColor(color.White) dc.Fill() ctx := &DrawContext{ Context: dc, x: 0.0, y: 0.0, w: 50, h: 50, color: color.Black, } _shapeCircle.Draw(ctx) err := dc.SavePNG("./testdata/circle.png") if err != nil { t.Error(err) t.FailNow() } } func Test_gg(t *testing.T) { rect := image.Rect(0, 0, 100, 100) rgba := image.NewRGBA(rect) dc := gg.NewContextForRGBA(rgba) dc.DrawRectangle(0, 0, 100, 100) dc.SetColor(color.White) dc.Fill() dc.DrawCircle(50, 50, 40) dc.SetColor(color.Black) dc.Fill() _ = dc.SavePNG("./testdata/out.png") } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/imgkit/000077500000000000000000000000001521051213400240375ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/writer/standard/imgkit/io.go000066400000000000000000000015661521051213400250050ustar00rootroot00000000000000package imgkit import ( "image" "image/jpeg" "image/png" "os" "path/filepath" "github.com/pkg/errors" ) // Read reads an image from a file. only support PNG and JPEG yet. func Read(path string) (img image.Image, err error) { fd, err := os.Open(path) if err != nil { return nil, errors.Wrap(err, "failed to open file") } defer fd.Close() img, _, err = image.Decode(fd) if err != nil { return nil, errors.Wrap(err, "failed to decode image") } return img, nil } // Save saves the image to the given path. func Save(img image.Image, filename string) error { fd, err := os.Create(filename) if err != nil { return err } defer fd.Close() switch filepath.Ext(filename) { case ".jpg", ".jpeg": err = jpeg.Encode(fd, img, nil) case ".png": err = png.Encode(fd, img) default: err = errors.New("unsupported image format, jpg or png only") } return err } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/imgkit/process.go000066400000000000000000000023731521051213400260510ustar00rootroot00000000000000package imgkit import ( "image" "image/color" "golang.org/x/image/draw" ) // Binaryzation process image with threshold value (0-255) and return new image. func Binaryzation(src image.Image, threshold uint8) image.Image { if threshold < 0 || threshold > 255 { threshold = 128 } gray := Gray(src) bounds := src.Bounds() height, width := bounds.Max.Y-bounds.Min.Y, bounds.Max.X-bounds.Min.X for i := 0; i < height; i++ { for j := 0; j < width; j++ { // var rgb int = int(gray[i][j][0]) + int(gray[i][j][1]) + int(gray[i][j][2]) if gray.At(j, i).(color.Gray).Y > threshold { gray.Set(j, i, color.White) } else { gray.Set(j, i, color.Black) } } } return gray } func Gray(src image.Image) *image.Gray { bounds := src.Bounds() height, width := bounds.Max.Y-bounds.Min.Y, bounds.Max.X-bounds.Min.X gray := image.NewGray(bounds) for i := 0; i < height; i++ { for j := 0; j < width; j++ { c := color.GrayModel.Convert(src.At(j, i)) gray.SetGray(j, i, c.(color.Gray)) } } return gray } func Scale(src image.Image, rect image.Rectangle, scale draw.Scaler) image.Image { if scale == nil { scale = draw.ApproxBiLinear } dst := image.NewRGBA(rect) scale.Scale(dst, rect, src, src.Bounds(), draw.Over, nil) return dst } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/imgkit/process_test.go000066400000000000000000000020501521051213400271000ustar00rootroot00000000000000package imgkit_test import ( "image" "testing" "github.com/stretchr/testify/assert" "github.com/yeqown/go-qrcode/writer/standard/imgkit" ) func Test_Gray(t *testing.T) { t.Skipf("need human to check") img, err := imgkit.Read("testdata/test.png") assert.NoError(t, err) out := imgkit.Gray(img) assert.Equal(t, out.Bounds(), img.Bounds()) imgkit.Save(out, "testdata/test_gray.png") } func TestBinaryzation(t *testing.T) { t.Skipf("need human to check") img, err := imgkit.Read("testdata/test.png") assert.NoError(t, err) out := imgkit.Binaryzation(img, 60) assert.Equal(t, out.Bounds(), img.Bounds()) err = imgkit.Save(out, "testdata/test_binaryzation.png") assert.NoError(t, err) } func TestScale(t *testing.T) { t.Skipf("need human to check") img, err := imgkit.Read("testdata/test_binaryzation.png") assert.NoError(t, err) out := imgkit.Scale(img, image.Rect(0, 0, 100, 100), nil) assert.Equal(t, out.Bounds(), image.Rect(0, 0, 100, 100)) err = imgkit.Save(out, "testdata/test_binaryzation_scale.png") assert.NoError(t, err) } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/writer.go000066400000000000000000000136161521051213400244250ustar00rootroot00000000000000package standard import ( "fmt" "image" "image/color" "io" "log" "os" "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/standard/imgkit" "github.com/fogleman/gg" "github.com/pkg/errors" ) var _ qrcode.Writer = (*Writer)(nil) var ( ErrNilWriter = errors.New("nil writer") ) // Writer is a writer that writes QR Code to io.Writer. type Writer struct { option *outputImageOptions closer io.WriteCloser } // New creates a standard writer. func New(filename string, opts ...ImageOption) (*Writer, error) { if _, err := os.Stat(filename); err != nil && os.IsExist(err) { // custom path got: "file exists" log.Printf("could not find path: %s, then save to %s", filename, _defaultFilename) filename = _defaultFilename } fd, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) if err != nil { return nil, errors.Wrap(err, "create file failed") } return NewWithWriter(fd, opts...), nil } func NewWithWriter(writeCloser io.WriteCloser, opts ...ImageOption) *Writer { dst := defaultOutputImageOption() for _, opt := range opts { opt.apply(dst) } if writeCloser == nil { panic("writeCloser could not be nil") } return &Writer{ option: dst, closer: writeCloser, } } const ( _defaultFilename = "default.jpeg" _defaultPadding = 40 ) func (w Writer) Write(mat qrcode.Matrix) error { return drawTo(w.closer, mat, w.option) } func (w Writer) Close() error { if w.closer == nil { return nil } if err := w.closer.Close(); !errors.Is(err, os.ErrClosed) { return err } return nil } func (w Writer) Attribute(dimension int) *Attribute { return w.option.preCalculateAttribute(dimension) } func drawTo(w io.Writer, mat qrcode.Matrix, option *outputImageOptions) (err error) { if option == nil { option = defaultOutputImageOption() } if w == nil { return ErrNilWriter } img := draw(mat, option) // DONE(@yeqown): support file format specified config option if err = option.imageEncoder.Encode(w, img); err != nil { err = fmt.Errorf("imageEncoder.Encode failed: %v", err) } return } // draw deal QRCode's matrix to be an image.Image. Notice that if anyone changed this function, // please also check the function outputImageOptions.preCalculateAttribute(). func draw(mat qrcode.Matrix, opt *outputImageOptions) image.Image { top, right, bottom, left := opt.borderWidths[0], opt.borderWidths[1], opt.borderWidths[2], opt.borderWidths[3] // closer as image width, h as image height w := mat.Width()*opt.qrBlockWidth() + left + right h := mat.Height()*opt.qrBlockWidth() + top + bottom dc := gg.NewContext(w, h) // draw background dc.SetColor(opt.backgroundColor()) dc.DrawRectangle(0, 0, float64(w), float64(h)) dc.Fill() // qrcode block draw context ctx := &DrawContext{ Context: dc, x: 0.0, y: 0.0, w: opt.qrBlockWidth(), h: opt.qrBlockWidth(), color: color.Black, } shape := opt.getShape() var ( halftoneImg image.Image halftoneW = float64(opt.qrBlockWidth()) / 3.0 ) if opt.halftoneImg != nil { halftoneImg = imgkit.Binaryzation( imgkit.Scale(opt.halftoneImg, image.Rect(0, 0, mat.Width()*3, mat.Width()*3), nil), 60, ) // _ = imgkit.Save(halftoneImg, "mask.jpeg") } // iterate the matrix to Draw each pixel mat.Iterate(qrcode.IterDirection_ROW, func(x int, y int, v qrcode.QRValue) { // Draw the block ctx.x, ctx.y = float64(x*opt.qrBlockWidth()+left), float64(y*opt.qrBlockWidth()+top) ctx.w, ctx.h = opt.qrBlockWidth(), opt.qrBlockWidth() ctx.color = opt.translateToRGBA(v) // DONE(@yeqown): make this abstract to Shapes switch typ := v.Type(); typ { case qrcode.QRType_FINDER: shape.DrawFinder(ctx) case qrcode.QRType_DATA: if halftoneImg == nil { shape.Draw(ctx) return } ctx2 := &DrawContext{ Context: ctx.Context, w: int(halftoneW), h: int(halftoneW), } // only halftone image enabled and current block is Data. for i := 0; i < 3; i++ { for j := 0; j < 3; j++ { ctx2.x, ctx2.y = ctx.x+float64(i)*halftoneW, ctx.y+float64(j)*halftoneW if i == 1 && j == 1 { ctx2.color = ctx.color } else { ctx2.color = halftoneColor(halftoneImg, opt.bgTransparent, x*3+i, y*3+j) } shape.Draw(ctx2) } } default: shape.Draw(ctx) } // EOFn }) // DONE(@yeqown): add logo image if opt.logoImage() != nil { // Draw logo image into rgba bound := opt.logo.Bounds() upperLeft, lowerRight := bound.Min, bound.Max logoWidth, logoHeight := lowerRight.X-upperLeft.X, lowerRight.Y-upperLeft.Y if !validLogoImage(w, h, logoWidth, logoHeight, opt.logoSizeMultiplier) { log.Printf("w=%d, h=%d, logoW=%d, logoH=%d, logo is over than 1/%d of QRCode \n", w, h, logoWidth, logoHeight, opt.logoSizeMultiplier) goto done } // DONE(@yeqown): calculate the xOffset and yOffset which point(xOffset, yOffset) // should icon upper-left to start dc.DrawImage(opt.logoImage(), (w-logoWidth)/2, (h-logoHeight)/2) } done: return dc.Image() } // halftoneImage is an image.Gray type image, which At(x, y) return color.Gray. // black equals to color.Gray{0}, white equals to color.Gray{255}. func halftoneColor(halftoneImage image.Image, transparent bool, x, y int) color.Color { c0 := halftoneImage.At(x, y) c1, ok := halftoneImage.At(x, y).(color.Gray) if !ok { log.Printf("halftoneColor: not a gray image, got: %T\n", c0) return c0 } if c1.Y == 255 { if transparent { return color.RGBA{} } return color.RGBA{R: 255, G: 255, B: 255, A: 255} } return color.RGBA{A: 255} } func validLogoImage(qrWidth, qrHeight, logoWidth, logoHeight, logoSizeMultiplier int) bool { return qrWidth >= logoSizeMultiplier*logoWidth && qrHeight >= logoSizeMultiplier*logoHeight } // Attribute contains basic information of generated image. type Attribute struct { // width and height of image W, H int // in the order of "top, right, bottom, left" Borders [4]int // the length of block edges BlockWidth int } golang-github-yeqown-go-qrcode-2.2.5/writer/standard/writer_test.go000066400000000000000000000106141521051213400254570ustar00rootroot00000000000000package standard import ( "crypto/md5" "encoding/hex" "image/png" "io" "os" "testing" "github.com/yeqown/go-qrcode/v2" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func Test_New(t *testing.T) { qrc, err := qrcode.New("cost 3+ days to read docs and coding") require.NoError(t, err) w, err := New("./testdata/qrtest.jpeg") require.NoError(t, err) // save file err = qrc.Save(w) require.NoError(t, err) // check file existed _, err = os.Stat("./testdata/qrtest.jpeg") if err != nil { t.Errorf("could not find image file: %v", err) t.Fail() } } func Test_New_WithOutputOption_bg_fg_width(t *testing.T) { qrc, err := qrcode.New("Test_New_WithOutputOption_bg_fg_width") require.NoError(t, err) w, err := New("./testdata/qrtest_fg_bg.jpeg", WithBgColorRGBHex("#b8de6f"), WithFgColorRGBHex("#01c5c4"), WithQRWidth(20), ) require.NoError(t, err) // save file err = qrc.Save(w) require.NoError(t, err) } func Test_New_WithOutputOption_Logo(t *testing.T) { qrcode.SetDebugMode() qrc, err := qrcode.New("Test_New_WithOutputOption_Logo") require.NoError(t, err) w, err := New("./testdata/qrtest_logo.jpeg", WithBgColorRGBHex("#b8de6f"), WithFgColorRGBHex("#f1e189"), WithLogoImageFileJPEG("./testdata/logo.jpeg"), //WithLogoImageFilePNG("./testdata/logo.png"), // png required ) require.NoError(t, err) // save file err = qrc.Save(w) require.NoError(t, err) } func Test_New_WithOutputOption_Shape(t *testing.T) { qrc, err := qrcode.New("Test_New_WithOutputOption_Shape") require.NoError(t, err) w, err := New("./testdata/qrtest_circle.jpeg", WithBgColorRGBHex("#b8de6f"), WithFgColorRGBHex("#f1e189"), WithCircleShape(), ) require.NoError(t, err) err = qrc.Save(w) require.NoError(t, err) } func Test_New_WithBorderWidth(t *testing.T) { qrc, err := qrcode.New("Test_New_WithOutputOption_Shape") require.NoError(t, err) w, err := New("./testdata/qrtest_border_width.jpeg", WithBorderWidth(10, 20, 30, 40)) // save file err = qrc.Save(w) require.NoError(t, err) } // Test_Issue40 // https://github.com/yeqown/go-qrcode/issues/40 func Test_Issue40(t *testing.T) { qrc, err := qrcode.New("https://yeqown.xyzom/") require.NoError(t, err) w1, err := New("./testdata/issue40_1.png") require.NoError(t, err) err = qrc.Save(w1) require.NoError(t, err) w2, err := New("./testdata/issue40_2.png") require.NoError(t, err) err = qrc.Save(w2) require.NoError(t, err) h1, err := hashFile("./testdata/issue40_1.png") require.NoError(t, err) h2, err := hashFile("./testdata/issue40_2.png") require.NoError(t, err) t.Logf("hash1=%s, hash2=%s", h1, h2) assert.Equal(t, h1, h2) } func hashFile(filename string) (string, error) { h := md5.New() fd1, err := os.Open(filename) if err != nil { return "", err } defer fd1.Close() bytes, err := io.ReadAll(fd1) if err != nil { return "", err } if _, err = h.Write(bytes); err != nil { return "", err } return hex.EncodeToString(h.Sum(nil)), nil } func statImage(filename string) (w, h int, err error) { fd, err := os.Open(filename) if err != nil { return 0, 0, err } defer fd.Close() img, err := png.Decode(fd) if err != nil { return 0, 0, err } rect := img.Bounds() w, h = rect.Dx(), rect.Dy() return } func Test_Attribute(t *testing.T) { qrc, err := qrcode.New("https://yeqown.xyzom") require.NoError(t, err) w, err := New("./testdata/attr.png", WithBuiltinImageEncoder(PNG_FORMAT), WithQRWidth(13), WithBorderWidth(1, 2, 3, 4), ) require.NoError(t, err) attr := w.Attribute(qrc.Dimension()) t.Logf("attr: %+v", attr) err = qrc.Save(w) require.NoError(t, err) width, height, err := statImage("./testdata/attr.png") require.NoError(t, err) assert.Equal(t, width, attr.W) assert.Equal(t, height, attr.H) } // //func Test_image_draw(t *testing.T) { // m := new(qrcode.Matrix) // // set all 3rd column as black else be white // for x := 0; x < m.Width(); x++ { // _ = m.Set(x, 3, matrix.StateTrue) // } // // fd, err := os.Create("./testdata/default.jpeg") // require.NoError(t, err) // err = drawTo(fd, *m, nil) // require.NoError(t, err) //} func Test_writer_WithBgTransparent(t *testing.T) { qrc, err := qrcode.New("https://yeqown.xyzom") require.NoError(t, err) w, err := New("./testdata/transparent.png", WithBuiltinImageEncoder(PNG_FORMAT), WithBorderWidth(20), WithBgTransparent(), ) require.NoError(t, err) err = qrc.Save(w) assert.NoError(t, err) } golang-github-yeqown-go-qrcode-2.2.5/writer/terminal/000077500000000000000000000000001521051213400225665ustar00rootroot00000000000000golang-github-yeqown-go-qrcode-2.2.5/writer/terminal/README.md000066400000000000000000000011151521051213400240430ustar00rootroot00000000000000## Terminal [![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/github.com/yeqown/go-qrcode/writer/terminal) Terminal Writer is a writer that is used to draw QR Code image into terminal. ### Usage ```go package main import ( "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/terminal" ) func main() { qrc, _ := qrcode.New("withTerminalWriter") w := terminal.New() if err := qrc.Save(w); err != nil { panic(err) } } ``` ### Option > 🤪 Do not support any option yet.golang-github-yeqown-go-qrcode-2.2.5/writer/terminal/go.mod000066400000000000000000000004671521051213400237030ustar00rootroot00000000000000module github.com/yeqown/go-qrcode/writer/terminal go 1.17 require ( github.com/nsf/termbox-go v1.1.1 github.com/yeqown/go-qrcode/v2 v2.2.2 ) require ( github.com/mattn/go-runewidth v0.0.9 // indirect github.com/yeqown/reedsolomon v1.0.0 // indirect ) //replace github.com/yeqown/go-qrcode/v2 => ../../ golang-github-yeqown-go-qrcode-2.2.5/writer/terminal/helper.go000066400000000000000000000016231521051213400243760ustar00rootroot00000000000000package terminal // //import ( // "image/color" // "os" // "syscall" // "unsafe" //) // //const defaultRatio float64 = 7.0 / 3.0 // The terminal's default cursor width/height ratio // //func terminalSize() (int, int, float64) { // var size [4]uint16 // if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, // uintptr(os.Stdout.Fd()), uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&size)), // 0, 0, 0); err != 0 { // panic(err) // } // rows, cols, width, height := size[0], size[1], size[2], size[3] // // whratio := defaultRatio // if width > 0 && height > 0 { // whratio = float64(height/rows) / float64(width/cols) // } // // return int(cols), int(rows), whratio //} // //func terminalColor(rgb color.RGBA) uint16 { // r := (((rgb.R * 5) + 127) / 255) * 36 // g := (((rgb.G * 5) + 127) / 255) * 6 // b := ((rgb.B * 5) + 127) / 255 // // return uint16(r+g+b) + 16 + 1 // termbox default color offset //} golang-github-yeqown-go-qrcode-2.2.5/writer/terminal/option.go000066400000000000000000000013021521051213400244210ustar00rootroot00000000000000package terminal // //import ( // "fmt" // "image/color" //) // //var ( // White = color.RGBA{R: 255, G: 255, B: 255, A: 255} // Black = color.RGBA{A: 255} //) // //// hexToRGBA convert hex string into color.RGBA //func hexToRGBA(s string) color.RGBA { // c := color.RGBA{ // R: 0, // G: 0, // B: 0, // A: 0xff, // } // // var err error // switch len(s) { // case 7: // _, err = fmt.Sscanf(s, "#%02x%02x%02x", &c.R, &c.G, &c.B) // case 4: // _, err = fmt.Sscanf(s, "#%1x%1x%1x", &c.R, &c.G, &c.B) // // Double the hex digits: // c.R *= 17 // c.G *= 17 // c.B *= 17 // default: // err = fmt.Errorf("invalid length, must be 7 or 4") // } // if err != nil { // panic(err) // } // // return c //} golang-github-yeqown-go-qrcode-2.2.5/writer/terminal/writer.go000066400000000000000000000042301521051213400244300ustar00rootroot00000000000000package terminal import ( "github.com/yeqown/go-qrcode/v2" "github.com/mattn/go-runewidth" termbox "github.com/nsf/termbox-go" ) var _ qrcode.Writer = (*Writer)(nil) // Writer implements qrcode.Writer based on termbox to print QRCode into // terminal / console. type Writer struct{} func New() *Writer { w := &Writer{} w.init() return w } func (w Writer) init() { err := termbox.Init() if err != nil { panic(err) } termbox.SetInputMode(termbox.InputEsc) termbox.SetOutputMode(termbox.Output256) } func (w Writer) preDraw(width, height, padding int, bg termbox.Attribute) { for i := 0; i < width+2*padding; i++ { for j := 0; j < height+2*padding; j++ { w.drawBlock(i, j, 0, bg, bg) } } } // drawBlock draws a block at (x, y) with fg and bg colors. // each block takes 2 times width of one character terminal, it looks like: ██ func (w Writer) drawBlock(x, y, padding int, fg termbox.Attribute, bg termbox.Attribute) { x1, y1 := x*2+2*padding, y+padding x2, y2 := x1+1, y1 termbox.SetCell(x1, y1, '█', fg, bg) termbox.SetCell(x2, y2, '█', fg, bg) } func (w Writer) Write(mat qrcode.Matrix) error { //width, height, whratio := terminalSize() //_ = width //_ = height //_ = whratio ww, hh := mat.Width(), mat.Height() bg := termbox.ColorWhite fg := termbox.ColorBlack padding, curRow := 1, 0 w.preDraw(ww, hh, padding, bg) mat.Iterate(qrcode.IterDirection_ROW, func(x int, y int, state qrcode.QRValue) { if state.IsSet() { fg = termbox.ColorBlack } else { fg = termbox.ColorWhite } w.drawBlock(x, y, padding, fg, bg) curRow = y }) printTip(curRow + 2*padding + 1 + 1) return hold() } func printTip(y int) { tip := "Press any key to quit." x := 0 for _, r := range tip { w := runewidth.RuneWidth(r) if w == 0 || (w == 2 && runewidth.IsAmbiguousWidth(r)) { w = 1 } termbox.SetCell(x, y, r, termbox.ColorDefault, termbox.ColorDefault) x += w } } func hold() error { if err := termbox.Flush(); err != nil { return err } wait: for { switch ev := termbox.PollEvent(); ev.Type { case termbox.EventKey: break wait } } return nil } func (w Writer) Close() error { termbox.Close() return nil }