From 4647a3ad43d5dc8bdd7d3b3eb003bbf3a6a59450 Mon Sep 17 00:00:00 2001 From: lehel Date: Wed, 1 Oct 2025 14:09:35 +0200 Subject: [PATCH] gitignore --- .github/workflows/ci.yml | 37 +++++++++++ .gitignore | 1 + llm.go | 99 ++++++++++++++++++++++------ visits.bleve/store/000000000004.zap | Bin 41254 -> 0 bytes visits.bleve/store/000000000006.zap | Bin 0 -> 41217 bytes visits.bleve/store/root.bolt | Bin 262144 -> 262144 bytes 6 files changed, 118 insertions(+), 19 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 visits.bleve/store/000000000004.zap create mode 100644 visits.bleve/store/000000000006.zap diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..641564d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,37 @@ +name: CI + +on: + push: + branches: [ main, master ] + pull_request: + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 10 + env: + # Provide dummy/default env vars so code paths that read them won't fail. + OPENAI_API_KEY: dummy + # Default to local Ollama endpoint for tests (tests mock LLM so it's unused). + OPENAI_BASE_URL: http://localhost:11434/api/chat + OPENAI_MODEL: qwen3:latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + - name: Go Vet + run: go vet ./... + + - name: Run Tests + run: go test -count=1 ./... + + - name: Build (sanity) + run: go build -v ./... + diff --git a/.gitignore b/.gitignore index 17ec726..e85110a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ reasons.bleve +visits.bleve diff --git a/llm.go b/llm.go index 417449a..ab6a811 100644 --- a/llm.go +++ b/llm.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" "fmt" + "io" "net/http" "strings" "text/template" @@ -104,45 +105,105 @@ func (llm *LLMClient) DisambiguateBestMatch(ctx context.Context, message string, return visitReason, nil } -// openAICompletion calls Ollama API with prompt and structure, returns structured result +// openAICompletion now supports both Ollama (default local) and OpenRouter/OpenAI-compatible APIs without external branching. +// It auto-detects by inspecting the BaseURL. If the URL contains "openrouter.ai" or "/v1/", it assumes OpenAI-style. func (llm *LLMClient) openAICompletion(ctx context.Context, prompt string, format map[string]interface{}) (string, error) { apiURL := llm.BaseURL if apiURL == "" { + // Default to Ollama local chat endpoint apiURL = "http://localhost:11434/api/chat" } - logrus.WithFields(logrus.Fields{"api_url": apiURL, "prompt": prompt, "format": format}).Info("[LLM] openAICompletion POST") - body := map[string]interface{}{ - "model": llm.Model, // "qwen3:latest", - "messages": []map[string]string{{"role": "user", "content": prompt}}, - "stream": false, - "format": format, + + isOpenAIStyle := strings.Contains(apiURL, "openrouter.ai") || strings.Contains(apiURL, "/v1/") + + // Build request body depending on style + var body map[string]interface{} + if isOpenAIStyle { + // OpenAI / OpenRouter style (chat.completions) + // Use response_format with JSON schema when provided. + responseFormat := map[string]interface{}{ + "type": "json_schema", + "json_schema": map[string]interface{}{ + "name": "structured_output", + "schema": format, + }, + } + body = map[string]interface{}{ + "model": llm.Model, + "messages": []map[string]string{{"role": "user", "content": prompt}}, + "response_format": responseFormat, + } + } else { + // Ollama structured output extension + body = map[string]interface{}{ + "model": llm.Model, + "messages": []map[string]string{{"role": "user", "content": prompt}}, + "stream": false, + "format": format, + } } + jsonBody, _ := json.Marshal(body) - req, _ := http.NewRequestWithContext(ctx, "POST", apiURL, bytes.NewBuffer(jsonBody)) - req.Header.Set("Authorization", "Bearer "+llm.APIKey) + logrus.WithFields(logrus.Fields{"api_url": apiURL, "prompt": prompt, "is_openai_style": isOpenAIStyle}).Info("[LLM] completion POST") + + req, _ := http.NewRequestWithContext(ctx, http.MethodPost, apiURL, bytes.NewBuffer(jsonBody)) + if llm.APIKey != "" { + // OpenRouter expects: Authorization: Bearer sk-... or OR-... depending on key type + req.Header.Set("Authorization", "Bearer "+llm.APIKey) + } req.Header.Set("Content-Type", "application/json") + client := &http.Client{} resp, err := client.Do(req) if err != nil { - logrus.WithError(err).Error("[LLM] openAICompletion error") + logrus.WithError(err).Error("[LLM] completion HTTP error") return "", err } defer resp.Body.Close() - var result struct { + + raw, err := io.ReadAll(resp.Body) + if err != nil { + return "", fmt.Errorf("failed reading response body: %w", err) + } + logrus.WithFields(logrus.Fields{"status": resp.StatusCode, "raw": string(raw)}).Debug("[LLM] completion raw response") + + // Attempt Ollama format first (backwards compatible) + var ollama struct { Message struct { Content string `json:"content"` } `json:"message"` } - if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { - logrus.WithError(err).Error("[LLM] openAICompletion decode error") - return "", err + if err := json.Unmarshal(raw, &ollama); err == nil && ollama.Message.Content != "" { + logrus.WithField("content", ollama.Message.Content).Info("[LLM] completion (ollama) parsed") + return ollama.Message.Content, nil } - if result.Message.Content == "" { - logrus.Warn("[LLM] openAICompletion: no content returned %v body:[%v]", resp.Status, resp.Body) - return "", nil + + // Attempt OpenAI / OpenRouter style + var openAI struct { + Choices []struct { + Message struct { + Role string `json:"role"` + Content string `json:"content"` + } `json:"message"` + } `json:"choices"` + Error *struct { + Message string `json:"message"` + Type string `json:"type"` + } `json:"error"` } - logrus.WithField("content", result.Message.Content).Info("[LLM] openAICompletion: got content") - return result.Message.Content, nil + if err := json.Unmarshal(raw, &openAI); err == nil { + if openAI.Error != nil { + return "", fmt.Errorf("provider error: %s (%s)", openAI.Error.Message, openAI.Error.Type) + } + if len(openAI.Choices) > 0 && openAI.Choices[0].Message.Content != "" { + content := openAI.Choices[0].Message.Content + logrus.WithField("content", content).Info("[LLM] completion (openai) parsed") + return content, nil + } + } + + // If still nothing, return error with snippet + return "", fmt.Errorf("unrecognized LLM response format: %.200s", string(raw)) } // LLMClientAPI allows mocking LLMClient in other places diff --git a/visits.bleve/store/000000000004.zap b/visits.bleve/store/000000000004.zap deleted file mode 100644 index cb80ed12648d3403c21d1bb1a10add8ea308283d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41254 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 BNcaE% diff --git a/visits.bleve/store/000000000006.zap b/visits.bleve/store/000000000006.zap new file mode 100644 index 0000000000000000000000000000000000000000..659acfd562f6cbe8df48b75d89901b8f30a6a34f GIT binary patch literal 41217 zcmbt-30zf0`~S>YF88wNxdaLbdT=*IaShE3OwCG76L(9mcm)Ij;o?Hp5BGh`H8qvY zloqqx%Y_}464Tc#ea+I+vPG@b)a?GBnK^gC8R7kW{ukk1@AI6Q=lRZe=FBa;#57QcyDIfRC|uyk*qt4^U253<@$tVo5P{oQf(>Osd`FsYaPcn z(h+@iFI}D)1tnzZlZx{*Cne`(B^KwU+8m&gJcg;nsq0547w2U`fd|v<4tt93QL}Y< z11sRX0&XiRao(a3=L4woRx_3rN9Ysac7N*jh{uTAY1HefRx~BkHgy5MF`v9oiGn|4 z(!t9FTiUoxTY@7y(;g4*fNl1aR(e8KdK$Pn39NIZ=YTos-gXq{W!m)dwn?_E^i&7& zFFckR|5EYZG)JO6&C6zxCibr?9Y+c#D0bcHX-lwDb_CM43^kLsj0`01wC@J)Or-8i z3nlKXVy(Ct*GCCS_Jow|jKjEx@yR~LHX%99=15LY3kXzwZoC$iodMR^Gi|B5Eh`I} zbb>w2Q9OSV{I%<;_C#B1ao(6Qx;=4fR*pT>?UHWOGqWAZ(AIgWskV%C2Ut7-8VtZ8 z-Zo(Fpm=-gczc#UE;%PT#g<&vXB#vpZsK1&J=KB7nbXpTZNTakqsZp>78gp>CJq;Pgu3sG7D3-muB>9{ya zwuA)3^#{1Q*Z;cvA%D9gUAG3`7-S!to~Vya&a&IG0FyDv_N+KPCEGEzI4?zqmV{5J+M9rQ7F+gLEb28WCoY3Z!NyKRicFQAEG zVVW)Fsa@C?@bd-ye0>RBf+&9V{0M$cB|?|x@c`L0N|(7fh+wpyKxKBki|e55R0s6# z^z5{;2XSN1e?on4yk;9SHXXR(MW8_gzm zmo4C|g?9K_zNEv4$i(G(3URqXD{%P*>hj>)#A7>kI3om&Nli~5J2^cwWgc$q{yYX- zR5e_8*s~m|wlUb}=s@V&;DvXsWbn!W2H12^Nzb&ycnI`Qn@Y?N1M*|3kHLL1jHMLk zXMkYbKpbL5s1NQC(KnoYKc;kfYX4){4ECGBezTc0nP#T;`w;sZSZI^Qg8fNgvznGg zss4HxVftDeNSOW}WBMM(^a31=#wOb`p320q1?%K2LWTb{cI&ExnqIZvH87_*KLvV9=rg26NA<@YLlA;bgvzLQ@QUW1l5L~z z;@W^sZ9t_qZQCFd!6wW?uxV6_3N^=lJoqhvDDM!y7T z&S0PtYys4@7*3le$NM;xfLg*ptz@8{!}S1E=u+Tu;w`MZKVzTZfZiFvo~&et-NijH zQ`K+S(-UEog-HU877P!V9XxdU_eRX7k4esPq^D&S=Ow~ekT|t?7dt)C@sT0!J&phr zbqRt2{&CQ2yNp0xdqL;3C&Kv^DF30Obb06kjlhLe%t)#FBGjo3iYE53;U5Oq!ACrh zS-j50bfgJ45y%?)63AMS@n$HcVFCp#ErQ^+5Z57i?XYJ8USDF} z{W;ijqfb_LW}-cFY68rb(kH;*arOzeRJ#tJ;`9lnA44~F=-EJkG`(F^dp*sTp=Tr~ z+0*C{>?W8C2`m%eTI$#WV^Cj9?6PDb^`4tV$ewB=z!dM&t*QQG;IecJf`c=9j#mBK zwL;NAaTr3ffa8D*A*t8v0sD+UXYbNy>|MUk-j(0kySjtDn~t-0a})M%8Hyzd7X+ig zF453t>`SE4cOp3_kf<=;O875KUp-!Q0%>b1j#iWwRUZGY zvb4}wTUK5YhOlXJnpHyD?4lFp<)s}Ewj|rFQZsFCQQ_$#q`gsbx}>bMybuamSaP(m zwBqRTFC29KUH2_^*zV{CzD=o<93)_8Zi zUfA`)iA(B2gAAD+Ds)g^db|Xe1tzG2Hdd!CVZ3$Z#0_-|B(&Z^X9W^k z+K`(92{f=mtXWu(_m$WIzP1G{2ISY{eU*?5w!-lvr1%QK@jm2u1+W_Qvp}jcAEV}m z^F9JjlGH9wAfZ(4^qD}ya5*E8FkG$+Bn+4N5xfNy7vR8_2p$)24irZ4xOg~lSx|CS z4m^mci38i}^VTt63k4G9>v@5M`FcwradBX21Kw9}4t&^v_tl#Nm4f3v9QaKjb#Y*! z&ilwXuvH*o95^D7FkHS7NEj}E3M34d#gV)PE)Hyq!! zAYUM194Hn@7%mqC5{AnifrR0*ya{iCiv#aB;c@Ziz_BJgE*=j2A}F~k2WB^|i31-s z<*j4B9ur8Iua^Z9=IaB2#KnO%&3IqEIk2Z0@2fWl&I*qAaNw3e>f*qP=Dd%L10M<` zj05EY3B%=kfrR05Um#()tZKnq;NrkXEqGkKIq*db9v2S>t_w=8%7OWh*TjKckMq_s zU%wDYn6Fm_66WjlmV9Y04y zs1QgPET+BLU54>VUwyTniahn^;Q%&!}qADfsdhsQ3YZZX~@MW-VYa(?nd$G zdNXNFYaU$>lMb}zORmbK)2(Y_(gQ&m46!wB_|h3-9}6UmNfiQ#i%CDW;eGXH(#&Yy zS8pb5jpmQ{FsWD|busDtXxRA-kvXm`MO>pVZQDWNSLpc0*Q+QKey+7_2$6b4!p14 z9LVp$AMfEnxj^dTz>ghx9~lRn0tw^5n;rRM7%sa65{Anc0tv(AszBo6!1PYMU)~(p z)QQK%!-2w1yq#4!aK2Mb9GLwCUk3AalR(0JJs^-UUr!4pE)M+m1n;Xi2NuTgzIt=u z!x;W}4+km)QWpn)j^TY|9GKaemoN^zC6F*&_6Z~mmoEhphRZJkiHifXyYPN_b6`ss z9v2S>O1tnLROP_ME;Vsr{*!ze%-1af3G?-kK*D@IE0DN2aPvvtS8on1?aKS=&4G`* z^2d8PP$`hQIPhCn-bcoPxli#D#(_M6gyHg;K*Df2Bakp$t_vhC4$SYy`{m7nZQXcW zJRCUIjrX7`2QGK3i35wD=F4EdZWBnDuZ02$^Yy$y;^M%qr+Ht!Ij|y@_tl#Ndt&+H zJsdbKkh(Z;81V=cn=58 z3#2X%-0jW#$T+a#IbOmz@S#A$a48o^7%txnBn+4P0*Q+QtDfim^5(#<=XqQ_960kl z??F`#Tz|eM4!rpSUk3Aamq5aN{X!sNzFrkbTpXC*hxgT+1DpErzIt<@P;k750~ZBS z7Y82n;eBKrSksr6Fb;eykT6^-1QLeJj{*tcq9_nsaQ5ZBr!B2XQ8Y@_Mu8|3i4?un z59yvrkq?a&VMJm@tmSFENRc{8BTo0@%S0?9HRxtP-ZQYpMB+OT0eX?gn#6Y?hQsU` z!lGWpo)2FX+ar71V*-2HNh2-`%0*x~!)JDXp-n+bCnZX0YaXJsQ`(pZm`9l7&4V`e zM~yuwSSSjBKj0u&MM8M=h5z+vNp6RIOfoFO!Fc_EO#`@FK!gqQ0CJZIL%l}^6!R)1 z3M+RaDwZeX(4_%acoo7NIUZ^ z^!ZCCc@22p&_-hrP!LU9Br zf@e^iLJYe&@G`GRC?K~bhDl~vCpa&DQ9M^GM8{2XCwYiG0tXVnC8R2*rp@6m`TRlr z?szT+i+~Tb=ph7M$p;qOU5>xX7Y(BjX=`XCS*wHQ4q7;ftDQD=JW=s!^CWt2&<Z9oi{77bZ8gsYLPP*B@eX?eVJ$ZoMBG!$u2 z6D)oDX2=Czhqg=GG1QAEZv zdsB?J3&VaK#&MP~miG3x1Q|In6s;M)emG|UZ3)t~%#u$q0&WLm{ORz+yrRK>C`%1* zf-Vog%BxWNQ*O(CRy1eCf)QMG)FOhiNwR3L;$y^zybjc)fVV(4RWZlJA)*_I(HA35 zkKk5M_|TX?Fa+!}HExOSk8lbLG=^8Xb{({F52m#cu|1k9VD<^ps+R${ECFeBx z`YV6(I^dcD!)!b35A5@Q42D;q&ar64s5eJ(c#@Mh;7OTd?)m~M7*#S#Xu3K8`}u-* z7B~f{wb12JS9v|!qv#lHj(Z+09KCcjSCmm31=APHJ4S!P>rkWyuoi~(sHaAM#p@X7 zWLgfK+Ha4($Lr8jB?$n5*|pI++eRB_4kZd96SRLVj1Sogg*qlV3K%+ooV1kIod8cI ztRehW>o-N;+kUoj0{}Uj5ew;nWs+Obn+bOlI6T|~B6ZW$;BmBl><42x`>303Si{4Ku3~H@uj4-N zDyE2*==#_{t5Kot{)Tr$q1QdPpt%TG5u|ZONQn9u?nbUPNWd#~-0W25>M5RxSUW{2Q-Bo0i6$eL@QbReZ2Re@f2XZ(F$#qfz53}?!9DH~Hb zYp9NKIRRUi4yP3HI<#BTd8{PCr1(?KrOkRhh_O z1EUfQH$JUkTbZIp!rE`ethYqh(*8)}h8r^2R3#kFOW&H#Sx5=T=K2b3a41bbCe$JG zv^FqLqq8NL9Fj>B`Z@i2IybL?D?2iNQm4s9=-P}88C^r5Ph32atCxC9Pend0JD^8Q=YFTp5s*v z$^#E2zsJzsi4S-cS_-)V0WiTRwjpzKCT9$7c{(kZ>%gXwg3J?abQ!2pu|%$-cGGf3m*jRVb_2)sqan7qLKj`Y=SLzbaKDmvB|;NV7=s58~xW=a|&l8xt(Z02z}5W zqs>#_naWv5+k_MwKu#)tbYz1I(UPghr#`Agdg}FQ(GmSI^)_E1R7w~D1%h!V==wme zPMy)Job@?ef#ePsm`KMXB`6dX=alDg7JAN|sIgG0g_hd0(6H*TDfnw*q4F2OcxM9XH48ia?{4Gav7Ex-lS zhIb7|4)U5ZwttLfRXc>C*|TR4j|sEN;b>XvYcE@+b()sDQ47g^TWg;CuC{0U636gv zI_y7FwwY)8+xqo-s$)bgt51QpSSh#$2K@@A5EEK;c-n{DehXCn3od|9-)p;n&=y|R zmR!>gT?c={(M_Dx!YYNKyOxRVtdfj%JvX4h7whvILP00N$7(zTlxv|ns5xqgn!w+d z=y&?t8aVVj{Kjp{62vA*kVtk=ygayf5$%y&=ib&qwAZq}%NSS=r`+3k0` zF1=;wAc2ah;0)GB=Qc#=@HsqMi6k(_VjtR9&5t6>!RM1G$-?h47@osi^qXQ%XC=9hgF+hV@)DM1pppLj7 z{D#*H3k|7T$Jb(pCQ%yJ`p>ET8)?%|Lm3kJb^Q$P*Q;CS4y_wUnpaBt2WusL(*{X@ zJ~vO&H*S-_WWR!ce>lE#b9FtQA88=Uc`{Nm%Y*>3zLLBcP?E0a7j8g8VOn#u75z0B`Iq0>QBPBmY*K##Q56KNyz}GNE zcXu|pL878?#TRXXPez}M^y#YTRXd$eO!xloPB&ZuJVz<|?gT|&n5gJWQWX6VqCGDQ z&IU;>BBAfSrudiCSS+aVYx8v+wX zYh=UQ5~M9c+H@Vhm>gr3$nfZhC!-ERq<10B1hrUmT?3A|XOT#z6@{WmaJd<32fvS_ zVB8LVAK9~@eEM?rD684ib6hfn9_l%ftmi2B3i=c+K^Z6>D)PL%IbDWz43_)D@4}*! zC8sWFE0DJIH0d3ZSL}d^ZPP-!FjaaDSf2qK9doofrA0&|3p7qnLJ2rH9cq@BXftk?UHC`) zFt@m%vgA^IiD-i_KKXf8ski`IIoTRl*cl2bEb0$m=Qym=@&d3vq!d17U_CzrM`3;2SwF1LJzaRb zbR{XGF^YrnzqA;N_z;|}C<1TK7L}jCI>Gkr*=L~%59V8?l@t4d53M^r*}XWEn6F;N z`t0(eioeO*)ncr_QCeOE{+!)a&;;RH#o%j8gu|!82G6n3#1%#VO8Qa)X9XDTn=`>G zm6bLIJ0F+qwn(YsXkl4V;p=d6I?le_l@|#ZFq2AQ2Wfd}N^gWi>rZl|S>@i)LZz2V z2Wd--ZjYDr>7}IYmi5_`6lcqB9|cEh zO#=VQfoAE}xO2#;ud?)PGE7bE0Ko)pAvLY+_ybv=z6AENmYytagc7Bea14-j3!&%H` ztWwGNXW?W0#*b&F0-cqql0L6DX^+ofsGgcNCQ>e!^*Kcqr+$<5d4)g0iL8*60v!Yp z7-x;EC^}nMvA1B?(o}@Q8Z<4=1_)qa)fbeWEa?HHD>_>~N7COe?}GKW3yUhRek18? zNC9P6p-ub<%b=y|6$7M8QivfivbRA8<$+R8wj(_uQY`@V3(Nbe`t--Z?j16P2!@Fh z(_V@~!{N4*KhjWEW~x0>c^B&o9!E`aIuNa)qVI(UhLhTiGE!Z+k2bxiq8C(P(hly; zx5`#r0=*6TOvBa#i_`4@F?zP~N6I-VJu$NT*@{xOH8}(NU{;bC?sOgae2SG%z(H18t@?ZnUh=C9a*U zEIMCU@(Z+5$))m=roekg23Q=T>Xe6-r7r={j#R5u83iONxmsAHOF#|BfL7qiQ5c?0 zXcG7nsZ55t$T&2&Yx}OXyDD8;bl&kqUZ-sxZ+BSKp-YD!+6`^@c-sfjPe%XMW?Gxq zS~rSn)hfGX#^c+YXEpEGTy5rTe81rx{m=T>!+#088gjYL(K=h}ycx7AaJja))_l0Y z8ji-IWb_T(e{kR~gC7j(kYIDtA-fg;TYzrmE-EZ`I4HkLd-| zF;hpMLZ5Etedag|z=5_}VtqgM?d12CU-6X5ld>IInHlM66H-&glM4+y*&04_Xng-Z zy?exVjp@+7U39DFjrE3)PX|BgD}cRuwupN^&3_dxw;-<`1QH+Lg5P=UWj_Z{KDnu4?kaXegR*&yB{D0%aKYewUg;- zpBK%;EC~rW#u$0YoFrM7(@1aS^h)dG^yDvcx^w$D#~QhDoDb!Bf&UvxOPuZ$9L`r6 zX#p?x!j*60^Xu?CYcaH`0{3s=q6O}c{jd)Iw2nuawwKDZU}?~T^?1p8UJF`7k_|1$ z*0ys!-d(L0UCr~=dVEfxMX0T+Rd2cCf7avN4Sc<{uNd{hYMAXC@CO1dat}x~J+#*4 z#0Gpypi4ih+Bfccif=+0Hg(+s) z^oV6Dvo_&Hn=lt1FygX`tOC0pT7FTm372ic+}$c;0fylogq3b?!nZc@?s+#3teRM} z8L!{WYtdVN?#7W1ZN`NHE!sFnjj(9o@@9NhpydrHEE|}ghZpDZHBvy`HR6x*@GgOt zcPD{J^qD;TjX;Z1+TGCTejauTv?vmW7Q_wn-o{(s=Ix@^8`OfZVENm)LZC$n=)wNC zxA9GZ79Eof9~CUE*n-z=;cN8xNW*#uw%|hot%q9Z;ud^apyeqGZrx&O_B(j~JA93_ zEcY-bz5fpWNTB7RJRR)5dIygvnb`FNxkh$qOOE#e zd*C`4G}e{QV%d|nYV<kP_iG z_w4!_xjKVu+;X@&15IqMmF<8lWw=`cSKVE;>8%i~OhQ?3Wzz`MkGDb^y{MW3sjCBgm-=V)f4={}FMjpn-F~)ywfjvZ*Hds^(h@y|lF%%)6&*kYs04kBuAqBJ z!X0ruwqw`yKP@%cnE5vhY;CmsJ%a;bOBQl37!u`? z?6S!TPK)J6>{O?bSk_50%Q}tJvQCnF)#*yS3Zkh_l8Mzh#p%gY%BFoz)s&l^;q=N( z=`>QB!fcOb@^p?($D<%=oIQ(95OFhP5B9}vEp>Fe)5vStt}nXL)oaF>oy8`NPRQ@* zB#9C|Ge=kQI=j=zr0ArX74bJ3O(Tdc8kt)rs~LFtG?p6B$r1=cIgl;TNmB|M^G&s# zlAahmyp=80>B^1g#Ci`WqIsVO^_?AEk zctvKp#HOGywEAPb?ql92I+oLt$g1|wKE_7`O0*;kDTye3_c8uKpaf?S2%5r=g)Gf@ zcwzhOPw?VT_}Q0xX*(^QEL%VP2`>7Cx083(1*@f>5l&DSAJF=K~!*0BJ zH*XU?M^h!Tinwq$E`5{|s}9x?U)hbX36wm{Aj@YL?!im<@YR9g3T>z=i(_~0!F%`c zvt46(EUlOrBD zLRd7KQ@mH8L`$Lr7+Je{_EUUbphP{Ulp?D)|M?W>e#Tel89m6#&AiX>R)Lad zcqZ#I%Ra-$AEiXwldPls%HZxdBwV8S}dJqPgtffBWedPi14 zo;!%Y6(~{fs7+)Yr1K!2dFT<<(P59QJbdR6-Y!t0!yZMPEC@Vy2!A0^@*qyy?)O9Z z4}lWx#K17dv4D_hfELLlMYy)bf*B{FW?=d;~i~xvQB72 zA>LfbD|t?LWI0b^Aubgtd00)>@mwjy*Q!+_>v$Fx;iW}O={^mm zRyOgDp+X6@NQPF3rIrXnqGfQ6Ktg_58U!v$^kIw!p-MPtItx|8Cyj(ENpM)w@^gtn z#SmpGELsU4A8QZMNvj-2D?WSnARONe;$v60Xr4%7GsurjB8e9c!r>%1`K`uch;Y1x z#Sk?X3k)Z*z`rz4C~)368v6r9-^>K4QzJny2=_tg$B6bFSou6i{ew^&8t8*iuveh3 zsJz5Go<|hPRm>}J1v8XI@gQ6b-<~D-oa)yC3=N`TyxI^6h40aLxMvh8EpdnOF0F;@ z%1{X45v=EzZh_T2U{K*zq6-l_$%xp^B%$vU`PwpqXJrZ2mz9=-iVuy>!H1Ac(0vg@ z`0ey1?d@`i0vi#ug9RN4SYQn)@dKQb9x3Hf)JTA={5+;Hu%i%7W-&0(@`KnH(GDX= zfk6bJLK#Zz3b7#wR<*^&5P)_^s)j?f$rZIadI=hQ=@SSCHiwX;RbCI#Jx~1USZQVD zIgN&w7D7}Tg71YDMd<`>ALK{kOI8Iw)A-W%(SMC9A2oE;nOAnc68FlTmruQ1F>>O_ z6(h!v&_Oz%Su!d;k}~>ZZS7 zhSLM$NK@&hN3nM_hy;Tm7Sz67!#YnH{UusvAAC_y{HnAM%S$EYvZOASO%<}wTE%=t zu`E-UsW(nS)@gVkh|{<@v^i}#PUArV&Xi=Q*P}$7^Z_DH_X9=XsxEP=6S863Q=Nk6 zayVTN;(#NJ=XW?gxz@=837p3BEj*g;M_)MUb1t0xb1tAh`jiY}ru#tm`B62AmAAhPWN*ppd|L_2(>OA9mF1@&{5Xt!x8XTnv*;mLERA! z`t*4U_!Vr8o|Ft%ldh*PvWdv9i9I;zN^&1{ z9LI&jH#A8*KB(BUTK7d`y_2*9LZ!!(^xzosM-VQRI(RAm|3J3txm;2gx?J<1o3w)*su6-r_-!EW6-orsJ zIAtgjgkax1f%$FxMiK~Eh$rd$L4mt9@6H0Dod+>jIGnnDVHqDiUea%aO7+>NwY*9} zDdb!v=?6t3GD(&6vmz0hmr42`B9Y7I#V2d<`2$d>#^*{9*WmLtP^rP^RbL89VLtB^ ziI~q7A`$cXib&-0dHSgueBKNS)%aWt;u?JZ7F25RdH!iZDa_}0L?Y(%5s`@bd`={C z`Fsn6T!_e<+bjQ5tFT!YW2K&1wsABaj}KCe9^sDSyrOC(}GpAd;$KK~5DYJHyf zRkc3958@hpE(4Vse7-3vh55Ybte^ts^EQ!)`CKFtxqQ9=!fJi~2NbH|_NK1|CRH87 zJ_VH;eEv~X3iCPl8$kuk=k+2H^LejGL?mK9UlfU$&-X+km(Qy%*WmMRP^iY|vmoYLsH)F@ zfJzNMzx9Kl6z21Ok%;+xS|nmV|1J`_e4hVf4L)xNg=&1R0C5dIUjdaGd|rMe8hP-J7-rZVE}*D)|=-fDJ8!VDri_ZMVBPGd3&3&BI-rzpUob ztgtEMMfaXqRVZx!{Q0o)#43}*$i@p(!DcAz9oRn72yNd^wvX)8mO!D@M1QPk{+h9a z%Ifo7yuL*w1j|-qk4?r)$eHiv*>@EVwk}&z9yNkfL z+6<@}r1ZI@^hH?rU%uJ3h1qWG`Y|@`K>5cp`JtP3Ncjvqva^V6 zy=ep&;>OmSM`7o}&A4bsRdLH2+>#1hungANMwe$DW=B$1X6EY?7i6qXe>-i*gilk; zQcjKkHu+l8?L;XNc5%YJ^icE!8iSUhB6I`kcmU4A8*vH#1-Rn19+|C1*3t|Ewi&k# zd{H*OhNX*=d{|L-sp@ua*>jSq@Zk0Fa{LVlJ? z)LT7+M&dI;N-Q{}s^{S7i&|^&N%}V)!@s`UnmmR2+w(MO%N+7&k}UuwsivMA zkty=nb6Zdce6ibh2@k>;UqsEYC329`*gxVTl7?*$y@(!bV(WAfDS*RMPyL@cI@&U5 zd+!SQ1K|4s+o6t&fXCO7c_>zW9b}I^w_Uvm2Sn{Q_ldUjg#Vy^O%9{@cG(K5 zi!<@rE=Ab-b-N-waXS2&FugVWnE`*2XFOGuJoBj{DDZOIBHOHvMYh=;i_plOTj9EPt)d=2E2hT|Z6+vWHCn~x6euLeha;|~mvvIGU6 z1CxDw7KNVk2bc%Pq2Tk-l4|64!RHCqbFBX*Mh9F#0889fG!2^+92Hpx>!L3s-_mxd z8@vxzFE)=4QC*b3V}g!CUPd=W_`Topu3PxVPp);Rf+xQcK7MUl&T3)(eACkiT=QjRYphatB zS|p*{z1#TTM`@AebS#zI<~#VEJG@vj)Go5TkY&;O_HTSiphe4~sM6$Dv+m+~cljEP zkUA-gBr}iGXO{EaRYv|faO12!rhR?zn5|1TP7LSEbK_nhq8K%vKy`U`Qd-bfWP50jU znO{Iwfd+=bJ~I-kq)|#LXWK9@Ev7-m%A(tKwR!HXmKAVFt#q&fHKn^&Nh}cdE|wPT z)s~X*FWnbNjGFEaCmy{-wg3{v+wW?-U<)BEcZCI-iPkvSad)B=9s_!h*3Pk!x%Rr5>0US3;ySB>AW&Hf>ty}uX17eb$u&POQd<9do!8%e z?e*7Qe67W6@@xC1rA+HN?ewd*SA$03iah%v^q)r~0K!{I(Wpg(y^x$%H@wzG&l zXSsC`WE~7o38qi@hJYA6=Ni8lO&)ViVqx?-*AYu&Y3$H=7&eWjsjnhCZm-ejHV4#h zMIvL#&T;gK&Y?N}@bG45M4u!Q$b)cV)dv+jS;*`Vn$#&0_i#Tt+L>%TwHLQ-40Ri^ zGpji|*(=cLJm5Oty58}3)1~)kN$>tkqh`BjN&LknbSD}$s{|o;S!$#cr%|upL4mu9 zcjpt=C4Kp9K?yYbo&uMj`c9G9$SAH=f{?rJCF8WDT@#7OC@N{Q=Ln8s*ZiABB66aX z^v^^hGCWH9S0a%Mp_?GA7NKQxYd~lhC~zfs5IQ9iyAZkw!bc#qXr4gC5ZWdZF@%al zB8Jcfk%%Gmw@BndXvKVif8HGW1Qe>}&>2w)9)$i9iCqY-SRjCbacGA~#1J|r5;25+ z5Q!KQLsK*%w`8=?PzLbV9p5tZOUX!RmN1ulg4fbbCtcZLum0* z!BGsM?IICFs8}Ro2z@IOxe&Sw!fFv(yQ~I;J_7}=1P?;zL}C|0cR~0FgjOyWh!{d2 zi9`&c<0275=tq%=A(Z=upe`3e>p{r*=iSRb1%+xkbU{>t2cdsNVi!W|R|rgF8ORU~2v&0Q&|iy`#3NaRB35D2S9=)a&)EkaIF2_A$tt`bz>Lg)|(AHkuo zMIwgKpCS=MXvu0pfefL1k%%EwA`-a}x(LE*5&9PtszoSoji3Y%LIonR3!#f3d;~)G zL?VXJs7jA`-a}n*OH1Kkr_)85F8Ts902j2cb(Mu?wN;>jb{C zUbaCbVhHUMi5NnsL?VXJZz2&xXx@5(87_pjfUsH)6@fyv2>mE3!GqAO4T1_>2yFr3 zBRF(eBw`4CBN8!${t}58LQCHg)Wr~bPb6|7R0_gs5&8iXszqq-MnMT4gx(d2T?mze z@DT`oClWD)?u$eWq1BrN1u}#_7Ks=_pNm8;gsy_HT7>3ot^uKZP~b}NAaqnDb|G{X zgpWXIMxH>#5PC}_VhHUQi5NnsMIu1R#6qmUgP3E2`x#3l8mrS^xDthH(YGaWJocf7 zEYZV`f-+Y!*@?#N`US)s24I&kCOc<~^#2o+E&X2)FC?3StG=qF9vxXAYr9R_I*Yc$ zUz=ftP+nL;U6O9p2l9D-iT0xP=yfy-bwd$Qh$p?MC+}gPZ!CmtBT(;Xk}~uqNEtd9 zQicwPl%cO^dv>gt@^Wk>+!0bnnVG)HJX^ft{A`T@;S_zB5UNDSLs#VG%vrh22MuIz(>5WtK;vCT*}&&!Ze@T&IN zHOMIVySD2lWE4E+G6^yY4)>4q$|wjS*(eCdN~VHP$kiDEn+_Ub2%JX3{V|rSvmJ)a zkrAjP{FmhFj3W`%dPc6!eh^tT6~tqbtJ7tmftgQ0Sc{mhM!LX2pZ`q7`UkIJebaOd z`8DTYeIrC=Nq$Ws;E-vvkF`s1pDvz!fq}l5#+Z-bwlsTY1+n8K)>jgwPl0hgARNlF zXI=rTu3^Y1387n8_RM>jX3zA&d!bRGNg-<{$u1ZOVd!8vyCi+dK8dBVj6g>umd3IkIwo;xEM53}SnFS>RpaKZsuH9JB?zB# z(wiW!Jc1xBvt%T|M>0#2o{HbbOs1t~pFb?-Gk%u+ z0sCoiJb4TR$Acg^ZtAC5{2+ALVWP!XYh{v~nXz9CM1aF$VxcIAj^lwnutkpv2?*EW z|9o^j2?D-hF%TWc10mcS;0hJ$I5x3Aj)&NCHhL<6)X+Xj^@G@SeVhW}>QDy`g0~lS z+!li4{y8l04&OXQg4v*&9a5i!l0h#!=tU^l-x->XY!TN`t>9}YI`kUyv0g(V@cEg5 zYslYv4U&=ZmI5K#8(av3Q}cD%&$xzek->L1q~wQEsKP;L~2 zgW-RnO-eLCc);_xtp*7D_kXTC_^}j}@qBZKcCmP7NTVQvZz!IM26X8zDdPs>cuTg@ zF+}wzmbY&aoUMfQ!NEb$WTEk+adT2$-=>ht08kwtZONv%bPOS&wor*KR2vV?(6`Gq zq>O?V>IGXaUJIy;8n=cIZTg--&B=$?gEx2l0@Z!)68X>5ZJQ1FKjhc*FBCIuE?xj% zDX$^**mJ9uHc7bhxebc+x_YMP+e%#r9P>23*bk0LczLIi8m8{(xfMl3_O$pZws`fr zKbYKh&`zaO0N&N}T~rG`MvuoW@VNmym3pSg?vabov+!|fM?3^V)&6~VnggC`-r_A1 z6~}WTw<-~%RUaq_UqEep?hNk~pabY~t)8@$Z{tWA_*?WWR?*NVMV($#BB8l$D=Dyg8%iXkgUkxStute3aHev2RfO z2_1p^F%2!1uufs()1>jc*TpT6Gy6GMf)Z|RdnoxO(q=Zl#cB2t&}y~JBU_Xi9+yEw zV;}swXZ-?Mkdg_J`tEg;U-$0=$3u|5FF0(AD${GZ`rdRibY1dthYQL-kk0LvX1xQ8 znjkn$pZMX6F7KAE?v}V25Ofqni9Ahh-X3Yu9$tyepj;)H(1&}Zj~}HZvFfbo)E?<8 zff5Zl8%pr}zdh1@fs%<-XDHQ18}>?@_wqK8DJ6@o!j^yTc}j(QrDJ;~ZaV0GqLRDx zdwZpS1*Jm-)i8lP#%R+%Y0EyL32r-0sAQjXRGnQ}^oGMl?EFC24OyNxfUAINd6RkSs@KrJb~eM${Iz@Rri3=!HVq zAnYB5g^jMIb+m0|$4iq)tafRUE2ryuBb{q;!ILD8TtRl|u7&NvMsyZMA)EL1(9YDZ za}cJDhlN-qO#7C1nD$s{7nTdRvJ{N;rD55;f(skQZg_e_*oIr{Pp*G|{hakLuW!Cy zUVmWS%5~}MaN}MBMoe_%EL!_^{)ul%05&rna(gBxje`uWwE_*u+8f~cA|1Dr2FPQS zsp=cpv>p2##pWNd#fhEx#xutDO|s+AQG77X?y#qL1tD$jKxBsPnOw4zCRNbog1%NaU6i0yQY&|*l;7lOa3PS`g|HZ=|jt#5{nowzTH zv#NuFScElVLUXUEDsF`GThB+~t^leU)&UHkU`xnKDb6F6{^nwgdldZsp!D5gY5k{? zJSust>s#cX?j9%Mj0hmOCC_j0NF=W#`i}5?Z%(mKh5VCav)o4wx$BXtY3Y!H$SoRo z%Ok1>yFwG}W3w|Mjtzfpj^y;TQLuM2+xvi=U7iDKdmWHwn_zdBI-{jWN%K<5$V^V~ zXssLW(NZTRXC*t_1#BAa5z&;f2yIGc)Y&w{c;8^W?>62~8SlTb_s#W<_h*cE<9L{i Y(wA?B@%^l-@8o|9F+^KAxS9I@0J+gi-T(jq literal 0 HcmV?d00001 diff --git a/visits.bleve/store/root.bolt b/visits.bleve/store/root.bolt index 12eaae9073e731a52363d8016eb0a01fc61338bf..16f4475f6f2bb001b251fd952fe98a4fc8ab3ab6 100644 GIT binary patch delta 286 zcmZo@5NK!+nBXA5!vFz>w;n8(;*0m+7`Wbk@_&0r0bZy?Oc@7r$Q_<;h(x{aWSs*k znt;8EojZ_b0b*t--){2nMkN&k3o8RdJxg;lLu~^iD+7a)%7WCY#DcQa zqT~n{C!?x^6p# zQHQe|s14)*!O5l#(O{KW29$bWN5xwqv?k2^#AsZicGyM vAU{n^(4W@8=%CWg1T_Ih^}u`r69B27W54YHqeKHEbGxJi({@P*=I8qXP+w3Q