Compare commits

...

2 commits

Author SHA1 Message Date
bf8bed3879
Add health check for my website 2024-11-17 23:19:46 +05:00
0a1c433a88
Run ollama 2024-11-17 23:18:27 +05:00
6 changed files with 383 additions and 236 deletions

14
ollama.yml Normal file
View file

@ -0,0 +1,14 @@
- hosts: webservers
roles:
- name: ollama
database_url: postgres://openwebui:{{ postgresql_users.openwebui }}@postgresql:5432/openwebui
webui_secret_key: "{{ ollama.webui_secret_key }}"
webui_url: https://ai.comfycamp.space
enable_login_form: false
admin_email: admin@comfycamp.space
enable_oauth_signup: true
oauth_client_id: pUiGwuYn4HP26e0R95IqCYhICay1qsLQIHSTZnxT
oauth_client_secret: "{{ ollama.client_secret }}"
oauth_provider_name: Comfy Camp
openid_provider_url: https://auth.comfycamp.space/application/o/ollama/.well-known/openid-configuration
openid_redirect_uri: https://ai.comfycamp.space/oauth/oidc/callback

View file

@ -107,6 +107,9 @@ frontend https
acl host_freshrss hdr(host) -i rss.comfycamp.space
use_backend freshrss if host_freshrss
acl host_ai hdr(host) -i ai.comfycamp.space
use_backend openwebui if host_ai
acl host_grafana hdr(host) -i grafana.comfycamp.space
use_backend grafana if host_grafana
@ -133,8 +136,10 @@ frontend authentik_ldap
backend comfycamp
mode http
option httpchk GET /health
http-check expect status 200
http-response set-header Onion-Location http://comfycgmgfvowbbw2ckkobuvk4cejo2e56uxrhznravxnrl7itftpkad.onion%[capture.req.uri]
server green comfycamp:4000 check
server s1 comfycamp:4000 check inter 15s
backend mastodon
mode http
@ -240,3 +245,6 @@ backend phoenix
backend uptime_kuma
server s1 uptime-kuma-1:3001 check
backend openwebui
server s1 open-webui-1:8080

View file

@ -0,0 +1,41 @@
argument_specs:
main:
options:
database_url:
type: str
required: true
database_pool_size:
type: int
webui_secret_key:
type: str
required: true
webui_url:
type: str
enable_login_form:
type: bool
admin_email:
type: str
task_model:
type: str
enable_rag_web_search:
type: str
enable_search_query:
type: bool
enable_oauth_signup:
type: bool
oauth_client_id:
type: str
oauth_client_secret:
type: str
oauth_scopes:
type: str
oauth_provider_name:
type: str
openid_provider_url:
type: str
openid_redirect_uri:
type: str
oauth_username_claim:
type: str
oauth_merge_accounts_by_email:
type: bool

View file

@ -0,0 +1,54 @@
---
- name: Create ollama docker volumes
become: true
community.docker.docker_volume:
name: "{{ item }}"
loop:
- ollama
- open-webui
- name: Create ollama network
become: true
community.docker.docker_network:
name: ollama
- name: Run ollama
become: true
community.docker.docker_container:
name: ollama-1
image: ollama/ollama:0.4.2
volumes:
- ollama:/root/.ollama
networks:
- name: ollama
restart_policy: unless-stopped
- name: Run ollama web ui
become: true
community.docker.docker_container:
name: open-webui-1
image: ghcr.io/open-webui/open-webui:git-96c8654
env:
OLLAMA_BASE_URL: http://ollama-1:11434
DATABASE_URL: "{{ database_url }}"
DATABASE_POOL_SIZE: "{{ database_pool_size | string }}"
WEBUI_SECRET_KEY: "{{ webui_secret_key }}"
WEBUI_URL: "{{ webui_url }}"
ENABLE_LOGIN_FORM: "{{ enable_login_form | string }}"
ADMIN_EMAIL: "{{ admin_email }}"
TASK_MODEL: "{{ task_model }}"
ENABLE_RAG_WEB_SEARCH: "{{ enable_rag_web_search | string }}"
ENABLE_SEARCH_QUERY: "{{ enable_search_query | string }}"
ENABLE_OAUTH_SIGNUP: "{{ enable_oauth_signup | string }}"
OAUTH_MERGE_ACCOUNTS_BY_EMAIL: "{{ oauth_merge_accounts_by_email | string }}"
OAUTH_USERNAME_CLAIM: "{{ oauth_username_claim }}"
OAUTH_CLIENT_ID: "{{ oauth_client_id }}"
OAUTH_CLIENT_SECRET: "{{ oauth_client_secret }}"
OAUTH_SCOPES: "{{ oauth_scopes }}"
OAUTH_PROVIDER_NAME: "{{ oauth_provider_name }}"
OPENID_PROVIDER_URL: "{{ openid_provider_url }}"
OPENID_REDIRECT_URI: "{{ openid_redirect_uri }}"
volumes:
- open-webui:/app/backend/data
networks:
- name: ollama
- name: haproxy
- name: postgresql
restart_policy: unless-stopped

