From 8c23f79b1293e577ffcc79e533c6cd562d3d2475 Mon Sep 17 00:00:00 2001 From: Ivan Reshetnikov Date: Sun, 20 Oct 2024 15:03:25 +0500 Subject: [PATCH] Configure LDAP for mastodon --- authentik.yml | 3 +- mastodon.yml | 3 +- roles/authentik/tasks/main.yml | 30 +- roles/mastodon/tasks/mastodon.yml | 2 + roles/mastodon/templates/mastodon.env.j2 | 16 +- vaulted_vars.yml | 350 ++++++++++++----------- 6 files changed, 220 insertions(+), 184 deletions(-) diff --git a/authentik.yml b/authentik.yml index e597e8a..b0d7f45 100644 --- a/authentik.yml +++ b/authentik.yml @@ -4,4 +4,5 @@ - name: authentik postgresql_password: "{{ postgresql_users.authentik }}" secret_key: "{{ authentik.secret_key }}" - smtp_pasword: "{{ mail_users['auth@comfycamp.space'] }}" + smtp_password: "{{ mail_users['auth@comfycamp.space'] }}" + ldap_outpost_token: "{{ authentik.ldap_outpost_token }}" diff --git a/mastodon.yml b/mastodon.yml index f78b350..6ddc5cd 100644 --- a/mastodon.yml +++ b/mastodon.yml @@ -12,5 +12,4 @@ active_record_encryption_deterministic_key: "{{ mastodon.active_record_encryption_deterministic_key }}" active_record_encryption_key_derivation_salt: "{{ mastodon.active_record_encryption_key_derivation_salt }}" active_record_encryption_primary_key: "{{ mastodon.active_record_encryption_primary_key }}" - oidc_client_id: "oD2Vg5shQju164gYmju8" - oidc_client_secret: "{{ mastodon.oidc_client_secret }}" + ldap_password: "{{ ldap_password }}" diff --git a/roles/authentik/tasks/main.yml b/roles/authentik/tasks/main.yml index 73c29b5..318ac10 100644 --- a/roles/authentik/tasks/main.yml +++ b/roles/authentik/tasks/main.yml @@ -8,7 +8,7 @@ become: true community.docker.docker_volume: name: "{{ item }}" - loop: ["authentik-redis", "authentik-media", "authentik-templates"] + loop: ["authentik-redis", "authentik-media", "authentik-templates", "authentik-certs"] - name: Run redis container become: true community.docker.docker_container: @@ -43,6 +43,13 @@ - name: authentik-redis - name: postgresql - name: haproxy + user: root + volumes: + - authentik-media:/media + - authentik-templates:/templates + - authentik-certs:/certs + - /etc/letsencrypt/live/comfycamp.space/fullchain.pem:/certs/comfycamp.space/fullchain.pem:ro + - /etc/letsencrypt/live/comfycamp.space/privkey.pem:/certs/comfycamp.space/privkey.pem:ro env_file: /etc/authentik/.env - name: Run authentik worker container become: true @@ -54,4 +61,25 @@ - name: authentik - name: authentik-redis - name: postgresql + volumes: + - authentik-media:/media + - authentik-templates:/templates + - authentik-certs:/certs env_file: /etc/authentik/.env +- name: Run authentik LDAP outpost + become: true + community.docker.docker_container: + name: authentik-ldap + image: ghcr.io/goauthentik/ldap:{{ tag }} + networks: + - name: authentik + - name: haproxy + ports: + - 389:3389 + volumes: + - authentik-certs:/certs + - /etc/letsencrypt/live/comfycamp.space/fullchain.pem:/certs/comfycamp.space/fullchain.pem:ro + - /etc/letsencrypt/live/comfycamp.space/privkey.pem:/certs/comfycamp.space/privkey.pem:ro + env: + AUTHENTIK_HOST: http://authentik:9000 + AUTHENTIK_TOKEN: "{{ ldap_outpost_token }}" diff --git a/roles/mastodon/tasks/mastodon.yml b/roles/mastodon/tasks/mastodon.yml index 415c8de..3efc828 100644 --- a/roles/mastodon/tasks/mastodon.yml +++ b/roles/mastodon/tasks/mastodon.yml @@ -31,6 +31,7 @@ - name: postgresql - name: minio - name: haproxy + - name: authentik ports: - 127.0.0.1:3000:3000 volumes: @@ -61,6 +62,7 @@ - name: redis-mastodon - name: postgresql - name: minio + - name: authentik volumes: - mastodon-public-system:/mastodon/public/system restart_policy: unless-stopped diff --git a/roles/mastodon/templates/mastodon.env.j2 b/roles/mastodon/templates/mastodon.env.j2 index 8f19c0a..b2db4e5 100644 --- a/roles/mastodon/templates/mastodon.env.j2 +++ b/roles/mastodon/templates/mastodon.env.j2 @@ -39,12 +39,10 @@ ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY={{ active_record_encryption_determini ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT={{ active_record_encryption_key_derivation_salt }} ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY={{ active_record_encryption_primary_key }} -OIDC_ENABLED=true -OIDC_DISPLAY_NAME=comfycamp.space -OIDC_ISSUER=https://comfycamp.space -OIDC_DISCOVERY=true -OIDC_SCOPE=openid,profile,email -OIDC_UID_FIELD=preferred_username -OIDC_REDIRECT_URI=https://m.comfycamp.space/auth/auth/openid_connect/callback -OIDC_CLIENT_ID={{ oidc_client_id }} -OIDC_CLIENT_SECRET={{ oidc_client_secret }} +LDAP_ENABLED=true +LDAP_HOST=comfycamp.space +LDAP_PORT=389 +LDAP_METHOD=start_tls +LDAP_BASE=DC=ldap,DC=goauthentik,DC=io +LDAP_BIND_DN=cn=ldapservice,ou=users,dc=ldap,dc=goauthentik,dc=io +LDAP_PASSWORD={{ ldap_password }} diff --git a/vaulted_vars.yml b/vaulted_vars.yml index fc58abb..71868a6 100644 --- a/vaulted_vars.yml +++ b/vaulted_vars.yml @@ -1,172 +1,180 @@ $ANSIBLE_VAULT;1.1;AES256 -62303238323030396332633131343161616138373937646534376462633863353632343063303063 -3665323164346365336532646364636363353636356535630a616137356630386337373564333537 -65373834653363373432303535333563636535656431316132326632356136633931386332323363 -6433613965383565370a316661343864623731346135656563643266663131623632363536623866 -66323361343136343566346532376132326438653133303337383332303533666637663632333633 -66643439343231633635336164613637353461636430386461306665636434383837336433316135 -32623634343264333339613537363739613932386564306430373162646535663665316566396663 -65306365653537306164663631306433363038653566313462656434656537323133613464653662 -66313535646436643763616534623761393634376465613332326533343532326466616437323338 -65653166346563613637343134386331323038346136373764636135343162666530373831666530 -33666633363464653139663636343662306432376538316162643663626430396435363464626138 -34623863663737366131666632313136353635653431613738313032376631373064353966346134 -32613633373762323232646437326663306265333333616238643039613131633066336439376330 -62393062653830316436346563656265653465386266323131623039323633393534306232613337 -37316336383639313939636264633363666265393438353439396530323239663734336330343031 -30633537323937383533313562316233336532373932336163656263636239653066663765373539 -64663166396430336533316330313733343838653739306334333132653731626236333437376136 -36363430343362656632616139663164356434633534366663373438323931363532646636663933 -39333166653334336437613139363535356261373936636433356366653663356631306138346336 -65643236353064306364643639363134656635303162313235653730396166323763306238353836 -34653439623937616431626465623139636364333062393636376132333661353330363465626137 -35373836333134356336643233303563366437326562386265336564643761656465333934356335 -61316539333931396233643466396138653164636335326563383866616366373161623061663834 -31383436636262383663333639313634633239363466326135373437633761363830656161303232 -37376634633361303235643330333939326439376564376630616232336636623564316161396530 -64626331613562386338366663363961366439633634653665646131306330333137626330333166 -35626461306463386332656639663938323166643866383534316333313332323032646665306237 -65626431653366353533393835303230306430363366636161303735343262383865633164343030 -65356336633335373063303337323538313533626531396532323161363161666438623835303361 -34626132643465346530653263306565343166373666313862623931366339373961373836636661 -65653861396466316466323764383539643662376236316636323736313866363132363263646463 -34623064326130313464666562643838646233383836366238653137326634643761363766356533 -39626637343331323634333038626238303162666436303462316232623266643639626634356131 -63323136333763393739386236663761383836653631373264393965343662666363356231313933 -33323864626330656535303335396533623031353536336537653230373134316139353064353631 -61646530636139323065383238666661333763356438316335666364306562393039363233383464 -65343939306630376361666232356634323837656133656334386636663436313137623561386538 -63303237643937376631383532393761383265353935613063393763313934613430393135386331 -64323866356261663137376466386537343965323264343633623730646237663464633963366132 -38336639643939393434383033396363303063363632343131373330306461346361636162343139 -61626164636564613564636637373638313664653038333664346131313539303634326233333264 -37303933343030636230616332643962653061623161636530626261376234653730396432616432 -65643631353831643936353136333462643039303432613735393236363765393265346233666231 -36653433393761393333336631376139393939386639306337376562303231626239313031326330 -33613262616461383631326135343166353563373439336232613339343331306662663736333433 -37306132633466356531623561313030346566383064356236636538353732323436396361643439 -34393162636263363338333165363735396535613465303531393466316438623665626265396534 -62393633393239386665313162626637386162316463343235346331643166383966633634316332 -36643065656638383961323062343665616333386365393936633864353138646630343966366533 -33356438643063316431663962626431343635653065636664336238643030356464343839666330 -36343130626365346465323234383538656564616531363763636132636236363166363432326234 -62643161316334393961653335623733303163663730646331326464333265353364363331396634 -31326239366130343238613332313266623933373965326432386538653138306263653333373433 -37303962646263643833636233626634336234386136356266386237376337646435656262323032 -62366661363537313433633965363363616330663030303036666561316239306131323838386337 -38313734396562373836623435326463613838396439376633363362663034353738626466396133 -34323037336263623138363738313932666435646335353834373532323631343363396338623366 -66326166336561396531306534366463633464663135346236663431356533363030396262383463 -31396463656564313635616662626636633566313761633536373935326230363434623837666562 -61393232636362383232633831373934343032663433363834383339336139396264343935353139 -36653537393264303063356165356532646432636562303761646236323965353033383535323137 -32643664613131383239613331323635633363333439633565663731633464373965653134306536 -32643737343631396136653763373733633331353362653239346537663435623566316136633466 -38393164346562353462353635306137633164366339306235396462633537316537663937356338 -63636664376162303931353462303432353633383765623638636131316630303131316161346166 -38393834613539316364666466646564653632326462626132643735366565643436663063373764 -32366237303562336435333561313332313739646564376233336366626437326262653962626533 -64393733346437303534613037663233373230643336373962633463613930653763633732333833 -64323438323165643464343536396233623562303461636561666663623635316363643161613164 -66313865333736636230333136393638666231386164356132313932393338396564336338353763 -32323936323362326664613164366635323033313862386663353465643363613964613832336134 -65636336393839343364393130356164663730363932646638363564353139303834303630623534 -35366665303730613033393833623163626635666362353635356535396161313333633063343232 -33363861303530366136656230613063306563326631663665303261396335373430633162363666 -63353636303331313235306636333431366536353135343336386537653436346536326135376336 -66323230393863323833343832366461653038313766393161316632393065636465643835333535 -37303764363031626263376566386633356335626539353863313861336130376138303164653839 -36356333306635343535333437646562316262383531626339623534653733303466653435653332 -63393664306266333465613032303230373562633839623832633539326337313662356337316464 -33363437306630393666376532653261333434666163393139623963353661316264646536613938 -39396466373562643865343236323964656163326433393136636565623132316466303335336563 -34656266366335316131613965636139666363656239636336306137633535386239663639613235 -33623835343835663262656639613136303732333631343165393763643739313739396364323337 -61643138626133363831363165313234313231396265326335643564343237306239333663376565 -32353834373735616232343662623232376433623833356232323239636631623864336435316264 -33663363623035383865643666396130383861386137303738623935376163316438356162306135 -62653763613536623337373236636564643762613362303466343139353764396431393430363832 -39323330353862303063356331646536383533306330343062653939336364643039626331666666 -36653130366137383533313665383065626236383363393164646339356330653032633265373761 -62613766303166656362376231383561626565623430356665396234643934363565303638326433 -62643433333037643034386461343464633430386432366133623332313139373037313635633831 -37653431393963306263653166663266646462633463393635303339376664323836343030353931 -66663030396634336363343233396366343836633238623536653331653363306361393934376164 -31306335643030373639356635626232306331353630343530626531623235323961303339373865 -30356531303938323431313937353134393162333761626535356365643232383032323433633465 -30343534313763353834666333313235336564646237666133373330636533323532353735363863 -33373838393035396162633066376462333632636232336531633936666366373861636232373364 -30333666343836333436383363356261633335613831336662326364343961333462353035303537 -36323862363762303336396634363564353762646432383833343965643965366533306661376133 -39363132333265306232363930326265653537373261613265386435333862386462666234316332 -39393136383336626534393738326438393761633339623833336530333462363362353237323332 -61623638646630646261396364633833643434633430313962326638643165373637613935383865 -37326535633238313234386362333937353837636563326133666163346431383736616363623539 -33313939626133393464656330666166376533303064623636633163336563306437383336373030 -32316633303162343737323034383264643638306264623166373139323363326130646336623434 -62653433626131323837613736373036303635343761663738653637373335636562616530313166 -32643931343537383331363233336236373963376435643933613637626638363665623061653665 -37363432343266663531323534656333376566633139666164363031643664316531663765633564 -63366631636236313363386138626232383061636139653637333263353762353632633439343166 -31323562623332643135363662643434653238323538383432373861663733396334633036613738 -61303934386362633566613239343463643265333864373133333164373739343538383931386330 -32306630393338643830633461653463613337313661613064313332343864666231353366633030 -38346563326564633462663036666331633038663639386162313835643431386166383466626332 -32326161623535666137386537303562303634356433343465626233366639393762303562303163 -37663366343630313434623665646438393539643136306333333630623133393736353763396630 -31306430373266336337633364656634356539336335663165643631383030616262646664396364 -37633236313935383166346365636466373739616661306536306631333735313462366634393137 -35623736646264363664306139653366353466343766653264363836643633323331633334386532 -35313166396163663532313032323366336238636262396361613130306239616432333338636430 -33376438323863343031373633336234643839393235386330363939303038376639616330303931 -65383339353837353531366563306337653233386162363137643965316330333566653861376132 -63353236396438323839386331393731306237383532666133616132353430363836376631653335 -32353262623439636466373038663564313234366163646365333836336336343238353239393433 -34303062326461376430313761386236326631383339313332653430656133396230623838383963 -64666261656365626537623436616662376464376161363733376461303039363135323835396165 -62333538643630353739623233346530626338643931656566326137643533303266656462626462 -61663963303236353562396532303734633863643030613830613666623438373764363937636566 -65323137353965316233643038626632396432653431326533643961303834653231376362343438 -62633232353962333533663366623335656134373364343365393161313263616336333330333538 -36653230336236366139356233663434396335626565336566313436666539376433353562353438 -64346464336430616338326530616365373364643733323238303339343633663936636566363339 -37303635643662643333313030643735613635386537636331313637303439396665386463643537 -32643163356139313465326666313364633366313862323338383737393566626637303965636466 -33656631613832343235383334373635303131643666313565316330366132396333326535663232 -32323462353362303166356535323137323034373832613839306164336634376661656662616436 -39616264376339376566343332303965386534656463343831356166643931616662363437653639 -63363833356534363637333130633166343764663065633763326465333336316331386436653735 -39613366666439336664363161313163646362373762643366386334666565653163613861306433 -37336263386439343237373035623364313533636534656234623836326336306138363666343434 -35616362303438383639393139386362396233393765303966653266646431633564656331353336 -63343864326465643134323963336132363034643538653732653736313761306663383832343564 -66333334386432373936366530363331316633313936633766376561333635623433356234323530 -62336330343665373836653137306436646236646237373331333737373433663566643964613231 -31373637386462333038386362303964656638363365616335643032653861376366333533613366 -39633765663433323933376164626533396663653037653364396665636166326237343235643962 -39393536323432633962383162396533616433663336353536376339393563333933613836366663 -37366533376462346139626665323366363331396632323933363566613862383437396461316664 -33623930323331366530323263326535396230306332313638356235623934643634376666633761 -64343930326238623730613331356663346338323162623331313361393066396662663034643634 -64313936306438313362623937393365386533363435306263313965346338326564656432323233 -35343131373263353364313238663033333433636462326266323230383964616539373132303434 -30393565333462393834656634346233343461323261306232326531633133623531313964663063 -66656465646131343835383832363836373961346162386162616161333939343763333234656161 -65353663303161663735613432663734326634633463636638633830316238636263333735633963 -36343861306366373663336635366139303333643835376139623666623062396462613835313138 -37653964626434656235373936613234313561636361636531376364393331346432336439343137 -63353139613065303266633336313535376630653066653361336362346335363362333336383864 -64323836326231313862306630633832346234656436653135343166323038323738333964346135 -38653263623563313164336665613965376539343166363263636233653331653638363932303532 -34343165353937663539666333653331636233623565373662376362393337653130373735326132 -34386134656165343836393630626235376537616137666439333634656638623331333432633436 -35613937613637313534356237386336366538653162613733626666366530646238363330656566 -39303035316338333531313631653836353831353831373766666564316138323536313138343765 -32373538663432363231333833663633326239313337643831623937393661313431326539666461 -66333238663834376331666631316163343833383834363366613938343837653136643935306335 -62636361376632326164643061636631323364393731383833613661336335373763383161333535 -62343861333634663930626635343562313762633036376132323933353232633564323038373565 -66633735643933393965393030333939653338306637646532303538373534363961343761643866 -39336566383238336563646636313339313237326637306134303636616130633238353665643166 -61666637396562333134386462623134333463303661303637393537666330646630346531313938 -623563313335646235323464363837633438 +62633431383231353637396566626664316637613263373139303464396439653964316464353533 +3961343265373032386266343964323365613033396334300a636431623961373265373939643136 +64386132303065393139326237303235306239633739353035653365383333363130396563346130 +3838396139363437380a373532313131373739356661376336343364623433333733316463626666 +66353939643336316137313033663832396538393638663332613939306334323639326265303834 +65646537336132323063666538663562633432613731656531316366343539306333373436373030 +64343233393336333566363131326234393962383665346538656663343935396433663931663139 +38663661633631616531333333303736666435393238366630306631646639623661613338326136 +64383761373339363564353961366533383237613835643339613034626362363662313235336232 +65656337656136326462633030376665313963356538653066376538333937313533646266383061 +37633931643666656133646433383764333963316234333162663736313066346331323638393039 +62356165383437326635363030386364366163313536386136393030646530656434316332386539 +66626234323166646439336636373539326334623336363934356633653565353734313339386133 +65656130376131623662363939643237363835656337656231643438386565346636376531343661 +37316135396464383439373531636437383730303562373665326337396463363433663062346266 +32386231633465386664663566613931353161323032343839303762613333353532646639313735 +39346539306663663330303430313638626366383664323461623234326332376434653463313335 +62663263626439633436386232356631353562626166643563616630376636373338316137626266 +33343365643062373734373464313835356337663731333833323438313733346536326538363665 +39653336323937393838393532373461326631626134626262343039656135386532303236613738 +31376430626666313563633731633833633933636133653664633962313865306637636364376563 +63323830653262396339383364666434663437336638326631356431336430393339343835343635 +39306464316666376537623064386362306666626562336432306462356165356133383862316632 +36393534623733346338386439363431383266656362656264376266393939313039313465303365 +37636134366535663563383331653162336633646139333761336565343761316231306161386534 +38363731373538373165313866393666343639336230373637363735636339663037316266663133 +35663964343030353635323733383234313432396130616166643663343866363830313035393838 +66363463653161643637626233636133633930363637363838363361373930646632383635336663 +39383137666236613939623533383432643731656631353533373661306638623566633137336665 +36383938353734373361366663653730333862616465616335376637333430316664353264346535 +34303639363737653439376332633030313933366462653132346165623934653736653330376538 +64326539663137316130306437313732393161356439626535663538656435366237386432306565 +36373135343933373735386539643934313831623034383232343538626661343062303936303032 +39656234343562386264386561303437616664646362653732623630386533343834376364366135 +61373964646335316238336333663035633138346130343163323739663362653462666639636231 +30663561373830353833306132623432333031336161313761316130666164393066366135323664 +37616634636534643264666532653666663161373165663436313234623532633037343032383231 +33633733653537356439643431633738656436333535373966666338633763366466316639393136 +35666566666334303366393761326638366238643538643934633834366235396337356430633963 +66633630346466323461343437656332393133313564633438336362633836316362306532353239 +32333762653637313037333430326130653531613439633333663362663032333939666537313232 +61383636623063303362396435333761623763363234343161646439393336303431613462376430 +63623233356533343839343264303930363632393436613433636630386331383338346662646662 +30343231363732343462616633383738616234633234346466383232626231393934333565353636 +64386635643262623135343238633766623530346463383730303537343866353966633161303237 +38313932663933396264636537316231666237343631343630326332393161623738663236636332 +37626261663835306333663863313666653965343766636261346564663435376536373137396535 +65333936303361306635653066313138633237376432376638386535363839383331626566653931 +64626462313033316336656661643733343230366538646565303232366562383232623364323136 +37633966653934313462623636376631626434376530323531636635363236353239373532396336 +63303936323535373964366566353062343939623065346338623862373764666634666264313932 +61306131643734663531643534326564613661326330613165613762666332356132306330396631 +37653238646334313161633862623535643363386134333039626130616537383933366633306162 +31313263613333303735366634373735363037336535373963313064353134306430656363383865 +34646563303863303336666634643964636136366134306630623566636363663537323736303130 +37383133313065666261333633623963393932366365386336356138386531333939666635353937 +63656465663338353763396661616333313037396364626337303933313562666665346163623965 +39303863633730613633636566323236663966646436623065303932373331313336306334343033 +30623030336431336563376465653063356331653136383035393339663963366137333965646232 +66393230633663323730646134626661326165646638393165613237623039643065663835303537 +36633534613365663535643033313438313036346131383962363837363463336131333632396534 +37613431663439306366646665323338653666383934393930396632363037616334313931633764 +30363031393439663839323030353132373135376431386136343130626663303534313461646464 +31373436626432623362313363396563383131306462356530643534363935393433386164363935 +64636231303733663863396662636262616166643161396137393238373035336338356634666636 +36653336396562636465316362623133333863333933656137663363316632633538323130393230 +30363665656132396434656135656331386430363237383562326336373832366431653134323966 +61366262346363336131376336333131306439636130363862346539343162303464356431313833 +61386235633036393435626638633032353537366633396235633930326164313633396332376666 +62633034663437616166623034356637336431663865363332376531653737663333303839326437 +64663261643066303464633965643231643637393538373863383936383262636530383737336336 +65363735313937616364653366633831623731376663356666376663393361333162303131383165 +62383632636461373933653835663932633962346532313362323261366166353461616336653664 +64373937643630353430386131663238383137626238336161633964613739326230653035316231 +34663739386139303665393233373862623431656336313662666664363566386435646362643963 +36376463356236366339653530353833653632623862363434313031616361613932326561393230 +61366439623064353139623037393664376630303861316138383866356535386133353765613861 +37303561613934366330396265653066393132636130343765313732653632373063343364383236 +32663562313337616462633933646432616261613135393262633933613330363663623938613662 +63386135316366643230386161653331663063336139326466326363313730336130356239653465 +36613161366635313361356539643966363664376461303366326635383438366134363733666262 +61343064613366386163616666313936303262333832623963326239343165323434373432363134 +65323335306432396464393433376433623038623166666132336530326532383665346161373961 +36643730633833376534363435626431356434663235626432313733336535633161383232356132 +34373735666538363663326438323832653364646130643339306631396139343139323530316666 +35396433396665666465623434663762376566373631376662323266373364633431393661393639 +64646162376166376537396463316364626333386436663034623330666236613566653137326532 +36366663303636303938643238396562353138326433343564386233623965373431656239336235 +37353965303533656163663066326163326335636331613566623631336337306139393534373064 +65643061636230373364633431306338353166613861656634376664363339623262366338383630 +37393961396362656236663635633339653439626539666531313236346333383030656364303431 +63376539393336316666393831303937643535366663303736653534636461303362663965373530 +61383534313634643639643834386165613737343732333236316530343130663565616333636561 +61653437313934336639343066316538303933613530623761653238306133373162336535333431 +38333334646538363833646636373233316236653438666235336333343234333135333266653830 +61643462643462613561373362613931653832653263663335353937363162326637363736336137 +34383237656639383762353466353537623030643466323162316237646161333031316432323061 +61633632373037653233343061646130333537303865343832646137323765313263313566326533 +35316439376566636362646530353334613037313639366633643131323133373338626566613364 +34336430393064346636383933366361363837356463633131396534353933643137663531633963 +66353234643535333433346331663265306238373539653761626165333738666364663761336431 +34633731653131373463656466613265616464636231363961623631303661656130353538333163 +36363131646666313930323434363737643666366131383466633731653866313264613565316233 +32323961346566326136663334663335663464303239636562316634303537636563613266646539 +38303036356465383333623166306331653439653837333362646335396333343432336335333533 +62376433656637363237363764396466323832613563363163336437353265653462313662643465 +66623066366538363964396135353831333834643235306536346636633237366664323965366639 +66613734376635653336363163386531346562346466386333373536323336666135323063323734 +37383037383235333133383232343130396535633838663239623565626566626662363966663961 +65643566306465643339386161653638326633323735613633666139346530326532363661373864 +64303837393566633935393838336366376363343063346233316431666239613535373633616365 +66323161633765353865373730396433656539643761613233373166623062386263646262626531 +66346532656361373032303566616161333337306539656462326564373462333732336238393234 +39653637623630326565336263303336613738326465663836343639346335613031396538393466 +64386162323664306433613466356530333765353139613261356435303833663365373138323239 +32393034353863363236346137356431353564653133653231663239383362613635336638393735 +30613838653166383364393436343730373530646634633637373364393732656366333461326235 +36313931323639323632366236626435386637626562326538303935616230653365326237303766 +33646463373130633632643334646538306631343336623934383237386465333631306238616162 +63653235353834316363616461663166613636303438643563643561343731313366306161616165 +62383061316237346333343063623563313631373363376136336630373665373062343436376263 +66326235313065306637653534373133363330326330306338333962373232346464396431346430 +33376336393834356532306262663838323838373464386330613664646433656163613836366364 +61633532613833383665663235393235316666333961393266663166623162383161643539323737 +63643465646337643638626238376364383831323139633466356139666632396438303437613935 +66613831613565613139336339303763326638373464346164303231613332633566626539613532 +36646561333736313634633532386133333839623930303732643333376633646164383162336662 +33613863353665366233663133653535316534316332316363393762653039343566666336633066 +36613734306163633932353863643632636165373937363933346332626231376632373962663039 +34393633663633396264386265353962356430376662636531656232613538383731303364343436 +32316564336134383363393337363832353032323538613333643266633063393739313461653361 +30326435613535613935306136393636363761323337333538353162343631353936333361323534 +65326564363962343330373361613562366635643233343430386164326666616534363366386437 +39353761356362373030663461633034343034386633653332353939323963353765326563396365 +30356665646230656130306365653936653262396235653461386432343135313737616130396161 +31643432663730373038353833306366383764633963646164343062666136306361383165356439 +32363137623966666465333934373766633532393236636562363762616631613964373261326135 +37626339386331316466363136633761376663626363376564636566636361396365623131343666 +38343131313137653665623966303463633435303131663938383062653539346532353263633230 +32366238343432333536663836363432383664623430636261363461383333636338633165343465 +31346339633430656636616461313231363339373461633537646366623166383239623836333165 +33616364353534646531373563363238643164326561353339373233353631623131333965636364 +35353363333232333530613635303866366463356662636532646531616564356566336438636239 +64653065356139646535333434373266646239636466653138333431343135663235626134363437 +32616331643961613435386461346564313533373464613832306536396339626162353030653362 +34326636323933326234366265316339663033343232366563323532343137303633336363393334 +31336531316665353163613236346666376533646532613431613263333130633038346466366263 +33363364636535333433373262313564663864373736383738326238313738313563616139396265 +35303836643035323137343163353130626662653430323336393933646464656439363834633434 +64363035386139333538376366666262316266343063616636336266316237303761353435303534 +30356433663966663166623331323335336534316536643835626136646131653031636135353864 +64633334376432343133386362353361376333666338333362343237656331346665383564623062 +64633335376464306635623333343037653533343632353062383763656337663039373832626430 +39353235633136303866353034343135633732376131623734303866326135663831316330376535 +32626338383638666436316134346331393836313964323364643934373664613462373539316330 +32626263643566386666313664336237616236323866313638366238376237643965356436373434 +30393338353837613265386363303235363162613261653563303166306565333637376261636131 +33613130363232633764393165626238303232393032356264363065613963356233373462616234 +34626238313539613665666331366661653730336238396139336630323733633639306364373832 +66373432393061333464346132666230336432373931313835633830613362343862633833326435 +64663535633133376539396632383662663838326531323831366161343663313632306563316561 +63353437343335343130363534316232396330313731336638666230636133313035613437353132 +63623533303637336366626631383233323739393064666464643138613035616532386230386161 +64636666373965623230343337323163663734613439313964313662656136363163326231646338 +33323261666237306434636534663762663835376633366365663438313936316230646537396538 +65346437353530343337383536633437363065653738626662356633616434333736613831666436 +32316664393536623439313665613061393163303262323238333937333432626130313234316465 +62313438653137396431316533396230643836363732306235333833636532333534313532613163 +62316534376435653961663230343262333837373761626130373532306366376531363833386230 +65383965653936663834323632303364643734366364643535383562373434313330616639626334 +66333333633863353966626235363835656261383033346563343961653662636531353832336437 +61653766323535353364633331663839626665636165346364383866353131343532396266356339 +38303435326139383466623532646166366532353636353437343336346335363332393665663835 +34316432313335656437386263373366326534666632633237613363366231613866393761376635 +66353463653838346532376638363965353434316330643064386238383931656464633264346262 +66623639383837643939633565343361613633373730653035653139633832343532656239633633 +62623539626236386163643765373633353363313336636537653162303930363463626139383435 +33383736366164646639666136353861663235646366303135663630363866343661626234613335 +353530333634326663326530663939633466