diff options
13 files changed, 282 insertions, 332 deletions
diff --git a/resources/tools/testbed-setup/ansible/roles/docker/defaults/main.yaml b/resources/tools/testbed-setup/ansible/roles/docker/defaults/main.yaml index 4f2cae9b75..6c445aa42a 100644 --- a/resources/tools/testbed-setup/ansible/roles/docker/defaults/main.yaml +++ b/resources/tools/testbed-setup/ansible/roles/docker/defaults/main.yaml @@ -2,29 +2,30 @@ # file: roles/docker/defaults/main.yaml # Version options. -docker_edition: 'ce' -docker_version: '19.03.3' -docker_apt_package: '5:{{ docker_version }}~3-0~{{ ansible_distribution | lower }}-{{ ansible_distribution_release }}' -docker_apt_package_state: present +docker_edition: "ce" +docker_package: "docker-{{ docker_edition }}" +docker_package_state: present # Service options. docker_service_state: started docker_service_enabled: true docker_restart_handler_state: restarted -# Used only for Debian/Ubuntu. Switch 'stable' to 'edge' if needed. -docker_apt_release_channel: 'edge' -docker_apt_repository: 'deb https://download.docker.com/linux/{{ ansible_distribution|lower }} {{ ansible_distribution_release }} {{ docker_apt_release_channel }}' +# Used only for Debian/Ubuntu. +docker_apt_release_channel: "stable" +docker_apt_key: "https://download.docker.com/linux/{{ ansible_distribution | lower }}/gpg" +docker_apt_key_state: present +docker_apt_repository: "deb https://download.docker.com/linux/{{ ansible_distribution|lower }} {{ ansible_distribution_release }} {{ docker_apt_release_channel }}" docker_apt_repository_state: present # A list of users who will be added to the docker group. docker_users: - - 'testuser' + - "testuser" # Proxy settings. docker_daemon_environment_http: - - 'HTTP_PROXY={{ proxy_env.http_proxy }}' - - 'NO_PROXY={{ proxy_env.no_proxy }}' + - "HTTP_PROXY={{ proxy_env.http_proxy }}" + - "NO_PROXY={{ proxy_env.no_proxy }}" docker_daemon_environment_https: - - 'HTTPS_PROXY={{ proxy_env.https_proxy }}' - - 'NO_PROXY={{ proxy_env.no_proxy }}' + - "HTTPS_PROXY={{ proxy_env.https_proxy }}" + - "NO_PROXY={{ proxy_env.no_proxy }}" diff --git a/resources/tools/testbed-setup/ansible/roles/docker/handlers/main.yaml b/resources/tools/testbed-setup/ansible/roles/docker/handlers/main.yaml index d33c63fae8..4dfcd0b867 100644 --- a/resources/tools/testbed-setup/ansible/roles/docker/handlers/main.yaml +++ b/resources/tools/testbed-setup/ansible/roles/docker/handlers/main.yaml @@ -3,6 +3,5 @@ - name: Restart Docker service: - name: 'docker' - state: '{{ docker_restart_handler_state }}' - tags: restart-docker + name: "docker" + state: "{{ docker_restart_handler_state }}" diff --git a/resources/tools/testbed-setup/ansible/roles/docker/meta/main.yaml b/resources/tools/testbed-setup/ansible/roles/docker/meta/main.yaml new file mode 100644 index 0000000000..0dc7d19507 --- /dev/null +++ b/resources/tools/testbed-setup/ansible/roles/docker/meta/main.yaml @@ -0,0 +1,6 @@ +--- +# file: roles/docker/meta/main.yaml + +dependencies: [] + + diff --git a/resources/tools/testbed-setup/ansible/roles/docker/tasks/main.yaml b/resources/tools/testbed-setup/ansible/roles/docker/tasks/main.yaml index 1f7fdf6692..d3eef82781 100644 --- a/resources/tools/testbed-setup/ansible/roles/docker/tasks/main.yaml +++ b/resources/tools/testbed-setup/ansible/roles/docker/tasks/main.yaml @@ -1,49 +1,72 @@ --- # file: roles/docker/tasks/main.yaml -- name: Docker - Install distribution - release - machine prerequisites - include_tasks: '{{ ansible_distribution|lower }}_{{ ansible_distribution_release }}.yaml' - tags: install-docker +- include_tasks: "{{ ansible_distribution|lower }}_{{ ansible_distribution_release }}.yaml" + tags: + - docker-inst-dependencies -- name: Docker - Create Service Directory +- name: Inst - Docker + package: + name: "{{ docker_package }}" + state: "{{ docker_package_state }}" + notify: + - "Restart Docker" + tags: + - docker-inst-package + +- name: Conf - Docker Service + service: + name: docker + state: "{{ docker_service_state }}" + enabled: "{{ docker_service_enabled }}" + tags: + - docker-conf-service + +- name: Conf - Docker Service Directory file: - path: '/etc/systemd/system/docker.service.d' - state: 'directory' - tags: install-docker + path: "/etc/systemd/system/docker.service.d" + state: "directory" + tags: + - docker-conf-service -- name: Docker - Setup HTTP Proxy +- name: Conf - Docker HTTP Proxy template: - src: 'templates/docker.service.proxy.http' - dest: '/etc/systemd/system/docker.service.d/http-proxy.conf' - owner: 'root' - group: 'root' - mode: '0644' + src: "templates/docker.service.proxy.http" + dest: "/etc/systemd/system/docker.service.d/http-proxy.conf" + owner: "root" + group: "root" + mode: "0644" notify: - - 'Restart Docker' + - "Restart Docker" when: > proxy_env is defined and proxy_env.http_proxy is defined - tags: install-docker + tags: + - docker-conf-service -- name: Docker - Setup HTTPS Proxy +- name: Conf - Docker HTTPS Proxy template: - src: 'templates/docker.service.proxy.https' - dest: '/etc/systemd/system/docker.service.d/https-proxy.conf' - owner: 'root' - group: 'root' - mode: '0644' + src: "templates/docker.service.proxy.https" + dest: "/etc/systemd/system/docker.service.d/https-proxy.conf" + owner: "root" + group: "root" + mode: "0644" notify: - - 'Restart Docker' + - "Restart Docker" when: > proxy_env is defined and proxy_env.https_proxy is defined - tags: install-docker + tags: + - docker-conf-service -- name: Docker - Set specific users to docker group +- name: Conf - Users to Docker Group user: - name: '{{ item }}' - groups: 'docker' + name: "{{ item }}" + groups: "docker" append: True - with_items: '{{ docker_users }}' + loop: "{{ docker_users }}" when: docker_users - tags: install-docker + tags: + - docker-conf-user + +- meta: flush_handlers diff --git a/resources/tools/testbed-setup/ansible/roles/docker/tasks/ubuntu_bionic.yaml b/resources/tools/testbed-setup/ansible/roles/docker/tasks/ubuntu_bionic.yaml index 32643b1119..a38a0af110 100644 --- a/resources/tools/testbed-setup/ansible/roles/docker/tasks/ubuntu_bionic.yaml +++ b/resources/tools/testbed-setup/ansible/roles/docker/tasks/ubuntu_bionic.yaml @@ -1,33 +1,27 @@ --- # file: roles/docker/tasks/ubuntu_bionic.yaml -- name: Docker repository - Dependencies +- name: Inst - Dependencies apt: name: - - 'apt-transport-https' - - 'ca-certificates' - - 'software-properties-common' - state: 'present' + - "apt-transport-https" + - "ca-certificates" + - "gpg-agent" + - "software-properties-common" + state: "present" cache_valid_time: 3600 install_recommends: False - tags: install-docker + tags: docker-inst-dependencies -- name: Docker repository - Add an Apt signing key +- name: Conf - Add APT Key apt_key: - url: 'https://download.docker.com/linux/ubuntu/gpg' - state: 'present' - tags: install-docker + url: "{{ docker_apt_key }}" + state: "{{ docker_apt_key_state }}" + tags: docker-conf-apt -- name: Docker repository - Install APT repository +- name: Conf - Install APT Repository apt_repository: - repo: '{{ docker_apt_repository }}' - state: '{{ docker_apt_repository_state }}' + repo: "{{ docker_apt_repository }}" + state: "{{ docker_apt_repository_state }}" update_cache: True - tags: install-docker - -- name: Install Docker - apt: - name: 'docker-{{ docker_edition }}={{ docker_apt_package }}' - state: '{{ docker_apt_package_state }}' - force: True - tags: install-docker + tags: docker-conf-apt diff --git a/resources/tools/testbed-setup/ansible/roles/kernel/handlers/main.yaml b/resources/tools/testbed-setup/ansible/roles/kernel/handlers/main.yaml new file mode 100644 index 0000000000..3d30a0973c --- /dev/null +++ b/resources/tools/testbed-setup/ansible/roles/kernel/handlers/main.yaml @@ -0,0 +1,6 @@ +--- +# file roles/kernel/handlers/main.yaml + +- name: Reboot Server + reboot: + reboot_timeout: 3600 diff --git a/resources/tools/testbed-setup/ansible/roles/kernel/tasks/main.yaml b/resources/tools/testbed-setup/ansible/roles/kernel/tasks/main.yaml index bf8ea9fa68..4c63c709a6 100644 --- a/resources/tools/testbed-setup/ansible/roles/kernel/tasks/main.yaml +++ b/resources/tools/testbed-setup/ansible/roles/kernel/tasks/main.yaml @@ -4,3 +4,5 @@ - name: Kernel - Install distribution - release include_tasks: '{{ ansible_distribution|lower }}_{{ ansible_distribution_release }}.yaml' tags: install-kernel + +- meta: flush_handlers diff --git a/resources/tools/testbed-setup/ansible/roles/kernel/tasks/ubuntu_bionic.yaml b/resources/tools/testbed-setup/ansible/roles/kernel/tasks/ubuntu_bionic.yaml index c9c561df6f..3cb79352ee 100644 --- a/resources/tools/testbed-setup/ansible/roles/kernel/tasks/ubuntu_bionic.yaml +++ b/resources/tools/testbed-setup/ansible/roles/kernel/tasks/ubuntu_bionic.yaml @@ -33,6 +33,8 @@ apt_kernel_list, kernel_version, ansible_kernel) }}" state: absent purge: true + notify: + - "Reboot Server" tags: install-kernel - name: Kernel - Ensure Any Microcode Is Absent diff --git a/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/main.yaml b/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/main.yaml index 4605783795..3a8f35b57f 100644 --- a/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/main.yaml +++ b/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/main.yaml @@ -22,10 +22,11 @@ line: "{{ grub_cmdline_linux[ansible_machine] | join() }}" notify: - "Update GRUB" - - "Reboot server" tags: - set-grub +- meta: flush_handlers + - name: Performance Tuning - Turbo Boost import_tasks: turbo_boost.yaml when: > @@ -160,6 +161,8 @@ owner: "root" group: "root" mode: "0644" + notify: + - "Update GRUB" tags: - copy-irqbalance diff --git a/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/ubuntu_bionic.yaml b/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/ubuntu_bionic.yaml index f239890989..273ad53f25 100644 --- a/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/ubuntu_bionic.yaml +++ b/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/ubuntu_bionic.yaml @@ -2,16 +2,17 @@ # file: roles/performance_tuning/tasks/ubuntu_bionic.yaml - name: Ubuntu Bionic - Mount /tmp as tmpfs I - copy: - src: "/usr/share/systemd/tmp.mount" - dest: "/etc/systemd/system/tmp.mount" - remote_src: yes + copy: + src: "/usr/share/systemd/tmp.mount" + dest: "/etc/systemd/system/tmp.mount" + remote_src: yes tags: - machine-optimizations - name: Ubuntu Bionic - Mount /tmp as tmpfs II - service: + systemd: name: "tmp.mount" + daemon_reload: yes enabled: yes tags: - machine-optimizations diff --git a/resources/tools/testbed-setup/ansible/sut.yaml b/resources/tools/testbed-setup/ansible/sut.yaml index 47e72bd5a6..68ac9b8364 100644 --- a/resources/tools/testbed-setup/ansible/sut.yaml +++ b/resources/tools/testbed-setup/ansible/sut.yaml @@ -10,6 +10,10 @@ tags: baremetal - role: common tags: common + - role: kernel + tags: kernel + - role: mellanox + tags: mellanox - role: vpp tags: vpp - role: dpdk @@ -18,14 +22,10 @@ tags: docker - role: kubernetes tags: kubernetes - - role: mellanox - tags: mellanox - role: kernel_vm tags: kernel_vm - role: performance_tuning tags: performance_tuning - - role: kernel - tags: kernel - role: cleanup tags: cleanup - role: calibration diff --git a/resources/tools/testbed-setup/ansible/tg.yaml b/resources/tools/testbed-setup/ansible/tg.yaml index a2c9fe5f23..e800881127 100644 --- a/resources/tools/testbed-setup/ansible/tg.yaml +++ b/resources/tools/testbed-setup/ansible/tg.yaml @@ -12,6 +12,10 @@ tags: common - role: tg tags: tg + - role: kernel + tags: kernel + - role: mellanox + tags: mellanox - role: iperf tags: iperf - role: trex @@ -20,12 +24,8 @@ tags: wrk - role: docker tags: docker - - role: mellanox - tags: mellanox - role: performance_tuning tags: performance_tuning - - role: kernel - tags: kernel - role: cleanup tags: cleanup - role: calibration diff --git a/resources/tools/testbed-setup/ansible/vault.yml b/resources/tools/testbed-setup/ansible/vault.yml index a500462147..56f15d84d9 100644 --- a/resources/tools/testbed-setup/ansible/vault.yml +++ b/resources/tools/testbed-setup/ansible/vault.yml @@ -1,255 +1,168 @@ $ANSIBLE_VAULT;1.1;AES256 -36343463316430383361393130343966303537663633623764306562626538623763633630326565 -3739396238616663666564643633656563646262656261370a373361326534313433643737623761 -66643663633865373637323138626432613065376430303233623263323463633764373233333836 -6561643461303634360a346634346162633337366530333037633235633932643833643165626361 -38666564373132366635663264393632303265303633366238363735393335373932666665383164 -37623239326234323738613338346162613030326237653930646162326465653837653538366438 -62393734623663306465333435663133393562656566386334303133333733376433353431616561 -62386439333065393365346462333331633537313962363965353732313662376463626161323338 -34366663386631626137363131643732646530323863646536613166653136343862333236323837 -66323839636264346231643737336134633466396363343537333231626433376632383131356332 -62313665373639643139333537396463383962386439643530616633633238393430346231323665 -33343738616331303563353438653662303762306237663162383430386438333431343333383739 -32343265643534396362373635383638303135663063376638343330353662613365393237663738 -65323932303030373862653539626431316135363639623930366337366333623761356337303836 -33373561386563346231366134616130633939626334343366666233376430326533343133323937 -30393963363866393863653237343762316663646633313934666236333061326333613037353363 -61663334623331653932316361373634626432366139643938613435396436353562623234336365 -65313239363130656532303432306232636438386162646233666662373938353461363361393831 -61653264656133366231346235663132303930616566336630626530383538616637626139326537 -37393938623764633037383931323439306561363931316133363764323432343862353836383864 -35646263626531336237393133356264333135353731666337653765623863643637643735373063 -35653637353230636630636232626534666232613639353836363235303163366362646162633330 -32623564333030613566353565376130633365316266323836616631326363626162643438356366 -32623939623830663039373032396636383739356530346537653730613762633731623863376233 -36653632356331656530613865346365353363633466643731633736363533303732303930396336 -33356366323765643838393634373664626662366530646661363764333833366262333531616635 -31313239376535626434333431303538656662303162326235336138333635313132326438653361 -62656635323462656536336464316436373039323461306461353534613534633532303930623661 -35663961393339363661633932376639326539333536373637303535333562373233643730663565 -38653064336232396136306566353564633561613330666331626430626161316639303234346564 -39333732333964373861663261613130326164303330353039373132326332383965643737383566 -65356631313562376634393534396632663566616366346434396663323165623261626332323034 -62656436626236343736613664636264383735616331313730316533336366326635303936353535 -62323937326636326264396133313933616664633765373535666161346532616237626432333431 -36393463383736353663326366306161636230623038626138393162373231323361633061633134 -38323937376363313664336638656162333538313036393337306261383664353461653762366333 -36643435646465616265313638653537303664646332653332393430346363313435393833373536 -34643137353834386533373736373165623435396463393236333231363163316463653439373535 -34396437326331336435623464373466643164653063343435636535386461653937623730636234 -30663435396261343464663835313832306366323266356434653838303461633036666161376339 -32353435376562623436393662643233373333383862313635656331656366383664663661633764 -36383236633437636136366263386330316438346137313034316439666237336438383130653730 -63666231666234343936323439326538376330343865366234303961393435326530303638336330 -33343734333039303637646261396462346565363032323437656263656665373937623232343639 -61393263326463363363313439346630336536356332346662313334373936386261613830613361 -65356434373262653632363466313562386538396638393330393963613064663833656565323164 -31373761383362613365626563343935386462656562613533303637653662376665393731666366 -66386264306330356563343565656166666434346466623239623636393934653435306534356339 -33383533363938336164363133616261646638346336353862353362353439333539336436653165 -39303833353036646337333836633963396234323439396363316238313130333537643737303236 -65356263363566663639653533383737376530353035343562633032323635616565633763643035 -34623966643239633866323331666233653438633064316562353963643335653363383830626238 -37313137613837626639376238376562656463623834383633303830353861653736346539336665 -32656236343138356564356264626130383334303939666564383237666662613163636432383835 -37363463656333613464393438613633656165633166343634386534616333396462633337343765 -39343133386162326162653231636463323231653733636264336539386131353234363466303363 -61343465333537363038306138623766616130666534313733613033303530356364393265653136 -66663231313936656331643561363339383365623263363936303862653564643434326364373130 -37666664663663663530396265383965653639386430313938626665623933306666353631313538 -31353830363730626632376161663263623336623731613466323163663565626435303034326232 -66333161366563393537336264633935636465396239303865373233623938616564653030363066 -32326138343931613032323837653034666333353365643337326363393932646437316366653832 -63306539373730623464323137303134666534393536303330336335656235666630316666363039 -65663439376161313864386262643262326431666636643535613765343161353237353364636333 -63333664376335643739613435623034616230643561386533366538393836373562656138393563 -30366530313936363539646363363539646231386139626237333963333634393034663438386263 -35333534623335303034373236383564306135356334356138623061386638663261343830346262 -65623438333136623435323137656235323939613665373831656361383332323364633731316134 -35613064633332383238393430396465623962393932393262306132353764643135633437646233 -35396635303236343837333337666131363563613462326433363531663233646465633532386562 -36656165363137313635353534353530313139343165393239373734353564333332636135616166 -30623537303837653961306533656234326166333064633435633262356264303239386265313131 -30656237323639356265336362613930313436383362346661316634333765316662323038653235 -36633730363333653635663431623932303636396435643665643639376362646537623761393733 -33383161643733383662313461306530343164343439376162623963356337643237353465643830 -63356134666433356336333732366437613365623535333232346464653066323034313430373932 -61306639653065326531623436633832663264383562653030376435336336376365303139353831 -34663539306238396238373538613664616164653261353038656239363337666231643137663032 -61656132616666633161353138333963313936303530353831373766373864316130376433386431 -37646361653130616262666635323930363234323265383535646334383464323732366662316238 -64303662363935366133653364373439633935316132383736623330386432313132383461323438 -39386239646330326636633636316235333139343963633535333462393037373664346631393562 -35306235343164623237303930616363323438323766383835646261326539313239353062626336 -34393064353866346239363666306464666161316230646563326537343263303961326264663633 -35336435323038396435306465653636646336353762646266346465646135316633653831373239 -31376130663735633163376464373066633536653965376262313439336561353038346530343232 -38313661646631636632353363636661336336313366383863616566316435323139396530373438 -64623563653962333564643633313862383863666562373030376137393338323961383438663638 -30323534396432333533653635633935646663383162613133326363663834306138343038336366 -36373937623764616630323565663939663236376638343339376261336266663637323736363439 -37643238616138336361366562343031333466666165656435313037343766313030323963343739 -34376164613362303134366436356166666363663933653233373032613534613132383065646463 -38333630313237663235383635656430636362313639383131666135383938646335653965383366 -35363034633362366232626562323235353063643061353737363862343932363464363831626437 -31313635663731643331663136643837323031623266663963633734653439623331333230343364 -30643438343062353034623831393134343463643335616436353966346661663963343363663536 -32336338353330343862633561363463633961383865613162386261336135316335363634616166 -33663532666330623463646465336336623235383036313432623864353364373331323736643832 -35653234656263626565653461373461343161636539626231646462643532323066363930633333 -65626565636263323262393361396465613738383537323637373564633030386461383330653562 -30616262326334303062363739636339633033323530303762643735663366303739613431316463 -61323231663537303239653461623766326261656333366264313531643332633236666166626137 -33643862303737393030626331623335633337306439323961343936393361343134353230313735 -62313939663862326339653966386366343961323264643062396637373433306138346335356566 -30656563646138646335353364343036386630373035343536356539373664643539303163626638 -62303732646166323835303761313338326566623532613361363235366464306636353364336466 -65323362356330323735383862333433633735323264343034666264346537353762616337613639 -61643862616333656664343338653832386131633738363132623034623063663630636461363235 -62656539633933633839636565623866316430316236613134636135303131626630616366373136 -61656239363539336366643031393761643364366439336365653934333939313731313663643063 -33356564376565643034663665626161353236343764343737306233373534653435653036323935 -35616433313632306361626662363838386161303363663138303833613337373566313864633533 -61343032356531363439633166333531316531353239636166336566333364336235616663323864 -30663331626634653566613032643061656632323039633230376565346136643439303936373435 -33353638353165323865393337616231383330336662326133653630643638643761633866313335 -63313530666262613930353731393162656663383461616434643536666230626162316536643236 -62393166336133336335633963666437393633393537663065616331326261303436366336333061 -35646130366561366363316163333162323333333064613662323330643639313930376234333433 -39363462323165363163356137653664336365306538393232653436316664303235626234363831 -33323539613732383362326139373635386161393263393764656531313135626136343439313632 -36343035626433646361613637376166306536666230666435356332353661663661303964316563 -64656461313061346261383464373661396337663837353438646161626562636134656433333034 -39303463613732613833623865396362376437313431323435386633633533326363343139363537 -35386566666233386632646361633639333831643666663734626566653532383239616335626630 -31666566623434316462363832393634346561376265383439346363396165653233623666626466 -30383239373963303139363336383963343933323763623131393035323466626364636539373662 -32383431636533643131326530633132643531633766613834633131623935343737316563323238 -61646336656136613166356331353036613130616430353463323036373863373337393263653231 -35333765393731303766356133376635383364313438383836663939663063313038393866613365 -61653539653432383364356631326165356636326564623064363438333465306566323765373335 -38626437303331303466373539363135303337643631613736636665323038666434633764316539 -64396139336561336638303364363535323864653134646337333164363638376637306633323832 -36326231393165613530343965323337316664376263383733323432306165656338653438323034 -61363235333733373830376639646534646636333534613731313537363764376563353934396132 -38613734393433393233316539623839396331323735316561303038323733393065663165303464 -33383537316365656361346631613462643032656363303936366333306334663461613430376631 -62336663396165306166356236363063653233306139313730326662366435653136616462633434 -37323038396533326430373332666664313133633532326538626463663833373465656464363635 -65353731623962316465666435653232383834366638643135656330636339643062363135383339 -36323965396136373138386464393363373239383666313631633662353865636263656631343936 -36636261633436373031393061636532623064633634653239366161366336613037663764643537 -62343638373235343534383237353133333765616666323833363765653863636234353135386235 -30373530333432353635356664363563656638653031663632656532653431643831623932313962 -32323036303038363463343533623763373135373639306561623561663830393565613339373865 -33303431663634386335333831353238343138616463383963346336396433396136633231363830 -37386161613163353639636633323164303465313062303133623666646265343934656233636133 -31386239313433663461653935623564616162373031336633643039646132316135343433626166 -64376530393035653434326636393065333664636463343561303761666564626139626632303331 -36633062656365633736393230656339623365646638343532323764323563653739653434303036 -32386263376136663365353237386632653730396234636238336463616136643335303438313039 -37336562306637366163393231663639343561616266663338303439303035393766386235353063 -30383664346261356136626266656563306432626339356562393266623265376433383261323663 -65616163376566353734376633376136376431366535303538616566353463386365346163386231 -31666135616332346265303631656363343961393831646537636663386538313835383730383633 -62373038613763613034653438343164306366633766333663343663343134393030373763313739 -34376335383235353333666566303337333261373335396139666461633131373934316264333532 -32626536336663343532373662666664393034373063653164323936336532393263303565653133 -33663634303962646365656133333936353063383135616532343964336330653735393161323432 -38336162356632306434663537383662316437303361626361396365393732393263343035643433 -39373464626262323430306534326363346131626166353464363834383566346531653535653030 -32363133303637303830326235373030633931653062663335386665303833633839303266663931 -37333037633136663239323038393030366665326436623834393937316631663961643638616662 -39643761313265386430633765386238656431383737376161356630323130356535313930336434 -37343037363731303637386665343262643535363634613539383733653161313561663962386332 -37396338633236303030386336383433663166396363616530373834646133386564333835656136 -30313862663433393861656332643030393966303733626435373637303436613532343662626563 -62396435396562663836303465316134373232663562316232646237376238666465363261373430 -62646239393365646137343464643563666131346638363731393538313561313661316466356335 -37393838323839336264613031323833333661303763653464613133383538653831656262626533 -33356165653263316532363039336464316162313563373264393961613639613965636435663463 -32666537663533326366346166663164336538646665303563386466636337633961626164353937 -38333738323861656364393330663362626239326334346333613837333236633536366636663431 -33636633393037326664356630366264343930333566356664386465363264333931636464646236 -39323736343831303466386337623261323934383433623166616234643739643566343930373339 -65356237306662646264363266343261646463316635393136316338633761636365333134353133 -64333330313831353766346530656364643565353232626266353361386239396662363263383539 -36356431363062313962333538303235393933616465613161396262396566343065393835303330 -36643462303236623361356637656564396431613932343235373630353638643466623632383130 -66613562626333386530633365336239346431386335373934663239393032393265303134616462 -34323936396430303034373263366334396335663664646632303830356134643935643266333462 -30653734653238363866316434373130623432363732653238333732373733616666666464393636 -34353361663538343332353063356537663231646634333934383363613661623532376533633232 -36653734316630646339393763626632646139333935356434626230653635613834373264353632 -39353336383938303462643561336664376563326235383962376332396132346164626466346163 -62333838363039343531343237376636393566303330336431313230363464623634646230623632 -35373234376537383063383762333739353430316137353830323363313238336533636661633636 -63653666383838646130626432363235393334393861666533613336336636643432313032303233 -31646636313463303962336135373166623534333632623135376264653164343266653863313235 -61663432623264333631656537643136323833393838623261356163393630343738643565336636 -31383138656630626439313037313530323265306437386164663835383131373630653639323033 -61653030316566313236396131386532626135366263333231386334663132656434626137616334 -65626335633761653565303331623634646430356335323338323936323235313464396231333864 -31333333363233303463306333373037666562383932343665366661626464386634663534303330 -38396231396431316230326132383835306536383563393937333234633238333461303537386164 -66663136663031636461643438376131356165333065336632323338373064363035353065356134 -36326535346635343336363138353266366463393536366264613631623131343963393032666630 -66613166313435326261616365636535313565383432393965396266393065316634386431646132 -63303063646561363832656230633361633164626262663666386465366634633738323938613734 -36623234623263393130626635613163323762353166336439633663623731373564626536653363 -33633337303664343337383339323635356331663634343438363262343038373333343865303931 -33666561643365346539613463303037346638396464663362323962616538393133326364613963 -62626437333135346166333564326438333263396666306433313463613830313732393963323339 -36636130326332653637303732643463353934326264353738353039363631643831343163663261 -37643162343161343431333236643932323961613837663563363733616466316662363935306664 -65343431353233373435633565366264653233383434313436323336376630383334373233353433 -39613561353634653331346161643034373639656463356232303739663163363462326436373030 -38336661386262653333343365376262323733656233616164353731613333363662643439373061 -36393539353135333564303363623337396233636638386637636639646432376631353139316230 -39636462663164386439313961353032363833373566393565323539636561373363303562383464 -37653439326531356338343465626535346464356437376234393761666363616132373230633737 -30643662316233613530306466396436373933366361343536323136613032343964346266623937 -34326361343738383434373136333961363832643935393632663364373330373636383761326437 -65343832366361353630306164616637393733616231653832316366646630333064633063623436 -62373163323130346332333166343331343265653331643565646136316636633935646131313263 -31303365636130323133623232383136613235663066323261616561623935643938326433613635 -35636461376230613834353533653664653539373761366664663163663133303161393065313264 -63363461643330353362663165396331393061633766343661633262393230383461323737613138 -36663762393562333633613533333134363339653564393735333865666530643761353232633835 -31656632343831326361336437303965303538663832646537363565643033386337373537626634 -35616361643934326163306162353365623238663461356330333235633934313735306166636335 -38613436363531343334613030343737346632633966346633396334303432373934343061643533 -37633231333234333763366635323830383862346534333966326632666537326331353165396132 -32633730633031376662613833656538333433386237333831653032386464303333313034626361 -62373865636331383038353061663266336662303264633137616330333233646535356239363966 -30306163393334386632303530366265646365366335663639346464323463633964363633366466 -36353662623033383165313535363562643030376665333330373932663162396330386461636132 -63353136313563343239393866633265663562396630306263326532313636633538313032613936 -65353662373866353533323963323634306333373236343934376531376264363639393565366635 -36666133646665366632313164623330643337383638653734636564353862326236613631383632 -35316630383065626332643966656461303633633336643338393165383434353330313334346138 -34383430363337333439366664363339396662623837376562626461633838313661653935636539 -34393639363836306534616361376439663731353062363131326439336665303639316461626130 -35626165373963373662396234623662656562373262323861343238326263326432646434386261 -34636234333161333762643265396266653162613830353133653762386264326466613038386264 -62636439653939366336666362666162643131306562376635346134333635383462663966663636 -37653236653134313536646436613530353661633465633838663631333964323561346235613864 -37646636346232636234663364363336313630646162666162653439333936323365353933616564 -35313164393532623133626366643366363962303636316232383239323566643961393563643466 -31343064333839633838346266653162386239336234613865396162346638393435366136333739 -62353236346665343139343830363636393531333134363566336535333765646633376565323365 -31396264373136376565373632326437393566626233396565613230316461313632643135386564 -39316630663639386466383161646538643931646365653835613930383935316364363361636130 -35303965633436336337393134333239346663303564666435333864393431663338323633613065 -37386433636239326430386335313738373337663034343761623464646662633035313330653935 -39653764393564383161613966353835393063303631393035666264346661393663623438343264 -61343335656362346665306665343764666536643461376538383138336261646531626161323662 -64626139636432396564323338336263313062636163383732633666643264353662613934323137 -39646661643462376137376462366238313364313064613436646632386461303734343365663239 -64326364333439396234356236323663653966303135383134613531366565616634326132653061 -39323532306339393666333036313132616561363261623162386436643765393961323238633361 -66356265353337303865343563383464313734396166303062323462343766356565386134386334 -31613563363962663533303133623733323436383631316433636136353437353835393735396435 -32623433623561326166633763336136323166333430393331306530393631636663656466363431 -6130313132383162626264393061623966643633376535366662 +65646237323436373833326439303135393936363466383764663164336365623832653531376234 +6438303331653966383964383663396536663761666563320a633065656366336466643330303936 +33653539343061343839353736666330326434383430616638666338306332326636316138656164 +6336303733653563340a613062363264393031633339363263396631663562666262663136393239 +34393763663737666338373136633239666332376464616465376237353732356334336338636231 +64383237313136363461323734383665306537383566313366636562346562383364636663636364 +62626136653666636264643030333332666131663230643531303932333233643638356366613363 +61613933386664373066626466336330633332613566633535346237623135303238643965373963 +37386335303934306531653036636130313036386533343437313034616663623462386330663662 +66663238353665666363353939373066633933353539373335336239383762376562623465633166 +30343034643863306132323936323231356233306463656130353536396366343938643165386161 +65613230336237383963623638613437623136613530353439653133373466313434623530653666 +34623866636265323030366230356632663934393035646339646462633566396231633038653134 +66316333383336653238333737396262613535623266343733343830653531346432323238333535 +34333739313730633037363232616161313231626166333462383764396235326637353732316335 +39376161373031656236623939376333343530356361643134366563316662373938346338633265 +31366633346136663239353338623562316532316164636638393634303630613261303238633731 +31396236326235323962613937363134666537653231663836653362396532616235633939396134 +64313235613463623263303233373931366337393333393462343035313530363836333466616238 +35363866653563346231613361303162616361363839663738393565643666383765313333363136 +65333563666532383264366132643064626638373961633465613932616637616438623938653036 +62666330633330623632646636623262393330383166666139393164336237303738343132653166 +36613836386565346263663966613139346463313036366138313465363064356563393761346164 +31323131613132303339343162386266303561623064383465386138623933643832343263363364 +64653330643161343263653361356436653332316561643863386334303231616665326364336439 +62396564336332383939353932313236346664316266323139643461623062663031343462383432 +61306437663838353334626365336537663563316264346634623336633331643330363963633838 +39333662623237633565353139396632633034313463303264313362646639356439356232376333 +33376265386438663164626262313630303662396537316135646562363438633163613339323639 +65376266333037303066346533353739303465353937323864663862303832363261393066383363 +66316433663533396438663839336563646265666335656364333966383763363563383437366138 +66393563313835633532613735366561653433343164346563383430323164383333616338386466 +61656365333431646238646534306130366535623266386432303035363337653865633561643137 +34613162616131346361306539653330346637386631646335383233353136353133396637666339 +37356631376638323761363261303438653636353539336535646263666266643338626530363563 +62613961343461333531366162313536656532333763633861373931336165396238393763656561 +36366631363731353837663634316666323436396163636333373037346331386362393633323835 +32306533376366633363653363376666313963306639613366653562363762636236363064353733 +30633832383330313661666135646531346330393535613834323431303334646632336239343532 +34623330663630373562373432643334613664316165303736666432373164613764353536366535 +35346464633635636162663230386363356465306164616234396331626537633462623433313637 +32396431343666643663383931353133353137633431346531313263643934643039363734383738 +31333438666165353739356633653432613061303965353665323665626330633764386339343639 +31383763386465343836666266363338663265386262633062343434383139336162393035623562 +66333034343264643036386130346234396433633238343838663230303630613663363137323362 +32306264303864323438353363636664313935383565636135653264663538313432376639643663 +62323161623532656433643238613939363933396334353438663235626632663936346536323964 +39313865356262373463656638646631653934366532383834643266323530316135356235366539 +63643361353864653437353532383134343861633566623331363561323732323639313738386231 +33643931363535393765363036343334323464303436626332313064626338356565396631633761 +66306530356336363062663763356337333164303564363630303866333030303337303562623738 +34636230643233353437643763623435323466393632623939353533303163633763383835343535 +36386230313230383532376639356564646139613338633437363161666261643833376263666263 +66323762373839316131343834623532313232646132343834326363663731313566333331646137 +64663331646338333765383236363032366166316464366431323137363263346636616265353366 +34336530303132316639663036396438336466656361393632303636656265386435393134643938 +30346663326632376638363433363866366163626266633966333530626631346330323038666635 +39333135306362663364373532386662623435343136346564386666613137643663303732373831 +37383032383866623565353966396533363234653665346332343833383234316138333032626161 +34633836613630333066353732393534373338376432363061326538613336613665336461653666 +65343461653835623365376338326137303262353239333263353231663836313139613333306534 +64643237623262303532396163353939303661643762383436626664663765353763383834383663 +62386338333338616130353936316130336633626165393737303162316131313266633762653830 +30636635333963663439356530663638663336393230383237626165343037666563306663336364 +31653931313730303930383663646666613766303464376532663866363362336535346130633961 +63353661366664653164663730373165353839336635323136306266346363356561656535306239 +62646631396365346534326164326564386464386636373632646435613434383161343166383363 +31646639353038626563636631383438333832623834343233306335316266663734343636643438 +37346531646137383438393238393137356366663363363962636635353561656532653231666438 +31353339663736386638313135636136666364306562323134313064626438353037336531613065 +33336530656339636231393236393033643930396432653637326436643135363639396661663764 +37373835626531373831303837613231643336333861663934306364386135616561653264616439 +63633465653637336561373836646436383566353033636237313230393831306535383464643161 +34326164326633353033336435333630353836626530303830656231353061393038393735616339 +32313039343961623636373336616564666230343961383935616536616231376361393338326530 +33373338383234663130373563636162393966623036363531623461633631656161613166366261 +39363163666463316435363938623135326361363466346266333833396135353839306662303939 +38383431386139326530376537333264346264373565303735363861656637373234333965613639 +63336635316632353130356138666465356334623033356339636132393366366265313934643335 +32306435653666663035323463623239633939616464666132356361613035313861356262336632 +38303032666537623761633737633564383332336132663061653037353239623836356163316564 +33653131353436313565653531363762353336373363316464343365346265636439353261363134 +39313363323635653264343131653666623963366366616266663566636239373232333766663962 +63393630643166393761313839616236373631383166613564633564613235613338323031333762 +61326134353938393764343063363764366633663462383533633734386363313266326161303762 +35386637356466653037626262613439376165616463366338346338646563353637376130313438 +61656638393239343039613064633438393063623232663031643839323734643432636633303264 +63336536333063633262376239646536636435623863336236323836363939633737613232313564 +30303165303235653664626133333436393836366437383463313530326666656363393139393662 +36623438633230353563343731633035626565343963373630316132393564363230333866366239 +61633363356531663338613236343466393834666433366139313636653730303966656633373135 +64613966323833393465303339353637363766323965373631343337333564386138383630303935 +39643132313135396461323361643265393064363966393234663662396132316639616230326265 +33346463373935373833643764623231363134636337336365383038656437326333303138623566 +64663562316166356161353830666231356635653332366238353135323465653739306638353261 +35636430656164353963303435303736373833336439653133666166616332666436393637646537 +39373335333337343931353535363534636434316130376635353831386461643536623835313332 +31646564373533333031353365626433613762636463613336616633343230643764306334643662 +36653833336236663834323833663533653439653731323435336665306133646432376437613761 +33306533663135333532323838653130633361653033383334386435343832663434383031396637 +37373662373239363136396332633762616137326233646264373661383464333132343963383338 +30336331613439346138643531643333356135316538653331353530353232643537313661386566 +32633031613236366264626466633033336431346134326338656534303634356238653164366532 +34633466643235303362663130356232636233626666353161663561623634313966326630343466 +32306364613634623930656538336634336430306235356536663361343264366136306230313738 +62353436353638656664353438663361313235356365396336356464353832306238626162396330 +61323262303337383239646238396364623634386635643764353330346433663665383561326339 +61616164613931363337656264353439373033366133303835393637623265323032653361303961 +38353665643264396439616363323761626538643465333463363032616333306238326332303231 +34336461396664643332323335363266323036373036666235656165653736393836393365303530 +38386564346231623238313030396339666262383638666539653138356139316664333364313031 +31346133343731663234653465383961396465616432313432653466303337383332316133323662 +61363731313662313035373136613761653030613139363133316331356532393133393332613039 +31613934346365633935373761303566656231303766303130363337626431396661343335643463 +32376235353466353831346265316336363961386132643531393831373830343230366531303933 +35646535386132643964393832363239353637383838336336653230353036663461653935666463 +33333938636237636135396637616666353036313332353666303166623531353838323361336364 +35656132616130363133366231323164323635313632353835623236373638353237386535346336 +31323661636366346232616563366230336562326132646665636562616561383665643561393232 +62623864323533656636326264626230666633666563663833386266616233313638653836623438 +32393162396234353262356232666462643466653461633532343638323533656633306335623565 +38316330323438383837646265323832613933316135326234383864333737653735666438323965 +61326266646663363162303036343139623265303331623239356466333430356431333664376339 +61636631316436656337353833336630373036383736353166653434393433333664376562346631 +34306662363935613633323539326164666130363538643038366265373734643961656465623830 +39633862383636643939336232323832613832383465666239343236363566343363323836616661 +65643364663538316138383038626161303331653832656337303933356664383435376336313832 +30313832653064316239356661323138383762383864613233333530623131376237356136373932 +34636531316364326563373931306635323964616563643563616634643164373765336132613330 +30653862373966333630613635393234356338346138326135306635373666613533626135396437 +65623865666634653665656364393532633766326661313136356461316661323663363838633164 +31386234633438636165373139643337636532363036643632366366636236613164336638663839 +61326462303234326561376636613463316432653762656236396330303465303065633534356433 +62616438336338646437666564336166386333623030306136613236653334306634633666363237 +30333333343032636333383238643732373034646362373831386162316431383235326132363539 +35623737636461303935323962373362323235356666353561663234373730383262343464653265 +61333138326466303230363936383862313334633130336639396630653233623738366261626133 +64356635643030353263623936623766653438666466393736386365383431666136303666663164 +64633932393362356638646333623266353938383564376238643465623165666330313936336566 +64613333633862316234363830346264306565666236393735346466316364306365636164643937 +34613335343532343161303439616464623331383133313133616630366464383838643030633366 +38396230613332306131323434636336636535306437643332343937626336353438343434653539 +32316536386563623537366236653639663138386238623637633836323538316336386365366162 +62346534386332646430656132653761306164653732323461303763363736636330366561666564 +35623536343139666339613961396633363562333637383230626566313133666237643366323930 +35626231323364336531353733313931306163643733386565623536643766303535666666616536 +30636231633330376136306134383531643833663962306433663064383538646133396334616364 +33333630343263353736626330623637393731376138363730323963373661643534623533643863 +31363966613963646334303737616562613537616661383461363136373936623433666364393039 +61306139383531646630653461333231373963626538656166396431666130313361373265666339 +34333762396666353330366334396465353731613734383265336365396634313835666363666531 +63393831336466626334393834323165333165383161306531616532316565316633306538333566 +65353337343862333065393861313464383632666664376266373365613066323037616566393035 +64326135353038313636333163663562646332633066316232653532623265336437356362376364 +32656361313332613261353232396164633332616163343333623236333639613938326633323132 +61653432343436353539383463346365353231353935646431353437313437313139336433383365 +37383763613437636435376265343039376266623534653539613438353335363937316137323335 +39396537316662613362636263363736646332396233666362613933633464343762346332366339 +63376335316261363837346238303361616534306237366632323933333965366632303235646636 +31306263653766323935306139333930376339366534363634646266623831356333353566623137 +39393561643630383262336432386266303531666630356433613233623334663834616264633064 +34626335383166373933393461353738333863643230343834356166653538653135343937376137 +31633537386133313335343164623833383833303632376565643536616363643830376462346231 +38353431653330366435623062303634663332613038616563336364656333346537663365326161 +65323437623132376235343234666263383566383134366566313633623431333834303762353138 +34623338316131333062363635636361623336643332373462636537656635353066623531306262 +313666303466366361313532616333623131 |