View file

@ -0,0 +1,19 @@
database_pool_size: 5
enable_login_form: true
admin_email: ""
task_model: llama3.1
enable_rag_web_search: true
enable_search_query: true
enable_oauth_signup: false
oauth_client_id: ""
oauth_client_secret: ""
oauth_merge_accounts_by_email: false
oauth_username_claim: preferred_username
oauth_scopes: openid email profile
oauth_provider_name: SSO
openid_provider_url: ""
openid_redirect_uri: ""

View file

@ -1,236 +1,247 @@
$ANSIBLE_VAULT;1.1;AES256
30373463346361363832616462626534336233633936383032613437326433353437366363313032
6430316535363530346633373638666262613436623133310a663037356562333334396261363833
62663133363265326230333961313364343134623032376165323961386132326637383062373065
3732653962616263360a663538613837303533653031376161643037623434336331613533356630
65623563366666333463613436303534356238663934616530353363633635393466323636346437
39643166613332326662373938366165336137623065356633646362316262663033633430326334
38616337333566643536383138663762313161376534663132343763653464346561333331633339
34636464613032633061646564623661656466393633653266323366363333393339363732376532
32363063303865646561323637623632636435643866393131313131313131343031373234613061
65336162633836383839333237353266316566666430333339333235313536303562653763396534
39386238623737376234333266366132626136613632653239366538356462363030313464613431
35616139373039623562306365623536346139643631653664396434383163663866313237663831
63646131343663386231613237663638393061643131363436323561396430336333373538323430
34323234623034356231663036643365646366376638323966313361313738316135643535623462
66636338356436666637303537626566633437393163343434336435666433653461356337376138
61623465653631633139626239343430323761353266353263323561386165356166666134623666
36313538326433396131323266383033613133323566656162633965383739653164363237333039
30373138626433343465666165356633346436646630333465376238343661653266313834623862
37616137656564363131343035653266313965333436353932313566363031353239356265363361
63623466646131323064306166626137306537613565666435616533623764613138643264383036
65376136386539653666366136616533626433653030636563316232663031663365356631626431
66653161633661643764666462333162363139626230303132663231636666343938393137333932
63613937663464303538306165353039356165396636646666313232633132373933303162303762
63653763633061306366393261653163633437306237386533663639326566306538346137343730
65366132346531363239613161363466623830666236346266636634643833613263636632353438
31666131303866333562376437363536333133633036353139643162626666656466336132303932
39646639663364633736393138623566383538663839613533303866326232373431366239336266
38633665313338636238653035646262356431333334633137646137633535396537306334613333
64313163346365336131393832333064303033366634313663333262666361636131386138323764
63613634666566616635336232663431353639326161313866326135303961333337636138336234
39643966663266653464626331306662383235366537383039643563636464613563313365383737
64303264643265316530326165333465306635383235313662646564333762333234616265313638
30653064326438663230386432343961653936356130316534613837653062623663633934333132
63643364393730633936343136626661383137643033316630336163383238616464326465366564
39323931636564663536626237313066646436633632376262353964643635626163376163633133
36363933313466356363613665383061386362333037373030393066326265333133636166613532
35343530373666623036643339303438376534343535346533393134343133383037666437363166
33653962376362383031323337386364326232613366613134343030306134323235623630306631
64343165653661633135633035366262336362643435633733343866323136393562393833653733
63646432356264323764336561633135336365393866623265366166303666666663653334343132
66393538303739663736366362633264346238306566333962373265663366306465366238623333
61333830393362326662393833326165393863643734386239333165346664343337373466626361
66666165663438383363636261323136376334636435396233393034623461623134653066646461
33653363333862393932306437633333396233653535353637663634323037393537343531393663
61643664386434366232333366303637616332366131383936373236366363373166363931343838
66626561393337373532326132663936393535613533393930663065633264343666343237633439
33616363353762633538653034626137333736303661323034636163356662623336643833303537
62373637643638356339396462613332336263633532343533353062636234646130326535663931
66316165623539396232373262356161643966643935666262316166336162643565333063656265
37313338383665386266633231326162303432646663353930643638626261343832616438316338
38633366616335393633323764306531356236633663336532666634646430323066643938636565
65626337353338653739363634376236373230646439353531353065353135313239353534653661
31323261323838653631653038386663646335313265613166643131313036663566353561373535
39663731363636366630386631306561616338663630396265343734623563663339316362383531
63623063316562663631336133376232643732643038653662393632336639306465303566653935
34323865353532306630303436623335326161363866303738323733613138636633393036633535
39646135393336653538386165316139363436653766623232343537346162373866313338316337
62306236616163613731316261626535313766323837316162643262626334393661643164623262
39353632333765383230636130633765663761323437643230356637343330383230336637323638
37613534646361346161383433386465353833383765613565616365323034396164353531656437
64633066626339303366616136653461616537303962623761636431623837626636353634663433
65396466636232653362663965313738316531383264353731393431346236393466653439396137
62363937346538363365333538373639313361323662393236333633646632363032383931653936
34653533646633636139336436613335633736306165303066313266326532633535366462326331
64323263373364663866373362623738343539383433316664646462393161643931653561376432
62373266613532666366663232636565393662643834636237633964613139646431343064613233
37656535396430636361386334343365663439383363366564313462656334316330356232636237
64393561363064313461613233306466303733386230383131353864643031346633373065343537
33663731656537316239383538333961336164633439386236346539316132636432376637303438
31393563623133323461653035326231306435613564643536633033333537646431393264353337
62643962363164666633373066356337373835626635326434656435633936343865363837356236
33383063323230646331663566653538373738356363313030366231393664313338353262663262
63663264653636393235333330643131616531363531633565623531393731623238373161663065
37636533353862643134333430386232643735373934623939656362383064633162306633363139
30643163306563646433366232363039653034383034393338343263626562373766343139636432
30383036653262343365636431613665633930663165386337653031336462373336323534393039
36316636633966326661396532653032356161326431653237376135323461653539356466366365
33336532643531663732313733316364653361653536656633333331613636633338376432316137
64326561623432376434663432396532336364326530663563366261393862303036313734623535
63363030353232613064613262633563313464396233633535663832376339393736336665623131
35333533363862303133653832306638306534656330373130383561343937656339653466393162
39626331376632623065643631393034323766323231393931363432383531346530383037613532
36353935346535376163313634303430616233376564306663303165623933353862343837666464
39643264383333356633623134626132663435393565666263613261643930306262663165626139
62393961376166366431643566626539376135653663343031303937643930613435626366663062
61616637396566363732313631633334616163346135383936373465626465306630303363393764
36623463656234633164633737356532313263616536366237636630363166353333306637653335
64616230613033383765646164646533376432353338303838656232646533623730663234333462
38666132666434643839636164666530636230366531386131333566313362393136353836356262
38653437653464313232303265316431393830303862323138653661346635396133666239353766
34633166393165623531343437306166393930633130653339326436356662666434653962316633
63306133636431303964356166626464616266326162636361633137663735646434623138333936
39373139633864393436383931343361616537646131653564663536306561323933343539656532
65313733626162356334386230346132373133316636306131643438353037356465313132356363
33653234623537393436336163626532326363303263323665643831313666366461336432636631
32346365323837666436636438636563366134636363303566643735643235303139646538633263
32656531373330373530313261363535313430303337333136373339323830623535646137373137
39643934366235666633343039346562643864633639383335663765653834656636333665346131
65316366663665626632313464316463376339643738633933313131333461653530623732653966
30353437396535303261343737333938396366383136356333663461666238353862386237336264
63353034616563396231343434336137653432313734666633316330376163663139303064336238
61623965643432626233326431626530616466663164326662316464636466313666353939316437
38326265303630333631303364346464626465356438373931313131663631356330363863363066
30363936393537356238663762363635666565643036646564363164333162313263663933346163
33336163306237643834316333653535613533303863346333616630353231383261393765373466
35633061373835663831613830393234363335656639303262366633656462626535643637383465
34316665383337643030633862636266306631643935356633343762646261343734636338303730
62363833623031343130653665613536623135343036363762343532663131643365343163343462
37333863643236633635653038383762663035306361363138336462633534356133303831313163
65306131663338343366353232646134326234356130663962663635353837663863643937383339
32636138376163363936353831656463356663356633663534346336353131313662303839613063
36633538613336383037613132396563356631656338393166313463666237373761363734373037
39316238613930396633616465336463363031383630306261323839646630303662383936366432
35376534393063646337373137356565343562623438646437666361663330303835313831313837
39376263366265613964363730353939363331383361643966383663333634303434616534386138
35366335643332353964623965333237626538326163333733313239646535613930656266366463
63336134613037623938343530303764346331323362656632356362386337393736306563306663
66313837303461323066656338326339633635353435383135626333386234373239333263656532
32366362323266323139376232663066333563663666633937393362646433656561623432666232
36353961366661323264353061353736616230383337646638656439363639613536353162396237
38386238376137353937653336333639393463333838353632336235336566633562303033653362
34643539613037373834353139323638313532633663653837363166323931356330316431373639
66663836316265663063306637343530303334386433386630363436616133643961313835353336
66333236336332353433376566353135303161633539623539366637353262313330346661386635
34376564336635326362326631623533366665663862313833623863326435346639323133353835
35613162643934353064313330666163303730376666313133613035393964633736666639393535
35373262396535373166303233343431316338316534633261343063306232343262626164643561
66343332376332353235343462353165326638333465633138346239633833396364336632353338
65363330653734646565663466346131616533333833303962326664323737653937396664663431
31303833653162373231653231383438666637326439386234323432613561613363353166396563
36373436356333306563643739636562363161303366643237613166343233653033656362663065
61646365343265326232303439303739343937653637346132343561383363663034646565623638
35383037663565326137636163643463383930323936346465626562333337653531623232653531
33323836623463346535626562383834383238303432653735313437323165666134366663643232
32313531383138383531343337303333616136643937333131303735313766303334333636376663
38626366313137626466616330333236376432646334363637383438656261623530643938396561
38623538386338646335363165343632353937623333343865346232623763633130623662626531
64663566323536373364306365316532333430323661623861643263663738383031376136373231
62626365336364616534323761303462613035626535623735303538323938356265353131623730
63383130623365333835383461626235656333386131636233353734666334376630363666373737
30326635636438363166643361323864393832616538313466366630346537626231356365616433
64636463303262666237356137666332356338396632306135663431366135343461306566386633
31373564383039316135656631623934306439626637396631323235636362373562636339323161
33363632316138356563633033333833613434633838616232393230346333626661623230643861
38333166646132373630613432323234633137666435323339653438663932613461633235373633
38613637373736656263396239663035663261333066376435613264656138313462336266303731
33623863633535386164363466393230393162616133313230336330323339396631386334663430
63333161623062623437386437326438396661363863633836326333626137386435656536383331
37353434313730313361353565373730393631613433333338666139373064316165313835326635
30393361663964656565396531386465306336393034333133376637383334393161393866656564
63383731363739663263333639366538326236313932336130623965653236373730646532656136
66623131373965376138323961663561633336653963613765396533376462386566363362623238
30613362373131636363343762343364363038316264333962383632663734653663383037643464
65626334616566373335396435633863633062626363343563363333323063666261313662353864
33313237616261646435386534636435646466353239633165333538626663626163656161646338
30353961373761626261646565333830383235386331356532663536313335353835333032326635
31313836323937366261663939353035386264393839663139623661663139336163383232336165
33333137386163373635613237333432653431633362343236643963636162353632353534623361
66333534623330323439373238346565613165326336333030656536353730373162323930353234
30653732316561303934373238366366376135383036383632623836353430643462316139613562
64343462626433636433656139616534373635313236326338386438366133363934613361613437
61343061646362343363663966343834643939376233653464373237326133656234303164336461
63613763396363336334313866656431363835656164396532366231663739613333343935383232
33616233376562346637623162333764643663663637346332656337333865626535303363336638
63386562616532623135656532386538383664396632626635373832366463366564623732636538
66393532313631646663373839653337653230346165373338343166393936306633656265323430
32653861616362666632643063663536383437633533376437616135336538383932326138656565
61306534613262323230616364613463623062386565653036663861373933353562353364663433
30666535383461653033653638303935616465666339323962393933333666313136646663626138
62373661326534613731346466386162316232646634323765326533613034366663366265656435
35616139653966393135646637343063383036646436616362646132623638366435356431333634
38626265653662383135346433323131366564626562636338656432623561396139623532636361
33333234316535623262663532636436306437643434303366656262386434356139643662656636
33613439653562636434653439653265336435373231653538383336663561343733363231653936
34306161646266626565303938616463353731386236343466663463363264373763643533636530
32313936356139646539353233666131333139303835376262303061313831623138643362363966
35646434333665626638633034323763343132646230313433336535663735393736313838373463
63633232623538343632396664636435396538393635356539323662356363396631333263373731
64333833383336373733353932396337623937373061636239356261313363316163356434653461
33363436316165633436633238356662633166373065613338633638363266303838333765353536
35646265616562313530333431313737393635333230636331306564636336386638356633336132
30626432333065633864346533333632306136333339363964383033616230383430386139636630
39643337633533643830386138353034613830346165613037343166396238366238346135396636
35333930396462303736306530353939366561313837613166653331623034343538396464653337
38613134346663636438363230303332363339326139653263303230643833323261326337646264
34353365663439653538663835373435383764633733353163336536616665393763366564626137
30613439356534663237346262386435333038366633373662616266306461333536356239666439
66323236326130336232306439613334313134316162653665326331333661343763373532303637
36316134366433623839323535303331623431346633613432346631303266643430663834353234
36616663383630663164303165643930343930303630353437313837376537313862303964633232
62363036663164303037376163306464323665383339333364386265626234663936623739303464
39336137353361653634306634613465363935633764323733656162366633353532656162613733
30633661303936313738346432303135396138346133323331616661343135613664616164666137
61366666333132303364353361323536663665373861643134663963353639313866373335666437
66373630336366313437653763393033616231396564363363396431363263323565313762623264
31303434393565336237326635383438383331323266336539333063613938306162343430313434
62353863666165336434646261303862623334633636653235323730636238366633633838616335
66376432626432373337376438383962336362613963333161656331313732363565653238613130
38656661653663363537373064363864646438303139363739366332633738653462663436343966
64326634323439366535343537613238366235386439643331656332306338383836616564333536
63643331666336663061323633353733386631316639633265613836636663386331326665633030
65313034316462316532313065633965636330633830343139313064653566343639333034613264
35663464313431306431646439333066303738653366383762663363666333646163303365313739
65643638613335333165366363323535666532376465343535386530346531323137626562393137
61613830323432623762613532623435333765643965616661653534333964306565353931386539
32636565313462353337316532643937306162663437313034616634663137356235643930623862
31393263613831646561366636366165336335616134353663656138626262656561343330326234
61646134303138623931373035396530653064363233313365373437646335656638363238316438
35363138373938313939333737353239396330356334306234653230313539366135633630643535
36303063323763656330373733653138353065316235333338383061623261343934666532393939
63316466316663326163633536333462373632653665663636363137303336636531336663326432
62646261303364646230376335376563376230613137386234633937366665626236396161336165
39363065613636353733373530636430333439333130346138323565303264376663633263373335
33646533376665353865336333353531393734343564663933636435323733616237313534353163
36386233353939666238653131306465646263626264343265303830626130366234306636383361
66653762326432633237623066363638343630666234656466356131306334623132653339656165
65633136316530386665333235343264303235643761643837616235613530666461363166626363
32383937366534346138653337653764323566373962663062393262356266303738313139393462
37353439643966336463396363316562336662336338633261636365323232666534383763333333
33313966343230636464636538663666356637663036323038663062356161346461393866646163
39396235323631636236343466343063353033363538663430366432346535623539333631306239
31643738613164396266616362396536333330363432333865633239336632343930346535616562
34373763666530393261376538383664313630396435373065376362616135633931383766326566
64353862613434316532383037626266366437646137643435323136376362653031343139613234
61303636333464373631323534323265646236393665623239616330376638396437393863646266
30383632643336643236653332653639653065363337303665623034646566333166353930663537
34303563326636383466653438303238393731333839303832316431353864333163333937633832
66306533623961386531636337333035663336396162373439396335643930383531363031366237
33353139663035326533643432613966333231666437333635636539356430353233633331393134
36633737633631323737383033666233333061306332616331653536636233663031353538396335
61336532623539623838663539326366306531643063323763393762633764383435346161386636
32383837353939633831663661613437383533353564663865373539363064376436356437613631
39653235313232383839316633313736373165363939613930323835643264623331343663336333
32663366373166343339666636666331623064363039613933373834636437303336363565623231
643264663362373833376333363461396566
38303939653832653463626363373732363731643437653435356231363165633765366534643733
3632366430343539376437396332656233393534376433310a646465623437663965623532663363
64653166396565656332303561643533663638613662323130636337386665306563646161656333
6538376238333032630a333333346639643034386565376538326234333238656630623331363865
34346630666534393339373638313465626231376633353239383631383334393166346365626534
31643435313062363533333765376261656561343162653665376661383461386130303638396630
30393134303935666165333333323238353539626337643631666166636136626362633736386234
65623534383932363966653939313939666164653737636637346263363964383834303862616261
65613539386434633633373365623162326437623635346438643661316539363662323335343330
62643533626631393433333731326435373031633361633539333166666231633737393963633237
65343363646133333964366463383763613731356166366465363635366538343139323631316565
38306632613332333839663436313539313963306166376639316433623437613736643239323436
64656533366136353533653039636637626437386161346532363835353534633366366566643666
61383836646130383361393739663631656538663438623733376634623938396165633433623130
34656438363736393433373830663538663261313963623366363161643936303137323239363430
61666631653965373831306261633139393063366666393262626134323762396633376434393037
63666163326630393038616564393537643031663332666237346334616366303338303062646262
33303636326265323332633538623535386432383161613530396262366430646438313130383230
36643565303663646663303161383536633531333365333664633438646631313361316136326433
63306566316164653666393437366164623739643634303462356465616530303931663563303838
32356433653130303036663636666231343737663830303435316631383737623265653438396538
37613537353430386531343066356665336230663465306164316631623538383066643263343232
61656534323666613638636261643130376465316430383830346164623565616366343436636566
30373263346262616233393131653262343630613737346132326261656136393934366632633136
36653438363833653232636362396461376630376531326633306339396534663663616539656665
37396336366465623961303432383933306564366139646265653438323966616630333839616239
35376366383962636566353530366133373833386533356464386532303135663664366333323631
64303632636166376432336161363362623834366262633531376463363065623436313761326365
64383836353562383233363863356238343234626363343964633136343530323939333335623932
33646563343265373538623265393033653638363561396436303336343465663039316633323436
39383236616231343463326261373764616231653837653631386136643530313538633639353166
32306534376438306564393438336363313461396466376235356431376637323266363263636333
39643733383766383536386535343832373131396533323663643063333861353832663237643731
38366162363865333765333731303064343965646138666366303162653462303962633239326235
33363234333965353863343965373061346562393566323565393531336637363931656362343739
65373165623535313766643864666162376535393437343335393661633430643039383461636131
39373533336134396561623761383338373734623537336565363836303435646237326633336363
35343631666235383566323564626137616636373830646262633661393432666430386638646233
63323864613765363539666235653864363335333530616364356138353361663031663237616161
61666132313635313364353433646232326165353034376333383738633433383635316232323837
36633566653330623161636139383566313235623061386339373966346437323265386163626431
36653534336265626439636261376230643463353765386632666361613636383237383731656461
63353138353836376336376265356565363634633337393133346633666664386430386437333564
61386334393766313464643666653864306564356633623037656330383331633165323539393737
34353331373764633666643032336136386632393735643133386465396530346239326333643364
65323035363066393431663537643231613038336361386566303034343363346164396563336531
33636137313839303963613564356338363833386430346132656333323366303464353163353632
34373165353762383030303439663936646263656439616266396265663835626538326537353833
38633761623331643263356538353263663863393233303139346132383964363735353334626532
35356138386661643232353237306462326465306430303362363864376630343937623938383464
32616537653136646330333033653461313565656535306236663530363934663730663331363964
32313833653239363162326237316430363535306138323865663733396361646563626230326332
65313366313362376363343939326135623365366564323364383364663639663863663337363236
37363131613837333539393938626637633139373332303062303636343830656532396562386161
30323233363334643164313835373761363566306461313633336365313033343731616632373263
31616433643566393139353666373964323838666133613030396661353238323737616235663135
61666532623636336237653532616135366465623534366134613961343636303334313633366436
62653936336666373839656631353330396139383137343834366339653534663832333533303062
65616561376564323337353362383663353439623539383839393132653964653634353031333030
35666561313534663134616539343165333665303632643132396632353261643566303839373465
30353833306563656639316365356563323638326634316362653137393435336364333738353031
66656632343134616439336337336161353834626462383761656561663062386561316636326135
63643436336463396364633763653735303766396539373861656162623434323539613031663839
66653330386135646539353338663066653037366464306233386136323838616237306162303530
63643638643963363131653035396565333862353632643733383136366635313839623766303531
63336338666162646130646134613162636365663061623635336464313435333962316162383363
37393434313062663037656437383036363066373561373335386239663837326431333264373439
34636236383361343138343037316462323339346662346333643761663336666235383461376334
30666136643164633564666564613231633361303339663833343264633031333465306237303334
64356165663263616566663437303935353264393538613766336563623730636562656635646266
66383339343738656431346333383537653338386466343736666138633930366235396138383461
36623763333761643833383262613436353563393134653765656139633665376230333034336137
30623131353265333665346631653535613538663537613238373237646564333438356466383161
61326362306335363461343566626661623533656133306437343766303437316534363133646333
32613032323434363166356133316162303166383766623665623062316135626332303935303335
37306332326464323431393631663839633366653837663338366432333334303439646532326165
62386162303533343664373665303265326432663331613262323738303337623037363962613537
66616161303435323436356262663463633963303933386336623161616665626436383264373864
37313561616361353166633039306265653237376363633930663235663732653834366131373038
35623565356363616532323133346338383138316639303063306134386663613361343038613736
66363765346139353363306566613132363461353332353230343364313538633936306632383038
33343266393136633263376366336635633864393331646333356234353162373733326633373630
66323261633933333834653363333932336164633637363939323462333233653535333335323736
32643332333539356562366666663734353234323534616434616562323666323462306336396164
38396536326232346361616131333364646239643231353135376334613335386462346138646136
36346163333566383937353261643264656433393766653461623734316566333539303961306432
39326638616234303166306534633738396565353138323635333335356432343861616332623538
33336533343730313066633930366130396566343031303935643962643133386133623365613663
64393564653230643165373732616563366631363239336637383139626232316461373037366164
36303263616338663564623861663433653761663836613835656162303865323631363138386130
37393731613837363835383639336535336633393733613964613637633161363431613232663436
35393739316165343335363065633863663737373134616430333966333037613361353533343064
35383037373334333963336335323737653436356465646161313237313431623461663335346566
33303761383736623538366438306134633538336634336330643861343136303635643763303063
65376430343136393436383030653862393832633066663834343562373830313936326265613964
62326163383233303938666263346464343630373533623466336130333238656631613761666365
36373930336162323563633932633832393335323064353339373962616165643763666230653735
65653966336263633565323666656237336261333463653866636363633539623630626336353763
35316538363432396533333561636462373764363438386238623735623166613931386166646630
36353632383763383664616436653363633639656262313833323237386561386236616362626532
62383430346436656639376433333937306438353461343834656261336163366563643062626463
33353662393836396233326330353830356435626234646538643235643661313736353836363235
32616133396530346339383163616331336331666366613030616263306531303361383261376262
31396432356536623366336562373833343733313432613763343462336131313837666435323639
30303033656466313832656231383132323134666136386538363034663264343039353763373261
63646236366365393964613965613664643539623136343161346338383236376262616465353465
62346135366237303030313533373864613538313337613162636162623462383631356636313336
63303831353662643239633434356537396531333930373633623836316436633236623431353066
62383366316261396632643062373233346532616261616330303437653336366433323534323030
30343937323363303063386436363432343065366330383762666233366234383162303364303631
35346163303061323633306466636562303934663835366630383266346361626235663931663837
64643034646539626231616133383035363937643432633261386361623263313362636664323632
35336131663863626630373066316335343561303635663934613632373234363264663864383831
35366165386466393130316664656437326432613866613238366232643833316361313038356631
63383737363062323632366561373030613338343837656330633366613435353336653161373833
66663237333733343033386563663661663862363339393430376534643661653462653432663533
39343330646635353034313338323733396362663339633664376339663839663730306565633166
66643237316231323334633864353139396664376538343566306535616364396263316131666232
30656663623535373439363830383561323831353664383133366362613938306437353630353035
62646639346334376434346461303462303635396362336138633839393030396235313132626163
37303532636433333466633734306363646566343236353731616463383863346434393134326461
65373430343064363462666234653464313638616466363035633663306131366361623630373039
35636662613366366263623361313465306236376262316263343666343136303533323562653165
34323063356133623961303738623337396431306264663761646235343338646332376530663433
36363864633964303235386530326161323639393861613062343764626361623730616435393034
64366264646561326461383132626330316166623339663435303339383064656365613133656637
31383133306436363863323537373932393937646539643835323466323937333766356339656164
35326661373637353535623135353530313536323733623736333033326564356538393935616437
38316366663932323364333238316333373366366238633832393933313436346461306265356430
61393834643763616634303232626164386461323966666631366534336465663435316137616330
31373232633565636261323530323165636161366534306437366236666430393765353866623539
31626532356564663230353338383565646635336265653262626231613832396263616666613462
32653034643737363931646634346339633366653730303066623039643035303337373538303761
33326533313863323931616638646231323964626434613133643531613631306364616266366563
31646237396235623162643130313563343734313363663037393734313663326335373038376139
62323136366231623238306362396638396334663237633436386239663031373734386437333562
30646266616331653131653236336634343563636233613731613665316565376565363865666336
62343234373163643238333830383065613033343934393338373966336530373135346235363262
63633265633939666665396630336461626533343935643665323332323131633833626466356131
34313531303939666666356430326236353534623634616661343363303562666138326266643331
63653163353337393330303762323537373865643765363930323661316136346536313964653338
62343063303636363463373362346234353731323235373163336337643038376439343834643462
39313137323637643766343266303761343636373932383633656437356530663233613564643037
64393863393431663064393062323536663332643134316539333264633033393036643962643261
31316164333735353830383061646633333838613761393665346562633362663034613635336564
33303033616633386466653837386338383163383038636532323437666431656263373966623939
63623664353430383963386430613734646164643935623534323865303036306665373433313139
30663363656331663834666530386165326366353837666434666264356566666236363534623632
64383232333232653833636366653133376432626531633861333938333765626432613933626130
65336664653461666664623330356539356534636365306464373030313636333465623132346130
32343834663332323934346137643832363531303238366130326365313038363339303738666136
30343435333661343032613164666138343434643433643034643637303131663765386362343534
39346236333734323338326134656562303361616639666361633936383735313635313238303033
36643638353638356132636138626239633666373365653830656562323263633564393437323539
32656664336636613734666638653633353439623630643531393436343039376161396335336635
62646432356463623266323061366663656163626535343735623064386437386338656363343235
30613431313035313236333666373861323166636338646361363466323834313633656231616165
31643439356565313531613734623439383937383835383866326164373633626662663536383234
32323030346335623166653063366533663866383736333561656463333566616631333165653038
35386531346561656663366535663565323234386361306633336136663033376264333539646136
34323233356330343065383335366362353165633736323862396165626337313333666164396262
33343034656261336630646464303266656137356434383738383738336235386236353664356337
61356264663231653637356265343930626430386166303333303437386333623464386363653939
33376431663539386331633830623363303636313537636465366130353338386430626433323332
35393533303436343138303934366632626365373635636661386639643431333463303466656633
38326436376134613931643563396261353638363637363364666631643632343633373731663837
32663233343463666234663931623962643932613033343561393366303563653637646137376162
38653330376131306332626532626539653433623430383262636531653864333665373962323532
36386636336264666664353033323061363165373565396231353637323837346532633666636266
34376566386230613633313231613331346665373165323638633966623361376334633139393534
36633935383362313932666464393137366537636632313431663935316166323833366530643437
64616262666162326361306462306430653536346333666363616530393134323237343963336431
37373532363862653666646135383762376133393433303762373362313466353732333935373866
36386561343234663663633931616632373933383866346534636633346138303236613438386665
38633364353236643439326664663939336639336562613538363363303936346566346163633436
38626265643833643432663166393132323330393466633736663236663830636132626237613166
37323431306636343565356261333636353739313763663266383633613363633935313033646333
64613434633262383162393662626461616336356563326139356136313931636132306662373861
36383761396666363239353635666666646233626635613830323332363136356135363163306463
61393965383632613734356230366631306462323163343065643331343738383762633065663237
39636534623231366635623239316537306461306330373565633731376263316165653361643031
61343334366634373238303263393665623836366139313661636466663034383934376464356163
34646234643432376138663131363533373138313763616264353834303430636339396163613065
65376661323936656234303935613633306363623662666236653961323564373333653536323937
34353962636638393664313539666565663738613966383133646161336338313935343730653561
39643438333234646534316565653864376363386439363838363738386533636638663138643866
66356266346562323535313934356262353330616662636232656230346263316566623937326233
39663362373162376565303538623734316463646361326634373038313236663838656664633662
66636537333837616331346665623338306131386161666435343362316130353034616164643064
64663638353361616438643431633263643133383164646166623833383838626335393837373437
62313431646434656466386564323037333662386636636361396635633662383265646332316236
61643239306430306331323137333663626633323961366561313730626462663630643734623736
36613339356539396265643061323030323530323439313034393134303132333265363934643436
63363437323334646537353335303532353666363362356163346334633638633936313936393336
32643438323132623261336362396135616364613461376338336261373535383134666339653464
36343637326431343639336237363239376661653439613462343839326331376236613766333237
63623565626464376533636263623730343065393166636630343035653466313539316230346532
39653164383839653034383362336662323833656632396262623766333234313835386535393661
36653935323066643130373636633630336335396430316261616132663066373432643363386563
39646337316463346539366566373763333133366435613433613764386430666439656136613265
66663735393166313438633665393465316336336437326337336330353838373965343535333430
30323833393962646535616461613331363965343734313636376531393934396139326438343531
31366437643464343464356337633137303563656130313361653465383532643263383830353139
34303965326562656132623862613935666137376161623735653662373261633035653037666362
65313934333963623431386636613630363564613231353933366436366134376337666336323739
63653565623538663366376262373731303433396638333732643834313430653632313737316435
65363462653561343130643837383266393438623866643136623666373764323363646533333966
30373665356237656639323132373731313365636161393934346665656561356562363036326161
36663566303530356537636238383439376435316561613466666538356436343663663336623765
32306536356334623061383965633338633466633931356330323965373065646135623366613636
39653065343433323231663261626262313634656631376161646562636334653736363863306462
64643936393661323237336533653566316264336537386630366562353862633462623533623839
32633436323031366230616664373136313639636266333538323062323231623634643931376234
36363666666137656230633430333635616362356330653162363163323961653062383334363330
61636432646566346239386638306663346233613866336434376336666164373662303964363766
64636136346365396236656238323630346534363966363930613264316161383933313766313032
32343663626139303133626462366438396463643433656437386264323330363464373866323466
64396333326562363063353236373831616661373861633437303932373333343535376639636163
30316661303266376536303364346461306563663232643633316334393832316664363231633764
66653962663064646236353566613935396532373364353938336266613233633065646463663639
34393334323862336531323832313637623565393633316431613639396561353737343134613434
31363465663364366262373236616639363665653165373561346430303432316565333237326138
34626130373436336161636632666331653762656463323764646536613132303062643965616235
31383839383632643463363365663133373637613938393535346335393630666566396137303365
39623762383165616530333035393736663666333739356232373137333137653763386637363239
35323536373566326432333834666135663463343330316433376435633766663139656137626539
39396437333833326665633037653732366335376439626565326339313037316432376438353539
64666634646333343934343966383461386530653934396264633262383165666663643539343435
39373665393834663137346133346439303766646130626437376136383964363138313663656239
65636334356334613933373335356130373833323634363330333337623566363038353366356133
62636362613737343635346236633530633033313431376439656565343662636535383762376162
35303637336433646531363137623731383663623035653164653232363533316437376436303238
39363630323466353633343166393038623239626632333135623230393062343431353231383961
35383761613566613934636633343361613133626536316637323631386431346232663031396236
64306261666536303664343662396464343031383036326139633863633237656466373764656533
64383037343063643563306133656137663162616637653131373836303636323930323232653834
61623732336561343331633364396637343138363266336134316135663762393263333637363630
33633964666262396361343832303033373662386231333531333064373430666435303762363764
65383332313330386231663966396532396232623935353162396431613034643538393939373835
63363561363863393737353730336564323633663735346138613562616236353631393739636637
66633234303965303734323665303333633663353936363933323731656464626337343337623433
62343666356562613964653662363434383563343636386137353365393537333735623934623237
38393664636634633764333936613566346465663538613532393265376662663663656632323565
36366539363266663338306237306563663133656162656566643466643138666462643237383661
36326436373438373730626363396563376538313731323532373330366136656535353463396336
3634336533353830663239353138313336623131353063313538