diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index ad41532b..f2efb58b 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -3,7 +3,7 @@ name: Validate Pull Request on: pull_request env: - PYTHON_VERSION: 3.8 + PYTHON_VERSION: 3.10.14 jobs: validate: @@ -16,9 +16,11 @@ jobs: uses: actions/setup-python@v1 with: python-version: ${{ env.PYTHON_VERSION }} + - name: Install pipenv + run: pip install pipenv - name: Change Directory run: cd ${{ github.workspace }} - - name: Install MkDocs - run: make install + - name: Install packages + run: pipenv install - name: Lint - run: make lint \ No newline at end of file + run: pipenv run make lint \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 789a6c04..5695d3b3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,7 @@ on: - main env: - PYTHON_VERSION: 3.8 + PYTHON_VERSION: 3.10.14 jobs: publish: @@ -19,10 +19,12 @@ jobs: uses: actions/setup-python@v1 with: python-version: ${{ env.PYTHON_VERSION }} + - name: Install pipenv + run: pip install pipenv - name: Change Directory run: cd ${{ github.workspace }} - - name: Install MkDocs - run: make install + - name: Install packages + run: pipenv install - name: Deploy run: make deploy - name: Zip Sample Data diff --git a/Makefile b/Makefile index 6a31ebbd..d6039c3d 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +2,6 @@ all: install serve -install: - pip install --upgrade pip - pip install -r requirements.txt - mkdocs --version - lint: mkdocs build diff --git a/Pipfile b/Pipfile new file mode 100644 index 00000000..09065671 --- /dev/null +++ b/Pipfile @@ -0,0 +1,17 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +jinja2 = "*" +mkdocs = "*" +mkdocs-material = "*" +mkdocs-mermaid2-plugin = "*" +mkdocs-redirects = "*" + +[dev-packages] + +[requires] +python_version = "3.10" +python_full_version = "3.10.14" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 00000000..ef69c1ca --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,615 @@ +{ + "_meta": { + "hash": { + "sha256": "4bda1726034bdf257dcb2b7e17ac915ba8b6b859aa9f10a04e75296a1d976550" + }, + "pipfile-spec": 6, + "requires": { + "python_full_version": "3.10.14", + "python_version": "3.10" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "babel": { + "hashes": [ + "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", + "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316" + ], + "markers": "python_version >= '3.8'", + "version": "==2.16.0" + }, + "beautifulsoup4": { + "hashes": [ + "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", + "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==4.12.3" + }, + "certifi": { + "hashes": [ + "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", + "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" + ], + "markers": "python_version >= '3.6'", + "version": "==2024.7.4" + }, + "charset-normalizer": { + "hashes": [ + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" + }, + "click": { + "hashes": [ + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.7" + }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "version": "==0.4.6" + }, + "editorconfig": { + "hashes": [ + "sha256:24857fa1793917dd9ccf0c7810a07e05404ce9b823521c7dce22a4fb5d125f80" + ], + "version": "==0.12.4" + }, + "ghp-import": { + "hashes": [ + "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", + "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343" + ], + "version": "==2.1.0" + }, + "idna": { + "hashes": [ + "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + ], + "markers": "python_version >= '3.5'", + "version": "==3.7" + }, + "jinja2": { + "hashes": [ + "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", + "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==3.1.4" + }, + "jsbeautifier": { + "hashes": [ + "sha256:ebd733b560704c602d744eafc839db60a1ee9326e30a2a80c4adb8718adc1b24" + ], + "version": "==1.15.1" + }, + "markdown": { + "hashes": [ + "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", + "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224" + ], + "markers": "python_version >= '3.8'", + "version": "==3.6" + }, + "markupsafe": { + "hashes": [ + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.5" + }, + "mergedeep": { + "hashes": [ + "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", + "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307" + ], + "markers": "python_version >= '3.6'", + "version": "==1.3.4" + }, + "mkdocs": { + "hashes": [ + "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7", + "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.6.0" + }, + "mkdocs-get-deps": { + "hashes": [ + "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", + "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134" + ], + "markers": "python_version >= '3.8'", + "version": "==0.2.0" + }, + "mkdocs-material": { + "hashes": [ + "sha256:1b1f49066fdb3824c1e96d6bacd2d4375de4ac74580b47e79ff44c4d835c5fcb", + "sha256:31833ec664772669f5856f4f276bf3fdf0e642a445e64491eda459249c3a1ca8" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==9.5.31" + }, + "mkdocs-material-extensions": { + "hashes": [ + "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", + "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31" + ], + "markers": "python_version >= '3.8'", + "version": "==1.3.1" + }, + "mkdocs-mermaid2-plugin": { + "hashes": [ + "sha256:4e25876b59d1e151ca33a467207b346404b4a246f4f24af5e44c32408e175882", + "sha256:bea5f3cbe6cb76bad21b81e49a01e074427ed466666c5d404e62fe8698bc2d7c" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==1.1.1" + }, + "mkdocs-redirects": { + "hashes": [ + "sha256:497089f9e0219e7389304cffefccdfa1cac5ff9509f2cb706f4c9b221726dffb", + "sha256:9420066d70e2a6bb357adf86e67023dcdca1857f97f07c7fe450f8f1fb42f861" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==1.2.1" + }, + "packaging": { + "hashes": [ + "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + ], + "markers": "python_version >= '3.8'", + "version": "==24.1" + }, + "paginate": { + "hashes": [ + "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d" + ], + "version": "==0.5.6" + }, + "pathspec": { + "hashes": [ + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" + ], + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, + "platformdirs": { + "hashes": [ + "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" + ], + "markers": "python_version >= '3.8'", + "version": "==4.2.2" + }, + "pygments": { + "hashes": [ + "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" + ], + "markers": "python_version >= '3.8'", + "version": "==2.18.0" + }, + "pymdown-extensions": { + "hashes": [ + "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753", + "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626" + ], + "markers": "python_version >= '3.8'", + "version": "==10.9" + }, + "python-dateutil": { + "hashes": [ + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.9.0.post0" + }, + "pyyaml": { + "hashes": [ + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" + ], + "markers": "python_version >= '3.8'", + "version": "==6.0.2" + }, + "pyyaml-env-tag": { + "hashes": [ + "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb", + "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069" + ], + "markers": "python_version >= '3.6'", + "version": "==0.1" + }, + "regex": { + "hashes": [ + "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c", + "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535", + "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24", + "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce", + "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc", + "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5", + "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce", + "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53", + "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d", + "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c", + "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908", + "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8", + "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024", + "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281", + "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a", + "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169", + "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364", + "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa", + "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be", + "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53", + "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759", + "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e", + "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b", + "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52", + "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610", + "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05", + "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2", + "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca", + "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0", + "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293", + "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289", + "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e", + "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f", + "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c", + "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94", + "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad", + "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46", + "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9", + "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9", + "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee", + "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9", + "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1", + "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9", + "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799", + "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1", + "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b", + "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf", + "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5", + "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2", + "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e", + "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51", + "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506", + "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73", + "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7", + "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5", + "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57", + "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4", + "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd", + "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b", + "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41", + "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe", + "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59", + "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8", + "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f", + "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e", + "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750", + "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1", + "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96", + "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc", + "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440", + "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe", + "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38", + "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950", + "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2", + "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd", + "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce", + "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66", + "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3", + "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86" + ], + "markers": "python_version >= '3.8'", + "version": "==2024.7.24" + }, + "requests": { + "hashes": [ + "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" + ], + "markers": "python_version >= '3.8'", + "version": "==2.32.3" + }, + "setuptools": { + "hashes": [ + "sha256:80aacbf633704e9c8bfa1d99fa5dd4dc59573efcf9e4042c13d3bcef91ac2ef9", + "sha256:f11dd94b7bae3a156a95ec151f24e4637fb4fa19c878e4d191bfb8b2d82728c4" + ], + "markers": "python_version >= '3.8'", + "version": "==72.2.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "soupsieve": { + "hashes": [ + "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", + "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" + ], + "markers": "python_version >= '3.8'", + "version": "==2.6" + }, + "urllib3": { + "hashes": [ + "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", + "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.2" + }, + "watchdog": { + "hashes": [ + "sha256:0b4359067d30d5b864e09c8597b112fe0a0a59321a0f331498b013fb097406b4", + "sha256:0d8a7e523ef03757a5aa29f591437d64d0d894635f8a50f370fe37f913ce4e19", + "sha256:0e83619a2d5d436a7e58a1aea957a3c1ccbf9782c43c0b4fed80580e5e4acd1a", + "sha256:10b6683df70d340ac3279eff0b2766813f00f35a1d37515d2c99959ada8f05fa", + "sha256:132937547a716027bd5714383dfc40dc66c26769f1ce8a72a859d6a48f371f3a", + "sha256:1cdcfd8142f604630deef34722d695fb455d04ab7cfe9963055df1fc69e6727a", + "sha256:2d468028a77b42cc685ed694a7a550a8d1771bb05193ba7b24006b8241a571a1", + "sha256:32be97f3b75693a93c683787a87a0dc8db98bb84701539954eef991fb35f5fbc", + "sha256:770eef5372f146997638d737c9a3c597a3b41037cfbc5c41538fc27c09c3a3f9", + "sha256:7c7d4bf585ad501c5f6c980e7be9c4f15604c7cc150e942d82083b31a7548930", + "sha256:88456d65f207b39f1981bf772e473799fcdc10801062c36fd5ad9f9d1d463a73", + "sha256:914285126ad0b6eb2258bbbcb7b288d9dfd655ae88fa28945be05a7b475a800b", + "sha256:936acba76d636f70db8f3c66e76aa6cb5136a936fc2a5088b9ce1c7a3508fc83", + "sha256:980b71510f59c884d684b3663d46e7a14b457c9611c481e5cef08f4dd022eed7", + "sha256:984306dc4720da5498b16fc037b36ac443816125a3705dfde4fd90652d8028ef", + "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1", + "sha256:aa160781cafff2719b663c8a506156e9289d111d80f3387cf3af49cedee1f040", + "sha256:b2c45f6e1e57ebb4687690c05bc3a2c1fb6ab260550c4290b8abb1335e0fd08b", + "sha256:b4dfbb6c49221be4535623ea4474a4d6ee0a9cef4a80b20c28db4d858b64e270", + "sha256:baececaa8edff42cd16558a639a9b0ddf425f93d892e8392a56bf904f5eff22c", + "sha256:bcfd02377be80ef3b6bc4ce481ef3959640458d6feaae0bd43dd90a43da90a7d", + "sha256:c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8", + "sha256:c100d09ac72a8a08ddbf0629ddfa0b8ee41740f9051429baa8e31bb903ad7508", + "sha256:c344453ef3bf875a535b0488e3ad28e341adbd5a9ffb0f7d62cefacc8824ef2b", + "sha256:c50f148b31b03fbadd6d0b5980e38b558046b127dc483e5e4505fcef250f9503", + "sha256:c82253cfc9be68e3e49282831afad2c1f6593af80c0daf1287f6a92657986757", + "sha256:cd67c7df93eb58f360c43802acc945fa8da70c675b6fa37a241e17ca698ca49b", + "sha256:d7ab624ff2f663f98cd03c8b7eedc09375a911794dfea6bf2a359fcc266bff29", + "sha256:e252f8ca942a870f38cf785aef420285431311652d871409a64e2a0a52a2174c", + "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22", + "sha256:eeea812f38536a0aa859972d50c76e37f4456474b02bd93674d1947cf1e39578", + "sha256:f15edcae3830ff20e55d1f4e743e92970c847bcddc8b7509bcd172aa04de506e", + "sha256:f5315a8c8dd6dd9425b974515081fc0aadca1d1d61e078d2246509fd756141ee", + "sha256:f6ee8dedd255087bc7fe82adf046f0b75479b989185fb0bdf9a98b612170eac7", + "sha256:f7c739888c20f99824f7aa9d31ac8a97353e22d0c0e54703a547a218f6637eb3" + ], + "markers": "python_version >= '3.8'", + "version": "==4.0.2" + } + }, + "develop": {} +} diff --git a/README.md b/README.md index ae9a4068..f280cd2f 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,28 @@ ElectionGuard is always improving. To keep up with the latest, check our **[offi This repository is a living document to help everyone interact with ElectionGuard. The [official ElectionGuard site][election-guard-official-page] is built using the `/docs` folder and [mkdocs][mkdocs-official-site] with [mkdocs-material][material-mkdocs]. Ensure you have the Python 3.8 or newer installed and run `make` to install the dependencies and start the site. +#### Setup + +This repo uses [pipenv](https://pipenv.pypa.io/en/latest/) for package and environment management. Disregard the `requirements.txt` file as it will be removed in a subsequent release. + +1. Install packages + +```sh +pipenv install +``` + +1. Run `make build` command from within the virtualenv + +```sh +pipenv run make build +``` + +1. Serve the site + +```sh +pipenv run make serve +``` + ### C ++ An ElectionGuard Core implemented in C++ to support ballot encryption and all phases of the Guardian key and tally ceremonies, including creation of the election package and production of the election record. diff --git a/docs/Reports/E2EVerifiability.md b/docs/Reports/E2EVerifiability.md index be2cbbc5..22359485 100644 --- a/docs/Reports/E2EVerifiability.md +++ b/docs/Reports/E2EVerifiability.md @@ -6,5 +6,5 @@ The report provides an overview of the ElectionGuard Pilot in the 2022 Franklin ![Cover Photo2][Cover-Photo-2] -[EAC-Report]: /images/EAC%20Report%20Final.pdf -[Cover-Photo-2]: /images/coverphoto.png "Cover Photo 2" \ No newline at end of file +[EAC-Report]: ../images/EAC%20Report%20Final.pdf +[Cover-Photo-2]: ../images/coverphoto.png "Cover Photo 2" \ No newline at end of file diff --git a/docs/develop/Applications.md b/docs/develop/Applications.md index a0f797e0..5470b9c7 100644 --- a/docs/develop/Applications.md +++ b/docs/develop/Applications.md @@ -8,7 +8,7 @@ If you develop an app for ElectionGuard, we suggest you [utilize our badges][bad ### ElectionGuard Core -An ElectionGuard Core is an application that implements the base level [features] such as Ballot Encryption by implementing them according to the specification. The internal examples of this are the Python and C++ reference implementations. There is a community example of this with the Java port done by the community. +An ElectionGuard Core is an application that implements the base level features such as Ballot Encryption by implementing them according to the specification. The internal examples of this are the Python and C++ reference implementations. There is a community example of this with the Java port done by the community. ### Ballot Marking @@ -50,13 +50,12 @@ The results of election can be displayed after an election is closed. An example A verifier app verifies an election is true and accurate by using the publicly published information about a completed election. At the close of an election using ElectionGuard, an election record should be created and made public. ElectionGuard encourages third parties to create their own verifiers and help verify election records. A basic example of a verifier can be found within the [electionguard-python repository][verifier], but verifiers should aim to be as thorough as possible. After consuming the files in an election record, verifiers can validate everything from the key ceremony to the decryption since the election is end to end verifiable. -[selections]: ../../overview/Glossary/#selection -[plaintext-ballot]: ../../overview/Glossary/#plaintext-ballot -[ciphertext-ballot]: ../../overview/Glossary/#ciphertext-ballot -[cast-ballot]: ../../overview/Glossary/#cast-ballot -[spoiled-ballot]: ../../overview/Glossary/#spoiled-ballot -[badges]: ../Badges -[features]: ../../overview/Features +[selections]: ../overview/Glossary.md#selection +[plaintext-ballot]: ../overview/Glossary.md#plaintext-ballot +[ciphertext-ballot]: ../overview/Glossary.md#ciphertext-ballot +[cast-ballot]: ../overview/Glossary.md#cast-ballot +[spoiled-ballot]: ../overview/Glossary.md#spoiled-ballot +[badges]: Badges.md [admin app]: https://github.com/microsoft/electionguard-ui/tree/main/packages/admin-app [result app ]: https://github.com/microsoft/electionguard-ui/tree/main/packages/result-app [api client]: https://github.com/microsoft/electionguard-ui/tree/main/packages/api-client diff --git a/docs/develop/Badges.md b/docs/develop/Badges.md index 0e277c2f..e92fc1ce 100644 --- a/docs/develop/Badges.md +++ b/docs/develop/Badges.md @@ -24,7 +24,12 @@ For your convenience, these are some badges to add to your repository indicating [![ElectionGuard 2.0][badge-2.0]][spec] ``` -[![ElectionGuard 2.0](https://img.shields.io/badge/πŸ—³%20ElectionGuard-v2.0-yellow)](https://www.electionguard.vote/spec) +[![ElectionGuard 2.0](https://img.shields.io/badge/πŸ—³%20ElectionGuard-v2.0-green)](https://www.electionguard.vote/spec) +``` + +[![ElectionGuard 2.1][badge-2.1]][spec] +``` +[![ElectionGuard 2.1](https://img.shields.io/badge/πŸ—³%20ElectionGuard-v2.1-green)](https://www.electionguard.vote/spec) ``` @@ -34,6 +39,7 @@ For your convenience, these are some badges to add to your repository indicating [badge-0.95]: https://img.shields.io/badge/πŸ—³%20ElectionGuard-v0.95-green [badge-1.0]: https://img.shields.io/badge/πŸ—³%20ElectionGuard-v1.0-green [badge-1.1]: https://img.shields.io/badge/πŸ—³%20ElectionGuard-v1.1-green -[badge-2.0]: https://img.shields.io/badge/πŸ—³%20ElectionGuard-v2.0-yellow +[badge-2.0]: https://img.shields.io/badge/πŸ—³%20ElectionGuard-v2.0-green +[badge-2.1]: https://img.shields.io/badge/πŸ—³%20ElectionGuard-v2.1-green --8<-- "includes/abbreviations.md" \ No newline at end of file diff --git a/docs/develop/Data_Schema.md b/docs/develop/Data_Schema.md index 63165aab..39374133 100644 --- a/docs/develop/Data_Schema.md +++ b/docs/develop/Data_Schema.md @@ -38,8 +38,8 @@ Currently, JSON is used as the primary serialization format of the artifacts fro [shield-green-0.95]: https://img.shields.io/badge/πŸ—³%20ElectionGuard-v0.95-green [json-schema]: https://json-schema.org/specification.html "Json Schema Specification" -[election-record]: ../Election_Record -[sample-data]: ../Sample_Data +[election-record]: Election_Record.md +[sample-data]: Sample_Data.md [manifest]: https://github.com/microsoft/electionguard/blob/main/data/1.91/schema/manifest.schema.json "Manifest Json Schema" [ciphertext_election_context]: https://github.com/microsoft/electionguard/blob/main/data/1.91/schema/ciphertext_election_context.schema.json "Ciphertext Election Context Json Schema" [election_constants]: https://github.com/microsoft/electionguard/blob/main/data/1.91/schema/election_constants.schema.json "Election Constants Json Schema" diff --git a/docs/develop/Getting_Started.md b/docs/develop/Getting_Started.md index a24a04a5..73d63c67 100644 --- a/docs/develop/Getting_Started.md +++ b/docs/develop/Getting_Started.md @@ -5,11 +5,8 @@ ElectionGuard as an SDK provides a specification and reference implementations w 1. [**Create an app**][applications] using ElectionGuard 2. [**Contribute**][contribute] to ElectionGuard's open source - !!! tip - If you're having trouble understanding where to start, the **[architecture][architecture]** pages dive in a bit deeper. Take a look at **[versioning]** to get a good idea of what is still in progress. - - + If you're having trouble understanding where to start, take a look at **[versioning]** to get a good idea of what is still in progress. ## Create an App @@ -17,7 +14,7 @@ There are many different possible applications that can be created using Electio ## Contribute to Open Source -ElectionGuard is an open source platform and depends on an active community and ecosystem. The **[contribute][contribute]** page highlights some top level ways to contribute. For those that want to jump right in, take a look at our **[approach][approach]** and our **[repositories][repositories]**. +ElectionGuard is an open source platform and depends on an active community and ecosystem. The **[contribute][contribute]** page highlights some top level ways to contribute. For those that want to jump right in, take a look at our **[repositories][repositories]**. !!! note Each repository houses the **in-depth developer documentation** for coding with the repositories. @@ -25,11 +22,9 @@ ElectionGuard is an open source platform and depends on an active community and ![Code][code-image] [code-image]: ../images/undraw/code_1.svg "Two people sitting at a computer" -[contribute]: ../../contribute -[architecture]: ../Architecture -[applications]: ../Applications -[approach]: ../Approach -[badges]: ../Badges -[data-schema]: ../Data_Schema -[repositories]: ../Repositories -[versioning]: ../Versioning +[contribute]: ../contribute/index.md +[applications]: Applications.md +[badges]: Badges.md +[data-schema]: Data_Schema.md +[repositories]: Repositories.md +[versioning]: Versioning.md diff --git a/docs/develop/Repositories.md b/docs/develop/Repositories.md index f55da47d..402eb6c2 100644 --- a/docs/develop/Repositories.md +++ b/docs/develop/Repositories.md @@ -72,9 +72,9 @@ This UI application features several TypeScript packages as a monorepo, a versio [election-guard-python-documentation]: https://microsoft.github.io/electionguard-python/ "Election Guard Python documentation" [election-guard-cpp-source]: https://github.com/microsoft/electionguard-cpp "Election Guard C++ source code" -[election-guard-spec-overview]: ../../spec "ElectionGuard Specification" +[election-guard-spec-overview]: ../spec/index.md "ElectionGuard Specification" [election-guard-verifiability]: ../concepts/Verifiability.md "Election Guard Verifiability" -[election-guard-post-election-audit]: ../Glossary/#post-election-audit "Election Guard Post-Election Audit" +[election-guard-post-election-audit]: ../overview/Glossary.md#post-election-audit "Election Guard Post-Election Audit" [election-guard-api-source]: https://github.com/microsoft/electionguard-api-python "Election Guard Web API source code" [election-guard-ui-source]: https://github.com/microsoft/electionguard-ui "Election Guard UI source code" diff --git a/docs/elections/College_Park_Maryland_2023.md b/docs/elections/College_Park_Maryland_2023.md index 8aca0ecc..b43d8df2 100644 --- a/docs/elections/College_Park_Maryland_2023.md +++ b/docs/elections/College_Park_Maryland_2023.md @@ -1,13 +1,13 @@ ![ElectionGuard College Park Banner][College-Park-Banner] # ElectionGuard in the November 2023 College Park General Election -This November will see College Park use the Hart VerityScan scanner with ElectionGuard in a similar configuration to what was used in the [Preston Idaho election in 2022](Preston_Idaho_2022.md). This year, voters will fill out ballots either by hand or using Hart's [Verity TouchWriter](https://www.youtube.com/watch?v=_GA0kzJrM-s). The official tally will be conducted with the Hart system, which will include mail-in ballots scanned with the VerityScan scanner but, because the voters were not present to collect the confirmation code receipt, will not be able to verify that their ballots were included. +This November will see College Park use the Hart VerityScan scanner with ElectionGuard in a similar configuration to what was used in the [Preston Idaho election in 2022][preston-idaho-pilot]. This year, voters will fill out ballots either by hand or using Hart's [Verity TouchWriter](https://www.youtube.com/watch?v=_GA0kzJrM-s). The official tally will be conducted with the Hart system, which will include mail-in ballots scanned with the VerityScan scanner but, because the voters were not present to collect the confirmation code receipt, will not be able to verify that their ballots were included. -!!! info "Vote by mail is a feature of the [ElectionGuard 2.0 Specification](/spec/#v20)" +!!! info "Vote by mail is a feature of the [ElectionGuard 2.0 Specification][election-guard-spec-v2_0]" ## New Capabilities -While the core Hart system and voting process will be identical to [the system used in Preston, Idaho](/docs/elections/Preston_Idaho_2022.md) the ElectionGuard software will be *almost* (see below) a full [implementation of the 2.0 specification](/docs/spec/index.md). It incorporates most of the new encryption structures, including a new implementation of guardian architecture and elimination of placeholder votes. A fully new version of the admin and guardian software used to run the key and tally ceremonies has also been developed. +While the core Hart system and voting process will be identical to [the system used in Preston, Idaho][preston-idaho-pilot] the ElectionGuard software will be *almost* (see below) a full [implementation of the 2.0 specification][election-guard-spec-v2_0]. It incorporates most of the new encryption structures, including a new implementation of guardian architecture and elimination of placeholder votes. A fully new version of the admin and guardian software used to run the key and tally ceremonies has also been developed. The biggest new capability is a full implementation of thresholding. Thresholding enables a quorum of guardians to participate in a tally ceremony rather than requiring all guardians to be present. (College Park will be using 5 guardians with a quorum of 3 to be present to run the tally ceremony.) Each guardian and the ElectionGuard administrator will be assigned their own Surface Go tablet to run the ceremonies and will use Windows Hello to authenticate on their assigned device. @@ -26,7 +26,7 @@ As a result,there are known aspects of the full 2.0 specification that will not There are fixes already in place that will be published after College Park, but to meet deployment and QA timelines were not released as part of 1.91.18. While it is not best practice by any means to intentionally omit support of components of independent verifier validations, some validations are more important than others, and the implementation risk of missing our deadlines for College Park outweighed the incremental benefit of delivery of the missing elements. -In addition, there are features that are [outlined in the 2.0 spec](/spec/#v20) that are not used in the College Park election, and independent verifier support is thus not necessary nor expected for 1.91.18: +In addition, there are features that are [outlined in the 2.0 spec][election-guard-spec-v2_0] that are not used in the College Park election, and independent verifier support is thus not necessary nor expected for 1.91.18: * Ballot chaining * Pre-encrypted ballots @@ -36,7 +36,7 @@ In addition, there are features that are [outlined in the 2.0 spec](/spec/#v20) Finally, when the verifier was run initially immediately after the tally ceremony on November 5, a data error was discovered around the extended base hash, causing the MITRE 1.I verification (1.H in the 2.0 Specification) to fail. The error was due to an already-addressed issue regarding equation formulation, yet the desired approach was implemented differently in the verifier versus the production code. Since the core ElectionGuard code could not be updated (due to the code freeze cited above), the verifier was modified to interpret the extended base hash correctly and the election was fully verified according to the precepts agreed to above. -!!! abstract "The [MITRE Requirements document](/images/MITRE-EG-CP-requirements.pdf) outlines in detail the encryption and election record capabilities adopted by their verifier for College Park." +!!! abstract "The [MITRE Requirements document][mitre-requirements-doc] outlines in detail the encryption and election record capabilities adopted by their verifier for College Park." !!! tip "Run the verifier yourself!" If you want to run the MITRE verifier yourself, [follow the instructions here](https://mitre.github.io/ElectionGuardVerifier1X.jl/index.html). The [election record for College Park is available at the confirmation code lookup website](https://app.enhancedvoting.com/results/public/cc/CollegePark/nov23). @@ -47,5 +47,8 @@ Finally, when the verifier was run initially immediately after the tally ceremon In-person voters will be asked to participate in an exit survey, and all College Park residents are welcome to participate in an election survey collecting general election feedback in addition to perspectives on ElectionGuard. Upon survey completion, the Center for Civic Design will publish a report on voter sentiment. -[College-Park-Banner]: /images/ElectionGuard_College_Park_2023.svg "College Park Banner" -[hart-scanner]: /images/votingmachine.jpeg \ No newline at end of file +[election-guard-spec-v2_0]: ../spec/index.md#v20 +[College-Park-Banner]: ../images/ElectionGuard_College_Park_2023.svg "College Park Banner" +[preston-idaho-pilot]: Preston_Idaho_2022.md +[hart-scanner]: ../images/votingmachine.jpeg +[mitre-requirements-doc]: ../images/MITRE-EG-CP-requirements.pdf \ No newline at end of file diff --git a/docs/elections/Fulton_Wisconsin_2020.md b/docs/elections/Fulton_Wisconsin_2020.md index db2c48e0..4e37b410 100644 --- a/docs/elections/Fulton_Wisconsin_2020.md +++ b/docs/elections/Fulton_Wisconsin_2020.md @@ -14,4 +14,4 @@ Three election guardians oversaw the ElectionGuard tally process. No independent ### ["Microsoft’s voting software is getting its first test in a small Wisconsin town" CNBC, February 18, 2020](https://www.cnbc.com/2020/02/18/microsoft-electionguard-software-gets-first-test-in-fulton-wisconsin.html) -[Fulton-Banner]: /images/ElectionGuard_Fulton_2020.svg "Fulton Banner" +[Fulton-Banner]: ../images/ElectionGuard_Fulton_2020.svg "Fulton Banner" diff --git a/docs/elections/Preston_Idaho_2022.md b/docs/elections/Preston_Idaho_2022.md index d975a6ea..45f07cc0 100644 --- a/docs/elections/Preston_Idaho_2022.md +++ b/docs/elections/Preston_Idaho_2022.md @@ -45,6 +45,6 @@ MITRE wrote an independent verifier for this election to ensure that ElectionGua * Increased their confidence in the accuracy and security of elections.Β  -[Idaho-Banner]: /images/ElectionGuard-Idaho-2022.svg "Idaho Banner" -[hart-scanner]: /images/votingmachine.jpeg -[EAC-Report]: /images/EAC%20Report%20Final.pdf +[Idaho-Banner]: ../images/ElectionGuard-Idaho-2022.svg "Idaho Banner" +[hart-scanner]: ../images/votingmachine.jpeg +[EAC-Report]: ../images/EAC%20Report%20Final.pdf diff --git a/docs/index.md b/docs/index.md index 8a039d65..1dc7872a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -57,7 +57,7 @@ A huge thank you to those who have helped us along the way: [oxide-design]: https://oxidedesign.com/ "Oxide Design" [contribute-index]: contribute/index.md "Contributors" -[glossary-end-to-end-verifiable]: overview/Glossary/#end-to-end-verifiable-elections "End-to-End Verifiable Elections" -[glossary-post-election-audit]: overview/Glossary/#post-election-audit "Post-election audit" +[glossary-end-to-end-verifiable]: overview/Glossary.md#end-to-end-verifiable-election "End-to-End Verifiable Elections" +[glossary-post-election-audit]: overview/Glossary.md#post-election-audit "Post-election audit" [develop-getting-started]: develop/Getting_Started.md "Developer - Getting Started" [roadmap]: overview/Roadmap.md "ElectionGuard - Roadmap" \ No newline at end of file diff --git a/docs/overview/Glossary.md b/docs/overview/Glossary.md index ed58cf4e..2c025c6e 100644 --- a/docs/overview/Glossary.md +++ b/docs/overview/Glossary.md @@ -44,7 +44,7 @@ A unique hash value generated by an [encryption device](#encryption-device) to a ### ballot decryption -Decrypting a secure encrypted [ciphertext ballot](ciphertext-ballot) to a readable [plaintext ballot](plaintext-ballot). +Decrypting a secure encrypted [ciphertext ballot](#ciphertext-ballot) to a readable [plaintext ballot](#plaintext-ballot). ```mermaid graph LR @@ -112,7 +112,7 @@ A [guardian's](#guardian) partial share of a [ballot decryption](#ballot-decrypt ### election -An election in ElectionGuard is an election as described by a [manifest](#manifest). An election will have one [encryption key](#encryption-key) to encrypt ballots and after tally, will result in an [election record](#election-record). +An election in ElectionGuard is an election as described by a [manifest](#manifest). An election will have one [encryption key](#joint-key) to encrypt ballots and after tally, will result in an [election record](#election-record). ### election key pair @@ -175,7 +175,7 @@ An end-to-end verifiable election must include two principle components: ### guardian -One of a number of independent, trustworthy individuals who serve guardians in the election. All guardians must participate in a [key ceremony](#key-ceremony) to create a [key](#joint-key) to encrypt the election and may participate in the accompanying tally ceremony(s) to decrypt the [tally(s)](#tally). A guardian is *available* if they are available for the tally ceremony. A guardian is *missing* if they cannot attend the tally ceremony. +One of a number of independent, trustworthy individuals who serve guardians in the election. All guardians must participate in a [key ceremony](#key-ceremony) to create a [key](#joint-key) to encrypt the election and may participate in the accompanying tally ceremony(s) to decrypt the [tally(s)](#plaintext-tally). A guardian is *available* if they are available for the tally ceremony. A guardian is *missing* if they cannot attend the tally ceremony. ###### _Other terms:_ election guardian, missing guardian, available guardian @@ -210,7 +210,7 @@ The process conducted at the beginning of the election to create the [joint key] ### key pair -A _key pair_ consists of a linked _private key_ and _public key_. Key pairs are used in [public key cryptography][cryptographic-context], in which public keys are distributed to others to [encrypt](#encrypting-a-ballot) messages that only the private key can [decrypt](#decrypt). +A _key pair_ consists of a linked _private key_ and _public key_. Key pairs are used in [public key cryptography][cryptographic-context], in which public keys are distributed to others to [encrypt](#ballot-encryption) messages that only the private key can [decrypt](#ballot-decryption). ```mermaid graph LR @@ -357,8 +357,8 @@ A zero-knowledge proof is a method by which one party (the prover) can prove to [^2]: [Zero-Knowledge Proof from Wikipedia][zero-knowledge-proof] -[Specification]: ../../spec -[Repositories]: ../../develop/Repositories +[Specification]: ../spec/index.md +[Repositories]: ../develop/Repositories.md [nist-data-format]: https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.1500-100r2.pdf "NIST Election Results Common Data Format Specification" [civics-data-format]: https://developers.google.com/elections-data/reference "Civics Common Standard Data Specification" [cryptographic-context]: https://en.wikipedia.org/wiki/Cryptographic_hash_function "Cryptographic hash function" diff --git a/docs/overview/Roadmap.md b/docs/overview/Roadmap.md index f43c5324..de80d06d 100644 --- a/docs/overview/Roadmap.md +++ b/docs/overview/Roadmap.md @@ -32,7 +32,7 @@ The specification itself will accommodate a lot of efficiency improvements and s ## 2022 Roadmap -2022 focused on a full 1.0 release of functionality across the Python and C++ repos. We needed to [support a pilot election in Franklin County, Idaho](events\Idaho_Pilot_2022) in partnership with Hart InterCivic on their Verity Precinct Scanner. MITRE worked with us to release the first truly full-featured verifier that was used to verify the election results, and Enhanced Voting hosted the confirmation-code-lookup website. +2022 focused on a full 1.0 release of functionality across the Python and C++ repos. We needed to [support a pilot election in Franklin County, Idaho][preston-idaho-pilot] in partnership with Hart InterCivic on their Verity Precinct Scanner. MITRE worked with us to release the first truly full-featured verifier that was used to verify the election results, and Enhanced Voting hosted the confirmation-code-lookup website. ## 2021 Roadmap @@ -75,7 +75,7 @@ A big step toward this new vision occurred with the release of the `electionguar 2020 provided many lessons. -During the first half of the year ElectionGuard was used successfully as a [Pilot in Fulton, WI][fulton-wi-election-pilot] with the help of [VotingWorks][voting-works] and [InfernoRed][infernored]. Subsequent to the pilot ElectionGuard released the [Python][election-guard-python-source] repo as a new reference implementation. +During the first half of the year ElectionGuard was used successfully as a [Pilot in Fulton, WI][cnn-news-fulton-wi] with the help of [VotingWorks][voting-works] and [InfernoRed][infernored]. Subsequent to the pilot ElectionGuard released the [Python][election-guard-python-source] repo as a new reference implementation. In the [second half of the year][election-guard-security-pilot], responding to COVID, led to the development of a remote voting app with [InfernoRed][infernored], [Markup][markup], and the US House Democratic Caucus to enable representatives to [vote by secret ballot safely, securely, and remotely for Caucus leadership positions][dems-virtual-leadership-election]. @@ -87,7 +87,7 @@ Last, and definitely not least, ElectionGuard [developed and published its first ??? done "Use ElectionGuard in a real-world end-to-end verifiable election" - * Run a verifiable election [Fulton, Wisconsin][Fulton] with [VotingWorks][voting-works] using smart cards, a ballot box, an admin device, and a ballot tracking site. + * Run a verifiable election [Fulton, Wisconsin][msft-news-fulton-wi] with [VotingWorks][voting-works] using smart cards, a ballot box, an admin device, and a ballot tracking site. * Integrate ElectionGuard with the VotingWorks print station and user flow * Build ballot box functionality to capture and seal ballots * Build admin device to enable tallies and key ceremonies @@ -125,13 +125,13 @@ Last, and definitely not least, ElectionGuard [developed and published its first [ElectionTools]: https://blogs.microsoft.com/on-the-issues/2020/12/04/electionguard-2020-elections-security-pilot/ -[Fulton]: https://news.microsoft.com/on-the-issues/2020/05/13/microsoft-electionguard-pilot-wisconsin/ +[msft-news-fulton-wi]: https://news.microsoft.com/on-the-issues/2020/05/13/microsoft-electionguard-pilot-wisconsin/ [evercrypt]: https://github.com/project-everest/hacl-star#evercrypt "Evercrypt" [windows-universal-application-guide]: https://docs.microsoft.com/en-us/windows/uwp/get-started/universal-application-platform-guide "Windows Universal APplication platform guide" [election-guard-python-source]: https://github.com/microsoft/electionguard-python "Election Guard Python source code" [election-guard-security-pilot]: https://blogs.microsoft.com/on-the-issues/2020/12/04/electionguard-2020-elections-security-pilot/ "Election Guard security pilot 2020" [protobuf-source]: https://github.com/protocolbuffers/protobuf "Protobuf source code" -[fulton-wi-election-pilot]: https://www.cnn.com/2020/02/22/tech/microsoft-election-guard-voting-test/index.html "Fulton, Wisconsin election pilot" +[cnn-news-fulton-wi]: https://www.cnn.com/2020/02/22/tech/microsoft-election-guard-voting-test/index.html "Fulton, Wisconsin election pilot" [voting-works]: https://voting.works "Voting works" [arlo]: https://voting.works/risk-limiting-audits/ "Voting Works risk limiting audits" [inyo-risk-limiting-audit]: https://elections.inyocounty.us/post-election-audits/ "Inyo's risk limiting post-election audit" @@ -140,3 +140,4 @@ Last, and definitely not least, ElectionGuard [developed and published its first [dems-virtual-leadership-election]: https://www.dems.gov/newsroom/press-releases/house-democrats-successfully-conclude-first-ever-virtual-leadership-elections "house democrats successfully conclude first-ever virtual leadership elections" [election-guard-contribute]: ../contribute/index.md "Election Guard Contribute" +[preston-idaho-pilot]: ../elections/Preston_Idaho_2022.md diff --git a/docs/spec/Serialization_Spec.md b/docs/spec/Serialization_Spec.md new file mode 100644 index 00000000..8394d538 --- /dev/null +++ b/docs/spec/Serialization_Spec.md @@ -0,0 +1,19 @@ +# ElectionGuard Serialization Specification + +This specification exists to help anyone trying to write a compatible implementation or, crucially, anyone trying to write a verifier. The design says what has to be done, how, and why. The data serialization spec describes the data formats used in the implementation to achieve the design. The data serialization spec currently matches the v2.0 implementation. + +Version | Specification | Recommended | Compatible [EG Spec][ElectionGuard Specification] +:------ |:-----------------------------------------------|:----------------:| :------------------------------------------------ +0.0.1 | [:material-download: Download][sp-spec-0.0.1] | | ![Version 2.0][badge-2.0] + + +[ElectionGuard Specification]: index.md +[badge]: ../develop/Badges.md +[versioning]: ../develop/Versioning.md + +[sp-spec-0.0.1]: https://github.com/microsoft/electionguard/releases/download/v2.1/EG_2_0_data_serialization_spec_0_0_1.pdf +[badge-2.1]: https://img.shields.io/badge/πŸ—³%20ElectionGuard-v2.1-green +[spec-2.1]: https://github.com/microsoft/electionguard/releases/download/v2.1/EG_Spec_2_1.pdf "Election Guard Specification 2.1" + +[badge-2.0]: https://img.shields.io/badge/πŸ—³%20ElectionGuard-v2.0-green +[spec-2.0]: https://github.com/microsoft/electionguard/releases/download/v2.0/EG_Spec_2_0.pdf "Election Guard Specification 2.0" diff --git a/docs/spec/index.md b/docs/spec/index.md index 132e5291..948fd701 100644 --- a/docs/spec/index.md +++ b/docs/spec/index.md @@ -4,14 +4,28 @@ The official versions of the ElectionGuard Specifications are listed below and s Version | Specification | Recommended | Badge :------ |:-----------------------------------------------|:----------------:| :----------- -2.0 | [:material-download: Download][spec-2.0] | :material-check: | ![Version 2.0][badge-2.0] -1.1 | [:material-download: Download][spec-1.1] | | ![Version 1.1][badge-1.1] -1.0 | [:material-download: Download][spec-1.0] | | ![Version 1.0][badge-1.0] -0.95 | [:material-download: Download][spec-0.95] | | ![Version 0.95][badge-0.95] +2.1 | [:material-download: Download][spec-2.1] | :material-check: | ![Version 2.1][badge-2.1] +2.0 | [:material-download: Download][spec-2.0] | :material-check: | ![Version 2.0][badge-2.0] +1.1 | [:material-download: Download][spec-1.1] | | ![Version 1.1][badge-1.1] +1.0 | [:material-download: Download][spec-1.0] | | ![Version 1.0][badge-1.0] +0.95 | [:material-download: Download][spec-0.95] | | ![Version 0.95][badge-0.95] 0.85 | [:material-download: Download][spec-0.85] | | ![Version 0.85][badge-0.85] ### Release Notes +#### v2.1 + +Version 2.1 of the ElectionGuard Design Specification has been significantly extended compared to version 2.0.0 and contains several significant changes. + +- Key generation: Three sets of keys are now generated by the guardians in order to support distinct uses; and a guardian record has been created, which the guardians must verify at the end of the key generation process. +- Ballot preparation: a selection encryption identifier is now created for each ballot, which is used to link together all the ciphertexts and proofs associated to a single ballot; signed ElGamal is now used for encrypting all data other than voter selections; the ballot nonce must now be encrypted and included in each ballot. +- Confirmation codes: A voting device information hash has been added; the simple ballot chaining mode has been detailed and refined. +- Tallying operations: Guardians now verify the election record before starting the tallying operations; support for weighting ballots during aggregation has been added; the verifiable decryption process and protocols have been detailed and updated. +- Audit of challenged ballots: The opening of challenged ballots has been made more efficient by releasing relevant encryption nonces instead of performing verifiable decryption. +- Hash computation steps have been revised and updated in many places, and a hash function that maps to integers modulo q has been defined separately. +- Several components have been designated as optional such as supplemental verifiable fields, contest data, and pre-encrypted ballots. +- A concrete list of verification steps for pre-encrypted ballots has been added. + #### v2.0 2.0 is a major refactor of the ElectionGuard specification. It includes the following capabilities @@ -25,6 +39,7 @@ Version | Specification | Recommended | Ba - Support is now available for instant verification allowing voters to confirm the accuracy of challenge ballots without waiting for the election record to be published. - New default parameters are used with ln(2) replacing the Euler-Mascheroni constant as the basis for generation of the large prime. - The data format of hashes has been clearly described to eliminate ambiguities. + #### v1.0 _Updates from previous version_ @@ -49,10 +64,13 @@ _Updates from previous version_ - Initial public release of specification for ElectionGuard -[ElectionGuard Specification]: ../overview/Glossary/#electionguard-specification -[badge]: ../develop/Badges/ +[ElectionGuard Specification]: ../overview/Glossary.md#electionguard-specification +[badge]: ../develop/Badges.md [versioning]: ../develop/Versioning.md +[badge-2.1]: https://img.shields.io/badge/πŸ—³%20ElectionGuard-v2.1-green +[spec-2.1]: https://github.com/microsoft/electionguard/releases/download/v2.1/EG_Spec_2_1.pdf "Election Guard Specification 2.1" + [badge-2.0]: https://img.shields.io/badge/πŸ—³%20ElectionGuard-v2.0-green [spec-2.0]: https://github.com/microsoft/electionguard/releases/download/v2.0/EG_Spec_2_0.pdf "Election Guard Specification 2.0" diff --git a/docs/use_cases/Precinct_Scan.md b/docs/use_cases/Precinct_Scan.md index 83672dac..dce600c8 100644 --- a/docs/use_cases/Precinct_Scan.md +++ b/docs/use_cases/Precinct_Scan.md @@ -130,6 +130,6 @@ A dehydrated ballot **_must_** provide the following data to be properly _rehydr [ballot-manifest]: https://www.electionguard.vote/guide/Election_Manifest/ [ballot-manifest-data-validation]: https://www.electionguard.vote/guide/Election_Manifest/#data-validation [nist-nonce]: https://csrc.nist.gov/glossary/term/nonce -[ballot-encryption]: ../../spec/web/6_Ballot_Encryption/ +[ballot-encryption]: ../spec/index.md [cast-vote-record]: ../overview/Glossary.md#cast-vote-record diff --git a/mkdocs.yml b/mkdocs.yml index 153be459..3f26ef81 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -40,6 +40,7 @@ nav: - Sample Data: develop/Sample_Data.md - Specification: - Official: spec/index.md + - Serialization: spec/Serialization_Spec.md - Contribute: contribute/index.md plugins: - search @@ -78,8 +79,8 @@ markdown_extensions: class: mermaid format: !!python/name:mermaid2.fence_mermaid - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg - pymdownx.arithmatex: generic: true extra_javascript: