From 5d2912f7892514748bb94e66feece64ebf2fbd20 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 3 Sep 2026 19:40:44 +0200 Subject: [PATCH] actualizado 3-sept --- .DS_Store | Bin 6148 -> 26628 bytes Dockerfile | 6 +- README.md | 2 +- __pycache__/app.cpython-311.pyc | Bin 0 -> 73917 bytes __pycache__/app.cpython-312.pyc | Bin 58106 -> 64656 bytes adminer/LICENSE.md | 16 + adminer/README.md | 66 + adminer/adminer.css | 69 + adminer/docker-compose.yml | 15 + .../plugins-enabled/login-password-less.php | 4 + app.py | 569 +- database/pyfleet.db | Bin 2510848 -> 2510848 bytes info.txt | 83 +- static/bootstrap-icons-1.13.1.zip | Bin 1694584 -> 0 bytes .../0-circle-fill.svg | 0 .../0-circle.svg | 0 .../0-square-fill.svg | 0 .../0-square.svg | 0 .../1-circle-fill.svg | 0 .../1-circle.svg | 0 .../1-square-fill.svg | 0 .../1-square.svg | 0 .../123.svg | 0 .../2-circle-fill.svg | 0 .../2-circle.svg | 0 .../2-square-fill.svg | 0 .../2-square.svg | 0 .../3-circle-fill.svg | 0 .../3-circle.svg | 0 .../3-square-fill.svg | 0 .../3-square.svg | 0 .../4-circle-fill.svg | 0 .../4-circle.svg | 0 .../4-square-fill.svg | 0 .../4-square.svg | 0 .../5-circle-fill.svg | 0 .../5-circle.svg | 0 .../5-square-fill.svg | 0 .../5-square.svg | 0 .../6-circle-fill.svg | 0 .../6-circle.svg | 0 .../6-square-fill.svg | 0 .../6-square.svg | 0 .../7-circle-fill.svg | 0 .../7-circle.svg | 0 .../7-square-fill.svg | 0 .../7-square.svg | 0 .../8-circle-fill.svg | 0 .../8-circle.svg | 0 .../8-square-fill.svg | 0 .../8-square.svg | 0 .../9-circle-fill.svg | 0 .../9-circle.svg | 0 .../9-square-fill.svg | 0 .../9-square.svg | 0 .../activity.svg | 0 .../airplane-engines-fill.svg | 0 .../airplane-engines.svg | 0 .../airplane-fill.svg | 0 .../airplane.svg | 0 .../alarm-fill.svg | 0 .../alarm.svg | 0 .../alexa.svg | 0 .../align-bottom.svg | 0 .../align-center.svg | 0 .../align-end.svg | 0 .../align-middle.svg | 0 .../align-start.svg | 0 .../align-top.svg | 0 .../alipay.svg | 0 .../alphabet-uppercase.svg | 0 .../alphabet.svg | 0 .../alt.svg | 0 .../amazon.svg | 0 .../amd.svg | 0 .../android.svg | 0 .../android2.svg | 0 .../anthropic.svg | 0 .../app-indicator.svg | 0 .../app.svg | 0 .../apple-music.svg | 0 .../apple.svg | 0 .../archive-fill.svg | 0 .../archive.svg | 0 .../arrow-90deg-down.svg | 0 .../arrow-90deg-left.svg | 0 .../arrow-90deg-right.svg | 0 .../arrow-90deg-up.svg | 0 .../arrow-bar-down.svg | 0 .../arrow-bar-left.svg | 0 .../arrow-bar-right.svg | 0 .../arrow-bar-up.svg | 0 .../arrow-clockwise.svg | 0 .../arrow-counterclockwise.svg | 0 .../arrow-down-circle-fill.svg | 0 .../arrow-down-circle.svg | 0 .../arrow-down-left-circle-fill.svg | 0 .../arrow-down-left-circle.svg | 0 .../arrow-down-left-square-fill.svg | 0 .../arrow-down-left-square.svg | 0 .../arrow-down-left.svg | 0 .../arrow-down-right-circle-fill.svg | 0 .../arrow-down-right-circle.svg | 0 .../arrow-down-right-square-fill.svg | 0 .../arrow-down-right-square.svg | 0 .../arrow-down-right.svg | 0 .../arrow-down-short.svg | 0 .../arrow-down-square-fill.svg | 0 .../arrow-down-square.svg | 0 .../arrow-down-up.svg | 0 .../arrow-down.svg | 0 .../arrow-left-circle-fill.svg | 0 .../arrow-left-circle.svg | 0 .../arrow-left-right.svg | 0 .../arrow-left-short.svg | 0 .../arrow-left-square-fill.svg | 0 .../arrow-left-square.svg | 0 .../arrow-left.svg | 0 .../arrow-repeat.svg | 0 .../arrow-return-left.svg | 0 .../arrow-return-right.svg | 0 .../arrow-right-circle-fill.svg | 0 .../arrow-right-circle.svg | 0 .../arrow-right-short.svg | 0 .../arrow-right-square-fill.svg | 0 .../arrow-right-square.svg | 0 .../arrow-right.svg | 0 .../arrow-through-heart-fill.svg | 0 .../arrow-through-heart.svg | 0 .../arrow-up-circle-fill.svg | 0 .../arrow-up-circle.svg | 0 .../arrow-up-left-circle-fill.svg | 0 .../arrow-up-left-circle.svg | 0 .../arrow-up-left-square-fill.svg | 0 .../arrow-up-left-square.svg | 0 .../arrow-up-left.svg | 0 .../arrow-up-right-circle-fill.svg | 0 .../arrow-up-right-circle.svg | 0 .../arrow-up-right-square-fill.svg | 0 .../arrow-up-right-square.svg | 0 .../arrow-up-right.svg | 0 .../arrow-up-short.svg | 0 .../arrow-up-square-fill.svg | 0 .../arrow-up-square.svg | 0 .../arrow-up.svg | 0 .../arrows-angle-contract.svg | 0 .../arrows-angle-expand.svg | 0 .../arrows-collapse-vertical.svg | 0 .../arrows-collapse.svg | 0 .../arrows-expand-vertical.svg | 0 .../arrows-expand.svg | 0 .../arrows-fullscreen.svg | 0 .../arrows-move.svg | 0 .../arrows-vertical.svg | 0 .../arrows.svg | 0 .../aspect-ratio-fill.svg | 0 .../aspect-ratio.svg | 0 .../asterisk.svg | 0 .../at.svg | 0 .../award-fill.svg | 0 .../award.svg | 0 .../back.svg | 0 .../backpack-fill.svg | 0 .../backpack.svg | 0 .../backpack2-fill.svg | 0 .../backpack2.svg | 0 .../backpack3-fill.svg | 0 .../backpack3.svg | 0 .../backpack4-fill.svg | 0 .../backpack4.svg | 0 .../backspace-fill.svg | 0 .../backspace-reverse-fill.svg | 0 .../backspace-reverse.svg | 0 .../backspace.svg | 0 .../badge-3d-fill.svg | 0 .../badge-3d.svg | 0 .../badge-4k-fill.svg | 0 .../badge-4k.svg | 0 .../badge-8k-fill.svg | 0 .../badge-8k.svg | 0 .../badge-ad-fill.svg | 0 .../badge-ad.svg | 0 .../badge-ar-fill.svg | 0 .../badge-ar.svg | 0 .../badge-cc-fill.svg | 0 .../badge-cc.svg | 0 .../badge-hd-fill.svg | 0 .../badge-hd.svg | 0 .../badge-sd-fill.svg | 0 .../badge-sd.svg | 0 .../badge-tm-fill.svg | 0 .../badge-tm.svg | 0 .../badge-vo-fill.svg | 0 .../badge-vo.svg | 0 .../badge-vr-fill.svg | 0 .../badge-vr.svg | 0 .../badge-wc-fill.svg | 0 .../badge-wc.svg | 0 .../bag-check-fill.svg | 0 .../bag-check.svg | 0 .../bag-dash-fill.svg | 0 .../bag-dash.svg | 0 .../bag-fill.svg | 0 .../bag-heart-fill.svg | 0 .../bag-heart.svg | 0 .../bag-plus-fill.svg | 0 .../bag-plus.svg | 0 .../bag-x-fill.svg | 0 .../bag-x.svg | 0 .../bag.svg | 0 .../balloon-fill.svg | 0 .../balloon-heart-fill.svg | 0 .../balloon-heart.svg | 0 .../balloon.svg | 0 .../ban-fill.svg | 0 .../ban.svg | 0 .../bandaid-fill.svg | 0 .../bandaid.svg | 0 .../bank.svg | 0 .../bank2.svg | 0 .../bar-chart-fill.svg | 0 .../bar-chart-line-fill.svg | 0 .../bar-chart-line.svg | 0 .../bar-chart-steps.svg | 0 .../bar-chart.svg | 0 .../basket-fill.svg | 0 .../basket.svg | 0 .../basket2-fill.svg | 0 .../basket2.svg | 0 .../basket3-fill.svg | 0 .../basket3.svg | 0 .../battery-charging.svg | 0 .../battery-full.svg | 0 .../battery-half.svg | 0 .../battery-low.svg | 0 .../battery.svg | 0 .../beaker-fill.svg | 0 .../beaker.svg | 0 .../behance.svg | 0 .../bell-fill.svg | 0 .../bell-slash-fill.svg | 0 .../bell-slash.svg | 0 .../bell.svg | 0 .../bezier.svg | 0 .../bezier2.svg | 0 .../bicycle.svg | 0 .../bing.svg | 0 .../binoculars-fill.svg | 0 .../binoculars.svg | 0 .../blockquote-left.svg | 0 .../blockquote-right.svg | 0 .../bluesky.svg | 0 .../bluetooth.svg | 0 .../body-text.svg | 0 .../book-fill.svg | 0 .../book-half.svg | 0 .../book.svg | 0 .../bookmark-check-fill.svg | 0 .../bookmark-check.svg | 0 .../bookmark-dash-fill.svg | 0 .../bookmark-dash.svg | 0 .../bookmark-fill.svg | 0 .../bookmark-heart-fill.svg | 0 .../bookmark-heart.svg | 0 .../bookmark-plus-fill.svg | 0 .../bookmark-plus.svg | 0 .../bookmark-star-fill.svg | 0 .../bookmark-star.svg | 0 .../bookmark-x-fill.svg | 0 .../bookmark-x.svg | 0 .../bookmark.svg | 0 .../bookmarks-fill.svg | 0 .../bookmarks.svg | 0 .../bookshelf.svg | 0 .../boombox-fill.svg | 0 .../boombox.svg | 0 .../bootstrap-fill.svg | 0 .../bootstrap-icons.css | 0 .../bootstrap-icons.json | 0 .../bootstrap-icons.min.css | 0 .../bootstrap-icons.scss | 0 .../bootstrap-icons.svg | 0 .../bootstrap-reboot.svg | 0 .../bootstrap.svg | 0 .../border-all.svg | 0 .../border-bottom.svg | 0 .../border-center.svg | 0 .../border-inner.svg | 0 .../border-left.svg | 0 .../border-middle.svg | 0 .../border-outer.svg | 0 .../border-right.svg | 0 .../border-style.svg | 0 .../border-top.svg | 0 .../border-width.svg | 0 .../border.svg | 0 .../bounding-box-circles.svg | 0 .../bounding-box.svg | 0 .../box-arrow-down-left.svg | 0 .../box-arrow-down-right.svg | 0 .../box-arrow-down.svg | 0 .../box-arrow-in-down-left.svg | 0 .../box-arrow-in-down-right.svg | 0 .../box-arrow-in-down.svg | 0 .../box-arrow-in-left.svg | 0 .../box-arrow-in-right.svg | 0 .../box-arrow-in-up-left.svg | 0 .../box-arrow-in-up-right.svg | 0 .../box-arrow-in-up.svg | 0 .../box-arrow-left.svg | 0 .../box-arrow-right.svg | 0 .../box-arrow-up-left.svg | 0 .../box-arrow-up-right.svg | 0 .../box-arrow-up.svg | 0 .../box-fill.svg | 0 .../box-seam-fill.svg | 0 .../box-seam.svg | 0 .../box.svg | 0 .../box2-fill.svg | 0 .../box2-heart-fill.svg | 0 .../box2-heart.svg | 0 .../box2.svg | 0 .../boxes.svg | 0 .../braces-asterisk.svg | 0 .../braces.svg | 0 .../bricks.svg | 0 .../briefcase-fill.svg | 0 .../briefcase.svg | 0 .../brightness-alt-high-fill.svg | 0 .../brightness-alt-high.svg | 0 .../brightness-alt-low-fill.svg | 0 .../brightness-alt-low.svg | 0 .../brightness-high-fill.svg | 0 .../brightness-high.svg | 0 .../brightness-low-fill.svg | 0 .../brightness-low.svg | 0 .../brilliance.svg | 0 .../broadcast-pin.svg | 0 .../broadcast.svg | 0 .../browser-chrome.svg | 0 .../browser-edge.svg | 0 .../browser-firefox.svg | 0 .../browser-safari.svg | 0 .../brush-fill.svg | 0 .../brush.svg | 0 .../bucket-fill.svg | 0 .../bucket.svg | 0 .../bug-fill.svg | 0 .../bug.svg | 0 .../building-add.svg | 0 .../building-check.svg | 0 .../building-dash.svg | 0 .../building-down.svg | 0 .../building-exclamation.svg | 0 .../building-fill-add.svg | 0 .../building-fill-check.svg | 0 .../building-fill-dash.svg | 0 .../building-fill-down.svg | 0 .../building-fill-exclamation.svg | 0 .../building-fill-gear.svg | 0 .../building-fill-lock.svg | 0 .../building-fill-slash.svg | 0 .../building-fill-up.svg | 0 .../building-fill-x.svg | 0 .../building-fill.svg | 0 .../building-gear.svg | 0 .../building-lock.svg | 0 .../building-slash.svg | 0 .../building-up.svg | 0 .../building-x.svg | 0 .../building.svg | 0 .../buildings-fill.svg | 0 .../buildings.svg | 0 .../bullseye.svg | 0 .../bus-front-fill.svg | 0 .../bus-front.svg | 0 .../c-circle-fill.svg | 0 .../c-circle.svg | 0 .../c-square-fill.svg | 0 .../c-square.svg | 0 .../cake-fill.svg | 0 .../cake.svg | 0 .../cake2-fill.svg | 0 .../cake2.svg | 0 .../calculator-fill.svg | 0 .../calculator.svg | 0 .../calendar-check-fill.svg | 0 .../calendar-check.svg | 0 .../calendar-date-fill.svg | 0 .../calendar-date.svg | 0 .../calendar-day-fill.svg | 0 .../calendar-day.svg | 0 .../calendar-event-fill.svg | 0 .../calendar-event.svg | 0 .../calendar-fill.svg | 0 .../calendar-heart-fill.svg | 0 .../calendar-heart.svg | 0 .../calendar-minus-fill.svg | 0 .../calendar-minus.svg | 0 .../calendar-month-fill.svg | 0 .../calendar-month.svg | 0 .../calendar-plus-fill.svg | 0 .../calendar-plus.svg | 0 .../calendar-range-fill.svg | 0 .../calendar-range.svg | 0 .../calendar-week-fill.svg | 0 .../calendar-week.svg | 0 .../calendar-x-fill.svg | 0 .../calendar-x.svg | 0 .../calendar.svg | 0 .../calendar2-check-fill.svg | 0 .../calendar2-check.svg | 0 .../calendar2-date-fill.svg | 0 .../calendar2-date.svg | 0 .../calendar2-day-fill.svg | 0 .../calendar2-day.svg | 0 .../calendar2-event-fill.svg | 0 .../calendar2-event.svg | 0 .../calendar2-fill.svg | 0 .../calendar2-heart-fill.svg | 0 .../calendar2-heart.svg | 0 .../calendar2-minus-fill.svg | 0 .../calendar2-minus.svg | 0 .../calendar2-month-fill.svg | 0 .../calendar2-month.svg | 0 .../calendar2-plus-fill.svg | 0 .../calendar2-plus.svg | 0 .../calendar2-range-fill.svg | 0 .../calendar2-range.svg | 0 .../calendar2-week-fill.svg | 0 .../calendar2-week.svg | 0 .../calendar2-x-fill.svg | 0 .../calendar2-x.svg | 0 .../calendar2.svg | 0 .../calendar3-event-fill.svg | 0 .../calendar3-event.svg | 0 .../calendar3-fill.svg | 0 .../calendar3-range-fill.svg | 0 .../calendar3-range.svg | 0 .../calendar3-week-fill.svg | 0 .../calendar3-week.svg | 0 .../calendar3.svg | 0 .../calendar4-event.svg | 0 .../calendar4-range.svg | 0 .../calendar4-week.svg | 0 .../calendar4.svg | 0 .../camera-fill.svg | 0 .../camera-reels-fill.svg | 0 .../camera-reels.svg | 0 .../camera-video-fill.svg | 0 .../camera-video-off-fill.svg | 0 .../camera-video-off.svg | 0 .../camera-video.svg | 0 .../camera.svg | 0 .../camera2.svg | 0 .../capslock-fill.svg | 0 .../capslock.svg | 0 .../capsule-pill.svg | 0 .../capsule.svg | 0 .../car-front-fill.svg | 0 .../car-front.svg | 0 .../card-checklist.svg | 0 .../card-heading.svg | 0 .../card-image.svg | 0 .../card-list.svg | 0 .../card-text.svg | 0 .../caret-down-fill.svg | 0 .../caret-down-square-fill.svg | 0 .../caret-down-square.svg | 0 .../caret-down.svg | 0 .../caret-left-fill.svg | 0 .../caret-left-square-fill.svg | 0 .../caret-left-square.svg | 0 .../caret-left.svg | 0 .../caret-right-fill.svg | 0 .../caret-right-square-fill.svg | 0 .../caret-right-square.svg | 0 .../caret-right.svg | 0 .../caret-up-fill.svg | 0 .../caret-up-square-fill.svg | 0 .../caret-up-square.svg | 0 .../caret-up.svg | 0 .../cart-check-fill.svg | 0 .../cart-check.svg | 0 .../cart-dash-fill.svg | 0 .../cart-dash.svg | 0 .../cart-fill.svg | 0 .../cart-plus-fill.svg | 0 .../cart-plus.svg | 0 .../cart-x-fill.svg | 0 .../cart-x.svg | 0 .../cart.svg | 0 .../cart2.svg | 0 .../cart3.svg | 0 .../cart4.svg | 0 .../cash-coin.svg | 0 .../cash-stack.svg | 0 .../cash.svg | 0 .../cassette-fill.svg | 0 .../cassette.svg | 0 .../cast.svg | 0 .../cc-circle-fill.svg | 0 .../cc-circle.svg | 0 .../cc-square-fill.svg | 0 .../cc-square.svg | 0 .../chat-dots-fill.svg | 0 .../chat-dots.svg | 0 .../chat-fill.svg | 0 .../chat-heart-fill.svg | 0 .../chat-heart.svg | 0 .../chat-left-dots-fill.svg | 0 .../chat-left-dots.svg | 0 .../chat-left-fill.svg | 0 .../chat-left-heart-fill.svg | 0 .../chat-left-heart.svg | 0 .../chat-left-quote-fill.svg | 0 .../chat-left-quote.svg | 0 .../chat-left-text-fill.svg | 0 .../chat-left-text.svg | 0 .../chat-left.svg | 0 .../chat-quote-fill.svg | 0 .../chat-quote.svg | 0 .../chat-right-dots-fill.svg | 0 .../chat-right-dots.svg | 0 .../chat-right-fill.svg | 0 .../chat-right-heart-fill.svg | 0 .../chat-right-heart.svg | 0 .../chat-right-quote-fill.svg | 0 .../chat-right-quote.svg | 0 .../chat-right-text-fill.svg | 0 .../chat-right-text.svg | 0 .../chat-right.svg | 0 .../chat-square-dots-fill.svg | 0 .../chat-square-dots.svg | 0 .../chat-square-fill.svg | 0 .../chat-square-heart-fill.svg | 0 .../chat-square-heart.svg | 0 .../chat-square-quote-fill.svg | 0 .../chat-square-quote.svg | 0 .../chat-square-text-fill.svg | 0 .../chat-square-text.svg | 0 .../chat-square.svg | 0 .../chat-text-fill.svg | 0 .../chat-text.svg | 0 .../chat.svg | 0 .../check-all.svg | 0 .../check-circle-fill.svg | 0 .../check-circle.svg | 0 .../check-lg.svg | 0 .../check-square-fill.svg | 0 .../check-square.svg | 0 .../check.svg | 0 .../check2-all.svg | 0 .../check2-circle.svg | 0 .../check2-square.svg | 0 .../check2.svg | 0 .../chevron-bar-contract.svg | 0 .../chevron-bar-down.svg | 0 .../chevron-bar-expand.svg | 0 .../chevron-bar-left.svg | 0 .../chevron-bar-right.svg | 0 .../chevron-bar-up.svg | 0 .../chevron-compact-down.svg | 0 .../chevron-compact-left.svg | 0 .../chevron-compact-right.svg | 0 .../chevron-compact-up.svg | 0 .../chevron-contract.svg | 0 .../chevron-double-down.svg | 0 .../chevron-double-left.svg | 0 .../chevron-double-right.svg | 0 .../chevron-double-up.svg | 0 .../chevron-down.svg | 0 .../chevron-expand.svg | 0 .../chevron-left.svg | 0 .../chevron-right.svg | 0 .../chevron-up.svg | 0 .../circle-fill.svg | 0 .../circle-half.svg | 0 .../circle-square.svg | 0 .../circle.svg | 0 .../claude.svg | 0 .../clipboard-check-fill.svg | 0 .../clipboard-check.svg | 0 .../clipboard-data-fill.svg | 0 .../clipboard-data.svg | 0 .../clipboard-fill.svg | 0 .../clipboard-heart-fill.svg | 0 .../clipboard-heart.svg | 0 .../clipboard-minus-fill.svg | 0 .../clipboard-minus.svg | 0 .../clipboard-plus-fill.svg | 0 .../clipboard-plus.svg | 0 .../clipboard-pulse.svg | 0 .../clipboard-x-fill.svg | 0 .../clipboard-x.svg | 0 .../clipboard.svg | 0 .../clipboard2-check-fill.svg | 0 .../clipboard2-check.svg | 0 .../clipboard2-data-fill.svg | 0 .../clipboard2-data.svg | 0 .../clipboard2-fill.svg | 0 .../clipboard2-heart-fill.svg | 0 .../clipboard2-heart.svg | 0 .../clipboard2-minus-fill.svg | 0 .../clipboard2-minus.svg | 0 .../clipboard2-plus-fill.svg | 0 .../clipboard2-plus.svg | 0 .../clipboard2-pulse-fill.svg | 0 .../clipboard2-pulse.svg | 0 .../clipboard2-x-fill.svg | 0 .../clipboard2-x.svg | 0 .../clipboard2.svg | 0 .../clock-fill.svg | 0 .../clock-history.svg | 0 .../clock.svg | 0 .../cloud-arrow-down-fill.svg | 0 .../cloud-arrow-down.svg | 0 .../cloud-arrow-up-fill.svg | 0 .../cloud-arrow-up.svg | 0 .../cloud-check-fill.svg | 0 .../cloud-check.svg | 0 .../cloud-download-fill.svg | 0 .../cloud-download.svg | 0 .../cloud-drizzle-fill.svg | 0 .../cloud-drizzle.svg | 0 .../cloud-fill.svg | 0 .../cloud-fog-fill.svg | 0 .../cloud-fog.svg | 0 .../cloud-fog2-fill.svg | 0 .../cloud-fog2.svg | 0 .../cloud-hail-fill.svg | 0 .../cloud-hail.svg | 0 .../cloud-haze-fill.svg | 0 .../cloud-haze.svg | 0 .../cloud-haze2-fill.svg | 0 .../cloud-haze2.svg | 0 .../cloud-lightning-fill.svg | 0 .../cloud-lightning-rain-fill.svg | 0 .../cloud-lightning-rain.svg | 0 .../cloud-lightning.svg | 0 .../cloud-minus-fill.svg | 0 .../cloud-minus.svg | 0 .../cloud-moon-fill.svg | 0 .../cloud-moon.svg | 0 .../cloud-plus-fill.svg | 0 .../cloud-plus.svg | 0 .../cloud-rain-fill.svg | 0 .../cloud-rain-heavy-fill.svg | 0 .../cloud-rain-heavy.svg | 0 .../cloud-rain.svg | 0 .../cloud-slash-fill.svg | 0 .../cloud-slash.svg | 0 .../cloud-sleet-fill.svg | 0 .../cloud-sleet.svg | 0 .../cloud-snow-fill.svg | 0 .../cloud-snow.svg | 0 .../cloud-sun-fill.svg | 0 .../cloud-sun.svg | 0 .../cloud-upload-fill.svg | 0 .../cloud-upload.svg | 0 .../cloud.svg | 0 .../clouds-fill.svg | 0 .../clouds.svg | 0 .../cloudy-fill.svg | 0 .../cloudy.svg | 0 .../code-slash.svg | 0 .../code-square.svg | 0 .../code.svg | 0 .../coin.svg | 0 .../collection-fill.svg | 0 .../collection-play-fill.svg | 0 .../collection-play.svg | 0 .../collection.svg | 0 .../columns-gap.svg | 0 .../columns.svg | 0 .../command.svg | 0 .../compass-fill.svg | 0 .../compass.svg | 0 .../cone-striped.svg | 0 .../cone.svg | 0 .../controller.svg | 0 .../cookie.svg | 0 .../copy.svg | 0 .../cpu-fill.svg | 0 .../cpu.svg | 0 .../credit-card-2-back-fill.svg | 0 .../credit-card-2-back.svg | 0 .../credit-card-2-front-fill.svg | 0 .../credit-card-2-front.svg | 0 .../credit-card-fill.svg | 0 .../credit-card.svg | 0 .../crop.svg | 0 .../crosshair.svg | 0 .../crosshair2.svg | 0 .../css.svg | 0 .../cup-fill.svg | 0 .../cup-hot-fill.svg | 0 .../cup-hot.svg | 0 .../cup-straw.svg | 0 .../cup.svg | 0 .../currency-bitcoin.svg | 0 .../currency-dollar.svg | 0 .../currency-euro.svg | 0 .../currency-exchange.svg | 0 .../currency-pound.svg | 0 .../currency-rupee.svg | 0 .../currency-yen.svg | 0 .../cursor-fill.svg | 0 .../cursor-text.svg | 0 .../cursor.svg | 0 .../dash-circle-dotted.svg | 0 .../dash-circle-fill.svg | 0 .../dash-circle.svg | 0 .../dash-lg.svg | 0 .../dash-square-dotted.svg | 0 .../dash-square-fill.svg | 0 .../dash-square.svg | 0 .../dash.svg | 0 .../database-add.svg | 0 .../database-check.svg | 0 .../database-dash.svg | 0 .../database-down.svg | 0 .../database-exclamation.svg | 0 .../database-fill-add.svg | 0 .../database-fill-check.svg | 0 .../database-fill-dash.svg | 0 .../database-fill-down.svg | 0 .../database-fill-exclamation.svg | 0 .../database-fill-gear.svg | 0 .../database-fill-lock.svg | 0 .../database-fill-slash.svg | 0 .../database-fill-up.svg | 0 .../database-fill-x.svg | 0 .../database-fill.svg | 0 .../database-gear.svg | 0 .../database-lock.svg | 0 .../database-slash.svg | 0 .../database-up.svg | 0 .../database-x.svg | 0 .../database.svg | 0 .../device-hdd-fill.svg | 0 .../device-hdd.svg | 0 .../device-ssd-fill.svg | 0 .../device-ssd.svg | 0 .../diagram-2-fill.svg | 0 .../diagram-2.svg | 0 .../diagram-3-fill.svg | 0 .../diagram-3.svg | 0 .../diamond-fill.svg | 0 .../diamond-half.svg | 0 .../diamond.svg | 0 .../dice-1-fill.svg | 0 .../dice-1.svg | 0 .../dice-2-fill.svg | 0 .../dice-2.svg | 0 .../dice-3-fill.svg | 0 .../dice-3.svg | 0 .../dice-4-fill.svg | 0 .../dice-4.svg | 0 .../dice-5-fill.svg | 0 .../dice-5.svg | 0 .../dice-6-fill.svg | 0 .../dice-6.svg | 0 .../disc-fill.svg | 0 .../disc.svg | 0 .../discord.svg | 0 .../display-fill.svg | 0 .../display.svg | 0 .../displayport-fill.svg | 0 .../displayport.svg | 0 .../distribute-horizontal.svg | 0 .../distribute-vertical.svg | 0 .../door-closed-fill.svg | 0 .../door-closed.svg | 0 .../door-open-fill.svg | 0 .../door-open.svg | 0 .../dot.svg | 0 .../download.svg | 0 .../dpad-fill.svg | 0 .../dpad.svg | 0 .../dribbble.svg | 0 .../dropbox.svg | 0 .../droplet-fill.svg | 0 .../droplet-half.svg | 0 .../droplet.svg | 0 .../duffle-fill.svg | 0 .../duffle.svg | 0 .../ear-fill.svg | 0 .../ear.svg | 0 .../earbuds.svg | 0 .../easel-fill.svg | 0 .../easel.svg | 0 .../easel2-fill.svg | 0 .../easel2.svg | 0 .../easel3-fill.svg | 0 .../easel3.svg | 0 .../egg-fill.svg | 0 .../egg-fried.svg | 0 .../egg.svg | 0 .../eject-fill.svg | 0 .../eject.svg | 0 .../emoji-angry-fill.svg | 0 .../emoji-angry.svg | 0 .../emoji-astonished-fill.svg | 0 .../emoji-astonished.svg | 0 .../emoji-dizzy-fill.svg | 0 .../emoji-dizzy.svg | 0 .../emoji-expressionless-fill.svg | 0 .../emoji-expressionless.svg | 0 .../emoji-frown-fill.svg | 0 .../emoji-frown.svg | 0 .../emoji-grimace-fill.svg | 0 .../emoji-grimace.svg | 0 .../emoji-grin-fill.svg | 0 .../emoji-grin.svg | 0 .../emoji-heart-eyes-fill.svg | 0 .../emoji-heart-eyes.svg | 0 .../emoji-kiss-fill.svg | 0 .../emoji-kiss.svg | 0 .../emoji-laughing-fill.svg | 0 .../emoji-laughing.svg | 0 .../emoji-neutral-fill.svg | 0 .../emoji-neutral.svg | 0 .../emoji-smile-fill.svg | 0 .../emoji-smile-upside-down-fill.svg | 0 .../emoji-smile-upside-down.svg | 0 .../emoji-smile.svg | 0 .../emoji-sunglasses-fill.svg | 0 .../emoji-sunglasses.svg | 0 .../emoji-surprise-fill.svg | 0 .../emoji-surprise.svg | 0 .../emoji-tear-fill.svg | 0 .../emoji-tear.svg | 0 .../emoji-wink-fill.svg | 0 .../emoji-wink.svg | 0 .../envelope-arrow-down-fill.svg | 0 .../envelope-arrow-down.svg | 0 .../envelope-arrow-up-fill.svg | 0 .../envelope-arrow-up.svg | 0 .../envelope-at-fill.svg | 0 .../envelope-at.svg | 0 .../envelope-check-fill.svg | 0 .../envelope-check.svg | 0 .../envelope-dash-fill.svg | 0 .../envelope-dash.svg | 0 .../envelope-exclamation-fill.svg | 0 .../envelope-exclamation.svg | 0 .../envelope-fill.svg | 0 .../envelope-heart-fill.svg | 0 .../envelope-heart.svg | 0 .../envelope-open-fill.svg | 0 .../envelope-open-heart-fill.svg | 0 .../envelope-open-heart.svg | 0 .../envelope-open.svg | 0 .../envelope-paper-fill.svg | 0 .../envelope-paper-heart-fill.svg | 0 .../envelope-paper-heart.svg | 0 .../envelope-paper.svg | 0 .../envelope-plus-fill.svg | 0 .../envelope-plus.svg | 0 .../envelope-slash-fill.svg | 0 .../envelope-slash.svg | 0 .../envelope-x-fill.svg | 0 .../envelope-x.svg | 0 .../envelope.svg | 0 .../eraser-fill.svg | 0 .../eraser.svg | 0 .../escape.svg | 0 .../ethernet.svg | 0 .../ev-front-fill.svg | 0 .../ev-front.svg | 0 .../ev-station-fill.svg | 0 .../ev-station.svg | 0 .../exclamation-circle-fill.svg | 0 .../exclamation-circle.svg | 0 .../exclamation-diamond-fill.svg | 0 .../exclamation-diamond.svg | 0 .../exclamation-lg.svg | 0 .../exclamation-octagon-fill.svg | 0 .../exclamation-octagon.svg | 0 .../exclamation-square-fill.svg | 0 .../exclamation-square.svg | 0 .../exclamation-triangle-fill.svg | 0 .../exclamation-triangle.svg | 0 .../exclamation.svg | 0 .../exclude.svg | 0 .../explicit-fill.svg | 0 .../explicit.svg | 0 .../exposure.svg | 0 .../eye-fill.svg | 0 .../eye-slash-fill.svg | 0 .../eye-slash.svg | 0 .../eye.svg | 0 .../eyedropper.svg | 0 .../eyeglasses.svg | 0 .../facebook.svg | 0 .../fan.svg | 0 .../fast-forward-btn-fill.svg | 0 .../fast-forward-btn.svg | 0 .../fast-forward-circle-fill.svg | 0 .../fast-forward-circle.svg | 0 .../fast-forward-fill.svg | 0 .../fast-forward.svg | 0 .../feather.svg | 0 .../feather2.svg | 0 .../file-arrow-down-fill.svg | 0 .../file-arrow-down.svg | 0 .../file-arrow-up-fill.svg | 0 .../file-arrow-up.svg | 0 .../file-bar-graph-fill.svg | 0 .../file-bar-graph.svg | 0 .../file-binary-fill.svg | 0 .../file-binary.svg | 0 .../file-break-fill.svg | 0 .../file-break.svg | 0 .../file-check-fill.svg | 0 .../file-check.svg | 0 .../file-code-fill.svg | 0 .../file-code.svg | 0 .../file-diff-fill.svg | 0 .../file-diff.svg | 0 .../file-earmark-arrow-down-fill.svg | 0 .../file-earmark-arrow-down.svg | 0 .../file-earmark-arrow-up-fill.svg | 0 .../file-earmark-arrow-up.svg | 0 .../file-earmark-bar-graph-fill.svg | 0 .../file-earmark-bar-graph.svg | 0 .../file-earmark-binary-fill.svg | 0 .../file-earmark-binary.svg | 0 .../file-earmark-break-fill.svg | 0 .../file-earmark-break.svg | 0 .../file-earmark-check-fill.svg | 0 .../file-earmark-check.svg | 0 .../file-earmark-code-fill.svg | 0 .../file-earmark-code.svg | 0 .../file-earmark-diff-fill.svg | 0 .../file-earmark-diff.svg | 0 .../file-earmark-easel-fill.svg | 0 .../file-earmark-easel.svg | 0 .../file-earmark-excel-fill.svg | 0 .../file-earmark-excel.svg | 0 .../file-earmark-fill.svg | 0 .../file-earmark-font-fill.svg | 0 .../file-earmark-font.svg | 0 .../file-earmark-image-fill.svg | 0 .../file-earmark-image.svg | 0 .../file-earmark-lock-fill.svg | 0 .../file-earmark-lock.svg | 0 .../file-earmark-lock2-fill.svg | 0 .../file-earmark-lock2.svg | 0 .../file-earmark-medical-fill.svg | 0 .../file-earmark-medical.svg | 0 .../file-earmark-minus-fill.svg | 0 .../file-earmark-minus.svg | 0 .../file-earmark-music-fill.svg | 0 .../file-earmark-music.svg | 0 .../file-earmark-pdf-fill.svg | 0 .../file-earmark-pdf.svg | 0 .../file-earmark-person-fill.svg | 0 .../file-earmark-person.svg | 0 .../file-earmark-play-fill.svg | 0 .../file-earmark-play.svg | 0 .../file-earmark-plus-fill.svg | 0 .../file-earmark-plus.svg | 0 .../file-earmark-post-fill.svg | 0 .../file-earmark-post.svg | 0 .../file-earmark-ppt-fill.svg | 0 .../file-earmark-ppt.svg | 0 .../file-earmark-richtext-fill.svg | 0 .../file-earmark-richtext.svg | 0 .../file-earmark-ruled-fill.svg | 0 .../file-earmark-ruled.svg | 0 .../file-earmark-slides-fill.svg | 0 .../file-earmark-slides.svg | 0 .../file-earmark-spreadsheet-fill.svg | 0 .../file-earmark-spreadsheet.svg | 0 .../file-earmark-text-fill.svg | 0 .../file-earmark-text.svg | 0 .../file-earmark-word-fill.svg | 0 .../file-earmark-word.svg | 0 .../file-earmark-x-fill.svg | 0 .../file-earmark-x.svg | 0 .../file-earmark-zip-fill.svg | 0 .../file-earmark-zip.svg | 0 .../file-earmark.svg | 0 .../file-easel-fill.svg | 0 .../file-easel.svg | 0 .../file-excel-fill.svg | 0 .../file-excel.svg | 0 .../file-fill.svg | 0 .../file-font-fill.svg | 0 .../file-font.svg | 0 .../file-image-fill.svg | 0 .../file-image.svg | 0 .../file-lock-fill.svg | 0 .../file-lock.svg | 0 .../file-lock2-fill.svg | 0 .../file-lock2.svg | 0 .../file-medical-fill.svg | 0 .../file-medical.svg | 0 .../file-minus-fill.svg | 0 .../file-minus.svg | 0 .../file-music-fill.svg | 0 .../file-music.svg | 0 .../file-pdf-fill.svg | 0 .../file-pdf.svg | 0 .../file-person-fill.svg | 0 .../file-person.svg | 0 .../file-play-fill.svg | 0 .../file-play.svg | 0 .../file-plus-fill.svg | 0 .../file-plus.svg | 0 .../file-post-fill.svg | 0 .../file-post.svg | 0 .../file-ppt-fill.svg | 0 .../file-ppt.svg | 0 .../file-richtext-fill.svg | 0 .../file-richtext.svg | 0 .../file-ruled-fill.svg | 0 .../file-ruled.svg | 0 .../file-slides-fill.svg | 0 .../file-slides.svg | 0 .../file-spreadsheet-fill.svg | 0 .../file-spreadsheet.svg | 0 .../file-text-fill.svg | 0 .../file-text.svg | 0 .../file-word-fill.svg | 0 .../file-word.svg | 0 .../file-x-fill.svg | 0 .../file-x.svg | 0 .../file-zip-fill.svg | 0 .../file-zip.svg | 0 .../file.svg | 0 .../files-alt.svg | 0 .../files.svg | 0 .../filetype-aac.svg | 0 .../filetype-ai.svg | 0 .../filetype-bmp.svg | 0 .../filetype-cs.svg | 0 .../filetype-css.svg | 0 .../filetype-csv.svg | 0 .../filetype-doc.svg | 0 .../filetype-docx.svg | 0 .../filetype-exe.svg | 0 .../filetype-gif.svg | 0 .../filetype-heic.svg | 0 .../filetype-html.svg | 0 .../filetype-java.svg | 0 .../filetype-jpg.svg | 0 .../filetype-js.svg | 0 .../filetype-json.svg | 0 .../filetype-jsx.svg | 0 .../filetype-key.svg | 0 .../filetype-m4p.svg | 0 .../filetype-md.svg | 0 .../filetype-mdx.svg | 0 .../filetype-mov.svg | 0 .../filetype-mp3.svg | 0 .../filetype-mp4.svg | 0 .../filetype-otf.svg | 0 .../filetype-pdf.svg | 0 .../filetype-php.svg | 0 .../filetype-png.svg | 0 .../filetype-ppt.svg | 0 .../filetype-pptx.svg | 0 .../filetype-psd.svg | 0 .../filetype-py.svg | 0 .../filetype-raw.svg | 0 .../filetype-rb.svg | 0 .../filetype-sass.svg | 0 .../filetype-scss.svg | 0 .../filetype-sh.svg | 0 .../filetype-sql.svg | 0 .../filetype-svg.svg | 0 .../filetype-tiff.svg | 0 .../filetype-tsx.svg | 0 .../filetype-ttf.svg | 0 .../filetype-txt.svg | 0 .../filetype-wav.svg | 0 .../filetype-woff.svg | 0 .../filetype-xls.svg | 0 .../filetype-xlsx.svg | 0 .../filetype-xml.svg | 0 .../filetype-yml.svg | 0 .../film.svg | 0 .../filter-circle-fill.svg | 0 .../filter-circle.svg | 0 .../filter-left.svg | 0 .../filter-right.svg | 0 .../filter-square-fill.svg | 0 .../filter-square.svg | 0 .../filter.svg | 0 .../fingerprint.svg | 0 .../fire.svg | 0 .../flag-fill.svg | 0 .../flag.svg | 0 .../flask-fill.svg | 0 .../flask-florence-fill.svg | 0 .../flask-florence.svg | 0 .../flask.svg | 0 .../floppy-fill.svg | 0 .../floppy.svg | 0 .../floppy2-fill.svg | 0 .../floppy2.svg | 0 .../flower1.svg | 0 .../flower2.svg | 0 .../flower3.svg | 0 .../folder-check.svg | 0 .../folder-fill.svg | 0 .../folder-minus.svg | 0 .../folder-plus.svg | 0 .../folder-symlink-fill.svg | 0 .../folder-symlink.svg | 0 .../folder-x.svg | 0 .../folder.svg | 0 .../folder2-open.svg | 0 .../folder2.svg | 0 .../fonts.svg | 0 .../fonts/bootstrap-icons.woff | Bin .../fonts/bootstrap-icons.woff2 | Bin .../fork-knife.svg | 0 .../forward-fill.svg | 0 .../forward.svg | 0 .../front.svg | 0 .../fuel-pump-diesel-fill.svg | 0 .../fuel-pump-diesel.svg | 0 .../fuel-pump-fill.svg | 0 .../fuel-pump.svg | 0 .../fullscreen-exit.svg | 0 .../fullscreen.svg | 0 .../funnel-fill.svg | 0 .../funnel.svg | 0 .../gear-fill.svg | 0 .../gear-wide-connected.svg | 0 .../gear-wide.svg | 0 .../gear.svg | 0 .../gem.svg | 0 .../gender-ambiguous.svg | 0 .../gender-female.svg | 0 .../gender-male.svg | 0 .../gender-neuter.svg | 0 .../gender-trans.svg | 0 .../geo-alt-fill.svg | 0 .../geo-alt.svg | 0 .../geo-fill.svg | 0 .../geo.svg | 0 .../gift-fill.svg | 0 .../gift.svg | 0 .../git.svg | 0 .../github.svg | 0 .../gitlab.svg | 0 .../globe-americas-fill.svg | 0 .../globe-americas.svg | 0 .../globe-asia-australia-fill.svg | 0 .../globe-asia-australia.svg | 0 .../globe-central-south-asia-fill.svg | 0 .../globe-central-south-asia.svg | 0 .../globe-europe-africa-fill.svg | 0 .../globe-europe-africa.svg | 0 .../globe.svg | 0 .../globe2.svg | 0 .../google-play.svg | 0 .../google.svg | 0 .../gpu-card.svg | 0 .../graph-down-arrow.svg | 0 .../graph-down.svg | 0 .../graph-up-arrow.svg | 0 .../graph-up.svg | 0 .../grid-1x2-fill.svg | 0 .../grid-1x2.svg | 0 .../grid-3x2-gap-fill.svg | 0 .../grid-3x2-gap.svg | 0 .../grid-3x2.svg | 0 .../grid-3x3-gap-fill.svg | 0 .../grid-3x3-gap.svg | 0 .../grid-3x3.svg | 0 .../grid-fill.svg | 0 .../grid.svg | 0 .../grip-horizontal.svg | 0 .../grip-vertical.svg | 0 .../h-circle-fill.svg | 0 .../h-circle.svg | 0 .../h-square-fill.svg | 0 .../h-square.svg | 0 .../hammer.svg | 0 .../hand-index-fill.svg | 0 .../hand-index-thumb-fill.svg | 0 .../hand-index-thumb.svg | 0 .../hand-index.svg | 0 .../hand-thumbs-down-fill.svg | 0 .../hand-thumbs-down.svg | 0 .../hand-thumbs-up-fill.svg | 0 .../hand-thumbs-up.svg | 0 .../handbag-fill.svg | 0 .../handbag.svg | 0 .../hash.svg | 0 .../hdd-fill.svg | 0 .../hdd-network-fill.svg | 0 .../hdd-network.svg | 0 .../hdd-rack-fill.svg | 0 .../hdd-rack.svg | 0 .../hdd-stack-fill.svg | 0 .../hdd-stack.svg | 0 .../hdd.svg | 0 .../hdmi-fill.svg | 0 .../hdmi.svg | 0 .../headphones.svg | 0 .../headset-vr.svg | 0 .../headset.svg | 0 .../heart-arrow.svg | 0 .../heart-fill.svg | 0 .../heart-half.svg | 0 .../heart-pulse-fill.svg | 0 .../heart-pulse.svg | 0 .../heart.svg | 0 .../heartbreak-fill.svg | 0 .../heartbreak.svg | 0 .../hearts.svg | 0 .../heptagon-fill.svg | 0 .../heptagon-half.svg | 0 .../heptagon.svg | 0 .../hexagon-fill.svg | 0 .../hexagon-half.svg | 0 .../hexagon.svg | 0 .../highlighter.svg | 0 .../highlights.svg | 0 .../hospital-fill.svg | 0 .../hospital.svg | 0 .../hourglass-bottom.svg | 0 .../hourglass-split.svg | 0 .../hourglass-top.svg | 0 .../hourglass.svg | 0 .../house-add-fill.svg | 0 .../house-add.svg | 0 .../house-check-fill.svg | 0 .../house-check.svg | 0 .../house-dash-fill.svg | 0 .../house-dash.svg | 0 .../house-door-fill.svg | 0 .../house-door.svg | 0 .../house-down-fill.svg | 0 .../house-down.svg | 0 .../house-exclamation-fill.svg | 0 .../house-exclamation.svg | 0 .../house-fill.svg | 0 .../house-gear-fill.svg | 0 .../house-gear.svg | 0 .../house-heart-fill.svg | 0 .../house-heart.svg | 0 .../house-lock-fill.svg | 0 .../house-lock.svg | 0 .../house-slash-fill.svg | 0 .../house-slash.svg | 0 .../house-up-fill.svg | 0 .../house-up.svg | 0 .../house-x-fill.svg | 0 .../house-x.svg | 0 .../house.svg | 0 .../houses-fill.svg | 0 .../houses.svg | 0 .../hr.svg | 0 .../hurricane.svg | 0 .../hypnotize.svg | 0 .../image-alt.svg | 0 .../image-fill.svg | 0 .../image.svg | 0 .../images.svg | 0 .../inbox-fill.svg | 0 .../inbox.svg | 0 .../inboxes-fill.svg | 0 .../inboxes.svg | 0 .../incognito.svg | 0 .../indent.svg | 0 .../infinity.svg | 0 .../info-circle-fill.svg | 0 .../info-circle.svg | 0 .../info-lg.svg | 0 .../info-square-fill.svg | 0 .../info-square.svg | 0 .../info.svg | 0 .../input-cursor-text.svg | 0 .../input-cursor.svg | 0 .../instagram.svg | 0 .../intersect.svg | 0 .../javascript.svg | 0 .../journal-album.svg | 0 .../journal-arrow-down.svg | 0 .../journal-arrow-up.svg | 0 .../journal-bookmark-fill.svg | 0 .../journal-bookmark.svg | 0 .../journal-check.svg | 0 .../journal-code.svg | 0 .../journal-medical.svg | 0 .../journal-minus.svg | 0 .../journal-plus.svg | 0 .../journal-richtext.svg | 0 .../journal-text.svg | 0 .../journal-x.svg | 0 .../journal.svg | 0 .../journals.svg | 0 .../joystick.svg | 0 .../justify-left.svg | 0 .../justify-right.svg | 0 .../justify.svg | 0 .../kanban-fill.svg | 0 .../kanban.svg | 0 .../key-fill.svg | 0 .../key.svg | 0 .../keyboard-fill.svg | 0 .../keyboard.svg | 0 .../ladder.svg | 0 .../lamp-fill.svg | 0 .../lamp.svg | 0 .../laptop-fill.svg | 0 .../laptop.svg | 0 .../layer-backward.svg | 0 .../layer-forward.svg | 0 .../layers-fill.svg | 0 .../layers-half.svg | 0 .../layers.svg | 0 .../layout-sidebar-inset-reverse.svg | 0 .../layout-sidebar-inset.svg | 0 .../layout-sidebar-reverse.svg | 0 .../layout-sidebar.svg | 0 .../layout-split.svg | 0 .../layout-text-sidebar-reverse.svg | 0 .../layout-text-sidebar.svg | 0 .../layout-text-window-reverse.svg | 0 .../layout-text-window.svg | 0 .../layout-three-columns.svg | 0 .../layout-wtf.svg | 0 .../leaf-fill.svg | 0 .../leaf.svg | 0 .../life-preserver.svg | 0 .../lightbulb-fill.svg | 0 .../lightbulb-off-fill.svg | 0 .../lightbulb-off.svg | 0 .../lightbulb.svg | 0 .../lightning-charge-fill.svg | 0 .../lightning-charge.svg | 0 .../lightning-fill.svg | 0 .../lightning.svg | 0 .../line.svg | 0 .../link-45deg.svg | 0 .../link.svg | 0 .../linkedin.svg | 0 .../list-check.svg | 0 .../list-columns-reverse.svg | 0 .../list-columns.svg | 0 .../list-nested.svg | 0 .../list-ol.svg | 0 .../list-stars.svg | 0 .../list-task.svg | 0 .../list-ul.svg | 0 .../list.svg | 0 .../lock-fill.svg | 0 .../lock.svg | 0 .../luggage-fill.svg | 0 .../luggage.svg | 0 .../lungs-fill.svg | 0 .../lungs.svg | 0 .../magic.svg | 0 .../magnet-fill.svg | 0 .../magnet.svg | 0 .../mailbox-flag.svg | 0 .../mailbox.svg | 0 .../mailbox2-flag.svg | 0 .../mailbox2.svg | 0 .../map-fill.svg | 0 .../map.svg | 0 .../markdown-fill.svg | 0 .../markdown.svg | 0 .../marker-tip.svg | 0 .../mask.svg | 0 .../mastodon.svg | 0 .../measuring-cup-fill.svg | 0 .../measuring-cup.svg | 0 .../medium.svg | 0 .../megaphone-fill.svg | 0 .../megaphone.svg | 0 .../memory.svg | 0 .../menu-app-fill.svg | 0 .../menu-app.svg | 0 .../menu-button-fill.svg | 0 .../menu-button-wide-fill.svg | 0 .../menu-button-wide.svg | 0 .../menu-button.svg | 0 .../menu-down.svg | 0 .../menu-up.svg | 0 .../messenger.svg | 0 .../meta.svg | 0 .../mic-fill.svg | 0 .../mic-mute-fill.svg | 0 .../mic-mute.svg | 0 .../mic.svg | 0 .../microsoft-teams.svg | 0 .../microsoft.svg | 0 .../minecart-loaded.svg | 0 .../minecart.svg | 0 .../modem-fill.svg | 0 .../modem.svg | 0 .../moisture.svg | 0 .../moon-fill.svg | 0 .../moon-stars-fill.svg | 0 .../moon-stars.svg | 0 .../moon.svg | 0 .../mortarboard-fill.svg | 0 .../mortarboard.svg | 0 .../motherboard-fill.svg | 0 .../motherboard.svg | 0 .../mouse-fill.svg | 0 .../mouse.svg | 0 .../mouse2-fill.svg | 0 .../mouse2.svg | 0 .../mouse3-fill.svg | 0 .../mouse3.svg | 0 .../music-note-beamed.svg | 0 .../music-note-list.svg | 0 .../music-note.svg | 0 .../music-player-fill.svg | 0 .../music-player.svg | 0 .../newspaper.svg | 0 .../nintendo-switch.svg | 0 .../node-minus-fill.svg | 0 .../node-minus.svg | 0 .../node-plus-fill.svg | 0 .../node-plus.svg | 0 .../noise-reduction.svg | 0 .../nut-fill.svg | 0 .../nut.svg | 0 .../nvidia.svg | 0 .../nvme-fill.svg | 0 .../nvme.svg | 0 .../octagon-fill.svg | 0 .../octagon-half.svg | 0 .../octagon.svg | 0 .../openai.svg | 0 .../opencollective.svg | 0 .../optical-audio-fill.svg | 0 .../optical-audio.svg | 0 .../option.svg | 0 .../outlet.svg | 0 .../p-circle-fill.svg | 0 .../p-circle.svg | 0 .../p-square-fill.svg | 0 .../p-square.svg | 0 .../paint-bucket.svg | 0 .../palette-fill.svg | 0 .../palette.svg | 0 .../palette2.svg | 0 .../paperclip.svg | 0 .../paragraph.svg | 0 .../pass-fill.svg | 0 .../pass.svg | 0 .../passport-fill.svg | 0 .../passport.svg | 0 .../patch-check-fill.svg | 0 .../patch-check.svg | 0 .../patch-exclamation-fill.svg | 0 .../patch-exclamation.svg | 0 .../patch-minus-fill.svg | 0 .../patch-minus.svg | 0 .../patch-plus-fill.svg | 0 .../patch-plus.svg | 0 .../patch-question-fill.svg | 0 .../patch-question.svg | 0 .../pause-btn-fill.svg | 0 .../pause-btn.svg | 0 .../pause-circle-fill.svg | 0 .../pause-circle.svg | 0 .../pause-fill.svg | 0 .../pause.svg | 0 .../paypal.svg | 0 .../pc-display-horizontal.svg | 0 .../pc-display.svg | 0 .../pc-horizontal.svg | 0 .../pc.svg | 0 .../pci-card-network.svg | 0 .../pci-card-sound.svg | 0 .../pci-card.svg | 0 .../peace-fill.svg | 0 .../peace.svg | 0 .../pen-fill.svg | 0 .../pen.svg | 0 .../pencil-fill.svg | 0 .../pencil-square.svg | 0 .../pencil.svg | 0 .../pentagon-fill.svg | 0 .../pentagon-half.svg | 0 .../pentagon.svg | 0 .../people-fill.svg | 0 .../people.svg | 0 .../percent.svg | 0 .../perplexity.svg | 0 .../person-add.svg | 0 .../person-arms-up.svg | 0 .../person-badge-fill.svg | 0 .../person-badge.svg | 0 .../person-bounding-box.svg | 0 .../person-check-fill.svg | 0 .../person-check.svg | 0 .../person-circle.svg | 0 .../person-dash-fill.svg | 0 .../person-dash.svg | 0 .../person-down.svg | 0 .../person-exclamation.svg | 0 .../person-fill-add.svg | 0 .../person-fill-check.svg | 0 .../person-fill-dash.svg | 0 .../person-fill-down.svg | 0 .../person-fill-exclamation.svg | 0 .../person-fill-gear.svg | 0 .../person-fill-lock.svg | 0 .../person-fill-slash.svg | 0 .../person-fill-up.svg | 0 .../person-fill-x.svg | 0 .../person-fill.svg | 0 .../person-gear.svg | 0 .../person-heart.svg | 0 .../person-hearts.svg | 0 .../person-lines-fill.svg | 0 .../person-lock.svg | 0 .../person-plus-fill.svg | 0 .../person-plus.svg | 0 .../person-raised-hand.svg | 0 .../person-rolodex.svg | 0 .../person-slash.svg | 0 .../person-square.svg | 0 .../person-standing-dress.svg | 0 .../person-standing.svg | 0 .../person-up.svg | 0 .../person-vcard-fill.svg | 0 .../person-vcard.svg | 0 .../person-video.svg | 0 .../person-video2.svg | 0 .../person-video3.svg | 0 .../person-walking.svg | 0 .../person-wheelchair.svg | 0 .../person-workspace.svg | 0 .../person-x-fill.svg | 0 .../person-x.svg | 0 .../person.svg | 0 .../phone-fill.svg | 0 .../phone-flip.svg | 0 .../phone-landscape-fill.svg | 0 .../phone-landscape.svg | 0 .../phone-vibrate-fill.svg | 0 .../phone-vibrate.svg | 0 .../phone.svg | 0 .../pie-chart-fill.svg | 0 .../pie-chart.svg | 0 .../piggy-bank-fill.svg | 0 .../piggy-bank.svg | 0 .../pin-angle-fill.svg | 0 .../pin-angle.svg | 0 .../pin-fill.svg | 0 .../pin-map-fill.svg | 0 .../pin-map.svg | 0 .../pin.svg | 0 .../pinterest.svg | 0 .../pip-fill.svg | 0 .../pip.svg | 0 .../play-btn-fill.svg | 0 .../play-btn.svg | 0 .../play-circle-fill.svg | 0 .../play-circle.svg | 0 .../play-fill.svg | 0 .../play.svg | 0 .../playstation.svg | 0 .../plug-fill.svg | 0 .../plug.svg | 0 .../plugin.svg | 0 .../plus-circle-dotted.svg | 0 .../plus-circle-fill.svg | 0 .../plus-circle.svg | 0 .../plus-lg.svg | 0 .../plus-slash-minus.svg | 0 .../plus-square-dotted.svg | 0 .../plus-square-fill.svg | 0 .../plus-square.svg | 0 .../plus.svg | 0 .../postage-fill.svg | 0 .../postage-heart-fill.svg | 0 .../postage-heart.svg | 0 .../postage.svg | 0 .../postcard-fill.svg | 0 .../postcard-heart-fill.svg | 0 .../postcard-heart.svg | 0 .../postcard.svg | 0 .../power.svg | 0 .../prescription.svg | 0 .../prescription2.svg | 0 .../printer-fill.svg | 0 .../printer.svg | 0 .../projector-fill.svg | 0 .../projector.svg | 0 .../puzzle-fill.svg | 0 .../puzzle.svg | 0 .../qr-code-scan.svg | 0 .../qr-code.svg | 0 .../question-circle-fill.svg | 0 .../question-circle.svg | 0 .../question-diamond-fill.svg | 0 .../question-diamond.svg | 0 .../question-lg.svg | 0 .../question-octagon-fill.svg | 0 .../question-octagon.svg | 0 .../question-square-fill.svg | 0 .../question-square.svg | 0 .../question.svg | 0 .../quora.svg | 0 .../quote.svg | 0 .../r-circle-fill.svg | 0 .../r-circle.svg | 0 .../r-square-fill.svg | 0 .../r-square.svg | 0 .../radar.svg | 0 .../radioactive.svg | 0 .../rainbow.svg | 0 .../receipt-cutoff.svg | 0 .../receipt.svg | 0 .../reception-0.svg | 0 .../reception-1.svg | 0 .../reception-2.svg | 0 .../reception-3.svg | 0 .../reception-4.svg | 0 .../record-btn-fill.svg | 0 .../record-btn.svg | 0 .../record-circle-fill.svg | 0 .../record-circle.svg | 0 .../record-fill.svg | 0 .../record.svg | 0 .../record2-fill.svg | 0 .../record2.svg | 0 .../recycle.svg | 0 .../reddit.svg | 0 .../regex.svg | 0 .../repeat-1.svg | 0 .../repeat.svg | 0 .../reply-all-fill.svg | 0 .../reply-all.svg | 0 .../reply-fill.svg | 0 .../reply.svg | 0 .../rewind-btn-fill.svg | 0 .../rewind-btn.svg | 0 .../rewind-circle-fill.svg | 0 .../rewind-circle.svg | 0 .../rewind-fill.svg | 0 .../rewind.svg | 0 .../robot.svg | 0 .../rocket-fill.svg | 0 .../rocket-takeoff-fill.svg | 0 .../rocket-takeoff.svg | 0 .../rocket.svg | 0 .../router-fill.svg | 0 .../router.svg | 0 .../rss-fill.svg | 0 .../rss.svg | 0 .../rulers.svg | 0 .../safe-fill.svg | 0 .../safe.svg | 0 .../safe2-fill.svg | 0 .../safe2.svg | 0 .../save-fill.svg | 0 .../save.svg | 0 .../save2-fill.svg | 0 .../save2.svg | 0 .../scissors.svg | 0 .../scooter.svg | 0 .../screwdriver.svg | 0 .../sd-card-fill.svg | 0 .../sd-card.svg | 0 .../search-heart-fill.svg | 0 .../search-heart.svg | 0 .../search.svg | 0 .../segmented-nav.svg | 0 .../send-arrow-down-fill.svg | 0 .../send-arrow-down.svg | 0 .../send-arrow-up-fill.svg | 0 .../send-arrow-up.svg | 0 .../send-check-fill.svg | 0 .../send-check.svg | 0 .../send-dash-fill.svg | 0 .../send-dash.svg | 0 .../send-exclamation-fill.svg | 0 .../send-exclamation.svg | 0 .../send-fill.svg | 0 .../send-plus-fill.svg | 0 .../send-plus.svg | 0 .../send-slash-fill.svg | 0 .../send-slash.svg | 0 .../send-x-fill.svg | 0 .../send-x.svg | 0 .../send.svg | 0 .../server.svg | 0 .../shadows.svg | 0 .../share-fill.svg | 0 .../share.svg | 0 .../shield-check.svg | 0 .../shield-exclamation.svg | 0 .../shield-fill-check.svg | 0 .../shield-fill-exclamation.svg | 0 .../shield-fill-minus.svg | 0 .../shield-fill-plus.svg | 0 .../shield-fill-x.svg | 0 .../shield-fill.svg | 0 .../shield-lock-fill.svg | 0 .../shield-lock.svg | 0 .../shield-minus.svg | 0 .../shield-plus.svg | 0 .../shield-shaded.svg | 0 .../shield-slash-fill.svg | 0 .../shield-slash.svg | 0 .../shield-x.svg | 0 .../shield.svg | 0 .../shift-fill.svg | 0 .../shift.svg | 0 .../shop-window.svg | 0 .../shop.svg | 0 .../shuffle.svg | 0 .../sign-dead-end-fill.svg | 0 .../sign-dead-end.svg | 0 .../sign-do-not-enter-fill.svg | 0 .../sign-do-not-enter.svg | 0 .../sign-intersection-fill.svg | 0 .../sign-intersection-side-fill.svg | 0 .../sign-intersection-side.svg | 0 .../sign-intersection-t-fill.svg | 0 .../sign-intersection-t.svg | 0 .../sign-intersection-y-fill.svg | 0 .../sign-intersection-y.svg | 0 .../sign-intersection.svg | 0 .../sign-merge-left-fill.svg | 0 .../sign-merge-left.svg | 0 .../sign-merge-right-fill.svg | 0 .../sign-merge-right.svg | 0 .../sign-no-left-turn-fill.svg | 0 .../sign-no-left-turn.svg | 0 .../sign-no-parking-fill.svg | 0 .../sign-no-parking.svg | 0 .../sign-no-right-turn-fill.svg | 0 .../sign-no-right-turn.svg | 0 .../sign-railroad-fill.svg | 0 .../sign-railroad.svg | 0 .../sign-stop-fill.svg | 0 .../sign-stop-lights-fill.svg | 0 .../sign-stop-lights.svg | 0 .../sign-stop.svg | 0 .../sign-turn-left-fill.svg | 0 .../sign-turn-left.svg | 0 .../sign-turn-right-fill.svg | 0 .../sign-turn-right.svg | 0 .../sign-turn-slight-left-fill.svg | 0 .../sign-turn-slight-left.svg | 0 .../sign-turn-slight-right-fill.svg | 0 .../sign-turn-slight-right.svg | 0 .../sign-yield-fill.svg | 0 .../sign-yield.svg | 0 .../signal.svg | 0 .../signpost-2-fill.svg | 0 .../signpost-2.svg | 0 .../signpost-fill.svg | 0 .../signpost-split-fill.svg | 0 .../signpost-split.svg | 0 .../signpost.svg | 0 .../sim-fill.svg | 0 .../sim-slash-fill.svg | 0 .../sim-slash.svg | 0 .../sim.svg | 0 .../sina-weibo.svg | 0 .../skip-backward-btn-fill.svg | 0 .../skip-backward-btn.svg | 0 .../skip-backward-circle-fill.svg | 0 .../skip-backward-circle.svg | 0 .../skip-backward-fill.svg | 0 .../skip-backward.svg | 0 .../skip-end-btn-fill.svg | 0 .../skip-end-btn.svg | 0 .../skip-end-circle-fill.svg | 0 .../skip-end-circle.svg | 0 .../skip-end-fill.svg | 0 .../skip-end.svg | 0 .../skip-forward-btn-fill.svg | 0 .../skip-forward-btn.svg | 0 .../skip-forward-circle-fill.svg | 0 .../skip-forward-circle.svg | 0 .../skip-forward-fill.svg | 0 .../skip-forward.svg | 0 .../skip-start-btn-fill.svg | 0 .../skip-start-btn.svg | 0 .../skip-start-circle-fill.svg | 0 .../skip-start-circle.svg | 0 .../skip-start-fill.svg | 0 .../skip-start.svg | 0 .../skype.svg | 0 .../slack.svg | 0 .../slash-circle-fill.svg | 0 .../slash-circle.svg | 0 .../slash-lg.svg | 0 .../slash-square-fill.svg | 0 .../slash-square.svg | 0 .../slash.svg | 0 .../sliders.svg | 0 .../sliders2-vertical.svg | 0 .../sliders2.svg | 0 .../smartwatch.svg | 0 .../snapchat.svg | 0 .../snow.svg | 0 .../snow2.svg | 0 .../snow3.svg | 0 .../sort-alpha-down-alt.svg | 0 .../sort-alpha-down.svg | 0 .../sort-alpha-up-alt.svg | 0 .../sort-alpha-up.svg | 0 .../sort-down-alt.svg | 0 .../sort-down.svg | 0 .../sort-numeric-down-alt.svg | 0 .../sort-numeric-down.svg | 0 .../sort-numeric-up-alt.svg | 0 .../sort-numeric-up.svg | 0 .../sort-up-alt.svg | 0 .../sort-up.svg | 0 .../soundwave.svg | 0 .../sourceforge.svg | 0 .../speaker-fill.svg | 0 .../speaker.svg | 0 .../speedometer.svg | 0 .../speedometer2.svg | 0 .../spellcheck.svg | 0 .../spotify.svg | 0 .../square-fill.svg | 0 .../square-half.svg | 0 .../square.svg | 0 .../stack-overflow.svg | 0 .../stack.svg | 0 .../star-fill.svg | 0 .../star-half.svg | 0 .../star.svg | 0 .../stars.svg | 0 .../steam.svg | 0 .../stickies-fill.svg | 0 .../stickies.svg | 0 .../sticky-fill.svg | 0 .../sticky.svg | 0 .../stop-btn-fill.svg | 0 .../stop-btn.svg | 0 .../stop-circle-fill.svg | 0 .../stop-circle.svg | 0 .../stop-fill.svg | 0 .../stop.svg | 0 .../stoplights-fill.svg | 0 .../stoplights.svg | 0 .../stopwatch-fill.svg | 0 .../stopwatch.svg | 0 .../strava.svg | 0 .../stripe.svg | 0 .../subscript.svg | 0 .../substack.svg | 0 .../subtract.svg | 0 .../suit-club-fill.svg | 0 .../suit-club.svg | 0 .../suit-diamond-fill.svg | 0 .../suit-diamond.svg | 0 .../suit-heart-fill.svg | 0 .../suit-heart.svg | 0 .../suit-spade-fill.svg | 0 .../suit-spade.svg | 0 .../suitcase-fill.svg | 0 .../suitcase-lg-fill.svg | 0 .../suitcase-lg.svg | 0 .../suitcase.svg | 0 .../suitcase2-fill.svg | 0 .../suitcase2.svg | 0 .../sun-fill.svg | 0 .../sun.svg | 0 .../sunglasses.svg | 0 .../sunrise-fill.svg | 0 .../sunrise.svg | 0 .../sunset-fill.svg | 0 .../sunset.svg | 0 .../superscript.svg | 0 .../symmetry-horizontal.svg | 0 .../symmetry-vertical.svg | 0 .../table.svg | 0 .../tablet-fill.svg | 0 .../tablet-landscape-fill.svg | 0 .../tablet-landscape.svg | 0 .../tablet.svg | 0 .../tag-fill.svg | 0 .../tag.svg | 0 .../tags-fill.svg | 0 .../tags.svg | 0 .../taxi-front-fill.svg | 0 .../taxi-front.svg | 0 .../telegram.svg | 0 .../telephone-fill.svg | 0 .../telephone-forward-fill.svg | 0 .../telephone-forward.svg | 0 .../telephone-inbound-fill.svg | 0 .../telephone-inbound.svg | 0 .../telephone-minus-fill.svg | 0 .../telephone-minus.svg | 0 .../telephone-outbound-fill.svg | 0 .../telephone-outbound.svg | 0 .../telephone-plus-fill.svg | 0 .../telephone-plus.svg | 0 .../telephone-x-fill.svg | 0 .../telephone-x.svg | 0 .../telephone.svg | 0 .../tencent-qq.svg | 0 .../terminal-dash.svg | 0 .../terminal-fill.svg | 0 .../terminal-plus.svg | 0 .../terminal-split.svg | 0 .../terminal-x.svg | 0 .../terminal.svg | 0 .../text-center.svg | 0 .../text-indent-left.svg | 0 .../text-indent-right.svg | 0 .../text-left.svg | 0 .../text-paragraph.svg | 0 .../text-right.svg | 0 .../text-wrap.svg | 0 .../textarea-resize.svg | 0 .../textarea-t.svg | 0 .../textarea.svg | 0 .../thermometer-half.svg | 0 .../thermometer-high.svg | 0 .../thermometer-low.svg | 0 .../thermometer-snow.svg | 0 .../thermometer-sun.svg | 0 .../thermometer.svg | 0 .../threads-fill.svg | 0 .../threads.svg | 0 .../three-dots-vertical.svg | 0 .../three-dots.svg | 0 .../thunderbolt-fill.svg | 0 .../thunderbolt.svg | 0 .../ticket-detailed-fill.svg | 0 .../ticket-detailed.svg | 0 .../ticket-fill.svg | 0 .../ticket-perforated-fill.svg | 0 .../ticket-perforated.svg | 0 .../ticket.svg | 0 .../tiktok.svg | 0 .../toggle-off.svg | 0 .../toggle-on.svg | 0 .../toggle2-off.svg | 0 .../toggle2-on.svg | 0 .../toggles.svg | 0 .../toggles2.svg | 0 .../tools.svg | 0 .../tornado.svg | 0 .../train-freight-front-fill.svg | 0 .../train-freight-front.svg | 0 .../train-front-fill.svg | 0 .../train-front.svg | 0 .../train-lightrail-front-fill.svg | 0 .../train-lightrail-front.svg | 0 .../translate.svg | 0 .../transparency.svg | 0 .../trash-fill.svg | 0 .../trash.svg | 0 .../trash2-fill.svg | 0 .../trash2.svg | 0 .../trash3-fill.svg | 0 .../trash3.svg | 0 .../tree-fill.svg | 0 .../tree.svg | 0 .../trello.svg | 0 .../triangle-fill.svg | 0 .../triangle-half.svg | 0 .../triangle.svg | 0 .../trophy-fill.svg | 0 .../trophy.svg | 0 .../tropical-storm.svg | 0 .../truck-flatbed.svg | 0 .../truck-front-fill.svg | 0 .../truck-front.svg | 0 .../truck.svg | 0 .../tsunami.svg | 0 .../tux.svg | 0 .../tv-fill.svg | 0 .../tv.svg | 0 .../twitch.svg | 0 .../twitter-x.svg | 0 .../twitter.svg | 0 .../type-bold.svg | 0 .../type-h1.svg | 0 .../type-h2.svg | 0 .../type-h3.svg | 0 .../type-h4.svg | 0 .../type-h5.svg | 0 .../type-h6.svg | 0 .../type-italic.svg | 0 .../type-strikethrough.svg | 0 .../type-underline.svg | 0 .../type.svg | 0 .../typescript.svg | 0 .../ubuntu.svg | 0 .../ui-checks-grid.svg | 0 .../ui-checks.svg | 0 .../ui-radios-grid.svg | 0 .../ui-radios.svg | 0 .../umbrella-fill.svg | 0 .../umbrella.svg | 0 .../unindent.svg | 0 .../union.svg | 0 .../unity.svg | 0 .../universal-access-circle.svg | 0 .../universal-access.svg | 0 .../unlock-fill.svg | 0 .../unlock.svg | 0 .../unlock2-fill.svg | 0 .../unlock2.svg | 0 .../upc-scan.svg | 0 .../upc.svg | 0 .../upload.svg | 0 .../usb-c-fill.svg | 0 .../usb-c.svg | 0 .../usb-drive-fill.svg | 0 .../usb-drive.svg | 0 .../usb-fill.svg | 0 .../usb-micro-fill.svg | 0 .../usb-micro.svg | 0 .../usb-mini-fill.svg | 0 .../usb-mini.svg | 0 .../usb-plug-fill.svg | 0 .../usb-plug.svg | 0 .../usb-symbol.svg | 0 .../usb.svg | 0 .../valentine.svg | 0 .../valentine2.svg | 0 .../vector-pen.svg | 0 .../view-list.svg | 0 .../view-stacked.svg | 0 .../vignette.svg | 0 .../vimeo.svg | 0 .../vinyl-fill.svg | 0 .../vinyl.svg | 0 .../virus.svg | 0 .../virus2.svg | 0 .../voicemail.svg | 0 .../volume-down-fill.svg | 0 .../volume-down.svg | 0 .../volume-mute-fill.svg | 0 .../volume-mute.svg | 0 .../volume-off-fill.svg | 0 .../volume-off.svg | 0 .../volume-up-fill.svg | 0 .../volume-up.svg | 0 .../vr.svg | 0 .../wallet-fill.svg | 0 .../wallet.svg | 0 .../wallet2.svg | 0 .../watch.svg | 0 .../water.svg | 0 .../webcam-fill.svg | 0 .../webcam.svg | 0 .../wechat.svg | 0 .../whatsapp.svg | 0 .../wifi-1.svg | 0 .../wifi-2.svg | 0 .../wifi-off.svg | 0 .../wifi.svg | 0 .../wikipedia.svg | 0 .../wind.svg | 0 .../window-dash.svg | 0 .../window-desktop.svg | 0 .../window-dock.svg | 0 .../window-fullscreen.svg | 0 .../window-plus.svg | 0 .../window-sidebar.svg | 0 .../window-split.svg | 0 .../window-stack.svg | 0 .../window-x.svg | 0 .../window.svg | 0 .../windows.svg | 0 .../wordpress.svg | 0 .../wrench-adjustable-circle-fill.svg | 0 .../wrench-adjustable-circle.svg | 0 .../wrench-adjustable.svg | 0 .../wrench.svg | 0 .../x-circle-fill.svg | 0 .../x-circle.svg | 0 .../x-diamond-fill.svg | 0 .../x-diamond.svg | 0 .../x-lg.svg | 0 .../x-octagon-fill.svg | 0 .../x-octagon.svg | 0 .../x-square-fill.svg | 0 .../x-square.svg | 0 .../x.svg | 0 .../xbox.svg | 0 .../yelp.svg | 0 .../yin-yang.svg | 0 .../youtube.svg | 0 .../zoom-in.svg | 0 .../zoom-out.svg | 0 templates/base.html | 81 +- templates/contacto.html | 2 +- templates/index.html | 2 +- templates/itv/list.html | 10 +- templates/tablas/poblaciones.html | 122 - templates/tablas/tipo.html | 2 +- templates/tablas/unidades.html | 2 +- templates/tablas/unidades_tabulator.html | 828 + templates/vehiculos/form.html | 375 +- templates/vehiculos/list.html | 8 +- templates/vehiculos/rows.html | 14 +- templates/viat/list.html | 10 +- templates/viat/rows.html | 2 +- uploads/documentos/v3260_1788429735.pdf | Bin 0 -> 4794620 bytes venv/bin/Activate.ps1 | 247 + venv/bin/activate | 63 + venv/bin/activate.csh | 26 + venv/bin/activate.fish | 69 + venv/bin/flask | 8 + venv/bin/gunicorn | 8 + venv/bin/gunicornc | 8 + venv/bin/pip | 8 + venv/bin/pip3 | 8 + venv/bin/pip3.11 | 8 + venv/bin/python | 1 + venv/bin/python3 | 1 + venv/bin/python3.11 | 1 + .../site-packages/_distutils_hack/__init__.py | 222 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 11169 bytes .../__pycache__/override.cpython-311.pyc | Bin 0 -> 326 bytes .../site-packages/_distutils_hack/override.py | 1 + .../blinker-1.9.0.dist-info/INSTALLER | 1 + .../blinker-1.9.0.dist-info/LICENSE.txt | 20 + .../blinker-1.9.0.dist-info/METADATA | 60 + .../blinker-1.9.0.dist-info/RECORD | 12 + .../blinker-1.9.0.dist-info/WHEEL | 4 + .../site-packages/blinker/__init__.py | 17 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 617 bytes .../__pycache__/_utilities.cpython-311.pyc | Bin 0 -> 3102 bytes .../blinker/__pycache__/base.cpython-311.pyc | Bin 0 -> 23634 bytes .../site-packages/blinker/_utilities.py | 64 + .../python3.11/site-packages/blinker/base.py | 512 + .../python3.11/site-packages/blinker/py.typed | 0 .../click-8.5.0.dist-info/INSTALLER | 1 + .../click-8.5.0.dist-info/METADATA | 83 + .../click-8.5.0.dist-info/RECORD | 40 + .../site-packages/click-8.5.0.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 28 + .../site-packages/click/__init__.py | 144 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5899 bytes .../click/__pycache__/_compat.cpython-311.pyc | Bin 0 -> 24582 bytes .../__pycache__/_termui_impl.cpython-311.pyc | Bin 0 -> 39533 bytes .../__pycache__/_textwrap.cpython-311.pyc | Bin 0 -> 8088 bytes .../click/__pycache__/_utils.cpython-311.pyc | Bin 0 -> 1485 bytes .../__pycache__/_winconsole.cpython-311.pyc | Bin 0 -> 13893 bytes .../click/__pycache__/core.cpython-311.pyc | Bin 0 -> 159820 bytes .../__pycache__/decorators.cpython-311.pyc | Bin 0 -> 27231 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 19497 bytes .../__pycache__/formatting.cpython-311.pyc | Bin 0 -> 15992 bytes .../click/__pycache__/globals.cpython-311.pyc | Bin 0 -> 3275 bytes .../click/__pycache__/parser.cpython-311.pyc | Bin 0 -> 22621 bytes .../shell_completion.cpython-311.pyc | Bin 0 -> 30694 bytes .../click/__pycache__/termui.cpython-311.pyc | Bin 0 -> 41197 bytes .../click/__pycache__/testing.cpython-311.pyc | Bin 0 -> 39201 bytes .../click/__pycache__/types.cpython-311.pyc | Bin 0 -> 65358 bytes .../click/__pycache__/utils.cpython-311.pyc | Bin 0 -> 28802 bytes .../python3.11/site-packages/click/_compat.py | 590 + .../site-packages/click/_termui_impl.py | 972 + .../site-packages/click/_textwrap.py | 188 + .../python3.11/site-packages/click/_utils.py | 36 + .../site-packages/click/_winconsole.py | 297 + .../python3.11/site-packages/click/core.py | 3799 ++++ .../site-packages/click/decorators.py | 627 + .../site-packages/click/exceptions.py | 378 + .../site-packages/click/formatting.py | 320 + .../python3.11/site-packages/click/globals.py | 67 + .../python3.11/site-packages/click/parser.py | 533 + .../python3.11/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 801 + .../python3.11/site-packages/click/termui.py | 1014 + .../python3.11/site-packages/click/testing.py | 798 + .../python3.11/site-packages/click/types.py | 1422 ++ .../python3.11/site-packages/click/utils.py | 688 + .../site-packages/distutils-precedence.pth | 1 + .../et_xmlfile-2.0.0.dist-info/AUTHORS.txt | 5 + .../et_xmlfile-2.0.0.dist-info/INSTALLER | 1 + .../et_xmlfile-2.0.0.dist-info/LICENCE.python | 298 + .../et_xmlfile-2.0.0.dist-info/LICENCE.rst | 23 + .../et_xmlfile-2.0.0.dist-info/METADATA | 51 + .../et_xmlfile-2.0.0.dist-info/RECORD | 14 + .../et_xmlfile-2.0.0.dist-info/WHEEL | 5 + .../et_xmlfile-2.0.0.dist-info/top_level.txt | 1 + .../site-packages/et_xmlfile/__init__.py | 8 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 465 bytes .../incremental_tree.cpython-311.pyc | Bin 0 -> 27871 bytes .../__pycache__/xmlfile.cpython-311.pyc | Bin 0 -> 5942 bytes .../et_xmlfile/incremental_tree.py | 917 + .../site-packages/et_xmlfile/xmlfile.py | 158 + .../flask-3.1.3.dist-info/INSTALLER | 1 + .../flask-3.1.3.dist-info/METADATA | 91 + .../flask-3.1.3.dist-info/RECORD | 58 + .../flask-3.1.3.dist-info/REQUESTED | 0 .../site-packages/flask-3.1.3.dist-info/WHEEL | 4 + .../flask-3.1.3.dist-info/entry_points.txt | 3 + .../licenses/LICENSE.txt | 28 + .../site-packages/flask/__init__.py | 61 + .../site-packages/flask/__main__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3233 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 269 bytes .../flask/__pycache__/app.cpython-311.pyc | Bin 0 -> 65088 bytes .../__pycache__/blueprints.cpython-311.pyc | Bin 0 -> 5366 bytes .../flask/__pycache__/cli.cpython-311.pyc | Bin 0 -> 48085 bytes .../flask/__pycache__/config.cpython-311.pyc | Bin 0 -> 17227 bytes .../flask/__pycache__/ctx.cpython-311.pyc | Bin 0 -> 21502 bytes .../__pycache__/debughelpers.cpython-311.pyc | Bin 0 -> 10221 bytes .../flask/__pycache__/globals.cpython-311.pyc | Bin 0 -> 2232 bytes .../flask/__pycache__/helpers.cpython-311.pyc | Bin 0 -> 26765 bytes .../flask/__pycache__/logging.cpython-311.pyc | Bin 0 -> 3462 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 0 -> 17664 bytes .../flask/__pycache__/signals.cpython-311.pyc | Bin 0 -> 1373 bytes .../__pycache__/templating.cpython-311.pyc | Bin 0 -> 10668 bytes .../flask/__pycache__/testing.cpython-311.pyc | Bin 0 -> 14647 bytes .../flask/__pycache__/typing.cpython-311.pyc | Bin 0 -> 3834 bytes .../flask/__pycache__/views.cpython-311.pyc | Bin 0 -> 7469 bytes .../__pycache__/wrappers.cpython-311.pyc | Bin 0 -> 10860 bytes .../lib/python3.11/site-packages/flask/app.py | 1536 ++ .../site-packages/flask/blueprints.py | 128 + .../lib/python3.11/site-packages/flask/cli.py | 1135 ++ .../python3.11/site-packages/flask/config.py | 367 + .../lib/python3.11/site-packages/flask/ctx.py | 459 + .../site-packages/flask/debughelpers.py | 178 + .../python3.11/site-packages/flask/globals.py | 51 + .../python3.11/site-packages/flask/helpers.py | 641 + .../site-packages/flask/json/__init__.py | 170 + .../json/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6884 bytes .../json/__pycache__/provider.cpython-311.pyc | Bin 0 -> 9999 bytes .../json/__pycache__/tag.cpython-311.pyc | Bin 0 -> 16592 bytes .../site-packages/flask/json/provider.py | 215 + .../site-packages/flask/json/tag.py | 327 + .../python3.11/site-packages/flask/logging.py | 79 + .../python3.11/site-packages/flask/py.typed | 0 .../site-packages/flask/sansio/README.md | 6 + .../sansio/__pycache__/app.cpython-311.pyc | Bin 0 -> 35450 bytes .../__pycache__/blueprints.cpython-311.pyc | Bin 0 -> 32560 bytes .../__pycache__/scaffold.cpython-311.pyc | Bin 0 -> 31439 bytes .../site-packages/flask/sansio/app.py | 964 + .../site-packages/flask/sansio/blueprints.py | 632 + .../site-packages/flask/sansio/scaffold.py | 792 + .../site-packages/flask/sessions.py | 385 + .../python3.11/site-packages/flask/signals.py | 17 + .../site-packages/flask/templating.py | 220 + .../python3.11/site-packages/flask/testing.py | 298 + .../python3.11/site-packages/flask/typing.py | 93 + .../python3.11/site-packages/flask/views.py | 191 + .../site-packages/flask/wrappers.py | 257 + .../gunicorn-26.2.0.dist-info/INSTALLER | 1 + .../gunicorn-26.2.0.dist-info/METADATA | 131 + .../gunicorn-26.2.0.dist-info/RECORD | 146 + .../gunicorn-26.2.0.dist-info/REQUESTED | 0 .../gunicorn-26.2.0.dist-info/WHEEL | 5 + .../entry_points.txt | 6 + .../licenses/LICENSE | 23 + .../gunicorn-26.2.0.dist-info/top_level.txt | 1 + .../site-packages/gunicorn/__init__.py | 8 + .../site-packages/gunicorn/__main__.py | 10 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 587 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 379 bytes .../__pycache__/arbiter.cpython-311.pyc | Bin 0 -> 50447 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 131438 bytes .../__pycache__/debug.cpython-311.pyc | Bin 0 -> 3458 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 1413 bytes .../__pycache__/glogging.cpython-311.pyc | Bin 0 -> 24704 bytes .../__pycache__/pidfile.cpython-311.pyc | Bin 0 -> 4912 bytes .../__pycache__/reloader.cpython-311.pyc | Bin 0 -> 8218 bytes .../gunicorn/__pycache__/sock.cpython-311.pyc | Bin 0 -> 15995 bytes .../__pycache__/systemd.cpython-311.pyc | Bin 0 -> 3802 bytes .../gunicorn/__pycache__/util.cpython-311.pyc | Bin 0 -> 29226 bytes .../site-packages/gunicorn/app/__init__.py | 3 + .../app/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 201 bytes .../app/__pycache__/base.cpython-311.pyc | Bin 0 -> 12601 bytes .../app/__pycache__/pasterapp.cpython-311.pyc | Bin 0 -> 3563 bytes .../app/__pycache__/wsgiapp.cpython-311.pyc | Bin 0 -> 3719 bytes .../site-packages/gunicorn/app/base.py | 235 + .../site-packages/gunicorn/app/pasterapp.py | 74 + .../site-packages/gunicorn/app/wsgiapp.py | 70 + .../site-packages/gunicorn/arbiter.py | 1037 + .../site-packages/gunicorn/asgi/__init__.py | 24 + .../asgi/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 856 bytes .../asgi/__pycache__/lifespan.cpython-311.pyc | Bin 0 -> 9164 bytes .../asgi/__pycache__/parser.cpython-311.pyc | Bin 0 -> 38343 bytes .../asgi/__pycache__/protocol.cpython-311.pyc | Bin 0 -> 85271 bytes .../asgi/__pycache__/unreader.cpython-311.pyc | Bin 0 -> 6002 bytes .../asgi/__pycache__/uwsgi.cpython-311.pyc | Bin 0 -> 7299 bytes .../__pycache__/websocket.cpython-311.pyc | Bin 0 -> 19823 bytes .../site-packages/gunicorn/asgi/lifespan.py | 178 + .../site-packages/gunicorn/asgi/parser.py | 991 + .../site-packages/gunicorn/asgi/protocol.py | 2007 ++ .../site-packages/gunicorn/asgi/unreader.py | 135 + .../site-packages/gunicorn/asgi/uwsgi.py | 172 + .../site-packages/gunicorn/asgi/websocket.py | 437 + .../site-packages/gunicorn/config.py | 3303 +++ .../site-packages/gunicorn/ctl/__init__.py | 16 + .../ctl/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 661 bytes .../ctl/__pycache__/cli.cpython-311.pyc | Bin 0 -> 22716 bytes .../ctl/__pycache__/client.cpython-311.pyc | Bin 0 -> 5801 bytes .../ctl/__pycache__/handlers.cpython-311.pyc | Bin 0 -> 21506 bytes .../ctl/__pycache__/protocol.cpython-311.pyc | Bin 0 -> 8605 bytes .../ctl/__pycache__/server.cpython-311.pyc | Bin 0 -> 19624 bytes .../site-packages/gunicorn/ctl/cli.py | 450 + .../site-packages/gunicorn/ctl/client.py | 139 + .../site-packages/gunicorn/ctl/handlers.py | 585 + .../site-packages/gunicorn/ctl/protocol.py | 224 + .../site-packages/gunicorn/ctl/server.py | 419 + .../site-packages/gunicorn/debug.py | 68 + .../site-packages/gunicorn/dirty/__init__.py | 81 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1928 bytes .../dirty/__pycache__/app.cpython-311.pyc | Bin 0 -> 11538 bytes .../dirty/__pycache__/arbiter.cpython-311.pyc | Bin 0 -> 53512 bytes .../dirty/__pycache__/client.cpython-311.pyc | Bin 0 -> 28071 bytes .../dirty/__pycache__/errors.cpython-311.pyc | Bin 0 -> 9728 bytes .../__pycache__/protocol.cpython-311.pyc | Bin 0 -> 27487 bytes .../dirty/__pycache__/stash.cpython-311.pyc | Bin 0 -> 21872 bytes .../dirty/__pycache__/tlv.cpython-311.pyc | Bin 0 -> 12768 bytes .../dirty/__pycache__/worker.cpython-311.pyc | Bin 0 -> 25258 bytes .../site-packages/gunicorn/dirty/app.py | 350 + .../site-packages/gunicorn/dirty/arbiter.py | 1156 ++ .../site-packages/gunicorn/dirty/client.py | 754 + .../site-packages/gunicorn/dirty/errors.py | 180 + .../site-packages/gunicorn/dirty/protocol.py | 810 + .../site-packages/gunicorn/dirty/stash.py | 503 + .../site-packages/gunicorn/dirty/tlv.py | 303 + .../site-packages/gunicorn/dirty/worker.py | 530 + .../site-packages/gunicorn/errors.py | 28 + .../site-packages/gunicorn/glogging.py | 493 + .../site-packages/gunicorn/http/__init__.py | 36 + .../http/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1397 bytes .../http/__pycache__/body.cpython-311.pyc | Bin 0 -> 14529 bytes .../http/__pycache__/errors.cpython-311.pyc | Bin 0 -> 11762 bytes .../http/__pycache__/message.cpython-311.pyc | Bin 0 -> 37663 bytes .../http/__pycache__/parser.cpython-311.pyc | Bin 0 -> 5837 bytes .../http/__pycache__/unreader.cpython-311.pyc | Bin 0 -> 5189 bytes .../http/__pycache__/wsgi.cpython-311.pyc | Bin 0 -> 23193 bytes .../site-packages/gunicorn/http/body.py | 274 + .../site-packages/gunicorn/http/errors.py | 182 + .../site-packages/gunicorn/http/message.py | 939 + .../site-packages/gunicorn/http/parser.py | 121 + .../site-packages/gunicorn/http/unreader.py | 92 + .../site-packages/gunicorn/http/wsgi.py | 551 + .../site-packages/gunicorn/http2/__init__.py | 86 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2885 bytes .../async_connection.cpython-311.pyc | Bin 0 -> 29252 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 31295 bytes .../http2/__pycache__/errors.cpython-311.pyc | Bin 0 -> 7162 bytes .../__pycache__/negotiation.cpython-311.pyc | Bin 0 -> 7493 bytes .../http2/__pycache__/request.cpython-311.pyc | Bin 0 -> 9850 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 2981 bytes .../http2/__pycache__/stream.cpython-311.pyc | Bin 0 -> 14033 bytes .../gunicorn/http2/async_connection.py | 656 + .../gunicorn/http2/connection.py | 765 + .../site-packages/gunicorn/http2/errors.py | 169 + .../gunicorn/http2/negotiation.py | 170 + .../site-packages/gunicorn/http2/request.py | 267 + .../site-packages/gunicorn/http2/response.py | 59 + .../site-packages/gunicorn/http2/stream.py | 364 + .../gunicorn/instrument/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 208 bytes .../__pycache__/statsd.cpython-311.pyc | Bin 0 -> 8436 bytes .../gunicorn/instrument/statsd.py | 140 + .../site-packages/gunicorn/pidfile.py | 87 + .../site-packages/gunicorn/reloader.py | 142 + .../python3.11/site-packages/gunicorn/sock.py | 315 + .../site-packages/gunicorn/systemd.py | 77 + .../python3.11/site-packages/gunicorn/util.py | 703 + .../site-packages/gunicorn/uwsgi/__init__.py | 21 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 629 bytes .../uwsgi/__pycache__/errors.cpython-311.pyc | Bin 0 -> 2542 bytes .../uwsgi/__pycache__/message.cpython-311.pyc | Bin 0 -> 10181 bytes .../uwsgi/__pycache__/parser.cpython-311.pyc | Bin 0 -> 656 bytes .../site-packages/gunicorn/uwsgi/errors.py | 46 + .../site-packages/gunicorn/uwsgi/message.py | 240 + .../site-packages/gunicorn/uwsgi/parser.py | 12 + .../gunicorn/workers/__init__.py | 14 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 574 bytes .../workers/__pycache__/base.cpython-311.pyc | Bin 0 -> 15673 bytes .../__pycache__/base_async.cpython-311.pyc | Bin 0 -> 18869 bytes .../workers/__pycache__/gasgi.cpython-311.pyc | Bin 0 -> 16417 bytes .../__pycache__/ggevent.cpython-311.pyc | Bin 0 -> 10238 bytes .../__pycache__/gthread.cpython-311.pyc | Bin 0 -> 38369 bytes .../__pycache__/gtornado.cpython-311.pyc | Bin 0 -> 7046 bytes .../workers/__pycache__/sync.cpython-311.pyc | Bin 0 -> 11641 bytes .../__pycache__/workertmp.cpython-311.pyc | Bin 0 -> 3087 bytes .../site-packages/gunicorn/workers/base.py | 290 + .../gunicorn/workers/base_async.py | 326 + .../site-packages/gunicorn/workers/gasgi.py | 303 + .../site-packages/gunicorn/workers/ggevent.py | 190 + .../site-packages/gunicorn/workers/gthread.py | 747 + .../gunicorn/workers/gtornado.py | 124 + .../site-packages/gunicorn/workers/sync.py | 212 + .../gunicorn/workers/workertmp.py | 53 + .../itsdangerous-2.2.0.dist-info/INSTALLER | 1 + .../itsdangerous-2.2.0.dist-info/LICENSE.txt | 28 + .../itsdangerous-2.2.0.dist-info/METADATA | 60 + .../itsdangerous-2.2.0.dist-info/RECORD | 22 + .../itsdangerous-2.2.0.dist-info/WHEEL | 4 + .../site-packages/itsdangerous/__init__.py | 38 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2002 bytes .../__pycache__/_json.cpython-311.pyc | Bin 0 -> 1379 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 0 -> 2958 bytes .../__pycache__/exc.cpython-311.pyc | Bin 0 -> 4829 bytes .../__pycache__/serializer.cpython-311.pyc | Bin 0 -> 15735 bytes .../__pycache__/signer.cpython-311.pyc | Bin 0 -> 12488 bytes .../__pycache__/timed.cpython-311.pyc | Bin 0 -> 9755 bytes .../__pycache__/url_safe.cpython-311.pyc | Bin 0 -> 4140 bytes .../site-packages/itsdangerous/_json.py | 18 + .../site-packages/itsdangerous/encoding.py | 54 + .../site-packages/itsdangerous/exc.py | 106 + .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 406 + .../site-packages/itsdangerous/signer.py | 266 + .../site-packages/itsdangerous/timed.py | 228 + .../site-packages/itsdangerous/url_safe.py | 83 + .../jinja2-3.1.6.dist-info/INSTALLER | 1 + .../jinja2-3.1.6.dist-info/METADATA | 84 + .../jinja2-3.1.6.dist-info/RECORD | 57 + .../jinja2-3.1.6.dist-info/WHEEL | 4 + .../jinja2-3.1.6.dist-info/entry_points.txt | 3 + .../licenses/LICENSE.txt | 28 + .../site-packages/jinja2/__init__.py | 38 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2128 bytes .../__pycache__/_identifier.cpython-311.pyc | Bin 0 -> 2144 bytes .../__pycache__/async_utils.cpython-311.pyc | Bin 0 -> 5604 bytes .../__pycache__/bccache.cpython-311.pyc | Bin 0 -> 20926 bytes .../__pycache__/compiler.cpython-311.pyc | Bin 0 -> 112448 bytes .../__pycache__/constants.cpython-311.pyc | Bin 0 -> 1563 bytes .../jinja2/__pycache__/debug.cpython-311.pyc | Bin 0 -> 6723 bytes .../__pycache__/defaults.cpython-311.pyc | Bin 0 -> 1729 bytes .../__pycache__/environment.cpython-311.pyc | Bin 0 -> 80586 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 8614 bytes .../jinja2/__pycache__/ext.cpython-311.pyc | Bin 0 -> 43390 bytes .../__pycache__/filters.cpython-311.pyc | Bin 0 -> 77648 bytes .../__pycache__/idtracking.cpython-311.pyc | Bin 0 -> 19518 bytes .../jinja2/__pycache__/lexer.cpython-311.pyc | Bin 0 -> 35671 bytes .../__pycache__/loaders.cpython-311.pyc | Bin 0 -> 34404 bytes .../jinja2/__pycache__/meta.cpython-311.pyc | Bin 0 -> 5708 bytes .../__pycache__/nativetypes.cpython-311.pyc | Bin 0 -> 7970 bytes .../jinja2/__pycache__/nodes.cpython-311.pyc | Bin 0 -> 64489 bytes .../__pycache__/optimizer.cpython-311.pyc | Bin 0 -> 2859 bytes .../jinja2/__pycache__/parser.cpython-311.pyc | Bin 0 -> 60035 bytes .../__pycache__/runtime.cpython-311.pyc | Bin 0 -> 51122 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 0 -> 19230 bytes .../jinja2/__pycache__/tests.cpython-311.pyc | Bin 0 -> 9279 bytes .../jinja2/__pycache__/utils.cpython-311.pyc | Bin 0 -> 37566 bytes .../__pycache__/visitor.cpython-311.pyc | Bin 0 -> 5707 bytes .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/async_utils.py | 99 + .../site-packages/jinja2/bccache.py | 408 + .../site-packages/jinja2/compiler.py | 1998 ++ .../site-packages/jinja2/constants.py | 20 + .../python3.11/site-packages/jinja2/debug.py | 191 + .../site-packages/jinja2/defaults.py | 48 + .../site-packages/jinja2/environment.py | 1672 ++ .../site-packages/jinja2/exceptions.py | 166 + .../python3.11/site-packages/jinja2/ext.py | 870 + .../site-packages/jinja2/filters.py | 1873 ++ .../site-packages/jinja2/idtracking.py | 318 + .../python3.11/site-packages/jinja2/lexer.py | 868 + .../site-packages/jinja2/loaders.py | 693 + .../python3.11/site-packages/jinja2/meta.py | 112 + .../site-packages/jinja2/nativetypes.py | 130 + .../python3.11/site-packages/jinja2/nodes.py | 1206 ++ .../site-packages/jinja2/optimizer.py | 48 + .../python3.11/site-packages/jinja2/parser.py | 1049 + .../python3.11/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1062 + .../site-packages/jinja2/sandbox.py | 436 + .../python3.11/site-packages/jinja2/tests.py | 256 + .../python3.11/site-packages/jinja2/utils.py | 766 + .../site-packages/jinja2/visitor.py | 92 + .../markupsafe-3.0.3.dist-info/INSTALLER | 1 + .../markupsafe-3.0.3.dist-info/METADATA | 74 + .../markupsafe-3.0.3.dist-info/RECORD | 14 + .../markupsafe-3.0.3.dist-info/WHEEL | 6 + .../licenses/LICENSE.txt | 28 + .../markupsafe-3.0.3.dist-info/top_level.txt | 1 + .../site-packages/markupsafe/__init__.py | 396 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 25782 bytes .../__pycache__/_native.cpython-311.pyc | Bin 0 -> 696 bytes .../site-packages/markupsafe/_native.py | 8 + .../site-packages/markupsafe/_speedups.c | 200 + .../_speedups.cpython-311-darwin.so | Bin 0 -> 50736 bytes .../site-packages/markupsafe/_speedups.pyi | 1 + .../site-packages/markupsafe/py.typed | 0 .../openpyxl-3.1.5.dist-info/INSTALLER | 1 + .../openpyxl-3.1.5.dist-info/LICENCE.rst | 23 + .../openpyxl-3.1.5.dist-info/METADATA | 86 + .../openpyxl-3.1.5.dist-info/RECORD | 387 + .../openpyxl-3.1.5.dist-info/REQUESTED | 0 .../openpyxl-3.1.5.dist-info/WHEEL | 6 + .../openpyxl-3.1.5.dist-info/top_level.txt | 1 + .../site-packages/openpyxl/__init__.py | 19 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 839 bytes .../__pycache__/_constants.cpython-311.pyc | Bin 0 -> 530 bytes .../site-packages/openpyxl/_constants.py | 13 + .../site-packages/openpyxl/cell/__init__.py | 4 + .../cell/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 370 bytes .../cell/__pycache__/_writer.cpython-311.pyc | Bin 0 -> 6491 bytes .../cell/__pycache__/cell.cpython-311.pyc | Bin 0 -> 13101 bytes .../__pycache__/read_only.cpython-311.pyc | Bin 0 -> 6672 bytes .../__pycache__/rich_text.cpython-311.pyc | Bin 0 -> 11213 bytes .../cell/__pycache__/text.cpython-311.pyc | Bin 0 -> 6217 bytes .../site-packages/openpyxl/cell/_writer.py | 136 + .../site-packages/openpyxl/cell/cell.py | 332 + .../site-packages/openpyxl/cell/read_only.py | 136 + .../site-packages/openpyxl/cell/rich_text.py | 202 + .../site-packages/openpyxl/cell/text.py | 184 + .../site-packages/openpyxl/chart/_3d.py | 105 + .../site-packages/openpyxl/chart/__init__.py | 19 + .../chart/__pycache__/_3d.cpython-311.pyc | Bin 0 -> 4194 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1125 bytes .../chart/__pycache__/_chart.cpython-311.pyc | Bin 0 -> 9653 bytes .../__pycache__/area_chart.cpython-311.pyc | Bin 0 -> 4635 bytes .../chart/__pycache__/axis.cpython-311.pyc | Bin 0 -> 14837 bytes .../__pycache__/bar_chart.cpython-311.pyc | Bin 0 -> 5872 bytes .../__pycache__/bubble_chart.cpython-311.pyc | Bin 0 -> 2909 bytes .../__pycache__/chartspace.cpython-311.pyc | Bin 0 -> 7151 bytes .../__pycache__/data_source.cpython-311.pyc | Bin 0 -> 9577 bytes .../__pycache__/descriptors.cpython-311.pyc | Bin 0 -> 1759 bytes .../__pycache__/error_bar.cpython-311.pyc | Bin 0 -> 2546 bytes .../chart/__pycache__/label.cpython-311.pyc | Bin 0 -> 4927 bytes .../chart/__pycache__/layout.cpython-311.pyc | Bin 0 -> 2845 bytes .../chart/__pycache__/legend.cpython-311.pyc | Bin 0 -> 2959 bytes .../__pycache__/line_chart.cpython-311.pyc | Bin 0 -> 5364 bytes .../chart/__pycache__/marker.cpython-311.pyc | Bin 0 -> 3324 bytes .../chart/__pycache__/picture.cpython-311.pyc | Bin 0 -> 1524 bytes .../__pycache__/pie_chart.cpython-311.pyc | Bin 0 -> 7112 bytes .../chart/__pycache__/pivot.cpython-311.pyc | Bin 0 -> 2685 bytes .../__pycache__/plotarea.cpython-311.pyc | Bin 0 -> 7803 bytes .../print_settings.cpython-311.pyc | Bin 0 -> 2539 bytes .../__pycache__/radar_chart.cpython-311.pyc | Bin 0 -> 2498 bytes .../chart/__pycache__/reader.cpython-311.pyc | Bin 0 -> 1568 bytes .../__pycache__/reference.cpython-311.pyc | Bin 0 -> 5267 bytes .../__pycache__/scatter_chart.cpython-311.pyc | Bin 0 -> 2496 bytes .../chart/__pycache__/series.cpython-311.pyc | Bin 0 -> 6721 bytes .../series_factory.cpython-311.pyc | Bin 0 -> 2115 bytes .../chart/__pycache__/shapes.cpython-311.pyc | Bin 0 -> 3341 bytes .../__pycache__/stock_chart.cpython-311.pyc | Bin 0 -> 2411 bytes .../__pycache__/surface_chart.cpython-311.pyc | Bin 0 -> 5228 bytes .../chart/__pycache__/text.cpython-311.pyc | Bin 0 -> 2966 bytes .../chart/__pycache__/title.cpython-311.pyc | Bin 0 -> 3674 bytes .../__pycache__/trendline.cpython-311.pyc | Bin 0 -> 3779 bytes .../__pycache__/updown_bars.cpython-311.pyc | Bin 0 -> 1459 bytes .../site-packages/openpyxl/chart/_chart.py | 199 + .../openpyxl/chart/area_chart.py | 106 + .../site-packages/openpyxl/chart/axis.py | 401 + .../site-packages/openpyxl/chart/bar_chart.py | 144 + .../openpyxl/chart/bubble_chart.py | 67 + .../openpyxl/chart/chartspace.py | 195 + .../openpyxl/chart/data_source.py | 246 + .../openpyxl/chart/descriptors.py | 43 + .../site-packages/openpyxl/chart/error_bar.py | 62 + .../site-packages/openpyxl/chart/label.py | 127 + .../site-packages/openpyxl/chart/layout.py | 74 + .../site-packages/openpyxl/chart/legend.py | 75 + .../openpyxl/chart/line_chart.py | 129 + .../site-packages/openpyxl/chart/marker.py | 90 + .../site-packages/openpyxl/chart/picture.py | 35 + .../site-packages/openpyxl/chart/pie_chart.py | 177 + .../site-packages/openpyxl/chart/pivot.py | 65 + .../site-packages/openpyxl/chart/plotarea.py | 162 + .../openpyxl/chart/print_settings.py | 57 + .../openpyxl/chart/radar_chart.py | 55 + .../site-packages/openpyxl/chart/reader.py | 32 + .../site-packages/openpyxl/chart/reference.py | 124 + .../openpyxl/chart/scatter_chart.py | 53 + .../site-packages/openpyxl/chart/series.py | 197 + .../openpyxl/chart/series_factory.py | 41 + .../site-packages/openpyxl/chart/shapes.py | 89 + .../openpyxl/chart/stock_chart.py | 54 + .../openpyxl/chart/surface_chart.py | 119 + .../site-packages/openpyxl/chart/text.py | 78 + .../site-packages/openpyxl/chart/title.py | 76 + .../site-packages/openpyxl/chart/trendline.py | 98 + .../openpyxl/chart/updown_bars.py | 31 + .../openpyxl/chartsheet/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 269 bytes .../__pycache__/chartsheet.cpython-311.pyc | Bin 0 -> 4966 bytes .../__pycache__/custom.cpython-311.pyc | Bin 0 -> 2531 bytes .../__pycache__/properties.cpython-311.pyc | Bin 0 -> 1278 bytes .../__pycache__/protection.cpython-311.pyc | Bin 0 -> 1782 bytes .../__pycache__/publish.cpython-311.pyc | Bin 0 -> 2378 bytes .../__pycache__/relation.cpython-311.pyc | Bin 0 -> 4090 bytes .../__pycache__/views.cpython-311.pyc | Bin 0 -> 2128 bytes .../openpyxl/chartsheet/chartsheet.py | 107 + .../openpyxl/chartsheet/custom.py | 61 + .../openpyxl/chartsheet/properties.py | 28 + .../openpyxl/chartsheet/protection.py | 41 + .../openpyxl/chartsheet/publish.py | 58 + .../openpyxl/chartsheet/relation.py | 97 + .../openpyxl/chartsheet/views.py | 51 + .../openpyxl/comments/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 262 bytes .../__pycache__/author.cpython-311.pyc | Bin 0 -> 980 bytes .../__pycache__/comment_sheet.cpython-311.pyc | Bin 0 -> 8109 bytes .../__pycache__/comments.cpython-311.pyc | Bin 0 -> 2934 bytes .../__pycache__/shape_writer.cpython-311.pyc | Bin 0 -> 5542 bytes .../site-packages/openpyxl/comments/author.py | 21 + .../openpyxl/comments/comment_sheet.py | 211 + .../openpyxl/comments/comments.py | 62 + .../openpyxl/comments/shape_writer.py | 112 + .../site-packages/openpyxl/compat/__init__.py | 54 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2445 bytes .../compat/__pycache__/abc.cpython-311.pyc | Bin 0 -> 441 bytes .../__pycache__/numbers.cpython-311.pyc | Bin 0 -> 1193 bytes .../__pycache__/product.cpython-311.pyc | Bin 0 -> 690 bytes .../__pycache__/singleton.cpython-311.pyc | Bin 0 -> 2332 bytes .../__pycache__/strings.cpython-311.pyc | Bin 0 -> 1112 bytes .../site-packages/openpyxl/compat/abc.py | 8 + .../site-packages/openpyxl/compat/numbers.py | 43 + .../site-packages/openpyxl/compat/product.py | 17 + .../openpyxl/compat/singleton.py | 40 + .../site-packages/openpyxl/compat/strings.py | 25 + .../openpyxl/descriptors/__init__.py | 58 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3790 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 15895 bytes .../__pycache__/container.cpython-311.pyc | Bin 0 -> 2494 bytes .../__pycache__/excel.cpython-311.pyc | Bin 0 -> 5294 bytes .../__pycache__/namespace.cpython-311.pyc | Bin 0 -> 545 bytes .../__pycache__/nested.cpython-311.pyc | Bin 0 -> 5704 bytes .../__pycache__/sequence.cpython-311.pyc | Bin 0 -> 7509 bytes .../__pycache__/serialisable.cpython-311.pyc | Bin 0 -> 10341 bytes .../__pycache__/slots.cpython-311.pyc | Bin 0 -> 1826 bytes .../openpyxl/descriptors/base.py | 272 + .../openpyxl/descriptors/container.py | 41 + .../openpyxl/descriptors/excel.py | 112 + .../openpyxl/descriptors/namespace.py | 12 + .../openpyxl/descriptors/nested.py | 129 + .../openpyxl/descriptors/sequence.py | 136 + .../openpyxl/descriptors/serialisable.py | 240 + .../openpyxl/descriptors/slots.py | 18 + .../openpyxl/drawing/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 260 bytes .../__pycache__/colors.cpython-311.pyc | Bin 0 -> 15396 bytes .../__pycache__/connector.cpython-311.pyc | Bin 0 -> 6003 bytes .../__pycache__/drawing.cpython-311.pyc | Bin 0 -> 4019 bytes .../__pycache__/effect.cpython-311.pyc | Bin 0 -> 15664 bytes .../drawing/__pycache__/fill.cpython-311.pyc | Bin 0 -> 15197 bytes .../__pycache__/geometry.cpython-311.pyc | Bin 0 -> 23322 bytes .../__pycache__/graphic.cpython-311.pyc | Bin 0 -> 6812 bytes .../drawing/__pycache__/image.cpython-311.pyc | Bin 0 -> 2861 bytes .../drawing/__pycache__/line.cpython-311.pyc | Bin 0 -> 5334 bytes .../__pycache__/picture.cpython-311.pyc | Bin 0 -> 5245 bytes .../__pycache__/properties.cpython-311.pyc | Bin 0 -> 6530 bytes .../__pycache__/relation.cpython-311.pyc | Bin 0 -> 934 bytes .../spreadsheet_drawing.cpython-311.pyc | Bin 0 -> 15888 bytes .../drawing/__pycache__/text.cpython-311.pyc | Bin 0 -> 25307 bytes .../drawing/__pycache__/xdr.cpython-311.pyc | Bin 0 -> 1408 bytes .../site-packages/openpyxl/drawing/colors.py | 435 + .../openpyxl/drawing/connector.py | 144 + .../site-packages/openpyxl/drawing/drawing.py | 92 + .../site-packages/openpyxl/drawing/effect.py | 407 + .../site-packages/openpyxl/drawing/fill.py | 425 + .../openpyxl/drawing/geometry.py | 584 + .../site-packages/openpyxl/drawing/graphic.py | 177 + .../site-packages/openpyxl/drawing/image.py | 65 + .../site-packages/openpyxl/drawing/line.py | 144 + .../site-packages/openpyxl/drawing/picture.py | 144 + .../openpyxl/drawing/properties.py | 174 + .../openpyxl/drawing/relation.py | 17 + .../openpyxl/drawing/spreadsheet_drawing.py | 382 + .../site-packages/openpyxl/drawing/text.py | 717 + .../site-packages/openpyxl/drawing/xdr.py | 33 + .../openpyxl/formatting/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 257 bytes .../__pycache__/formatting.cpython-311.pyc | Bin 0 -> 5643 bytes .../__pycache__/rule.cpython-311.pyc | Bin 0 -> 11366 bytes .../openpyxl/formatting/formatting.py | 114 + .../site-packages/openpyxl/formatting/rule.py | 291 + .../openpyxl/formula/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 264 bytes .../__pycache__/tokenizer.cpython-311.pyc | Bin 0 -> 20942 bytes .../__pycache__/translate.cpython-311.pyc | Bin 0 -> 8154 bytes .../openpyxl/formula/tokenizer.py | 446 + .../openpyxl/formula/translate.py | 166 + .../openpyxl/packaging/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 312 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 4990 bytes .../__pycache__/custom.cpython-311.pyc | Bin 0 -> 12959 bytes .../__pycache__/extended.cpython-311.pyc | Bin 0 -> 5274 bytes .../__pycache__/interface.cpython-311.pyc | Bin 0 -> 1956 bytes .../__pycache__/manifest.cpython-311.pyc | Bin 0 -> 9719 bytes .../__pycache__/relationship.cpython-311.pyc | Bin 0 -> 7287 bytes .../__pycache__/workbook.cpython-311.pyc | Bin 0 -> 7765 bytes .../site-packages/openpyxl/packaging/core.py | 115 + .../openpyxl/packaging/custom.py | 289 + .../openpyxl/packaging/extended.py | 137 + .../openpyxl/packaging/interface.py | 56 + .../openpyxl/packaging/manifest.py | 194 + .../openpyxl/packaging/relationship.py | 158 + .../openpyxl/packaging/workbook.py | 185 + .../site-packages/openpyxl/pivot/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 203 bytes .../pivot/__pycache__/cache.cpython-311.pyc | Bin 0 -> 34010 bytes .../pivot/__pycache__/fields.cpython-311.pyc | Bin 0 -> 10006 bytes .../pivot/__pycache__/record.cpython-311.pyc | Bin 0 -> 4653 bytes .../pivot/__pycache__/table.cpython-311.pyc | Bin 0 -> 44829 bytes .../site-packages/openpyxl/pivot/cache.py | 965 + .../site-packages/openpyxl/pivot/fields.py | 326 + .../site-packages/openpyxl/pivot/record.py | 111 + .../site-packages/openpyxl/pivot/table.py | 1261 ++ .../site-packages/openpyxl/reader/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 204 bytes .../__pycache__/drawings.cpython-311.pyc | Bin 0 -> 3601 bytes .../reader/__pycache__/excel.cpython-311.pyc | Bin 0 -> 17970 bytes .../__pycache__/strings.cpython-311.pyc | Bin 0 -> 1918 bytes .../__pycache__/workbook.cpython-311.pyc | Bin 0 -> 6694 bytes .../site-packages/openpyxl/reader/drawings.py | 71 + .../site-packages/openpyxl/reader/excel.py | 349 + .../site-packages/openpyxl/reader/strings.py | 44 + .../site-packages/openpyxl/reader/workbook.py | 133 + .../site-packages/openpyxl/styles/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 828 bytes .../__pycache__/alignment.cpython-311.pyc | Bin 0 -> 2882 bytes .../__pycache__/borders.cpython-311.pyc | Bin 0 -> 4320 bytes .../__pycache__/builtins.cpython-311.pyc | Bin 0 -> 33564 bytes .../__pycache__/cell_style.cpython-311.pyc | Bin 0 -> 8588 bytes .../styles/__pycache__/colors.cpython-311.pyc | Bin 0 -> 7420 bytes .../__pycache__/differential.cpython-311.pyc | Bin 0 -> 4016 bytes .../styles/__pycache__/fills.cpython-311.pyc | Bin 0 -> 10573 bytes .../styles/__pycache__/fonts.cpython-311.pyc | Bin 0 -> 4765 bytes .../__pycache__/named_styles.cpython-311.pyc | Bin 0 -> 12393 bytes .../__pycache__/numbers.cpython-311.pyc | Bin 0 -> 8800 bytes .../__pycache__/protection.cpython-311.pyc | Bin 0 -> 974 bytes .../styles/__pycache__/proxy.cpython-311.pyc | Bin 0 -> 3114 bytes .../__pycache__/styleable.cpython-311.pyc | Bin 0 -> 8247 bytes .../__pycache__/stylesheet.cpython-311.pyc | Bin 0 -> 12547 bytes .../styles/__pycache__/table.cpython-311.pyc | Bin 0 -> 3816 bytes .../openpyxl/styles/alignment.py | 62 + .../site-packages/openpyxl/styles/borders.py | 103 + .../site-packages/openpyxl/styles/builtins.py | 1397 ++ .../openpyxl/styles/cell_style.py | 206 + .../site-packages/openpyxl/styles/colors.py | 172 + .../openpyxl/styles/differential.py | 95 + .../site-packages/openpyxl/styles/fills.py | 224 + .../site-packages/openpyxl/styles/fonts.py | 113 + .../openpyxl/styles/named_styles.py | 282 + .../site-packages/openpyxl/styles/numbers.py | 200 + .../openpyxl/styles/protection.py | 17 + .../site-packages/openpyxl/styles/proxy.py | 62 + .../openpyxl/styles/styleable.py | 151 + .../openpyxl/styles/stylesheet.py | 274 + .../site-packages/openpyxl/styles/table.py | 94 + .../site-packages/openpyxl/utils/__init__.py | 17 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 679 bytes .../bound_dictionary.cpython-311.pyc | Bin 0 -> 1567 bytes .../utils/__pycache__/cell.cpython-311.pyc | Bin 0 -> 11415 bytes .../__pycache__/dataframe.cpython-311.pyc | Bin 0 -> 3450 bytes .../__pycache__/datetime.cpython-311.pyc | Bin 0 -> 6829 bytes .../utils/__pycache__/escape.cpython-311.pyc | Bin 0 -> 1681 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 2298 bytes .../__pycache__/formulas.cpython-311.pyc | Bin 0 -> 4161 bytes .../__pycache__/indexed_list.cpython-311.pyc | Bin 0 -> 2513 bytes .../__pycache__/inference.cpython-311.pyc | Bin 0 -> 2510 bytes .../__pycache__/protection.cpython-311.pyc | Bin 0 -> 1321 bytes .../utils/__pycache__/units.cpython-311.pyc | Bin 0 -> 3474 bytes .../openpyxl/utils/bound_dictionary.py | 26 + .../site-packages/openpyxl/utils/cell.py | 240 + .../site-packages/openpyxl/utils/dataframe.py | 87 + .../site-packages/openpyxl/utils/datetime.py | 140 + .../site-packages/openpyxl/utils/escape.py | 43 + .../openpyxl/utils/exceptions.py | 34 + .../site-packages/openpyxl/utils/formulas.py | 24 + .../openpyxl/utils/indexed_list.py | 49 + .../site-packages/openpyxl/utils/inference.py | 60 + .../openpyxl/utils/protection.py | 22 + .../site-packages/openpyxl/utils/units.py | 108 + .../openpyxl/workbook/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 263 bytes .../__pycache__/_writer.cpython-311.pyc | Bin 0 -> 11146 bytes .../__pycache__/child.cpython-311.pyc | Bin 0 -> 7749 bytes .../__pycache__/defined_name.cpython-311.pyc | Bin 0 -> 8446 bytes .../external_reference.cpython-311.pyc | Bin 0 -> 962 bytes .../function_group.cpython-311.pyc | Bin 0 -> 1627 bytes .../__pycache__/properties.cpython-311.pyc | Bin 0 -> 5556 bytes .../__pycache__/protection.cpython-311.pyc | Bin 0 -> 6810 bytes .../__pycache__/smart_tags.cpython-311.pyc | Bin 0 -> 2320 bytes .../__pycache__/views.cpython-311.pyc | Bin 0 -> 5349 bytes .../workbook/__pycache__/web.cpython-311.pyc | Bin 0 -> 3773 bytes .../__pycache__/workbook.cpython-311.pyc | Bin 0 -> 21072 bytes .../openpyxl/workbook/_writer.py | 197 + .../site-packages/openpyxl/workbook/child.py | 166 + .../openpyxl/workbook/defined_name.py | 189 + .../workbook/external_link/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 281 bytes .../__pycache__/external.cpython-311.pyc | Bin 0 -> 7685 bytes .../workbook/external_link/external.py | 190 + .../openpyxl/workbook/external_reference.py | 18 + .../openpyxl/workbook/function_group.py | 36 + .../openpyxl/workbook/properties.py | 151 + .../openpyxl/workbook/protection.py | 163 + .../openpyxl/workbook/smart_tags.py | 56 + .../site-packages/openpyxl/workbook/views.py | 155 + .../site-packages/openpyxl/workbook/web.py | 98 + .../openpyxl/workbook/workbook.py | 438 + .../openpyxl/worksheet/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 207 bytes .../__pycache__/_read_only.cpython-311.pyc | Bin 0 -> 8003 bytes .../__pycache__/_reader.cpython-311.pyc | Bin 0 -> 24172 bytes .../__pycache__/_write_only.cpython-311.pyc | Bin 0 -> 7026 bytes .../__pycache__/_writer.cpython-311.pyc | Bin 0 -> 21495 bytes .../__pycache__/cell_range.cpython-311.pyc | Bin 0 -> 24800 bytes .../__pycache__/cell_watch.cpython-311.pyc | Bin 0 -> 1420 bytes .../__pycache__/controls.cpython-311.pyc | Bin 0 -> 3756 bytes .../__pycache__/copier.cpython-311.pyc | Bin 0 -> 4153 bytes .../__pycache__/custom.cpython-311.pyc | Bin 0 -> 1454 bytes .../datavalidation.cpython-311.pyc | Bin 0 -> 9071 bytes .../__pycache__/dimensions.cpython-311.pyc | Bin 0 -> 13087 bytes .../__pycache__/drawing.cpython-311.pyc | Bin 0 -> 841 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 3536 bytes .../__pycache__/filters.cpython-311.pyc | Bin 0 -> 19193 bytes .../__pycache__/formula.cpython-311.pyc | Bin 0 -> 2075 bytes .../__pycache__/header_footer.cpython-311.pyc | Bin 0 -> 11909 bytes .../__pycache__/hyperlink.cpython-311.pyc | Bin 0 -> 1998 bytes .../__pycache__/merge.cpython-311.pyc | Bin 0 -> 6764 bytes .../worksheet/__pycache__/ole.cpython-311.pyc | Bin 0 -> 4798 bytes .../__pycache__/page.cpython-311.pyc | Bin 0 -> 6906 bytes .../__pycache__/pagebreak.cpython-311.pyc | Bin 0 -> 3622 bytes .../__pycache__/picture.cpython-311.pyc | Bin 0 -> 574 bytes .../print_settings.cpython-311.pyc | Bin 0 -> 10275 bytes .../__pycache__/properties.cpython-311.pyc | Bin 0 -> 3724 bytes .../__pycache__/protection.cpython-311.pyc | Bin 0 -> 5130 bytes .../__pycache__/related.cpython-311.pyc | Bin 0 -> 1122 bytes .../__pycache__/scenario.cpython-311.pyc | Bin 0 -> 3926 bytes .../__pycache__/smart_tag.cpython-311.pyc | Bin 0 -> 2950 bytes .../__pycache__/table.cpython-311.pyc | Bin 0 -> 17329 bytes .../__pycache__/views.cpython-311.pyc | Bin 0 -> 6017 bytes .../__pycache__/worksheet.cpython-311.pyc | Bin 0 -> 39938 bytes .../openpyxl/worksheet/_read_only.py | 190 + .../openpyxl/worksheet/_reader.py | 472 + .../openpyxl/worksheet/_write_only.py | 160 + .../openpyxl/worksheet/_writer.py | 390 + .../openpyxl/worksheet/cell_range.py | 512 + .../openpyxl/worksheet/cell_watch.py | 34 + .../openpyxl/worksheet/controls.py | 107 + .../openpyxl/worksheet/copier.py | 70 + .../openpyxl/worksheet/custom.py | 35 + .../openpyxl/worksheet/datavalidation.py | 202 + .../openpyxl/worksheet/dimensions.py | 306 + .../openpyxl/worksheet/drawing.py | 14 + .../openpyxl/worksheet/errors.py | 93 + .../openpyxl/worksheet/filters.py | 486 + .../openpyxl/worksheet/formula.py | 51 + .../openpyxl/worksheet/header_footer.py | 270 + .../openpyxl/worksheet/hyperlink.py | 46 + .../site-packages/openpyxl/worksheet/merge.py | 141 + .../site-packages/openpyxl/worksheet/ole.py | 133 + .../site-packages/openpyxl/worksheet/page.py | 174 + .../openpyxl/worksheet/pagebreak.py | 94 + .../openpyxl/worksheet/picture.py | 8 + .../openpyxl/worksheet/print_settings.py | 184 + .../openpyxl/worksheet/properties.py | 97 + .../openpyxl/worksheet/protection.py | 120 + .../openpyxl/worksheet/related.py | 17 + .../openpyxl/worksheet/scenario.py | 105 + .../openpyxl/worksheet/smart_tag.py | 78 + .../site-packages/openpyxl/worksheet/table.py | 385 + .../site-packages/openpyxl/worksheet/views.py | 155 + .../openpyxl/worksheet/worksheet.py | 907 + .../site-packages/openpyxl/writer/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 204 bytes .../writer/__pycache__/excel.cpython-311.pyc | Bin 0 -> 17474 bytes .../writer/__pycache__/theme.cpython-311.pyc | Bin 0 -> 10588 bytes .../site-packages/openpyxl/writer/excel.py | 295 + .../site-packages/openpyxl/writer/theme.py | 291 + .../site-packages/openpyxl/xml/__init__.py | 42 + .../xml/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1758 bytes .../xml/__pycache__/constants.cpython-311.pyc | Bin 0 -> 5141 bytes .../xml/__pycache__/functions.cpython-311.pyc | Bin 0 -> 3251 bytes .../site-packages/openpyxl/xml/constants.py | 129 + .../site-packages/openpyxl/xml/functions.py | 87 + .../pip-26.2.1.dist-info/INSTALLER | 1 + .../pip-26.2.1.dist-info/METADATA | 110 + .../site-packages/pip-26.2.1.dist-info/RECORD | 885 + .../pip-26.2.1.dist-info/REQUESTED | 0 .../site-packages/pip-26.2.1.dist-info/WHEEL | 4 + .../pip-26.2.1.dist-info/entry_points.txt | 4 + .../pip-26.2.1.dist-info/licenses/AUTHORS.txt | 888 + .../pip-26.2.1.dist-info/licenses/LICENSE.txt | 20 + .../src/pip/_vendor/cachecontrol/LICENSE.txt | 13 + .../licenses/src/pip/_vendor/certifi/LICENSE | 20 + .../src/pip/_vendor/distlib/LICENSE.txt | 284 + .../licenses/src/pip/_vendor/distro/LICENSE | 202 + .../licenses/src/pip/_vendor/idna/LICENSE.md | 31 + .../licenses/src/pip/_vendor/msgpack/COPYING | 14 + .../src/pip/_vendor/packaging/LICENSE | 3 + .../src/pip/_vendor/packaging/LICENSE.APACHE | 177 + .../src/pip/_vendor/packaging/LICENSE.BSD | 23 + .../src/pip/_vendor/pkg_resources/LICENSE | 17 + .../src/pip/_vendor/platformdirs/LICENSE | 21 + .../licenses/src/pip/_vendor/pygments/LICENSE | 25 + .../src/pip/_vendor/pyproject_hooks/LICENSE | 21 + .../licenses/src/pip/_vendor/requests/LICENSE | 175 + .../src/pip/_vendor/resolvelib/LICENSE | 13 + .../licenses/src/pip/_vendor/rich/LICENSE | 19 + .../licenses/src/pip/_vendor/tomli/LICENSE | 21 + .../licenses/src/pip/_vendor/tomli_w/LICENSE | 21 + .../src/pip/_vendor/truststore/LICENSE | 21 + .../src/pip/_vendor/urllib3/LICENSE.txt | 21 + .../python3.11/site-packages/pip/__init__.py | 13 + .../python3.11/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 747 bytes .../pip/__pycache__/__main__.cpython-311.pyc | Bin 0 -> 926 bytes .../__pip-runner__.cpython-311.pyc | Bin 0 -> 2517 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 861 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 14151 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 0 -> 20411 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 58829 bytes .../__pycache__/main.cpython-311.pyc | Bin 0 -> 730 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 0 -> 4659 bytes .../self_outdated_check.cpython-311.pyc | Bin 0 -> 11015 bytes .../__pycache__/wheel_builder.cpython-311.pyc | Bin 0 -> 11971 bytes .../pip/_internal/build_env/__init__.py | 25 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1003 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 5470 bytes .../__pycache__/installer.cpython-311.pyc | Bin 0 -> 15501 bytes .../__pycache__/noop.cpython-311.pyc | Bin 0 -> 2276 bytes .../__pycache__/venv.cpython-311.pyc | Bin 0 -> 7236 bytes .../__pycache__/virtual.cpython-311.pyc | Bin 0 -> 8275 bytes .../pip/_internal/build_env/base.py | 103 + .../pip/_internal/build_env/installer.py | 333 + .../pip/_internal/build_env/noop.py | 42 + .../pip/_internal/build_env/venv.py | 145 + .../pip/_internal/build_env/virtual.py | 139 + .../site-packages/pip/_internal/cache.py | 294 + .../pip/_internal/cli/__init__.py | 3 + .../cli/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 290 bytes .../autocompletion.cpython-311.pyc | Bin 0 -> 11018 bytes .../__pycache__/base_command.cpython-311.pyc | Bin 0 -> 13054 bytes .../__pycache__/cmdoptions.cpython-311.pyc | Bin 0 -> 44312 bytes .../command_context.cpython-311.pyc | Bin 0 -> 2169 bytes .../__pycache__/index_command.cpython-311.pyc | Bin 0 -> 9974 bytes .../cli/__pycache__/main.cpython-311.pyc | Bin 0 -> 2541 bytes .../__pycache__/main_parser.cpython-311.pyc | Bin 0 -> 5559 bytes .../cli/__pycache__/parser.cpython-311.pyc | Bin 0 -> 21707 bytes .../__pycache__/progress_bars.cpython-311.pyc | Bin 0 -> 7062 bytes .../__pycache__/req_command.cpython-311.pyc | Bin 0 -> 19126 bytes .../cli/__pycache__/spinners.cpython-311.pyc | Bin 0 -> 12866 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 0 -> 414 bytes .../pip/_internal/cli/autocompletion.py | 187 + .../pip/_internal/cli/base_command.py | 261 + .../pip/_internal/cli/cmdoptions.py | 1409 ++ .../pip/_internal/cli/command_context.py | 28 + .../pip/_internal/cli/index_command.py | 217 + .../site-packages/pip/_internal/cli/main.py | 86 + .../pip/_internal/cli/main_parser.py | 135 + .../site-packages/pip/_internal/cli/parser.py | 366 + .../pip/_internal/cli/progress_bars.py | 153 + .../pip/_internal/cli/req_command.py | 504 + .../pip/_internal/cli/spinners.py | 235 + .../pip/_internal/cli/status_codes.py | 7 + .../pip/_internal/commands/__init__.py | 139 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4633 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 12852 bytes .../__pycache__/check.cpython-311.pyc | Bin 0 -> 2970 bytes .../__pycache__/completion.cpython-311.pyc | Bin 0 -> 5889 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 0 -> 15241 bytes .../__pycache__/debug.cpython-311.pyc | Bin 0 -> 11923 bytes .../__pycache__/download.cpython-311.pyc | Bin 0 -> 7915 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 0 -> 4586 bytes .../commands/__pycache__/hash.cpython-311.pyc | Bin 0 -> 3319 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 0 -> 1931 bytes .../__pycache__/index.cpython-311.pyc | Bin 0 -> 8636 bytes .../__pycache__/inspect.cpython-311.pyc | Bin 0 -> 4426 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 36771 bytes .../commands/__pycache__/list.cpython-311.pyc | Bin 0 -> 19959 bytes .../commands/__pycache__/lock.cpython-311.pyc | Bin 0 -> 8788 bytes .../__pycache__/search.cpython-311.pyc | Bin 0 -> 8982 bytes .../commands/__pycache__/show.cpython-311.pyc | Bin 0 -> 13132 bytes .../__pycache__/uninstall.cpython-311.pyc | Bin 0 -> 5113 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 9058 bytes .../pip/_internal/commands/cache.py | 256 + .../pip/_internal/commands/check.py | 66 + .../pip/_internal/commands/completion.py | 136 + .../pip/_internal/commands/configuration.py | 289 + .../pip/_internal/commands/debug.py | 195 + .../pip/_internal/commands/download.py | 150 + .../pip/_internal/commands/freeze.py | 107 + .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/help.py | 40 + .../pip/_internal/commands/index.py | 173 + .../pip/_internal/commands/inspect.py | 92 + .../pip/_internal/commands/install.py | 904 + .../pip/_internal/commands/list.py | 408 + .../pip/_internal/commands/lock.py | 173 + .../pip/_internal/commands/search.py | 178 + .../pip/_internal/commands/show.py | 237 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 177 + .../pip/_internal/configuration.py | 395 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1049 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 3305 bytes .../__pycache__/installed.cpython-311.pyc | Bin 0 -> 2006 bytes .../__pycache__/sdist.cpython-311.pyc | Bin 0 -> 10762 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 2598 bytes .../pip/_internal/distributions/base.py | 57 + .../pip/_internal/distributions/installed.py | 34 + .../pip/_internal/distributions/sdist.py | 193 + .../pip/_internal/distributions/wheel.py | 45 + .../site-packages/pip/_internal/exceptions.py | 1145 ++ .../pip/_internal/index/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 244 bytes .../__pycache__/collector.cpython-311.pyc | Bin 0 -> 24644 bytes .../package_finder.cpython-311.pyc | Bin 0 -> 47841 bytes .../index/__pycache__/sources.cpython-311.pyc | Bin 0 -> 13601 bytes .../pip/_internal/index/collector.py | 510 + .../pip/_internal/index/package_finder.py | 1152 ++ .../pip/_internal/index/sources.py | 286 + .../pip/_internal/locations/__init__.py | 438 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 16317 bytes .../__pycache__/_distutils.cpython-311.pyc | Bin 0 -> 7266 bytes .../__pycache__/_sysconfig.cpython-311.pyc | Bin 0 -> 8943 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 3968 bytes .../pip/_internal/locations/_distutils.py | 173 + .../pip/_internal/locations/_sysconfig.py | 218 + .../pip/_internal/locations/base.py | 82 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 169 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 7454 bytes .../__pycache__/_json.cpython-311.pyc | Bin 0 -> 3630 bytes .../metadata/__pycache__/base.cpython-311.pyc | Bin 0 -> 37405 bytes .../__pycache__/pkg_resources.cpython-311.pyc | Bin 0 -> 18066 bytes .../pip/_internal/metadata/_json.py | 87 + .../pip/_internal/metadata/base.py | 690 + .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 404 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 4746 bytes .../__pycache__/_dists.cpython-311.pyc | Bin 0 -> 14547 bytes .../__pycache__/_envs.cpython-311.pyc | Bin 0 -> 9291 bytes .../_internal/metadata/importlib/_compat.py | 87 + .../_internal/metadata/importlib/_dists.py | 235 + .../pip/_internal/metadata/importlib/_envs.py | 148 + .../pip/_internal/metadata/pkg_resources.py | 298 + .../pip/_internal/models/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 278 bytes .../__pycache__/candidate.cpython-311.pyc | Bin 0 -> 1995 bytes .../__pycache__/direct_url.cpython-311.pyc | Bin 0 -> 2320 bytes .../format_control.cpython-311.pyc | Bin 0 -> 4513 bytes .../models/__pycache__/index.cpython-311.pyc | Bin 0 -> 1912 bytes .../installation_report.cpython-311.pyc | Bin 0 -> 2648 bytes .../models/__pycache__/link.cpython-311.pyc | Bin 0 -> 31086 bytes .../release_control.cpython-311.pyc | Bin 0 -> 4651 bytes .../models/__pycache__/scheme.cpython-311.pyc | Bin 0 -> 1146 bytes .../__pycache__/search_scope.cpython-311.pyc | Bin 0 -> 5703 bytes .../selection_prefs.cpython-311.pyc | Bin 0 -> 1973 bytes .../__pycache__/target_python.cpython-311.pyc | Bin 0 -> 5134 bytes .../models/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 5133 bytes .../pip/_internal/models/candidate.py | 27 + .../pip/_internal/models/direct_url.py | 42 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 57 + .../pip/_internal/models/link.py | 657 + .../pip/_internal/models/release_control.py | 91 + .../pip/_internal/models/scheme.py | 23 + .../pip/_internal/models/search_scope.py | 124 + .../pip/_internal/models/selection_prefs.py | 36 + .../pip/_internal/models/target_python.py | 122 + .../pip/_internal/models/wheel.py | 80 + .../pip/_internal/network/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 266 bytes .../network/__pycache__/auth.cpython-311.pyc | Bin 0 -> 24058 bytes .../network/__pycache__/cache.cpython-311.pyc | Bin 0 -> 9683 bytes .../__pycache__/download.cpython-311.pyc | Bin 0 -> 18667 bytes .../__pycache__/lazy_wheel.cpython-311.pyc | Bin 0 -> 12889 bytes .../__pycache__/session.cpython-311.pyc | Bin 0 -> 22524 bytes .../network/__pycache__/utils.cpython-311.pyc | Bin 0 -> 7116 bytes .../__pycache__/xmlrpc.cpython-311.pyc | Bin 0 -> 3234 bytes .../pip/_internal/network/auth.py | 587 + .../pip/_internal/network/cache.py | 128 + .../pip/_internal/network/download.py | 387 + .../pip/_internal/network/lazy_wheel.py | 215 + .../pip/_internal/network/session.py | 532 + .../pip/_internal/network/utils.py | 206 + .../pip/_internal/network/xmlrpc.py | 61 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 213 bytes .../__pycache__/check.cpython-311.pyc | Bin 0 -> 8092 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 0 -> 11699 bytes .../__pycache__/prepare.cpython-311.pyc | Bin 0 -> 34247 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 219 bytes .../__pycache__/build_tracker.cpython-311.pyc | Bin 0 -> 8715 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 0 -> 2283 bytes .../metadata_editable.cpython-311.pyc | Bin 0 -> 2339 bytes .../build/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 1965 bytes .../wheel_editable.cpython-311.pyc | Bin 0 -> 2409 bytes .../operations/build/build_tracker.py | 140 + .../_internal/operations/build/metadata.py | 38 + .../operations/build/metadata_editable.py | 41 + .../pip/_internal/operations/build/wheel.py | 38 + .../operations/build/wheel_editable.py | 47 + .../pip/_internal/operations/check.py | 174 + .../pip/_internal/operations/freeze.py | 259 + .../_internal/operations/install/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 278 bytes .../install/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 40545 bytes .../pip/_internal/operations/install/wheel.py | 764 + .../pip/_internal/operations/prepare.py | 896 + .../site-packages/pip/_internal/pyproject.py | 123 + .../pip/_internal/req/__init__.py | 105 + .../req/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4685 bytes .../__pycache__/constructors.cpython-311.pyc | Bin 0 -> 26738 bytes .../req/__pycache__/pep723.cpython-311.pyc | Bin 0 -> 3199 bytes .../req_dependency_group.cpython-311.pyc | Bin 0 -> 5523 bytes .../req/__pycache__/req_file.cpython-311.pyc | Bin 0 -> 26033 bytes .../__pycache__/req_install.cpython-311.pyc | Bin 0 -> 36672 bytes .../req/__pycache__/req_set.cpython-311.pyc | Bin 0 -> 5943 bytes .../__pycache__/req_uninstall.cpython-311.pyc | Bin 0 -> 36151 bytes .../pip/_internal/req/constructors.py | 662 + .../site-packages/pip/_internal/req/pep723.py | 41 + .../pip/_internal/req/req_dependency_group.py | 86 + .../pip/_internal/req/req_file.py | 622 + .../pip/_internal/req/req_install.py | 842 + .../pip/_internal/req/req_set.py | 81 + .../pip/_internal/req/req_uninstall.py | 644 + .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 213 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 1342 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 220 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 0 -> 23531 bytes .../_internal/resolution/legacy/resolver.py | 598 + .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 224 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 11583 bytes .../__pycache__/candidates.cpython-311.pyc | Bin 0 -> 30432 bytes .../__pycache__/factory.cpython-311.pyc | Bin 0 -> 39793 bytes .../found_candidates.cpython-311.pyc | Bin 0 -> 7164 bytes .../__pycache__/provider.cpython-311.pyc | Bin 0 -> 13625 bytes .../__pycache__/reporter.cpython-311.pyc | Bin 0 -> 6448 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 15877 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 0 -> 13916 bytes .../_internal/resolution/resolvelib/base.py | 164 + .../resolution/resolvelib/candidates.py | 598 + .../resolution/resolvelib/factory.py | 901 + .../resolution/resolvelib/found_candidates.py | 166 + .../resolution/resolvelib/provider.py | 309 + .../resolution/resolvelib/reporter.py | 98 + .../resolution/resolvelib/requirements.py | 251 + .../resolution/resolvelib/resolver.py | 341 + .../pip/_internal/self_outdated_check.py | 246 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 208 bytes .../__pycache__/_jaraco_text.cpython-311.pyc | Bin 0 -> 4771 bytes .../utils/__pycache__/_log.cpython-311.pyc | Bin 0 -> 2029 bytes .../utils/__pycache__/appdirs.cpython-311.pyc | Bin 0 -> 2598 bytes .../utils/__pycache__/compat.cpython-311.pyc | Bin 0 -> 3656 bytes .../compatibility_tags.cpython-311.pyc | Bin 0 -> 8072 bytes .../__pycache__/datetime.cpython-311.pyc | Bin 0 -> 1612 bytes .../__pycache__/deprecation.cpython-311.pyc | Bin 0 -> 5497 bytes .../direct_url_helpers.cpython-311.pyc | Bin 0 -> 3844 bytes .../__pycache__/egg_link.cpython-311.pyc | Bin 0 -> 3502 bytes .../__pycache__/entrypoints.cpython-311.pyc | Bin 0 -> 4319 bytes .../__pycache__/filesystem.cpython-311.pyc | Bin 0 -> 11160 bytes .../__pycache__/filetypes.cpython-311.pyc | Bin 0 -> 1270 bytes .../utils/__pycache__/glibc.cpython-311.pyc | Bin 0 -> 2634 bytes .../utils/__pycache__/hashes.cpython-311.pyc | Bin 0 -> 8954 bytes .../utils/__pycache__/logging.cpython-311.pyc | Bin 0 -> 17490 bytes .../utils/__pycache__/misc.cpython-311.pyc | Bin 0 -> 37729 bytes .../__pycache__/packaging.cpython-311.pyc | Bin 0 -> 2042 bytes .../utils/__pycache__/pylock.cpython-311.pyc | Bin 0 -> 12085 bytes .../utils/__pycache__/retry.cpython-311.pyc | Bin 0 -> 2317 bytes .../__pycache__/subprocess.cpython-311.pyc | Bin 0 -> 9472 bytes .../__pycache__/temp_dir.cpython-311.pyc | Bin 0 -> 13294 bytes .../__pycache__/unpacking.cpython-311.pyc | Bin 0 -> 18330 bytes .../utils/__pycache__/urls.cpython-311.pyc | Bin 0 -> 2299 bytes .../__pycache__/virtualenv.cpython-311.pyc | Bin 0 -> 3305 bytes .../utils/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 6945 bytes .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 91 + .../pip/_internal/utils/compatibility_tags.py | 201 + .../pip/_internal/utils/datetime.py | 28 + .../pip/_internal/utils/deprecation.py | 144 + .../pip/_internal/utils/direct_url_helpers.py | 92 + .../pip/_internal/utils/egg_link.py | 81 + .../pip/_internal/utils/entrypoints.py | 88 + .../pip/_internal/utils/filesystem.py | 201 + .../pip/_internal/utils/filetypes.py | 24 + .../pip/_internal/utils/glibc.py | 102 + .../pip/_internal/utils/hashes.py | 150 + .../pip/_internal/utils/logging.py | 404 + .../site-packages/pip/_internal/utils/misc.py | 815 + .../pip/_internal/utils/packaging.py | 44 + .../pip/_internal/utils/pylock.py | 299 + .../pip/_internal/utils/retry.py | 46 + .../pip/_internal/utils/subprocess.py | 249 + .../pip/_internal/utils/temp_dir.py | 293 + .../pip/_internal/utils/unpacking.py | 407 + .../site-packages/pip/_internal/utils/urls.py | 58 + .../pip/_internal/utils/virtualenv.py | 71 + .../pip/_internal/utils/wheel.py | 132 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 643 bytes .../vcs/__pycache__/bazaar.cpython-311.pyc | Bin 0 -> 5886 bytes .../vcs/__pycache__/git.cpython-311.pyc | Bin 0 -> 22560 bytes .../vcs/__pycache__/mercurial.cpython-311.pyc | Bin 0 -> 8789 bytes .../__pycache__/subversion.cpython-311.pyc | Bin 0 -> 14266 bytes .../versioncontrol.cpython-311.pyc | Bin 0 -> 31283 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 130 + .../site-packages/pip/_internal/vcs/git.py | 574 + .../pip/_internal/vcs/mercurial.py | 186 + .../pip/_internal/vcs/subversion.py | 335 + .../pip/_internal/vcs/versioncontrol.py | 694 + .../pip/_internal/wheel_builder.py | 265 + .../site-packages/pip/_vendor/README.rst | 178 + .../site-packages/pip/_vendor/__init__.py | 117 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5493 bytes .../site-packages/pip/_vendor/bom.cdx.json | 231 + .../pip/_vendor/cachecontrol/LICENSE.txt | 13 + .../pip/_vendor/cachecontrol/__init__.py | 32 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1016 bytes .../__pycache__/_cmd.cpython-311.pyc | Bin 0 -> 3038 bytes .../__pycache__/adapter.cpython-311.pyc | Bin 0 -> 7118 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 4511 bytes .../__pycache__/controller.cpython-311.pyc | Bin 0 -> 18589 bytes .../__pycache__/filewrapper.cpython-311.pyc | Bin 0 -> 4830 bytes .../__pycache__/heuristics.cpython-311.pyc | Bin 0 -> 7578 bytes .../__pycache__/serialize.cpython-311.pyc | Bin 0 -> 5948 bytes .../__pycache__/wrapper.cpython-311.pyc | Bin 0 -> 1879 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 + .../pip/_vendor/cachecontrol/adapter.py | 167 + .../pip/_vendor/cachecontrol/cache.py | 75 + .../_vendor/cachecontrol/caches/__init__.py | 8 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 488 bytes .../__pycache__/file_cache.cpython-311.pyc | Bin 0 -> 8213 bytes .../__pycache__/redis_cache.cpython-311.pyc | Bin 0 -> 3095 bytes .../_vendor/cachecontrol/caches/file_cache.py | 145 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 511 + .../pip/_vendor/cachecontrol/filewrapper.py | 121 + .../pip/_vendor/cachecontrol/heuristics.py | 157 + .../pip/_vendor/cachecontrol/py.typed | 0 .../pip/_vendor/cachecontrol/serialize.py | 146 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../site-packages/pip/_vendor/certifi/LICENSE | 20 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 350 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 751 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 0 -> 2426 bytes .../pip/_vendor/certifi/cacert.pem | 3863 ++++ .../site-packages/pip/_vendor/certifi/core.py | 83 + .../pip/_vendor/certifi/py.typed | 0 .../pip/_vendor/distlib/LICENSE.txt | 284 + .../pip/_vendor/distlib/__init__.py | 33 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1477 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 52149 bytes .../__pycache__/resources.cpython-311.pyc | Bin 0 -> 19646 bytes .../__pycache__/scripts.cpython-311.pyc | Bin 0 -> 21877 bytes .../distlib/__pycache__/util.cpython-311.pyc | Bin 0 -> 99698 bytes .../pip/_vendor/distlib/compat.py | 1107 + .../pip/_vendor/distlib/resources.py | 372 + .../pip/_vendor/distlib/scripts.py | 451 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 108032 bytes .../site-packages/pip/_vendor/distlib/util.py | 2021 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 101888 bytes .../site-packages/pip/_vendor/distro/LICENSE | 202 + .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1206 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 340 bytes .../distro/__pycache__/distro.cpython-311.pyc | Bin 0 -> 57830 bytes .../pip/_vendor/distro/distro.py | 1403 ++ .../site-packages/pip/_vendor/distro/py.typed | 0 .../site-packages/pip/_vendor/idna/LICENSE.md | 31 + .../pip/_vendor/idna/__init__.py | 45 + .../pip/_vendor/idna/__main__.py | 6 + .../idna/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1112 bytes .../idna/__pycache__/__main__.cpython-311.pyc | Bin 0 -> 411 bytes .../idna/__pycache__/cli.cpython-311.pyc | Bin 0 -> 6634 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 0 -> 7095 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 0 -> 2052 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 0 -> 31560 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 0 -> 22064 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 0 -> 2929 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 0 -> 228 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 0 -> 96360 bytes .../site-packages/pip/_vendor/idna/cli.py | 128 + .../site-packages/pip/_vendor/idna/codec.py | 159 + .../site-packages/pip/_vendor/idna/compat.py | 41 + .../site-packages/pip/_vendor/idna/core.py | 648 + .../pip/_vendor/idna/idnadata.py | 1897 ++ .../pip/_vendor/idna/intranges.py | 55 + .../pip/_vendor/idna/package_data.py | 1 + .../site-packages/pip/_vendor/idna/py.typed | 0 .../pip/_vendor/idna/uts46data.py | 16896 ++++++++++++++++ .../site-packages/pip/_vendor/msgpack/COPYING | 14 + .../pip/_vendor/msgpack/__init__.py | 55 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1990 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 2387 bytes .../msgpack/__pycache__/ext.cpython-311.pyc | Bin 0 -> 8739 bytes .../__pycache__/fallback.cpython-311.pyc | Bin 0 -> 44779 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 170 + .../pip/_vendor/msgpack/fallback.py | 929 + .../pip/_vendor/packaging/LICENSE | 3 + .../pip/_vendor/packaging/LICENSE.APACHE | 177 + .../pip/_vendor/packaging/LICENSE.BSD | 23 + .../pip/_vendor/packaging/__init__.py | 15 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 570 bytes .../__pycache__/_elffile.cpython-311.pyc | Bin 0 -> 5435 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 11154 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 5333 bytes .../__pycache__/_parser.cpython-311.pyc | Bin 0 -> 18104 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 1830 bytes .../__pycache__/_tokenizer.cpython-311.pyc | Bin 0 -> 8906 bytes .../dependency_groups.cpython-311.pyc | Bin 0 -> 12605 bytes .../__pycache__/direct_url.cpython-311.pyc | Bin 0 -> 16488 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 4793 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 19956 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 0 -> 35871 bytes .../__pycache__/pylock.cpython-311.pyc | Bin 0 -> 41857 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 6552 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 81023 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 41191 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 12058 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 43913 bytes .../pip/_vendor/packaging/_elffile.py | 108 + .../pip/_vendor/packaging/_manylinux.py | 262 + .../pip/_vendor/packaging/_musllinux.py | 85 + .../pip/_vendor/packaging/_parser.py | 393 + .../pip/_vendor/packaging/_structures.py | 33 + .../pip/_vendor/packaging/_tokenizer.py | 193 + .../_vendor/packaging/dependency_groups.py | 302 + .../pip/_vendor/packaging/direct_url.py | 325 + .../pip/_vendor/packaging/errors.py | 94 + .../_vendor/packaging/licenses/__init__.py | 186 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6409 bytes .../__pycache__/_spdx.cpython-311.pyc | Bin 0 -> 52918 bytes .../pip/_vendor/packaging/licenses/_spdx.py | 799 + .../pip/_vendor/packaging/markers.py | 492 + .../pip/_vendor/packaging/metadata.py | 964 + .../pip/_vendor/packaging/py.typed | 0 .../pip/_vendor/packaging/pylock.py | 905 + .../pip/_vendor/packaging/requirements.py | 129 + .../pip/_vendor/packaging/specifiers.py | 1943 ++ .../pip/_vendor/packaging/tags.py | 932 + .../pip/_vendor/packaging/utils.py | 296 + .../pip/_vendor/packaging/version.py | 1231 ++ .../pip/_vendor/pkg_resources/LICENSE | 17 + .../pip/_vendor/pkg_resources/__init__.py | 3676 ++++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 176840 bytes .../pip/_vendor/platformdirs/LICENSE | 21 + .../pip/_vendor/platformdirs/__init__.py | 917 + .../pip/_vendor/platformdirs/__main__.py | 66 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 29118 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 2509 bytes .../__pycache__/_xdg.cpython-311.pyc | Bin 0 -> 15403 bytes .../__pycache__/android.cpython-311.pyc | Bin 0 -> 15404 bytes .../__pycache__/api.cpython-311.pyc | Bin 0 -> 22734 bytes .../__pycache__/macos.cpython-311.pyc | Bin 0 -> 15479 bytes .../__pycache__/unix.cpython-311.pyc | Bin 0 -> 21755 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 723 bytes .../__pycache__/windows.cpython-311.pyc | Bin 0 -> 23313 bytes .../pip/_vendor/platformdirs/_xdg.py | 171 + .../pip/_vendor/platformdirs/android.py | 300 + .../pip/_vendor/platformdirs/api.py | 463 + .../pip/_vendor/platformdirs/macos.py | 223 + .../pip/_vendor/platformdirs/py.typed | 0 .../pip/_vendor/platformdirs/unix.py | 321 + .../pip/_vendor/platformdirs/version.py | 24 + .../pip/_vendor/platformdirs/windows.py | 395 + .../pip/_vendor/pygments/LICENSE | 25 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3844 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 793 bytes .../__pycache__/console.cpython-311.pyc | Bin 0 -> 3063 bytes .../__pycache__/filter.cpython-311.pyc | Bin 0 -> 3510 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 0 -> 4993 bytes .../__pycache__/lexer.cpython-311.pyc | Bin 0 -> 42471 bytes .../__pycache__/modeline.cpython-311.pyc | Bin 0 -> 1737 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 0 -> 2949 bytes .../__pycache__/regexopt.cpython-311.pyc | Bin 0 -> 5477 bytes .../__pycache__/scanner.cpython-311.pyc | Bin 0 -> 4898 bytes .../__pycache__/sphinxext.cpython-311.pyc | Bin 0 -> 14031 bytes .../__pycache__/style.cpython-311.pyc | Bin 0 -> 7480 bytes .../__pycache__/token.cpython-311.pyc | Bin 0 -> 7516 bytes .../__pycache__/unistring.cpython-311.pyc | Bin 0 -> 33859 bytes .../pygments/__pycache__/util.cpython-311.pyc | Bin 0 -> 15816 bytes .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 70 + .../pip/_vendor/pygments/filters/__init__.py | 942 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 40178 bytes .../pip/_vendor/pygments/formatter.py | 129 + .../_vendor/pygments/formatters/__init__.py | 157 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 7792 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 0 -> 4232 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/lexer.py | 965 + .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 16446 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 0 -> 70562 bytes .../lexers/__pycache__/python.cpython-311.pyc | Bin 0 -> 43966 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 603 + .../pip/_vendor/pygments/lexers/python.py | 1204 ++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 74 + .../pip/_vendor/pygments/regexopt.py | 102 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 247 + .../pip/_vendor/pygments/style.py | 203 + .../pip/_vendor/pygments/styles/__init__.py | 61 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3121 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 0 -> 3680 bytes .../pip/_vendor/pygments/styles/_mapping.py | 54 + .../pip/_vendor/pygments/token.py | 214 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 324 + .../pip/_vendor/pyproject_hooks/LICENSE | 21 + .../pip/_vendor/pyproject_hooks/__init__.py | 31 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 886 bytes .../__pycache__/_impl.cpython-311.pyc | Bin 0 -> 20452 bytes .../pip/_vendor/pyproject_hooks/_impl.py | 410 + .../pyproject_hooks/_in_process/__init__.py | 21 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1166 bytes .../__pycache__/_in_process.cpython-311.pyc | Bin 0 -> 17480 bytes .../_in_process/_in_process.py | 389 + .../pip/_vendor/pyproject_hooks/py.typed | 0 .../pip/_vendor/requests/LICENSE | 175 + .../pip/_vendor/requests/__init__.py | 214 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6599 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 0 -> 596 bytes .../_internal_utils.cpython-311.pyc | Bin 0 -> 2274 bytes .../__pycache__/_types.cpython-311.pyc | Bin 0 -> 8736 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 0 -> 31825 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 0 -> 8316 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 0 -> 17168 bytes .../__pycache__/certs.cpython-311.pyc | Bin 0 -> 742 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 2453 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 0 -> 30634 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 9621 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 0 -> 4448 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 0 -> 1895 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 45878 bytes .../__pycache__/packages.cpython-311.pyc | Bin 0 -> 1356 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 0 -> 33948 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 0 -> 6462 bytes .../__pycache__/structures.cpython-311.pyc | Bin 0 -> 8215 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 44905 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 51 + .../pip/_vendor/requests/_types.py | 183 + .../pip/_vendor/requests/adapters.py | 748 + .../site-packages/pip/_vendor/requests/api.py | 180 + .../pip/_vendor/requests/auth.py | 354 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 96 + .../pip/_vendor/requests/cookies.py | 625 + .../pip/_vendor/requests/exceptions.py | 162 + .../pip/_vendor/requests/help.py | 127 + .../pip/_vendor/requests/hooks.py | 48 + .../pip/_vendor/requests/models.py | 1180 ++ .../pip/_vendor/requests/packages.py | 25 + .../pip/_vendor/requests/py.typed | 0 .../pip/_vendor/requests/sessions.py | 920 + .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 130 + .../pip/_vendor/requests/utils.py | 1155 ++ .../pip/_vendor/resolvelib/LICENSE | 13 + .../pip/_vendor/resolvelib/__init__.py | 27 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 767 bytes .../__pycache__/providers.cpython-311.pyc | Bin 0 -> 10456 bytes .../__pycache__/reporters.cpython-311.pyc | Bin 0 -> 3679 bytes .../__pycache__/structs.cpython-311.pyc | Bin 0 -> 14165 bytes .../pip/_vendor/resolvelib/providers.py | 196 + .../pip/_vendor/resolvelib/py.typed | 0 .../pip/_vendor/resolvelib/reporters.py | 55 + .../_vendor/resolvelib/resolvers/__init__.py | 27 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 903 bytes .../__pycache__/abstract.cpython-311.pyc | Bin 0 -> 2807 bytes .../__pycache__/criterion.cpython-311.pyc | Bin 0 -> 3544 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 5067 bytes .../__pycache__/resolution.cpython-311.pyc | Bin 0 -> 28086 bytes .../_vendor/resolvelib/resolvers/abstract.py | 47 + .../_vendor/resolvelib/resolvers/criterion.py | 48 + .../resolvelib/resolvers/exceptions.py | 57 + .../resolvelib/resolvers/resolution.py | 627 + .../pip/_vendor/resolvelib/structs.py | 209 + .../site-packages/pip/_vendor/rich/LICENSE | 19 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 245 + .../rich/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 7506 bytes .../rich/__pycache__/__main__.cpython-311.pyc | Bin 0 -> 10746 bytes .../__pycache__/_cell_widths.cpython-311.pyc | Bin 0 -> 7896 bytes .../__pycache__/_emoji_codes.cpython-311.pyc | Bin 0 -> 208532 bytes .../_emoji_replace.cpython-311.pyc | Bin 0 -> 1944 bytes .../_export_format.cpython-311.pyc | Bin 0 -> 2363 bytes .../__pycache__/_extension.cpython-311.pyc | Bin 0 -> 645 bytes .../rich/__pycache__/_fileno.cpython-311.pyc | Bin 0 -> 987 bytes .../rich/__pycache__/_inspect.cpython-311.pyc | Bin 0 -> 14132 bytes .../__pycache__/_log_render.cpython-311.pyc | Bin 0 -> 4779 bytes .../rich/__pycache__/_loop.cpython-311.pyc | Bin 0 -> 2125 bytes .../__pycache__/_null_file.cpython-311.pyc | Bin 0 -> 4191 bytes .../__pycache__/_palettes.cpython-311.pyc | Bin 0 -> 5261 bytes .../rich/__pycache__/_pick.cpython-311.pyc | Bin 0 -> 805 bytes .../rich/__pycache__/_ratio.cpython-311.pyc | Bin 0 -> 7770 bytes .../__pycache__/_spinners.cpython-311.pyc | Bin 0 -> 13694 bytes .../rich/__pycache__/_stack.cpython-311.pyc | Bin 0 -> 1140 bytes .../rich/__pycache__/_timer.cpython-311.pyc | Bin 0 -> 993 bytes .../_win32_console.cpython-311.pyc | Bin 0 -> 29960 bytes .../rich/__pycache__/_windows.cpython-311.pyc | Bin 0 -> 2840 bytes .../_windows_renderer.cpython-311.pyc | Bin 0 -> 4031 bytes .../rich/__pycache__/_wrap.cpython-311.pyc | Bin 0 -> 3867 bytes .../rich/__pycache__/abc.cpython-311.pyc | Bin 0 -> 1937 bytes .../rich/__pycache__/align.cpython-311.pyc | Bin 0 -> 13411 bytes .../rich/__pycache__/ansi.cpython-311.pyc | Bin 0 -> 10525 bytes .../rich/__pycache__/bar.cpython-311.pyc | Bin 0 -> 4559 bytes .../rich/__pycache__/box.cpython-311.pyc | Bin 0 -> 12830 bytes .../rich/__pycache__/cells.cpython-311.pyc | Bin 0 -> 6555 bytes .../rich/__pycache__/color.cpython-311.pyc | Bin 0 -> 27789 bytes .../__pycache__/color_triplet.cpython-311.pyc | Bin 0 -> 1885 bytes .../rich/__pycache__/columns.cpython-311.pyc | Bin 0 -> 10656 bytes .../rich/__pycache__/console.cpython-311.pyc | Bin 0 -> 125350 bytes .../__pycache__/constrain.cpython-311.pyc | Bin 0 -> 2477 bytes .../__pycache__/containers.cpython-311.pyc | Bin 0 -> 10823 bytes .../rich/__pycache__/control.cpython-311.pyc | Bin 0 -> 11737 bytes .../default_styles.cpython-311.pyc | Bin 0 -> 12809 bytes .../rich/__pycache__/diagnose.cpython-311.pyc | Bin 0 -> 1865 bytes .../rich/__pycache__/emoji.cpython-311.pyc | Bin 0 -> 4660 bytes .../rich/__pycache__/errors.cpython-311.pyc | Bin 0 -> 2341 bytes .../__pycache__/file_proxy.cpython-311.pyc | Bin 0 -> 4045 bytes .../rich/__pycache__/filesize.cpython-311.pyc | Bin 0 -> 3280 bytes .../__pycache__/highlighter.cpython-311.pyc | Bin 0 -> 11001 bytes .../rich/__pycache__/json.cpython-311.pyc | Bin 0 -> 6556 bytes .../rich/__pycache__/jupyter.cpython-311.pyc | Bin 0 -> 6416 bytes .../rich/__pycache__/layout.cpython-311.pyc | Bin 0 -> 23323 bytes .../rich/__pycache__/live.cpython-311.pyc | Bin 0 -> 22418 bytes .../__pycache__/live_render.cpython-311.pyc | Bin 0 -> 4985 bytes .../rich/__pycache__/logging.cpython-311.pyc | Bin 0 -> 15030 bytes .../rich/__pycache__/markup.cpython-311.pyc | Bin 0 -> 10774 bytes .../rich/__pycache__/measure.cpython-311.pyc | Bin 0 -> 7283 bytes .../rich/__pycache__/padding.cpython-311.pyc | Bin 0 -> 7252 bytes .../rich/__pycache__/pager.cpython-311.pyc | Bin 0 -> 2257 bytes .../rich/__pycache__/palette.cpython-311.pyc | Bin 0 -> 5990 bytes .../rich/__pycache__/panel.cpython-311.pyc | Bin 0 -> 13400 bytes .../rich/__pycache__/pretty.cpython-311.pyc | Bin 0 -> 44976 bytes .../rich/__pycache__/progress.cpython-311.pyc | Bin 0 -> 80133 bytes .../__pycache__/progress_bar.cpython-311.pyc | Bin 0 -> 11024 bytes .../rich/__pycache__/prompt.cpython-311.pyc | Bin 0 -> 17947 bytes .../rich/__pycache__/protocol.cpython-311.pyc | Bin 0 -> 2108 bytes .../rich/__pycache__/region.cpython-311.pyc | Bin 0 -> 671 bytes .../rich/__pycache__/repr.cpython-311.pyc | Bin 0 -> 7634 bytes .../rich/__pycache__/rule.cpython-311.pyc | Bin 0 -> 7177 bytes .../rich/__pycache__/scope.cpython-311.pyc | Bin 0 -> 4363 bytes .../rich/__pycache__/screen.cpython-311.pyc | Bin 0 -> 2786 bytes .../rich/__pycache__/segment.cpython-311.pyc | Bin 0 -> 32047 bytes .../rich/__pycache__/spinner.cpython-311.pyc | Bin 0 -> 6705 bytes .../rich/__pycache__/status.cpython-311.pyc | Bin 0 -> 6770 bytes .../rich/__pycache__/style.cpython-311.pyc | Bin 0 -> 35250 bytes .../rich/__pycache__/styled.cpython-311.pyc | Bin 0 -> 2451 bytes .../rich/__pycache__/syntax.cpython-311.pyc | Bin 0 -> 43657 bytes .../rich/__pycache__/table.cpython-311.pyc | Bin 0 -> 49072 bytes .../terminal_theme.cpython-311.pyc | Bin 0 -> 3717 bytes .../rich/__pycache__/text.cpython-311.pyc | Bin 0 -> 67577 bytes .../rich/__pycache__/theme.cpython-311.pyc | Bin 0 -> 7308 bytes .../rich/__pycache__/themes.cpython-311.pyc | Bin 0 -> 367 bytes .../__pycache__/traceback.cpython-311.pyc | Bin 0 -> 39771 bytes .../rich/__pycache__/tree.cpython-311.pyc | Bin 0 -> 12874 bytes .../pip/_vendor/rich/_cell_widths.py | 454 + .../pip/_vendor/rich/_emoji_codes.py | 3610 ++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 76 + .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 24 + .../pip/_vendor/rich/_inspect.py | 268 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 69 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 153 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 661 + .../pip/_vendor/rich/_windows.py | 71 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 93 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 306 + .../site-packages/pip/_vendor/rich/ansi.py | 241 + .../site-packages/pip/_vendor/rich/bar.py | 93 + .../site-packages/pip/_vendor/rich/box.py | 474 + .../site-packages/pip/_vendor/rich/cells.py | 174 + .../site-packages/pip/_vendor/rich/color.py | 621 + .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2680 +++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 219 + .../pip/_vendor/rich/default_styles.py | 193 + .../pip/_vendor/rich/diagnose.py | 39 + .../site-packages/pip/_vendor/rich/emoji.py | 91 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 57 + .../pip/_vendor/rich/filesize.py | 88 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 139 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 442 + .../site-packages/pip/_vendor/rich/live.py | 400 + .../pip/_vendor/rich/live_render.py | 106 + .../site-packages/pip/_vendor/rich/logging.py | 297 + .../site-packages/pip/_vendor/rich/markup.py | 251 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 317 + .../site-packages/pip/_vendor/rich/pretty.py | 1016 + .../pip/_vendor/rich/progress.py | 1715 ++ .../pip/_vendor/rich/progress_bar.py | 223 + .../site-packages/pip/_vendor/rich/prompt.py | 400 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/py.typed | 0 .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 130 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 752 + .../site-packages/pip/_vendor/rich/spinner.py | 132 + .../site-packages/pip/_vendor/rich/status.py | 131 + .../site-packages/pip/_vendor/rich/style.py | 792 + .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 985 + .../site-packages/pip/_vendor/rich/table.py | 1006 + .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1361 ++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 899 + .../site-packages/pip/_vendor/rich/tree.py | 257 + .../site-packages/pip/_vendor/tomli/LICENSE | 21 + .../pip/_vendor/tomli/__init__.py | 8 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 376 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 0 -> 34056 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 0 -> 4925 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 0 -> 414 bytes .../pip/_vendor/tomli/_parser.py | 793 + .../site-packages/pip/_vendor/tomli/_re.py | 119 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../site-packages/pip/_vendor/tomli/py.typed | 1 + .../site-packages/pip/_vendor/tomli_w/LICENSE | 21 + .../pip/_vendor/tomli_w/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 359 bytes .../__pycache__/_writer.cpython-311.pyc | Bin 0 -> 12039 bytes .../pip/_vendor/tomli_w/_writer.py | 229 + .../pip/_vendor/tomli_w/py.typed | 1 + .../pip/_vendor/truststore/LICENSE | 21 + .../pip/_vendor/truststore/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1569 bytes .../__pycache__/_api.cpython-311.pyc | Bin 0 -> 18909 bytes .../__pycache__/_macos.cpython-311.pyc | Bin 0 -> 19833 bytes .../__pycache__/_openssl.cpython-311.pyc | Bin 0 -> 2407 bytes .../_ssl_constants.cpython-311.pyc | Bin 0 -> 1131 bytes .../__pycache__/_windows.cpython-311.pyc | Bin 0 -> 17554 bytes .../pip/_vendor/truststore/_api.py | 341 + .../pip/_vendor/truststore/_macos.py | 571 + .../pip/_vendor/truststore/_openssl.py | 68 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 567 + .../pip/_vendor/truststore/py.typed | 0 .../pip/_vendor/urllib3/LICENSE.txt | 21 + .../pip/_vendor/urllib3/__init__.py | 211 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 7691 bytes .../_base_connection.cpython-311.pyc | Bin 0 -> 7137 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 26365 bytes .../_request_methods.cpython-311.pyc | Bin 0 -> 10738 bytes .../__pycache__/_version.cpython-311.pyc | Bin 0 -> 718 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 41042 bytes .../connectionpool.cpython-311.pyc | Bin 0 -> 41687 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 20110 bytes .../__pycache__/fields.cpython-311.pyc | Bin 0 -> 12724 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 0 -> 3894 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 0 -> 25954 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 61697 bytes .../pip/_vendor/urllib3/_base_connection.py | 167 + .../pip/_vendor/urllib3/_collections.py | 486 + .../pip/_vendor/urllib3/_request_methods.py | 278 + .../pip/_vendor/urllib3/_version.py | 24 + .../pip/_vendor/urllib3/connection.py | 1099 + .../pip/_vendor/urllib3/connectionpool.py | 1191 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 216 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 0 -> 29547 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 0 -> 8753 bytes .../urllib3/contrib/emscripten/__init__.py | 17 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1138 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 10775 bytes .../__pycache__/fetch.cpython-311.pyc | Bin 0 -> 31314 bytes .../__pycache__/request.cpython-311.pyc | Bin 0 -> 1674 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 13121 bytes .../urllib3/contrib/emscripten/connection.py | 260 + .../emscripten/emscripten_fetch_worker.js | 110 + .../urllib3/contrib/emscripten/fetch.py | 726 + .../urllib3/contrib/emscripten/request.py | 22 + .../urllib3/contrib/emscripten/response.py | 281 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 563 + .../pip/_vendor/urllib3/contrib/socks.py | 228 + .../pip/_vendor/urllib3/exceptions.py | 335 + .../pip/_vendor/urllib3/fields.py | 341 + .../pip/_vendor/urllib3/filepost.py | 89 + .../pip/_vendor/urllib3/http2/__init__.py | 53 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2041 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 19062 bytes .../http2/__pycache__/probe.cpython-311.pyc | Bin 0 -> 4361 bytes .../pip/_vendor/urllib3/http2/connection.py | 356 + .../pip/_vendor/urllib3/http2/probe.py | 87 + .../pip/_vendor/urllib3/poolmanager.py | 653 + .../pip/_vendor/urllib3/py.typed | 2 + .../pip/_vendor/urllib3/response.py | 1487 ++ .../pip/_vendor/urllib3/util/__init__.py | 42 + .../util/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1249 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 5072 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 0 -> 1307 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 0 -> 8971 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 0 -> 3381 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 0 -> 22042 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 0 -> 16671 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 0 -> 6105 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 0 -> 14340 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 0 -> 12111 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 0 -> 17861 bytes .../util/__pycache__/util.cpython-311.pyc | Bin 0 -> 2197 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 0 -> 3768 bytes .../pip/_vendor/urllib3/util/connection.py | 137 + .../pip/_vendor/urllib3/util/proxy.py | 43 + .../pip/_vendor/urllib3/util/request.py | 254 + .../pip/_vendor/urllib3/util/response.py | 101 + .../pip/_vendor/urllib3/util/retry.py | 557 + .../pip/_vendor/urllib3/util/ssl_.py | 477 + .../urllib3/util/ssl_match_hostname.py | 153 + .../pip/_vendor/urllib3/util/ssltransport.py | 271 + .../pip/_vendor/urllib3/util/timeout.py | 275 + .../pip/_vendor/urllib3/util/url.py | 469 + .../pip/_vendor/urllib3/util/util.py | 42 + .../pip/_vendor/urllib3/util/wait.py | 124 + .../site-packages/pip/_vendor/vendor.txt | 18 + .../lib/python3.11/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3296 +++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 159582 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 210 bytes .../__pycache__/appdirs.cpython-311.pyc | Bin 0 -> 29458 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 0 -> 16003 bytes .../pkg_resources/_vendor/appdirs.py | 608 + .../_vendor/importlib_resources/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 844 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 10761 bytes .../__pycache__/_common.cpython-311.pyc | Bin 0 -> 4288 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 5573 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1406 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 0 -> 6504 bytes .../__pycache__/abc.cpython-311.pyc | Bin 0 -> 7505 bytes .../__pycache__/readers.cpython-311.pyc | Bin 0 -> 8379 bytes .../__pycache__/simple.cpython-311.pyc | Bin 0 -> 6401 bytes .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 217 bytes .../__pycache__/context.cpython-311.pyc | Bin 0 -> 9440 bytes .../__pycache__/functools.cpython-311.pyc | Bin 0 -> 20303 bytes .../pkg_resources/_vendor/jaraco/context.py | 213 + .../pkg_resources/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 + .../text/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 26620 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 311 bytes .../__pycache__/more.cpython-311.pyc | Bin 0 -> 167972 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 0 -> 26963 bytes .../_vendor/more_itertools/more.py | 4316 ++++ .../_vendor/more_itertools/recipes.py | 698 + .../_vendor/packaging/__about__.py | 26 + .../_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 661 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 582 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 13248 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 8016 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3704 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 16553 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 7668 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 34382 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 21367 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 6702 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21894 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 + .../pkg_resources/_vendor/packaging/tags.py | 487 + .../pkg_resources/_vendor/packaging/utils.py | 136 + .../_vendor/packaging/version.py | 504 + .../_vendor/pyparsing/__init__.py | 331 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8355 bytes .../__pycache__/actions.cpython-311.pyc | Bin 0 -> 8481 bytes .../__pycache__/common.cpython-311.pyc | Bin 0 -> 14803 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 277655 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 12945 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 53646 bytes .../__pycache__/results.cpython-311.pyc | Bin 0 -> 36329 bytes .../__pycache__/testing.cpython-311.pyc | Bin 0 -> 19525 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 0 -> 15383 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 14282 bytes .../_vendor/pyparsing/actions.py | 207 + .../pkg_resources/_vendor/pyparsing/common.py | 424 + .../pkg_resources/_vendor/pyparsing/core.py | 5814 ++++++ .../_vendor/pyparsing/diagram/__init__.py | 642 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 28018 bytes .../_vendor/pyparsing/exceptions.py | 267 + .../_vendor/pyparsing/helpers.py | 1088 + .../_vendor/pyparsing/results.py | 760 + .../_vendor/pyparsing/testing.py | 331 + .../_vendor/pyparsing/unicode.py | 352 + .../pkg_resources/_vendor/pyparsing/util.py | 235 + .../pkg_resources/_vendor/zipp.py | 329 + .../pkg_resources/extern/__init__.py | 76 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4329 bytes .../setuptools-65.5.0.dist-info/INSTALLER | 1 + .../setuptools-65.5.0.dist-info/LICENSE | 19 + .../setuptools-65.5.0.dist-info/METADATA | 144 + .../setuptools-65.5.0.dist-info/RECORD | 466 + .../setuptools-65.5.0.dist-info/REQUESTED | 0 .../setuptools-65.5.0.dist-info/WHEEL | 5 + .../entry_points.txt | 57 + .../setuptools-65.5.0.dist-info/top_level.txt | 3 + .../site-packages/setuptools/__init__.py | 247 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 12919 bytes .../_deprecation_warning.cpython-311.pyc | Bin 0 -> 654 bytes .../__pycache__/_entry_points.cpython-311.pyc | Bin 0 -> 4803 bytes .../__pycache__/_imp.cpython-311.pyc | Bin 0 -> 3667 bytes .../__pycache__/_importlib.cpython-311.pyc | Bin 0 -> 1967 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1166 bytes .../__pycache__/_path.cpython-311.pyc | Bin 0 -> 1487 bytes .../__pycache__/_reqs.cpython-311.pyc | Bin 0 -> 1148 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 0 -> 10176 bytes .../__pycache__/build_meta.cpython-311.pyc | Bin 0 -> 28109 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 0 -> 1302 bytes .../__pycache__/depends.cpython-311.pyc | Bin 0 -> 7987 bytes .../__pycache__/discovery.cpython-311.pyc | Bin 0 -> 31131 bytes .../__pycache__/dist.cpython-311.pyc | Bin 0 -> 64068 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 2963 bytes .../__pycache__/extension.cpython-311.pyc | Bin 0 -> 6819 bytes .../__pycache__/glob.cpython-311.pyc | Bin 0 -> 6576 bytes .../__pycache__/installer.cpython-311.pyc | Bin 0 -> 5626 bytes .../__pycache__/launch.cpython-311.pyc | Bin 0 -> 1542 bytes .../__pycache__/logging.cpython-311.pyc | Bin 0 -> 2060 bytes .../__pycache__/monkey.cpython-311.pyc | Bin 0 -> 7019 bytes .../__pycache__/msvc.cpython-311.pyc | Bin 0 -> 64192 bytes .../__pycache__/namespaces.cpython-311.pyc | Bin 0 -> 5674 bytes .../__pycache__/package_index.cpython-311.pyc | Bin 0 -> 60769 bytes .../__pycache__/py34compat.cpython-311.pyc | Bin 0 -> 729 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 0 -> 27345 bytes .../__pycache__/unicode_utils.cpython-311.pyc | Bin 0 -> 1831 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 449 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 15504 bytes .../windows_support.cpython-311.pyc | Bin 0 -> 1446 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 24 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 784 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 2934 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 0 -> 875 bytes .../__pycache__/_macos_compat.cpython-311.pyc | Bin 0 -> 584 bytes .../__pycache__/_msvccompiler.cpython-311.pyc | Bin 0 -> 25119 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 0 -> 10671 bytes .../__pycache__/bcppcompiler.cpython-311.pyc | Bin 0 -> 13497 bytes .../__pycache__/ccompiler.cpython-311.pyc | Bin 0 -> 46396 bytes .../__pycache__/cmd.cpython-311.pyc | Bin 0 -> 18910 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 6059 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 10003 bytes .../cygwinccompiler.cpython-311.pyc | Bin 0 -> 13627 bytes .../__pycache__/debug.cpython-311.pyc | Bin 0 -> 336 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 0 -> 4003 bytes .../__pycache__/dir_util.cpython-311.pyc | Bin 0 -> 10378 bytes .../__pycache__/dist.cpython-311.pyc | Bin 0 -> 55425 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 6809 bytes .../__pycache__/extension.cpython-311.pyc | Bin 0 -> 10190 bytes .../__pycache__/fancy_getopt.cpython-311.pyc | Bin 0 -> 17255 bytes .../__pycache__/file_util.cpython-311.pyc | Bin 0 -> 10698 bytes .../__pycache__/filelist.cpython-311.pyc | Bin 0 -> 17644 bytes .../__pycache__/log.cpython-311.pyc | Bin 0 -> 3944 bytes .../__pycache__/msvc9compiler.cpython-311.pyc | Bin 0 -> 33602 bytes .../__pycache__/msvccompiler.cpython-311.pyc | Bin 0 -> 27004 bytes .../__pycache__/py38compat.cpython-311.pyc | Bin 0 -> 636 bytes .../__pycache__/py39compat.cpython-311.pyc | Bin 0 -> 1004 bytes .../__pycache__/spawn.cpython-311.pyc | Bin 0 -> 4473 bytes .../__pycache__/sysconfig.cpython-311.pyc | Bin 0 -> 22000 bytes .../__pycache__/text_file.cpython-311.pyc | Bin 0 -> 11285 bytes .../__pycache__/unixccompiler.cpython-311.pyc | Bin 0 -> 16541 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 20895 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 11360 bytes .../versionpredicate.cpython-311.pyc | Bin 0 -> 7761 bytes .../setuptools/_distutils/_collections.py | 56 + .../setuptools/_distutils/_functools.py | 20 + .../setuptools/_distutils/_macos_compat.py | 12 + .../setuptools/_distutils/_msvccompiler.py | 572 + .../setuptools/_distutils/archive_util.py | 280 + .../setuptools/_distutils/bcppcompiler.py | 408 + .../setuptools/_distutils/ccompiler.py | 1220 ++ .../setuptools/_distutils/cmd.py | 436 + .../setuptools/_distutils/command/__init__.py | 25 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 556 bytes .../_framework_compat.cpython-311.pyc | Bin 0 -> 2797 bytes .../command/__pycache__/bdist.cpython-311.pyc | Bin 0 -> 6050 bytes .../__pycache__/bdist_dumb.cpython-311.pyc | Bin 0 -> 5775 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 0 -> 23309 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 0 -> 6105 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 0 -> 7808 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 0 -> 30350 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 0 -> 17626 bytes .../__pycache__/build_scripts.cpython-311.pyc | Bin 0 -> 7877 bytes .../command/__pycache__/check.cpython-311.pyc | Bin 0 -> 7539 bytes .../command/__pycache__/clean.cpython-311.pyc | Bin 0 -> 3207 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 16270 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 29458 bytes .../__pycache__/install_data.cpython-311.pyc | Bin 0 -> 3792 bytes .../install_egg_info.cpython-311.pyc | Bin 0 -> 5218 bytes .../install_headers.cpython-311.pyc | Bin 0 -> 2375 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 0 -> 8707 bytes .../install_scripts.cpython-311.pyc | Bin 0 -> 3172 bytes .../__pycache__/py37compat.cpython-311.pyc | Bin 0 -> 1553 bytes .../__pycache__/register.cpython-311.pyc | Bin 0 -> 15539 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 0 -> 23847 bytes .../__pycache__/upload.cpython-311.pyc | Bin 0 -> 10488 bytes .../_distutils/command/_framework_compat.py | 55 + .../setuptools/_distutils/command/bdist.py | 157 + .../_distutils/command/bdist_dumb.py | 144 + .../_distutils/command/bdist_rpm.py | 615 + .../setuptools/_distutils/command/build.py | 153 + .../_distutils/command/build_clib.py | 208 + .../_distutils/command/build_ext.py | 787 + .../setuptools/_distutils/command/build_py.py | 407 + .../_distutils/command/build_scripts.py | 173 + .../setuptools/_distutils/command/check.py | 151 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 377 + .../setuptools/_distutils/command/install.py | 814 + .../_distutils/command/install_data.py | 84 + .../_distutils/command/install_egg_info.py | 91 + .../_distutils/command/install_headers.py | 45 + .../_distutils/command/install_lib.py | 238 + .../_distutils/command/install_scripts.py | 61 + .../_distutils/command/py37compat.py | 31 + .../setuptools/_distutils/command/register.py | 319 + .../setuptools/_distutils/command/sdist.py | 531 + .../setuptools/_distutils/command/upload.py | 205 + .../setuptools/_distutils/config.py | 139 + .../setuptools/_distutils/core.py | 291 + .../setuptools/_distutils/cygwinccompiler.py | 364 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 96 + .../setuptools/_distutils/dir_util.py | 243 + .../setuptools/_distutils/dist.py | 1286 ++ .../setuptools/_distutils/errors.py | 127 + .../setuptools/_distutils/extension.py | 248 + .../setuptools/_distutils/fancy_getopt.py | 470 + .../setuptools/_distutils/file_util.py | 249 + .../setuptools/_distutils/filelist.py | 371 + .../setuptools/_distutils/log.py | 80 + .../setuptools/_distutils/msvc9compiler.py | 832 + .../setuptools/_distutils/msvccompiler.py | 695 + .../setuptools/_distutils/py38compat.py | 8 + .../setuptools/_distutils/py39compat.py | 22 + .../setuptools/_distutils/spawn.py | 109 + .../setuptools/_distutils/sysconfig.py | 558 + .../setuptools/_distutils/text_file.py | 287 + .../setuptools/_distutils/unixccompiler.py | 401 + .../setuptools/_distutils/util.py | 513 + .../setuptools/_distutils/version.py | 358 + .../setuptools/_distutils/versionpredicate.py | 175 + .../site-packages/setuptools/_entry_points.py | 86 + .../site-packages/setuptools/_imp.py | 82 + .../site-packages/setuptools/_importlib.py | 47 + .../site-packages/setuptools/_itertools.py | 23 + .../site-packages/setuptools/_path.py | 29 + .../site-packages/setuptools/_reqs.py | 19 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 207 bytes .../__pycache__/ordered_set.cpython-311.pyc | Bin 0 -> 21793 bytes .../typing_extensions.cpython-311.pyc | Bin 0 -> 107624 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 0 -> 16000 bytes .../_vendor/importlib_metadata/__init__.py | 1047 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 58246 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 3859 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 2206 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 2728 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 0 -> 3646 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 2609 bytes .../__pycache__/_meta.cpython-311.pyc | Bin 0 -> 3013 bytes .../__pycache__/_text.cpython-311.pyc | Bin 0 -> 4404 bytes .../_vendor/importlib_metadata/_adapters.py | 68 + .../importlib_metadata/_collections.py | 30 + .../_vendor/importlib_metadata/_compat.py | 71 + .../_vendor/importlib_metadata/_functools.py | 104 + .../_vendor/importlib_metadata/_itertools.py | 73 + .../_vendor/importlib_metadata/_meta.py | 48 + .../_vendor/importlib_metadata/_text.py | 99 + .../_vendor/importlib_resources/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 841 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 10758 bytes .../__pycache__/_common.cpython-311.pyc | Bin 0 -> 4285 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 5570 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1403 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 0 -> 6501 bytes .../__pycache__/abc.cpython-311.pyc | Bin 0 -> 7502 bytes .../__pycache__/readers.cpython-311.pyc | Bin 0 -> 8376 bytes .../__pycache__/simple.cpython-311.pyc | Bin 0 -> 6398 bytes .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../setuptools/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 214 bytes .../__pycache__/context.cpython-311.pyc | Bin 0 -> 9437 bytes .../__pycache__/functools.cpython-311.pyc | Bin 0 -> 20294 bytes .../setuptools/_vendor/jaraco/context.py | 213 + .../setuptools/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 + .../text/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 26608 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 307 bytes .../__pycache__/more.cpython-311.pyc | Bin 0 -> 149194 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 0 -> 23776 bytes .../setuptools/_vendor/more_itertools/more.py | 3824 ++++ .../_vendor/more_itertools/recipes.py | 620 + .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 26 + .../setuptools/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 658 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 579 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 13245 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 8013 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3701 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 16547 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 7662 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 34379 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 21364 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 6699 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21891 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../setuptools/_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 + .../setuptools/_vendor/packaging/tags.py | 487 + .../setuptools/_vendor/packaging/utils.py | 136 + .../setuptools/_vendor/packaging/version.py | 504 + .../setuptools/_vendor/pyparsing/__init__.py | 331 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8352 bytes .../__pycache__/actions.cpython-311.pyc | Bin 0 -> 8478 bytes .../__pycache__/common.cpython-311.pyc | Bin 0 -> 14800 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 277652 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 12942 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 53643 bytes .../__pycache__/results.cpython-311.pyc | Bin 0 -> 36326 bytes .../__pycache__/testing.cpython-311.pyc | Bin 0 -> 19522 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 0 -> 15380 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 14279 bytes .../setuptools/_vendor/pyparsing/actions.py | 207 + .../setuptools/_vendor/pyparsing/common.py | 424 + .../setuptools/_vendor/pyparsing/core.py | 5814 ++++++ .../_vendor/pyparsing/diagram/__init__.py | 642 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 28015 bytes .../_vendor/pyparsing/exceptions.py | 267 + .../setuptools/_vendor/pyparsing/helpers.py | 1088 + .../setuptools/_vendor/pyparsing/results.py | 760 + .../setuptools/_vendor/pyparsing/testing.py | 331 + .../setuptools/_vendor/pyparsing/unicode.py | 352 + .../setuptools/_vendor/pyparsing/util.py | 235 + .../setuptools/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 429 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 0 -> 30868 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 0 -> 4508 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 0 -> 421 bytes .../setuptools/_vendor/tomli/_parser.py | 691 + .../setuptools/_vendor/tomli/_re.py | 107 + .../setuptools/_vendor/tomli/_types.py | 10 + .../setuptools/_vendor/typing_extensions.py | 2296 +++ .../site-packages/setuptools/_vendor/zipp.py | 329 + .../site-packages/setuptools/archive_util.py | 213 + .../site-packages/setuptools/build_meta.py | 511 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 0 -> 137216 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 648 bytes .../command/__pycache__/alias.cpython-311.pyc | Bin 0 -> 3915 bytes .../__pycache__/bdist_egg.cpython-311.pyc | Bin 0 -> 25597 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 0 -> 2203 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 0 -> 7009 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 0 -> 4136 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 0 -> 22023 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 0 -> 23189 bytes .../__pycache__/develop.cpython-311.pyc | Bin 0 -> 10931 bytes .../__pycache__/dist_info.cpython-311.pyc | Bin 0 -> 7993 bytes .../__pycache__/easy_install.cpython-311.pyc | Bin 0 -> 119348 bytes .../editable_wheel.cpython-311.pyc | Bin 0 -> 51426 bytes .../__pycache__/egg_info.cpython-311.pyc | Bin 0 -> 39846 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 6828 bytes .../install_egg_info.cpython-311.pyc | Bin 0 -> 4141 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 0 -> 6423 bytes .../install_scripts.cpython-311.pyc | Bin 0 -> 4292 bytes .../__pycache__/py36compat.cpython-311.pyc | Bin 0 -> 8049 bytes .../__pycache__/register.cpython-311.pyc | Bin 0 -> 1139 bytes .../__pycache__/rotate.cpython-311.pyc | Bin 0 -> 4199 bytes .../__pycache__/saveopts.cpython-311.pyc | Bin 0 -> 1379 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 0 -> 13451 bytes .../__pycache__/setopt.cpython-311.pyc | Bin 0 -> 7691 bytes .../command/__pycache__/test.cpython-311.pyc | Bin 0 -> 14632 bytes .../__pycache__/upload.cpython-311.pyc | Bin 0 -> 1103 bytes .../__pycache__/upload_docs.cpython-311.pyc | Bin 0 -> 11954 bytes .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 457 + .../setuptools/command/bdist_rpm.py | 40 + .../site-packages/setuptools/command/build.py | 146 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 383 + .../setuptools/command/build_py.py | 368 + .../setuptools/command/develop.py | 193 + .../setuptools/command/dist_info.py | 142 + .../setuptools/command/easy_install.py | 2312 +++ .../setuptools/command/editable_wheel.py | 844 + .../setuptools/command/egg_info.py | 763 + .../setuptools/command/install.py | 139 + .../setuptools/command/install_egg_info.py | 63 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 70 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 210 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 251 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 213 + .../setuptools/config/__init__.py | 35 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2043 bytes .../_apply_pyprojecttoml.cpython-311.pyc | Bin 0 -> 22546 bytes .../config/__pycache__/expand.cpython-311.pyc | Bin 0 -> 28257 bytes .../__pycache__/pyprojecttoml.cpython-311.pyc | Bin 0 -> 27455 bytes .../__pycache__/setupcfg.cpython-311.pyc | Bin 0 -> 33039 bytes .../setuptools/config/_apply_pyprojecttoml.py | 377 + .../config/_validate_pyproject/__init__.py | 34 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2331 bytes .../error_reporting.cpython-311.pyc | Bin 0 -> 20222 bytes .../extra_validations.cpython-311.pyc | Bin 0 -> 1880 bytes .../fastjsonschema_exceptions.cpython-311.pyc | Bin 0 -> 3255 bytes ...fastjsonschema_validations.cpython-311.pyc | Bin 0 -> 192653 bytes .../__pycache__/formats.cpython-311.pyc | Bin 0 -> 14370 bytes .../_validate_pyproject/error_reporting.py | 318 + .../_validate_pyproject/extra_validations.py | 36 + .../fastjsonschema_exceptions.py | 51 + .../fastjsonschema_validations.py | 1035 + .../config/_validate_pyproject/formats.py | 259 + .../site-packages/setuptools/config/expand.py | 462 + .../setuptools/config/pyprojecttoml.py | 493 + .../setuptools/config/setupcfg.py | 762 + .../site-packages/setuptools/dep_util.py | 25 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/discovery.py | 600 + .../site-packages/setuptools/dist.py | 1222 ++ .../site-packages/setuptools/errors.py | 58 + .../site-packages/setuptools/extension.py | 148 + .../setuptools/extern/__init__.py | 76 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4407 bytes .../site-packages/setuptools/glob.py | 167 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 0 -> 137728 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 104 + .../site-packages/setuptools/launch.py | 36 + .../site-packages/setuptools/logging.py | 36 + .../site-packages/setuptools/monkey.py | 165 + .../site-packages/setuptools/msvc.py | 1703 ++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1126 + .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 530 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/unicode_utils.py | 42 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 222 + .../setuptools/windows_support.py | 29 + .../werkzeug-3.1.8.dist-info/INSTALLER | 1 + .../werkzeug-3.1.8.dist-info/METADATA | 109 + .../werkzeug-3.1.8.dist-info/RECORD | 116 + .../werkzeug-3.1.8.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 28 + .../site-packages/werkzeug/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 407 bytes .../__pycache__/_internal.cpython-311.pyc | Bin 0 -> 10686 bytes .../__pycache__/_reloader.cpython-311.pyc | Bin 0 -> 23363 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 37622 bytes .../__pycache__/formparser.cpython-311.pyc | Bin 0 -> 18007 bytes .../werkzeug/__pycache__/http.cpython-311.pyc | Bin 0 -> 55587 bytes .../__pycache__/local.cpython-311.pyc | Bin 0 -> 31343 bytes .../__pycache__/security.cpython-311.pyc | Bin 0 -> 9479 bytes .../__pycache__/serving.cpython-311.pyc | Bin 0 -> 50407 bytes .../werkzeug/__pycache__/test.cpython-311.pyc | Bin 0 -> 64259 bytes .../__pycache__/testapp.cpython-311.pyc | Bin 0 -> 9551 bytes .../werkzeug/__pycache__/urls.cpython-311.pyc | Bin 0 -> 9040 bytes .../__pycache__/user_agent.cpython-311.pyc | Bin 0 -> 2331 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 29751 bytes .../werkzeug/__pycache__/wsgi.cpython-311.pyc | Bin 0 -> 27647 bytes .../site-packages/werkzeug/_internal.py | 211 + .../site-packages/werkzeug/_reloader.py | 465 + .../werkzeug/datastructures/__init__.py | 64 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3064 bytes .../__pycache__/accept.cpython-311.pyc | Bin 0 -> 18309 bytes .../__pycache__/auth.cpython-311.pyc | Bin 0 -> 15711 bytes .../__pycache__/cache_control.cpython-311.pyc | Bin 0 -> 13419 bytes .../__pycache__/csp.cpython-311.pyc | Bin 0 -> 7220 bytes .../__pycache__/etag.cpython-311.pyc | Bin 0 -> 6110 bytes .../__pycache__/file_storage.cpython-311.pyc | Bin 0 -> 9723 bytes .../__pycache__/headers.cpython-311.pyc | Bin 0 -> 33791 bytes .../__pycache__/mixins.cpython-311.pyc | Bin 0 -> 19209 bytes .../__pycache__/range.cpython-311.pyc | Bin 0 -> 10862 bytes .../__pycache__/structures.cpython-311.pyc | Bin 0 -> 66527 bytes .../werkzeug/datastructures/accept.py | 350 + .../werkzeug/datastructures/auth.py | 320 + .../werkzeug/datastructures/cache_control.py | 273 + .../werkzeug/datastructures/csp.py | 100 + .../werkzeug/datastructures/etag.py | 106 + .../werkzeug/datastructures/file_storage.py | 209 + .../werkzeug/datastructures/headers.py | 662 + .../werkzeug/datastructures/mixins.py | 317 + .../werkzeug/datastructures/range.py | 214 + .../werkzeug/datastructures/structures.py | 1239 ++ .../site-packages/werkzeug/debug/__init__.py | 574 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 26197 bytes .../debug/__pycache__/console.cpython-311.pyc | Bin 0 -> 13467 bytes .../debug/__pycache__/repr.cpython-311.pyc | Bin 0 -> 16145 bytes .../debug/__pycache__/tbtools.cpython-311.pyc | Bin 0 -> 18252 bytes .../site-packages/werkzeug/debug/console.py | 219 + .../site-packages/werkzeug/debug/repr.py | 282 + .../werkzeug/debug/shared/ICON_LICENSE.md | 6 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 344 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/style.css | 150 + .../site-packages/werkzeug/debug/tbtools.py | 449 + .../site-packages/werkzeug/exceptions.py | 905 + .../site-packages/werkzeug/formparser.py | 430 + .../python3.11/site-packages/werkzeug/http.py | 1443 ++ .../site-packages/werkzeug/local.py | 653 + .../werkzeug/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 208 bytes .../__pycache__/dispatcher.cpython-311.pyc | Bin 0 -> 3492 bytes .../__pycache__/http_proxy.cpython-311.pyc | Bin 0 -> 10977 bytes .../__pycache__/lint.cpython-311.pyc | Bin 0 -> 20938 bytes .../__pycache__/profiler.cpython-311.pyc | Bin 0 -> 7614 bytes .../__pycache__/proxy_fix.cpython-311.pyc | Bin 0 -> 7681 bytes .../__pycache__/shared_data.cpython-311.pyc | Bin 0 -> 13917 bytes .../werkzeug/middleware/dispatcher.py | 81 + .../werkzeug/middleware/http_proxy.py | 236 + .../site-packages/werkzeug/middleware/lint.py | 439 + .../werkzeug/middleware/profiler.py | 155 + .../werkzeug/middleware/proxy_fix.py | 183 + .../werkzeug/middleware/shared_data.py | 283 + .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 134 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5073 bytes .../__pycache__/converters.cpython-311.pyc | Bin 0 -> 12452 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 8956 bytes .../routing/__pycache__/map.cpython-311.pyc | Bin 0 -> 41100 bytes .../__pycache__/matcher.cpython-311.pyc | Bin 0 -> 9101 bytes .../routing/__pycache__/rules.cpython-311.pyc | Bin 0 -> 42181 bytes .../werkzeug/routing/converters.py | 261 + .../werkzeug/routing/exceptions.py | 152 + .../site-packages/werkzeug/routing/map.py | 928 + .../site-packages/werkzeug/routing/matcher.py | 202 + .../site-packages/werkzeug/routing/rules.py | 927 + .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 204 bytes .../sansio/__pycache__/http.cpython-311.pyc | Bin 0 -> 6120 bytes .../__pycache__/multipart.cpython-311.pyc | Bin 0 -> 15608 bytes .../__pycache__/request.cpython-311.pyc | Bin 0 -> 23512 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 34137 bytes .../sansio/__pycache__/utils.cpython-311.pyc | Bin 0 -> 8870 bytes .../site-packages/werkzeug/sansio/http.py | 170 + .../werkzeug/sansio/multipart.py | 331 + .../site-packages/werkzeug/sansio/request.py | 536 + .../site-packages/werkzeug/sansio/response.py | 763 + .../site-packages/werkzeug/sansio/utils.py | 224 + .../site-packages/werkzeug/security.py | 201 + .../site-packages/werkzeug/serving.py | 1126 + .../python3.11/site-packages/werkzeug/test.py | 1464 ++ .../site-packages/werkzeug/testapp.py | 194 + .../python3.11/site-packages/werkzeug/urls.py | 203 + .../site-packages/werkzeug/user_agent.py | 47 + .../site-packages/werkzeug/utils.py | 684 + .../werkzeug/wrappers/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 369 bytes .../__pycache__/request.cpython-311.pyc | Bin 0 -> 27592 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 37268 bytes .../werkzeug/wrappers/request.py | 650 + .../werkzeug/wrappers/response.py | 838 + .../python3.11/site-packages/werkzeug/wsgi.py | 609 + venv/pyvenv.cfg | 5 + 4338 files changed, 350157 insertions(+), 386 deletions(-) create mode 100755 __pycache__/app.cpython-311.pyc create mode 100755 adminer/LICENSE.md create mode 100755 adminer/README.md create mode 100755 adminer/adminer.css create mode 100755 adminer/docker-compose.yml create mode 100755 adminer/plugins-enabled/login-password-less.php delete mode 100755 static/bootstrap-icons-1.13.1.zip rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/0-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/0-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/0-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/0-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/1-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/1-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/1-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/1-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/123.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/2-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/2-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/2-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/2-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/3-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/3-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/3-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/3-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/4-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/4-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/4-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/4-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/5-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/5-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/5-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/5-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/6-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/6-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/6-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/6-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/7-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/7-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/7-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/7-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/8-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/8-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/8-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/8-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/9-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/9-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/9-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/9-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/activity.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/airplane-engines-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/airplane-engines.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/airplane-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/airplane.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/alarm-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/alarm.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/alexa.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/align-bottom.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/align-center.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/align-end.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/align-middle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/align-start.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/align-top.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/alipay.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/alphabet-uppercase.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/alphabet.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/alt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/amazon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/amd.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/android.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/android2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/anthropic.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/app-indicator.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/app.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/apple-music.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/apple.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/archive-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/archive.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-90deg-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-90deg-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-90deg-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-90deg-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-bar-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-bar-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-bar-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-bar-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-clockwise.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-counterclockwise.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-left-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-left-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-left-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-left-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-right-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-right-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-right-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-right-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-short.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-left-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-left-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-left-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-left-short.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-left-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-left-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-repeat.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-return-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-return-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-right-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-right-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-right-short.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-right-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-right-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-through-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-through-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-left-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-left-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-left-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-left-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-right-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-right-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-right-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-right-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-short.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrow-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrows-angle-contract.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrows-angle-expand.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrows-collapse-vertical.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrows-collapse.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrows-expand-vertical.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrows-expand.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrows-fullscreen.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrows-move.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrows-vertical.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/arrows.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/aspect-ratio-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/aspect-ratio.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/asterisk.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/at.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/award-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/award.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/back.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backpack-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backpack.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backpack2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backpack2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backpack3-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backpack3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backpack4-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backpack4.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backspace-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backspace-reverse-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backspace-reverse.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/backspace.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-3d-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-3d.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-4k-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-4k.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-8k-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-8k.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-ad-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-ad.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-ar-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-ar.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-cc-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-cc.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-hd-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-hd.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-sd-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-sd.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-tm-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-tm.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-vo-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-vo.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-vr-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-vr.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-wc-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/badge-wc.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag-dash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bag.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/balloon-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/balloon-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/balloon-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/balloon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ban-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ban.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bandaid-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bandaid.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bank.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bank2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bar-chart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bar-chart-line-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bar-chart-line.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bar-chart-steps.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bar-chart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/basket-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/basket.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/basket2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/basket2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/basket3-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/basket3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/battery-charging.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/battery-full.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/battery-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/battery-low.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/battery.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/beaker-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/beaker.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/behance.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bell-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bell-slash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bell-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bell.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bezier.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bezier2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bicycle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bing.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/binoculars-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/binoculars.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/blockquote-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/blockquote-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bluesky.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bluetooth.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/body-text.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/book-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/book-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/book.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-dash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-star-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-star.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmark.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmarks-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookmarks.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bookshelf.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/boombox-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/boombox.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bootstrap-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bootstrap-icons.css (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bootstrap-icons.json (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bootstrap-icons.min.css (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bootstrap-icons.scss (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bootstrap-icons.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bootstrap-reboot.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bootstrap.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border-all.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border-bottom.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border-center.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border-inner.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border-middle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border-outer.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border-style.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border-top.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border-width.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/border.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bounding-box-circles.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bounding-box.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-down-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-down-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-in-down-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-in-down-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-in-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-in-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-in-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-in-up-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-in-up-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-in-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-up-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-up-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-arrow-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-seam-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box-seam.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box2-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box2-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/box2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/boxes.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/braces-asterisk.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/braces.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bricks.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/briefcase-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/briefcase.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/brightness-alt-high-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/brightness-alt-high.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/brightness-alt-low-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/brightness-alt-low.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/brightness-high-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/brightness-high.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/brightness-low-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/brightness-low.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/brilliance.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/broadcast-pin.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/broadcast.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/browser-chrome.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/browser-edge.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/browser-firefox.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/browser-safari.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/brush-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/brush.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bucket-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bucket.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bug-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bug.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-add.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-fill-add.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-fill-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-fill-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-fill-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-fill-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-fill-gear.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-fill-lock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-fill-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-fill-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-fill-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-gear.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-lock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/building.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/buildings-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/buildings.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bullseye.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bus-front-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/bus-front.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/c-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/c-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/c-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/c-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cake-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cake.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cake2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cake2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calculator-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calculator.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-date-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-date.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-day-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-day.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-event-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-event.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-minus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-month-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-month.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-range-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-range.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-week-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-week.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-date-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-date.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-day-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-day.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-event-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-event.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-minus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-month-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-month.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-range-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-range.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-week-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-week.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar3-event-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar3-event.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar3-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar3-range-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar3-range.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar3-week-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar3-week.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar4-event.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar4-range.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar4-week.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/calendar4.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/camera-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/camera-reels-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/camera-reels.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/camera-video-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/camera-video-off-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/camera-video-off.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/camera-video.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/camera.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/camera2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/capslock-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/capslock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/capsule-pill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/capsule.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/car-front-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/car-front.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/card-checklist.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/card-heading.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/card-image.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/card-list.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/card-text.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-down-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-down-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-down-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-left-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-left-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-left-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-right-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-right-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-right-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-up-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-up-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-up-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/caret-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart-dash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cart4.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cash-coin.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cash-stack.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cassette-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cassette.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cast.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cc-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cc-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cc-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cc-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-dots-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-dots.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-left-dots-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-left-dots.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-left-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-left-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-left-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-left-quote-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-left-quote.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-left-text-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-left-text.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-quote-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-quote.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-right-dots-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-right-dots.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-right-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-right-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-right-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-right-quote-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-right-quote.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-right-text-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-right-text.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-square-dots-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-square-dots.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-square-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-square-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-square-quote-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-square-quote.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-square-text-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-square-text.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-text-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat-text.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chat.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/check-all.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/check-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/check-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/check-lg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/check-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/check-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/check2-all.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/check2-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/check2-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/check2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-bar-contract.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-bar-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-bar-expand.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-bar-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-bar-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-bar-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-compact-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-compact-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-compact-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-compact-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-contract.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-double-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-double-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-double-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-double-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-expand.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/chevron-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/circle-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/circle-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/claude.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-data-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-data.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-minus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-pulse.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-data-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-data.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-minus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-pulse-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-pulse.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clipboard2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clock-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clock-history.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-arrow-down-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-arrow-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-arrow-up-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-arrow-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-download-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-download.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-drizzle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-drizzle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-fog-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-fog.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-fog2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-fog2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-hail-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-hail.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-haze-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-haze.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-haze2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-haze2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-lightning-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-lightning-rain-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-lightning-rain.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-lightning.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-minus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-moon-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-moon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-rain-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-rain-heavy-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-rain-heavy.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-rain.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-slash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-sleet-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-sleet.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-snow-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-snow.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-sun-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-sun.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-upload-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud-upload.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloud.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clouds-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/clouds.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloudy-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cloudy.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/code-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/code-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/code.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/coin.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/collection-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/collection-play-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/collection-play.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/collection.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/columns-gap.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/columns.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/command.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/compass-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/compass.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cone-striped.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cone.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/controller.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cookie.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/copy.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cpu-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cpu.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/credit-card-2-back-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/credit-card-2-back.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/credit-card-2-front-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/credit-card-2-front.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/credit-card-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/credit-card.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/crop.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/crosshair.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/crosshair2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/css.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cup-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cup-hot-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cup-hot.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cup-straw.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cup.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/currency-bitcoin.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/currency-dollar.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/currency-euro.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/currency-exchange.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/currency-pound.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/currency-rupee.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/currency-yen.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cursor-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cursor-text.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/cursor.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dash-circle-dotted.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dash-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dash-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dash-lg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dash-square-dotted.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dash-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dash-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-add.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-fill-add.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-fill-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-fill-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-fill-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-fill-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-fill-gear.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-fill-lock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-fill-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-fill-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-fill-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-gear.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-lock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/database.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/device-hdd-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/device-hdd.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/device-ssd-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/device-ssd.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/diagram-2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/diagram-2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/diagram-3-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/diagram-3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/diamond-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/diamond-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/diamond.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-1-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-1.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-3-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-4-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-4.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-5-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-5.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-6-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dice-6.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/disc-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/disc.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/discord.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/display-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/display.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/displayport-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/displayport.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/distribute-horizontal.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/distribute-vertical.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/door-closed-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/door-closed.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/door-open-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/door-open.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dot.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/download.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dpad-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dpad.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dribbble.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/dropbox.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/droplet-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/droplet-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/droplet.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/duffle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/duffle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ear-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ear.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/earbuds.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/easel-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/easel.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/easel2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/easel2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/easel3-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/easel3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/egg-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/egg-fried.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/egg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/eject-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/eject.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-angry-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-angry.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-astonished-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-astonished.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-dizzy-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-dizzy.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-expressionless-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-expressionless.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-frown-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-frown.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-grimace-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-grimace.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-grin-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-grin.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-heart-eyes-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-heart-eyes.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-kiss-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-kiss.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-laughing-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-laughing.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-neutral-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-neutral.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-smile-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-smile-upside-down-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-smile-upside-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-smile.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-sunglasses-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-sunglasses.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-surprise-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-surprise.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-tear-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-tear.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-wink-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/emoji-wink.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-arrow-down-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-arrow-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-arrow-up-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-arrow-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-at-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-at.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-dash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-exclamation-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-open-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-open-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-open-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-open.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-paper-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-paper-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-paper-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-paper.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-slash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/envelope.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/eraser-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/eraser.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/escape.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ethernet.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ev-front-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ev-front.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ev-station-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ev-station.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation-diamond-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation-diamond.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation-lg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation-octagon-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation-octagon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation-triangle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation-triangle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exclude.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/explicit-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/explicit.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/exposure.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/eye-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/eye-slash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/eye-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/eye.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/eyedropper.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/eyeglasses.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/facebook.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fan.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fast-forward-btn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fast-forward-btn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fast-forward-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fast-forward-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fast-forward-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fast-forward.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/feather.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/feather2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-arrow-down-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-arrow-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-arrow-up-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-arrow-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-bar-graph-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-bar-graph.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-binary-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-binary.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-break-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-break.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-code-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-code.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-diff-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-diff.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-arrow-down-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-arrow-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-arrow-up-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-arrow-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-bar-graph-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-bar-graph.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-binary-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-binary.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-break-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-break.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-code-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-code.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-diff-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-diff.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-easel-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-easel.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-excel-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-excel.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-font-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-font.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-image-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-image.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-lock-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-lock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-lock2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-lock2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-medical-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-medical.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-minus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-music-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-music.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-pdf-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-pdf.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-person-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-person.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-play-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-play.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-post-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-post.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-ppt-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-ppt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-richtext-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-richtext.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-ruled-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-ruled.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-slides-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-slides.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-spreadsheet-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-spreadsheet.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-text-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-text.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-word-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-word.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-zip-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark-zip.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-earmark.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-easel-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-easel.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-excel-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-excel.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-font-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-font.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-image-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-image.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-lock-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-lock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-lock2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-lock2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-medical-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-medical.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-minus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-music-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-music.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-pdf-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-pdf.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-person-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-person.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-play-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-play.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-post-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-post.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-ppt-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-ppt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-richtext-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-richtext.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-ruled-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-ruled.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-slides-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-slides.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-spreadsheet-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-spreadsheet.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-text-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-text.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-word-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-word.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-zip-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file-zip.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/file.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/files-alt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/files.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-aac.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-ai.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-bmp.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-cs.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-css.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-csv.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-doc.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-docx.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-exe.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-gif.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-heic.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-html.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-java.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-jpg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-js.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-json.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-jsx.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-key.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-m4p.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-md.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-mdx.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-mov.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-mp3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-mp4.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-otf.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-pdf.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-php.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-png.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-ppt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-pptx.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-psd.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-py.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-raw.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-rb.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-sass.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-scss.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-sh.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-sql.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-svg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-tiff.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-tsx.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-ttf.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-txt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-wav.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-woff.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-xls.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-xlsx.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-xml.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filetype-yml.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/film.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filter-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filter-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filter-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filter-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filter-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filter-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/filter.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fingerprint.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fire.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/flag-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/flag.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/flask-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/flask-florence-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/flask-florence.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/flask.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/floppy-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/floppy.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/floppy2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/floppy2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/flower1.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/flower2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/flower3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/folder-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/folder-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/folder-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/folder-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/folder-symlink-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/folder-symlink.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/folder-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/folder.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/folder2-open.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/folder2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fonts.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fonts/bootstrap-icons.woff (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fonts/bootstrap-icons.woff2 (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fork-knife.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/forward-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/forward.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/front.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fuel-pump-diesel-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fuel-pump-diesel.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fuel-pump-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fuel-pump.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fullscreen-exit.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/fullscreen.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/funnel-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/funnel.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gear-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gear-wide-connected.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gear-wide.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gear.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gem.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gender-ambiguous.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gender-female.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gender-male.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gender-neuter.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gender-trans.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/geo-alt-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/geo-alt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/geo-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/geo.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gift-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gift.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/git.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/github.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gitlab.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/globe-americas-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/globe-americas.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/globe-asia-australia-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/globe-asia-australia.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/globe-central-south-asia-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/globe-central-south-asia.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/globe-europe-africa-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/globe-europe-africa.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/globe.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/globe2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/google-play.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/google.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/gpu-card.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/graph-down-arrow.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/graph-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/graph-up-arrow.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/graph-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grid-1x2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grid-1x2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grid-3x2-gap-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grid-3x2-gap.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grid-3x2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grid-3x3-gap-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grid-3x3-gap.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grid-3x3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grid-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grid.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grip-horizontal.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/grip-vertical.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/h-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/h-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/h-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/h-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hammer.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hand-index-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hand-index-thumb-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hand-index-thumb.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hand-index.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hand-thumbs-down-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hand-thumbs-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hand-thumbs-up-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hand-thumbs-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/handbag-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/handbag.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hdd-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hdd-network-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hdd-network.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hdd-rack-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hdd-rack.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hdd-stack-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hdd-stack.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hdd.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hdmi-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hdmi.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/headphones.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/headset-vr.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/headset.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/heart-arrow.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/heart-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/heart-pulse-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/heart-pulse.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/heartbreak-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/heartbreak.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hearts.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/heptagon-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/heptagon-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/heptagon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hexagon-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hexagon-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hexagon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/highlighter.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/highlights.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hospital-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hospital.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hourglass-bottom.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hourglass-split.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hourglass-top.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hourglass.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-add-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-add.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-dash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-door-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-door.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-down-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-exclamation-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-gear-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-gear.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-lock-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-lock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-slash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-up-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/house.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/houses-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/houses.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hr.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hurricane.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/hypnotize.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/image-alt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/image-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/image.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/images.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/inbox-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/inbox.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/inboxes-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/inboxes.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/incognito.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/indent.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/infinity.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/info-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/info-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/info-lg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/info-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/info-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/info.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/input-cursor-text.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/input-cursor.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/instagram.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/intersect.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/javascript.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-album.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-arrow-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-arrow-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-bookmark-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-bookmark.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-code.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-medical.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-richtext.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-text.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journal.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/journals.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/joystick.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/justify-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/justify-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/justify.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/kanban-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/kanban.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/key-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/key.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/keyboard-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/keyboard.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ladder.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lamp-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lamp.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/laptop-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/laptop.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layer-backward.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layer-forward.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layers-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layers-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layers.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layout-sidebar-inset-reverse.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layout-sidebar-inset.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layout-sidebar-reverse.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layout-sidebar.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layout-split.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layout-text-sidebar-reverse.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layout-text-sidebar.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layout-text-window-reverse.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layout-text-window.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layout-three-columns.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/layout-wtf.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/leaf-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/leaf.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/life-preserver.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lightbulb-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lightbulb-off-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lightbulb-off.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lightbulb.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lightning-charge-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lightning-charge.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lightning-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lightning.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/line.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/link-45deg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/link.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/linkedin.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/list-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/list-columns-reverse.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/list-columns.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/list-nested.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/list-ol.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/list-stars.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/list-task.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/list-ul.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/list.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lock-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/luggage-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/luggage.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lungs-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/lungs.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/magic.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/magnet-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/magnet.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mailbox-flag.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mailbox.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mailbox2-flag.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mailbox2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/map-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/map.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/markdown-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/markdown.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/marker-tip.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mask.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mastodon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/measuring-cup-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/measuring-cup.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/medium.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/megaphone-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/megaphone.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/memory.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/menu-app-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/menu-app.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/menu-button-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/menu-button-wide-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/menu-button-wide.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/menu-button.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/menu-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/menu-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/messenger.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/meta.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mic-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mic-mute-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mic-mute.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mic.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/microsoft-teams.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/microsoft.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/minecart-loaded.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/minecart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/modem-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/modem.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/moisture.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/moon-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/moon-stars-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/moon-stars.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/moon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mortarboard-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mortarboard.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/motherboard-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/motherboard.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mouse-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mouse.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mouse2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mouse2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mouse3-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/mouse3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/music-note-beamed.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/music-note-list.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/music-note.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/music-player-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/music-player.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/newspaper.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/nintendo-switch.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/node-minus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/node-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/node-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/node-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/noise-reduction.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/nut-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/nut.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/nvidia.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/nvme-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/nvme.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/octagon-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/octagon-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/octagon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/openai.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/opencollective.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/optical-audio-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/optical-audio.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/option.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/outlet.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/p-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/p-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/p-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/p-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/paint-bucket.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/palette-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/palette.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/palette2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/paperclip.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/paragraph.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pass-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pass.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/passport-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/passport.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/patch-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/patch-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/patch-exclamation-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/patch-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/patch-minus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/patch-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/patch-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/patch-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/patch-question-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/patch-question.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pause-btn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pause-btn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pause-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pause-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pause-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pause.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/paypal.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pc-display-horizontal.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pc-display.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pc-horizontal.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pc.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pci-card-network.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pci-card-sound.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pci-card.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/peace-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/peace.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pen-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pen.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pencil-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pencil-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pencil.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pentagon-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pentagon-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pentagon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/people-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/people.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/percent.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/perplexity.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-add.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-arms-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-badge-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-badge.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-bounding-box.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-dash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-fill-add.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-fill-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-fill-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-fill-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-fill-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-fill-gear.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-fill-lock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-fill-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-fill-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-fill-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-gear.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-hearts.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-lines-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-lock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-raised-hand.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-rolodex.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-standing-dress.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-standing.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-vcard-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-vcard.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-video.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-video2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-video3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-walking.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-wheelchair.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-workspace.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/person.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/phone-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/phone-flip.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/phone-landscape-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/phone-landscape.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/phone-vibrate-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/phone-vibrate.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/phone.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pie-chart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pie-chart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/piggy-bank-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/piggy-bank.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pin-angle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pin-angle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pin-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pin-map-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pin-map.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pin.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pinterest.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pip-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/pip.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/play-btn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/play-btn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/play-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/play-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/play-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/play.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/playstation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plug-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plug.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plugin.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plus-circle-dotted.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plus-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plus-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plus-lg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plus-slash-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plus-square-dotted.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plus-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plus-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/postage-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/postage-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/postage-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/postage.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/postcard-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/postcard-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/postcard-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/postcard.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/power.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/prescription.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/prescription2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/printer-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/printer.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/projector-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/projector.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/puzzle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/puzzle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/qr-code-scan.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/qr-code.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/question-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/question-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/question-diamond-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/question-diamond.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/question-lg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/question-octagon-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/question-octagon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/question-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/question-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/question.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/quora.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/quote.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/r-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/r-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/r-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/r-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/radar.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/radioactive.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rainbow.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/receipt-cutoff.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/receipt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/reception-0.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/reception-1.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/reception-2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/reception-3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/reception-4.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/record-btn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/record-btn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/record-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/record-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/record-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/record.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/record2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/record2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/recycle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/reddit.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/regex.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/repeat-1.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/repeat.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/reply-all-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/reply-all.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/reply-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/reply.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rewind-btn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rewind-btn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rewind-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rewind-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rewind-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rewind.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/robot.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rocket-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rocket-takeoff-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rocket-takeoff.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rocket.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/router-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/router.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rss-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rss.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/rulers.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/safe-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/safe.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/safe2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/safe2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/save-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/save.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/save2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/save2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/scissors.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/scooter.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/screwdriver.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sd-card-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sd-card.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/search-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/search-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/search.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/segmented-nav.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-arrow-down-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-arrow-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-arrow-up-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-arrow-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-check-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-dash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-exclamation-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-slash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/send.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/server.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shadows.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/share-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/share.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-fill-check.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-fill-exclamation.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-fill-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-fill-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-fill-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-lock-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-lock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-shaded.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-slash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shield.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shift-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shift.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shop-window.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shop.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/shuffle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-dead-end-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-dead-end.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-do-not-enter-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-do-not-enter.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-intersection-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-intersection-side-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-intersection-side.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-intersection-t-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-intersection-t.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-intersection-y-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-intersection-y.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-intersection.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-merge-left-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-merge-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-merge-right-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-merge-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-no-left-turn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-no-left-turn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-no-parking-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-no-parking.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-no-right-turn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-no-right-turn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-railroad-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-railroad.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-stop-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-stop-lights-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-stop-lights.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-stop.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-turn-left-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-turn-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-turn-right-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-turn-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-turn-slight-left-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-turn-slight-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-turn-slight-right-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-turn-slight-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-yield-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sign-yield.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/signal.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/signpost-2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/signpost-2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/signpost-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/signpost-split-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/signpost-split.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/signpost.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sim-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sim-slash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sim-slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sim.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sina-weibo.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-backward-btn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-backward-btn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-backward-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-backward-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-backward-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-backward.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-end-btn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-end-btn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-end-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-end-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-end-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-end.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-forward-btn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-forward-btn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-forward-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-forward-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-forward-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-forward.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-start-btn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-start-btn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-start-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-start-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-start-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skip-start.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/skype.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/slack.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/slash-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/slash-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/slash-lg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/slash-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/slash-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/slash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sliders.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sliders2-vertical.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sliders2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/smartwatch.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/snapchat.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/snow.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/snow2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/snow3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-alpha-down-alt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-alpha-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-alpha-up-alt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-alpha-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-down-alt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-numeric-down-alt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-numeric-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-numeric-up-alt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-numeric-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-up-alt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sort-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/soundwave.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sourceforge.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/speaker-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/speaker.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/speedometer.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/speedometer2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/spellcheck.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/spotify.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/square-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stack-overflow.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stack.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/star-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/star-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/star.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stars.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/steam.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stickies-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stickies.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sticky-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sticky.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stop-btn-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stop-btn.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stop-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stop-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stop-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stop.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stoplights-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stoplights.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stopwatch-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stopwatch.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/strava.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/stripe.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/subscript.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/substack.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/subtract.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suit-club-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suit-club.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suit-diamond-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suit-diamond.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suit-heart-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suit-heart.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suit-spade-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suit-spade.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suitcase-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suitcase-lg-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suitcase-lg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suitcase.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suitcase2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/suitcase2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sun-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sun.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sunglasses.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sunrise-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sunrise.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sunset-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/sunset.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/superscript.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/symmetry-horizontal.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/symmetry-vertical.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/table.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tablet-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tablet-landscape-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tablet-landscape.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tablet.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tag-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tag.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tags-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tags.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/taxi-front-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/taxi-front.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telegram.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-forward-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-forward.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-inbound-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-inbound.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-minus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-minus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-outbound-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-outbound.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-plus-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-x-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/telephone.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tencent-qq.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/terminal-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/terminal-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/terminal-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/terminal-split.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/terminal-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/terminal.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/text-center.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/text-indent-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/text-indent-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/text-left.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/text-paragraph.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/text-right.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/text-wrap.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/textarea-resize.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/textarea-t.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/textarea.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/thermometer-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/thermometer-high.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/thermometer-low.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/thermometer-snow.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/thermometer-sun.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/thermometer.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/threads-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/threads.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/three-dots-vertical.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/three-dots.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/thunderbolt-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/thunderbolt.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ticket-detailed-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ticket-detailed.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ticket-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ticket-perforated-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ticket-perforated.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ticket.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tiktok.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/toggle-off.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/toggle-on.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/toggle2-off.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/toggle2-on.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/toggles.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/toggles2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tools.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tornado.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/train-freight-front-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/train-freight-front.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/train-front-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/train-front.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/train-lightrail-front-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/train-lightrail-front.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/translate.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/transparency.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/trash-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/trash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/trash2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/trash2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/trash3-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/trash3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tree-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tree.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/trello.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/triangle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/triangle-half.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/triangle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/trophy-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/trophy.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tropical-storm.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/truck-flatbed.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/truck-front-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/truck-front.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/truck.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tsunami.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tux.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tv-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/tv.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/twitch.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/twitter-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/twitter.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/type-bold.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/type-h1.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/type-h2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/type-h3.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/type-h4.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/type-h5.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/type-h6.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/type-italic.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/type-strikethrough.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/type-underline.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/type.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/typescript.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ubuntu.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ui-checks-grid.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ui-checks.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ui-radios-grid.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/ui-radios.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/umbrella-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/umbrella.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/unindent.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/union.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/unity.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/universal-access-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/universal-access.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/unlock-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/unlock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/unlock2-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/unlock2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/upc-scan.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/upc.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/upload.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-c-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-c.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-drive-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-drive.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-micro-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-micro.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-mini-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-mini.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-plug-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-plug.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb-symbol.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/usb.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/valentine.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/valentine2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/vector-pen.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/view-list.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/view-stacked.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/vignette.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/vimeo.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/vinyl-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/vinyl.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/virus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/virus2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/voicemail.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/volume-down-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/volume-down.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/volume-mute-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/volume-mute.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/volume-off-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/volume-off.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/volume-up-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/volume-up.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/vr.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wallet-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wallet.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wallet2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/watch.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/water.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/webcam-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/webcam.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wechat.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/whatsapp.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wifi-1.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wifi-2.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wifi-off.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wifi.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wikipedia.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wind.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/window-dash.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/window-desktop.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/window-dock.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/window-fullscreen.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/window-plus.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/window-sidebar.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/window-split.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/window-stack.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/window-x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/window.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/windows.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wordpress.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wrench-adjustable-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wrench-adjustable-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wrench-adjustable.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/wrench.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/x-circle-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/x-circle.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/x-diamond-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/x-diamond.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/x-lg.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/x-octagon-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/x-octagon.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/x-square-fill.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/x-square.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/x.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/xbox.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/yelp.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/yin-yang.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/youtube.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/zoom-in.svg (100%) rename static/{bootstrap-icons => bootstrap-icons-1.13.1}/zoom-out.svg (100%) delete mode 100755 templates/tablas/poblaciones.html create mode 100755 templates/tablas/unidades_tabulator.html create mode 100755 uploads/documentos/v3260_1788429735.pdf create mode 100755 venv/bin/Activate.ps1 create mode 100755 venv/bin/activate create mode 100755 venv/bin/activate.csh create mode 100755 venv/bin/activate.fish create mode 100755 venv/bin/flask create mode 100755 venv/bin/gunicorn create mode 100755 venv/bin/gunicornc create mode 100755 venv/bin/pip create mode 100755 venv/bin/pip3 create mode 100755 venv/bin/pip3.11 create mode 120000 venv/bin/python create mode 120000 venv/bin/python3 create mode 120000 venv/bin/python3.11 create mode 100755 venv/lib/python3.11/site-packages/_distutils_hack/__init__.py create mode 100755 venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/_distutils_hack/override.py create mode 100755 venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/blinker/__init__.py create mode 100755 venv/lib/python3.11/site-packages/blinker/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/blinker/__pycache__/_utilities.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/blinker/__pycache__/base.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/blinker/_utilities.py create mode 100755 venv/lib/python3.11/site-packages/blinker/base.py create mode 100755 venv/lib/python3.11/site-packages/blinker/py.typed create mode 100755 venv/lib/python3.11/site-packages/click-8.5.0.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/click-8.5.0.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/click-8.5.0.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/click-8.5.0.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/click-8.5.0.dist-info/licenses/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/click/__init__.py create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/_compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/_textwrap.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/_utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/_winconsole.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/core.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/decorators.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/formatting.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/parser.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/shell_completion.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/termui.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/testing.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/types.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/click/_compat.py create mode 100755 venv/lib/python3.11/site-packages/click/_termui_impl.py create mode 100755 venv/lib/python3.11/site-packages/click/_textwrap.py create mode 100755 venv/lib/python3.11/site-packages/click/_utils.py create mode 100755 venv/lib/python3.11/site-packages/click/_winconsole.py create mode 100755 venv/lib/python3.11/site-packages/click/core.py create mode 100755 venv/lib/python3.11/site-packages/click/decorators.py create mode 100755 venv/lib/python3.11/site-packages/click/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/click/formatting.py create mode 100755 venv/lib/python3.11/site-packages/click/globals.py create mode 100755 venv/lib/python3.11/site-packages/click/parser.py create mode 100755 venv/lib/python3.11/site-packages/click/py.typed create mode 100755 venv/lib/python3.11/site-packages/click/shell_completion.py create mode 100755 venv/lib/python3.11/site-packages/click/termui.py create mode 100755 venv/lib/python3.11/site-packages/click/testing.py create mode 100755 venv/lib/python3.11/site-packages/click/types.py create mode 100755 venv/lib/python3.11/site-packages/click/utils.py create mode 100755 venv/lib/python3.11/site-packages/distutils-precedence.pth create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile-2.0.0.dist-info/AUTHORS.txt create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile-2.0.0.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile-2.0.0.dist-info/LICENCE.python create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile-2.0.0.dist-info/LICENCE.rst create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile-2.0.0.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile-2.0.0.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile-2.0.0.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile-2.0.0.dist-info/top_level.txt create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile/__init__.py create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile/__pycache__/incremental_tree.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile/__pycache__/xmlfile.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile/incremental_tree.py create mode 100755 venv/lib/python3.11/site-packages/et_xmlfile/xmlfile.py create mode 100755 venv/lib/python3.11/site-packages/flask-3.1.3.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/flask-3.1.3.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/flask-3.1.3.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/flask-3.1.3.dist-info/REQUESTED create mode 100755 venv/lib/python3.11/site-packages/flask-3.1.3.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/flask-3.1.3.dist-info/entry_points.txt create mode 100755 venv/lib/python3.11/site-packages/flask-3.1.3.dist-info/licenses/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/flask/__init__.py create mode 100755 venv/lib/python3.11/site-packages/flask/__main__.py create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/__main__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/app.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/blueprints.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/cli.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/config.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/ctx.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/debughelpers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/globals.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/helpers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/logging.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/sessions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/signals.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/templating.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/testing.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/typing.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/views.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/__pycache__/wrappers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/app.py create mode 100755 venv/lib/python3.11/site-packages/flask/blueprints.py create mode 100755 venv/lib/python3.11/site-packages/flask/cli.py create mode 100755 venv/lib/python3.11/site-packages/flask/config.py create mode 100755 venv/lib/python3.11/site-packages/flask/ctx.py create mode 100755 venv/lib/python3.11/site-packages/flask/debughelpers.py create mode 100755 venv/lib/python3.11/site-packages/flask/globals.py create mode 100755 venv/lib/python3.11/site-packages/flask/helpers.py create mode 100755 venv/lib/python3.11/site-packages/flask/json/__init__.py create mode 100755 venv/lib/python3.11/site-packages/flask/json/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/json/__pycache__/provider.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/json/__pycache__/tag.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/json/provider.py create mode 100755 venv/lib/python3.11/site-packages/flask/json/tag.py create mode 100755 venv/lib/python3.11/site-packages/flask/logging.py create mode 100755 venv/lib/python3.11/site-packages/flask/py.typed create mode 100755 venv/lib/python3.11/site-packages/flask/sansio/README.md create mode 100755 venv/lib/python3.11/site-packages/flask/sansio/__pycache__/app.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/sansio/__pycache__/blueprints.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/sansio/__pycache__/scaffold.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/flask/sansio/app.py create mode 100755 venv/lib/python3.11/site-packages/flask/sansio/blueprints.py create mode 100755 venv/lib/python3.11/site-packages/flask/sansio/scaffold.py create mode 100755 venv/lib/python3.11/site-packages/flask/sessions.py create mode 100755 venv/lib/python3.11/site-packages/flask/signals.py create mode 100755 venv/lib/python3.11/site-packages/flask/templating.py create mode 100755 venv/lib/python3.11/site-packages/flask/testing.py create mode 100755 venv/lib/python3.11/site-packages/flask/typing.py create mode 100755 venv/lib/python3.11/site-packages/flask/views.py create mode 100755 venv/lib/python3.11/site-packages/flask/wrappers.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn-26.2.0.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/gunicorn-26.2.0.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/gunicorn-26.2.0.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/gunicorn-26.2.0.dist-info/REQUESTED create mode 100755 venv/lib/python3.11/site-packages/gunicorn-26.2.0.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/gunicorn-26.2.0.dist-info/entry_points.txt create mode 100755 venv/lib/python3.11/site-packages/gunicorn-26.2.0.dist-info/licenses/LICENSE create mode 100755 venv/lib/python3.11/site-packages/gunicorn-26.2.0.dist-info/top_level.txt create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__init__.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__main__.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/__main__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/arbiter.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/config.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/debug.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/errors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/glogging.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/pidfile.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/reloader.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/sock.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/systemd.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/__pycache__/util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/app/__init__.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/app/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/app/__pycache__/base.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/app/__pycache__/pasterapp.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/app/__pycache__/wsgiapp.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/app/base.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/app/pasterapp.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/arbiter.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/__init__.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/__pycache__/lifespan.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/__pycache__/parser.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/__pycache__/protocol.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/__pycache__/unreader.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/__pycache__/uwsgi.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/__pycache__/websocket.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/lifespan.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/parser.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/protocol.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/unreader.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/uwsgi.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/asgi/websocket.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/config.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/__init__.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/__pycache__/cli.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/__pycache__/client.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/__pycache__/handlers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/__pycache__/protocol.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/__pycache__/server.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/cli.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/client.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/handlers.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/protocol.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/ctl/server.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/debug.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/__init__.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/__pycache__/app.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/__pycache__/arbiter.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/__pycache__/client.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/__pycache__/errors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/__pycache__/protocol.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/__pycache__/stash.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/__pycache__/tlv.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/__pycache__/worker.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/app.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/arbiter.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/client.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/errors.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/protocol.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/stash.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/tlv.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/dirty/worker.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/errors.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/glogging.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/__init__.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/__pycache__/body.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/__pycache__/errors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/__pycache__/message.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/__pycache__/parser.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/__pycache__/unreader.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/__pycache__/wsgi.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/body.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/errors.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/message.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/parser.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/unreader.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http/wsgi.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/__init__.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/__pycache__/async_connection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/__pycache__/connection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/__pycache__/errors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/__pycache__/negotiation.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/__pycache__/request.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/__pycache__/response.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/__pycache__/stream.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/async_connection.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/connection.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/errors.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/negotiation.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/request.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/response.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/http2/stream.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/instrument/__init__.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/instrument/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/instrument/__pycache__/statsd.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/instrument/statsd.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/pidfile.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/reloader.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/sock.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/systemd.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/util.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/uwsgi/__init__.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/uwsgi/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/uwsgi/__pycache__/errors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/uwsgi/__pycache__/message.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/uwsgi/__pycache__/parser.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/uwsgi/errors.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/uwsgi/message.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/uwsgi/parser.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/__init__.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/__pycache__/base.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/__pycache__/base_async.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/__pycache__/gasgi.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/__pycache__/ggevent.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/__pycache__/gthread.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/__pycache__/gtornado.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/__pycache__/sync.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/__pycache__/workertmp.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/base.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/base_async.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/gasgi.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/ggevent.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/gthread.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/gtornado.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/sync.py create mode 100755 venv/lib/python3.11/site-packages/gunicorn/workers/workertmp.py create mode 100755 venv/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/__init__.py create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/__pycache__/_json.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/__pycache__/encoding.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/__pycache__/exc.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/__pycache__/serializer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/__pycache__/signer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/__pycache__/timed.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/__pycache__/url_safe.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/_json.py create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/encoding.py create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/exc.py create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/py.typed create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/serializer.py create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/signer.py create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/timed.py create mode 100755 venv/lib/python3.11/site-packages/itsdangerous/url_safe.py create mode 100755 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/entry_points.txt create mode 100755 venv/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/jinja2/__init__.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/_identifier.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/async_utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/bccache.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/compiler.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/constants.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/debug.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/defaults.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/environment.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/ext.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/filters.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/idtracking.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/lexer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/loaders.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/meta.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/nativetypes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/nodes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/optimizer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/parser.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/runtime.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/sandbox.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/tests.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/__pycache__/visitor.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/jinja2/_identifier.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/async_utils.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/bccache.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/compiler.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/constants.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/debug.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/defaults.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/environment.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/ext.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/filters.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/idtracking.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/lexer.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/loaders.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/meta.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/nativetypes.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/nodes.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/optimizer.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/parser.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/py.typed create mode 100755 venv/lib/python3.11/site-packages/jinja2/runtime.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/sandbox.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/tests.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/utils.py create mode 100755 venv/lib/python3.11/site-packages/jinja2/visitor.py create mode 100755 venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/top_level.txt create mode 100755 venv/lib/python3.11/site-packages/markupsafe/__init__.py create mode 100755 venv/lib/python3.11/site-packages/markupsafe/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/markupsafe/__pycache__/_native.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/markupsafe/_native.py create mode 100755 venv/lib/python3.11/site-packages/markupsafe/_speedups.c create mode 100755 venv/lib/python3.11/site-packages/markupsafe/_speedups.cpython-311-darwin.so create mode 100755 venv/lib/python3.11/site-packages/markupsafe/_speedups.pyi create mode 100755 venv/lib/python3.11/site-packages/markupsafe/py.typed create mode 100755 venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/LICENCE.rst create mode 100755 venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/REQUESTED create mode 100755 venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/top_level.txt create mode 100755 venv/lib/python3.11/site-packages/openpyxl/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/__pycache__/_constants.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/_constants.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/_writer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/cell.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/read_only.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/rich_text.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/text.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/_writer.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/cell.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/read_only.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/rich_text.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/cell/text.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/_3d.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/_3d.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/_chart.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/area_chart.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/axis.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/bar_chart.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/bubble_chart.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/chartspace.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/data_source.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/descriptors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/error_bar.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/label.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/layout.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/legend.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/line_chart.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/marker.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/picture.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/pie_chart.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/pivot.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/plotarea.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/print_settings.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/radar_chart.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/reader.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/reference.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/scatter_chart.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/series.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/series_factory.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/shapes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/stock_chart.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/surface_chart.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/text.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/title.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/trendline.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/updown_bars.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/_chart.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/area_chart.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/axis.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/bar_chart.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/bubble_chart.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/chartspace.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/data_source.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/descriptors.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/error_bar.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/label.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/layout.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/legend.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/line_chart.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/marker.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/picture.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/pie_chart.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/pivot.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/plotarea.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/print_settings.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/radar_chart.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/reader.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/reference.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/scatter_chart.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/series.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/series_factory.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/shapes.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/stock_chart.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/surface_chart.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/text.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/title.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/trendline.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chart/updown_bars.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/chartsheet.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/custom.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/properties.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/protection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/publish.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/relation.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/views.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/chartsheet.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/custom.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/properties.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/protection.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/publish.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/relation.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/chartsheet/views.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/comments/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/comments/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/comments/__pycache__/author.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/comments/__pycache__/comment_sheet.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/comments/__pycache__/comments.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/comments/__pycache__/shape_writer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/comments/author.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/comments/comment_sheet.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/comments/comments.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/comments/shape_writer.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/abc.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/numbers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/product.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/singleton.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/strings.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/abc.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/numbers.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/product.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/singleton.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/compat/strings.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/base.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/container.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/excel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/namespace.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/nested.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/sequence.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/serialisable.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/slots.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/base.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/container.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/excel.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/namespace.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/nested.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/sequence.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/serialisable.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/descriptors/slots.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/colors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/connector.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/drawing.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/effect.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/fill.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/geometry.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/graphic.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/image.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/line.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/picture.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/properties.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/relation.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/spreadsheet_drawing.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/text.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/xdr.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/colors.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/connector.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/drawing.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/effect.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/fill.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/geometry.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/graphic.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/image.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/line.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/picture.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/properties.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/relation.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/spreadsheet_drawing.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/text.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/drawing/xdr.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formatting/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formatting/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formatting/__pycache__/formatting.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formatting/__pycache__/rule.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formatting/formatting.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formatting/rule.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formula/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formula/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formula/__pycache__/tokenizer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formula/__pycache__/translate.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formula/tokenizer.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/formula/translate.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/core.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/custom.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/extended.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/interface.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/manifest.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/relationship.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/workbook.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/core.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/custom.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/extended.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/interface.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/manifest.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/relationship.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/packaging/workbook.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/pivot/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/pivot/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/pivot/__pycache__/cache.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/pivot/__pycache__/fields.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/pivot/__pycache__/record.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/pivot/__pycache__/table.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/pivot/cache.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/pivot/fields.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/pivot/record.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/pivot/table.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/reader/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/reader/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/reader/__pycache__/drawings.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/reader/__pycache__/excel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/reader/__pycache__/strings.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/reader/__pycache__/workbook.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/reader/drawings.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/reader/excel.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/reader/strings.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/reader/workbook.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/alignment.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/borders.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/builtins.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/cell_style.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/colors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/differential.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/fills.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/fonts.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/named_styles.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/numbers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/protection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/proxy.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/styleable.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/stylesheet.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/table.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/alignment.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/borders.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/builtins.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/cell_style.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/colors.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/differential.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/fills.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/fonts.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/named_styles.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/numbers.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/protection.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/proxy.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/styleable.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/stylesheet.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/styles/table.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/bound_dictionary.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/cell.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/dataframe.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/datetime.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/escape.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/formulas.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/indexed_list.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/inference.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/protection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/__pycache__/units.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/bound_dictionary.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/cell.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/dataframe.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/datetime.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/escape.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/formulas.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/indexed_list.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/inference.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/protection.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/utils/units.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/_writer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/child.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/defined_name.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/external_reference.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/function_group.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/properties.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/protection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/smart_tags.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/views.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/web.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/__pycache__/workbook.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/_writer.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/child.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/defined_name.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/external_link/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/external_link/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/external_link/__pycache__/external.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/external_link/external.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/external_reference.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/function_group.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/properties.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/protection.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/smart_tags.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/views.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/web.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/workbook/workbook.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/_read_only.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/_reader.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/_write_only.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/_writer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/cell_range.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/cell_watch.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/controls.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/copier.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/custom.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/datavalidation.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/dimensions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/drawing.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/errors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/filters.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/formula.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/header_footer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/hyperlink.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/merge.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/ole.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/page.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/pagebreak.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/picture.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/print_settings.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/properties.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/protection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/related.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/scenario.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/smart_tag.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/table.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/views.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/__pycache__/worksheet.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/_read_only.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/_reader.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/_write_only.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/_writer.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/cell_range.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/cell_watch.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/controls.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/copier.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/custom.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/datavalidation.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/dimensions.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/drawing.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/errors.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/filters.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/formula.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/header_footer.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/hyperlink.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/merge.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/ole.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/page.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/pagebreak.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/picture.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/print_settings.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/properties.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/protection.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/related.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/scenario.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/smart_tag.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/table.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/views.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/worksheet/worksheet.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/writer/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/writer/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/writer/__pycache__/excel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/writer/__pycache__/theme.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/writer/excel.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/writer/theme.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/xml/__init__.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/xml/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/xml/__pycache__/constants.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/xml/__pycache__/functions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/openpyxl/xml/constants.py create mode 100755 venv/lib/python3.11/site-packages/openpyxl/xml/functions.py create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/REQUESTED create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/entry_points.txt create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/AUTHORS.txt create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/certifi/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/distro/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/msgpack/COPYING create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pygments/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/requests/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/rich/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/truststore/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/pip/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/__main__.py create mode 100755 venv/lib/python3.11/site-packages/pip/__pip-runner__.py create mode 100755 venv/lib/python3.11/site-packages/pip/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/__pycache__/__main__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/base.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/installer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/noop.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/venv.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/virtual.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/base.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/installer.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/noop.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/venv.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/virtual.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cache.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/autocompletion.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/base_command.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/command_context.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/index_command.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/main.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/main_parser.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/parser.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/req_command.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/spinners.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/lock.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/cache.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/check.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/completion.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/configuration.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/debug.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/download.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/freeze.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/hash.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/help.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/index.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/inspect.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/install.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/list.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/lock.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/search.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/show.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/uninstall.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/wheel.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/configuration.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/distributions/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/distributions/base.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/distributions/installed.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/distributions/wheel.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/index/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/index/collector.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/index/package_finder.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/index/sources.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/locations/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/locations/_distutils.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/locations/_sysconfig.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/locations/base.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/main.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/_json.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/base.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/release_control.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/candidate.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/direct_url.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/format_control.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/index.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/installation_report.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/link.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/release_control.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/scheme.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/search_scope.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/selection_prefs.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/target_python.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/models/wheel.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/auth.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/cache.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/download.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/lazy_wheel.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/session.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/utils.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/network/xmlrpc.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/metadata.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/check.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/freeze.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/install/wheel.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/operations/prepare.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/pyproject.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/pep723.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_dependency_group.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/constructors.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/pep723.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/req_dependency_group.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/req_file.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/req_install.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/req_set.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/req/req_uninstall.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/base.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/self_outdated_check.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/pylock.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/retry.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/_log.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/appdirs.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/compat.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/datetime.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/deprecation.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/egg_link.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/entrypoints.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/filesystem.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/filetypes.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/glibc.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/hashes.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/logging.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/misc.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/packaging.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/pylock.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/retry.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/subprocess.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/temp_dir.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/unpacking.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/urls.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/virtualenv.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/utils/wheel.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/bazaar.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/git.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/mercurial.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/subversion.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100755 venv/lib/python3.11/site-packages/pip/_internal/wheel_builder.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/README.rst create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/bom.cdx.json create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/certifi/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__main__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/certifi/cacert.pem create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/certifi/core.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/certifi/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/compat.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/resources.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/scripts.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/t32.exe create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/t64.exe create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/util.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/w32.exe create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distlib/w64.exe create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distro/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distro/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distro/__main__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distro/distro.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/distro/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/LICENSE.md create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__main__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/__main__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/cli.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/cli.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/codec.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/compat.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/core.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/idnadata.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/intranges.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/package_data.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/idna/uts46data.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/COPYING create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/ext.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/fallback.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/LICENSE.APACHE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/LICENSE.BSD create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/dependency_groups.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/direct_url.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/errors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/pylock.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_elffile.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_parser.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_structures.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_tokenizer.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/dependency_groups.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/direct_url.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/errors.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/licenses/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/licenses/_spdx.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/markers.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/metadata.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/pylock.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/requirements.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/specifiers.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/tags.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/utils.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/packaging/version.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/_xdg.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/_xdg.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/console.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filter.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/modeline.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/style.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/_mapping.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/token.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/util.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_types.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__version__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/_types.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/adapters.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/api.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/auth.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/certs.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/compat.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/cookies.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/help.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/hooks.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/models.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/packages.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/sessions.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/structures.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/utils.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__main__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_extension.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_fileno.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_loop.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_null_file.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_pick.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_timer.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/abc.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/align.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/bar.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/box.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/cells.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/color.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/columns.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/console.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/containers.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/control.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/emoji.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/errors.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/filesize.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/json.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/jupyter.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/layout.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/live.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/live_render.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/logging.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/markup.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/measure.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/padding.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/pager.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/palette.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/panel.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/pretty.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/progress.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/progress_bar.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/prompt.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/protocol.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/region.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/repr.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/rule.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/scope.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/screen.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/segment.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/spinner.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/status.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/style.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/styled.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/syntax.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/table.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/text.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/theme.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/themes.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/traceback.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/tree.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_parser.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_re.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_types.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/__pycache__/_writer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/_writer.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/LICENSE create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/_api.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/_macos.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/_openssl.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/_windows.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_base_connection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_request_methods.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_base_connection.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_collections.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_request_methods.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_version.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/connection.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__pycache__/connection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__pycache__/fetch.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__pycache__/request.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__pycache__/response.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/connection.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/emscripten_fetch_worker.js create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/fetch.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/request.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/response.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/fields.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/filepost.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/__pycache__/connection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/__pycache__/probe.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/connection.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/probe.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/py.typed create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/response.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/request.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/response.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/url.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/util.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/vendor.txt create mode 100755 venv/lib/python3.11/site-packages/pip/py.typed create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/appdirs.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_common.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/abc.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/readers.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/simple.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/context.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/functools.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/more.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/recipes.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_manylinux.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_musllinux.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/actions.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/common.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/core.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/helpers.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/results.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/testing.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/unicode.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/util.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/_vendor/zipp.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/extern/__init__.py create mode 100755 venv/lib/python3.11/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/LICENSE create mode 100755 venv/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/REQUESTED create mode 100755 venv/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/entry_points.txt create mode 100755 venv/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/top_level.txt create mode 100755 venv/lib/python3.11/site-packages/setuptools/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/_path.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/depends.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/dist.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/errors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/extension.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/glob.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/installer.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/launch.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/logging.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/version.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_deprecation_warning.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/_collections.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/_functools.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/_macos_compat.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/archive_util.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/ccompiler.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/cmd.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/_framework_compat.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_clib.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_ext.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_py.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/check.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/clean.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/config.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_data.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_headers.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_lib.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/py37compat.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/register.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/sdist.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/command/upload.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/config.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/core.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/debug.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/dep_util.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/dir_util.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/dist.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/errors.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/extension.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/file_util.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/filelist.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/log.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/msvccompiler.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/py38compat.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/py39compat.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/spawn.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/sysconfig.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/text_file.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/unixccompiler.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/util.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/version.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_distutils/versionpredicate.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_entry_points.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_imp.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_importlib.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_itertools.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_path.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_reqs.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_collections.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_compat.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_functools.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_meta.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_text.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_adapters.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_common.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_compat.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_itertools.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_legacy.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/abc.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/readers.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/simple.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/context.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/functools.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/ordered_set.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_manylinux.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_musllinux.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/markers.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/tags.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/utils.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/version.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/actions.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/common.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/core.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/helpers.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/results.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/testing.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/unicode.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/util.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_parser.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_re.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_types.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/typing_extensions.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/_vendor/zipp.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/archive_util.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/build_meta.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/cli-32.exe create mode 100755 venv/lib/python3.11/site-packages/setuptools/cli-64.exe create mode 100755 venv/lib/python3.11/site-packages/setuptools/cli-arm64.exe create mode 100755 venv/lib/python3.11/site-packages/setuptools/cli.exe create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/alias.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/bdist_egg.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/bdist_rpm.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/build.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/build_clib.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/build_ext.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/build_py.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/develop.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/dist_info.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/easy_install.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/editable_wheel.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/egg_info.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/install.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/install_egg_info.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/install_lib.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/install_scripts.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/launcher manifest.xml create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/py36compat.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/register.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/rotate.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/saveopts.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/sdist.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/setopt.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/test.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/upload.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/command/upload_docs.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_apply_pyprojecttoml.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/error_reporting.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/extra_validations.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/formats.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/expand.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/config/setupcfg.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/dep_util.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/depends.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/discovery.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/dist.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/errors.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/extension.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/extern/__init__.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/setuptools/glob.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/gui-32.exe create mode 100755 venv/lib/python3.11/site-packages/setuptools/gui-64.exe create mode 100755 venv/lib/python3.11/site-packages/setuptools/gui-arm64.exe create mode 100755 venv/lib/python3.11/site-packages/setuptools/gui.exe create mode 100755 venv/lib/python3.11/site-packages/setuptools/installer.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/launch.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/logging.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/monkey.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/msvc.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/namespaces.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/package_index.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/py34compat.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/sandbox.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/script (dev).tmpl create mode 100755 venv/lib/python3.11/site-packages/setuptools/script.tmpl create mode 100755 venv/lib/python3.11/site-packages/setuptools/unicode_utils.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/version.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/wheel.py create mode 100755 venv/lib/python3.11/site-packages/setuptools/windows_support.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/INSTALLER create mode 100755 venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/METADATA create mode 100755 venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/RECORD create mode 100755 venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/WHEEL create mode 100755 venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/licenses/LICENSE.txt create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__init__.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/_internal.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/_reloader.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/formparser.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/http.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/local.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/security.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/serving.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/test.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/testapp.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/urls.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/user_agent.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/__pycache__/wsgi.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/_internal.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/_reloader.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__init__.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/range.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/accept.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/auth.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/cache_control.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/csp.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/etag.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/file_storage.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/headers.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/mixins.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/range.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/datastructures/structures.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/__init__.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/__pycache__/console.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/__pycache__/repr.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/console.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/repr.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/shared/ICON_LICENSE.md create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/shared/console.png create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/shared/debugger.js create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/shared/less.png create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/shared/more.png create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/shared/style.css create mode 100755 venv/lib/python3.11/site-packages/werkzeug/debug/tbtools.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/formparser.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/http.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/local.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/__init__.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/lint.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/dispatcher.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/http_proxy.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/lint.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/profiler.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/proxy_fix.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/middleware/shared_data.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/py.typed create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/__init__.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/converters.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/map.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/matcher.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/rules.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/converters.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/exceptions.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/map.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/matcher.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/routing/rules.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/__init__.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/http.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/request.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/response.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/utils.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/http.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/multipart.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/request.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/response.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/sansio/utils.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/security.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/serving.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/test.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/testapp.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/urls.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/user_agent.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/utils.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/wrappers/__init__.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/request.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/response.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/werkzeug/wrappers/request.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/wrappers/response.py create mode 100755 venv/lib/python3.11/site-packages/werkzeug/wsgi.py create mode 100755 venv/pyvenv.cfg diff --git a/.DS_Store b/.DS_Store index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0f066add95854fcc5f4d0524ac0861469525c06f 100644 GIT binary patch literal 26628 zcmeHQU2NP`7Cy&G6HhZxr?e(59WpRLtCFZQlQc;wf@yxVl%^y!X_Kaf)H7p>P|&?P^^3aA0aG63Epvc5P{{$IK8;X-88E@7$UO^AaU^G%wskul5z1B% zMT+JvD4I^OFKyasfV#cu8Pjm`@%U#b)zz1o5JA>)k99x+}Y||XJ z9V2hp*5OHIz34PFBTCL8J?9V|&+8}iqJud5qW0qxj-AW*xmOrB=%S+4gm!Y&?+^+- zwXP*{`BhiPcV2US{|$q~XO!mk7j4+6h9``yZsm>J3_W*n*2w0k4r@+Ex3Y$H`&iL% zjI^nbTH3VUEG6ZT+iTNiRUI#+jS~eUe@cnT@|la8*DGqPdYP=eARo=rxc1vwamK9M zKGv$LM?`I3PN!{_I*5yJ-KK^|9lA|LqZ5l$gxl2}A;pnLj~kZPHIWRf2Td)ln@Tq1 zb?fR5t7AovAId(za`&}ibv$EFPt#DGW^D7TQ+rhPR&nJ)&B+hV=$4*U{^?(SfR0T# zQ(8_Rnzi(tU%QuT-Jg!?MW=zRk+(|+_qVFy!{T&%vRN92chl+tbyQY9lt~5*t7zm& z1c>`Y3XU8r3E+m(j!!X`+V1VfUc2LO?w&j7SSs$fkf9Zl&<}%@tIEOe;4koZcoJTO z*WnF#6F!8`;4AnKd;{NM9X4Pi%GivXaSKN9QrwE$a64X&J-7$=<4rh(<9G{B;xW|l z4m^(2XrY65;XQaS-iN=%KjUBVL3{`w#z*i;d>Ws@XYo~h7vID8@dNw>|BavH7x*=P zFM)*8T4{r{QBtK=DJoqq#iTB&TS`ecOA}H?n)2>m@=*(p`lIoQbb@xu6>P>+FzJnD z6fCm$#(jhPZ`$|2pkSY_^Hu8Nmdk{m?YgdSK_opHE{ScqGPoMBNM~F@a8)iKx@R_R zzGO?}(r~n-mqC3!NNS^>l!g2&jb7_m_)3{nM_J<)w}rRMq%=x{S8R{$5Gt!kZZVvU zbcRS7mAW%qHea%-t347?kn}_bf1Cigzq*{u6?qvRB z_!oQ$U&DV%=9^H#jd%sN<4)X-1Go-u03N}kcq_^JkCHxvr|?da_S1Mb{vPkg z2k?*hr!t9u6d%LK@dM)2roZG!v&$jZKK`xcsfxJsg04*^agJP>$$9yln;hR*gorl5B>m06DY`|C)+zD^sHW_8s$u~Xoo&&M zWPF7daGAleC1gv;$&A%cW-PC698YjOQ9JR(GIAbp0U8NUvjp-6<NXt28mgd~2;lwk9^2~qB+*~4_ zAXC%P@e`&-r1oi9Hue7i9b7afcGB5NXD5C2o%EoRv5U^ISv#<~NV)@%xt5-0ouHRS z4T4P_+F_Qq>8e9#2R$iI#yeLColB05A(SDMA#}ANbRjn$FfSDzdzopeO76Ty4KCnfrwo9m;-->O@F8ceOw9L{4CG0<(7D`K&b{ z0O3n~HB{}`H<{=rkWO^35TwQ9LotPh_nD@c;IHx>0RGyazxL;^{a5*G|24}c+&DJo z*to`G^sr=lV<2jD!Y9yXJ>lway0;2!-35YoUCs2Uk#317B zV6pg9W*!ss{|;2n|DU4&0noy81G}u^4RfGoIe_*3BmKQJywXfU!I6qYVU*Tmw2DQv zoA;>Og*Kvzs2BM}Q4qGpo&1pMW<*_Sq4K=gNB1m(x?PF7U5R>T>6}dj%(MUfO0)mb Qzl2$4YB`Sos~`XW04$%usQ>@~ delta 107 zcmZp*e5nf sEoSH75M+i33vdHzS0Gm1SoocJGJlF9BjaS#6eCuU*$kWGdFC(!0FPl2t^fc4 diff --git a/Dockerfile b/Dockerfile index 132f9ed..189a721 100755 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,9 @@ COPY . . EXPOSE 5000 -CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"] +CMD ["gunicorn", "-w", "2", "-b", "0.0.0.0:5000", "app:app"] +# CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"] +# gunicorn -w 2 -b 0.0.0.0:5000 app:app # CMD ["python", "app.py"] -# docker compose up -d --build \ No newline at end of file +# docker compose up -d --build diff --git a/README.md b/README.md index 11e8cd8..87d64d5 100755 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -APP NEXUS +APP PyFleet Gestion de flota \ No newline at end of file diff --git a/__pycache__/app.cpython-311.pyc b/__pycache__/app.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..4ea482a2e348af473680f2b2c702720ff3fff1c7 GIT binary patch literal 73917 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 cd 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 Q`()$HIRvp00(_MFKk4cRL;wH) literal 0 HcmV?d00001 diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc index 7b07ecf99bfd7aad6eba60c830ffcfe3471c0a3c..b5691c700f65281c598a93f7224b32fafe7b2a12 100755 GIT binary patch delta 18497 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 Y9_D2y6r+E*Gr{xObo}p&+3#Wh3&FAuQvd(} delta 13433 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 P;H&4p|0q}6L0ta@(si>8 diff --git a/adminer/LICENSE.md b/adminer/LICENSE.md new file mode 100755 index 0000000..6f27f20 --- /dev/null +++ b/adminer/LICENSE.md @@ -0,0 +1,16 @@ +## License + +Copyright (C) Max Geissler + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . diff --git a/adminer/README.md b/adminer/README.md new file mode 100755 index 0000000..e60eaab --- /dev/null +++ b/adminer/README.md @@ -0,0 +1,66 @@ +# adminer-sqlite + +With adminer-sqlite you can use [adminer](https://www.adminer.org) with a local [sqlite](https://sqlite.org) database. + +## Usage + +Hint: The following usage instructions are written for macOS and Linux. On Windows, the commands must be adapted. + +1. Download and install [Docker](https://www.docker.com/). + +2. Download adminer-sqlite + + ``` + git clone https://github.com/fluidblue/adminer-sqlite.git + cd adminer-sqlite + ``` + +3. Copy your database to `db` directory -or- create a symbolic link to the database + + ``` + # Option 1 + cp /path/to/db.sqlite3 ./db/db.sqlite3 + ``` + +# Option 2 + +ln -s /path/to/db.sqlite3 ./db/db.sqlite3 + +``` +4. Set a new password in `docker-compose.yml` (environment variable `ADMINER_PASSWORD`). +Note: You can't use an empty password. + +5. Use Docker compose to start the container +``` + +docker compose up -d + +``` +6. Go to http://localhost:8080 and enter the following +``` + +System: SQLite 3 +Username: +Password: +Database: /db/db.sqlite3 + +``` +Para acceder a nexus: +``` + +System: SQLite 3 +Username: +Password: p4ssw0rd +Database: /db/pyfleet.db + +``` +La ruta Database es la ruta dentro del contenedor, no la ruta del host. + +## License + + +Copyright (C) 2023 Max Geissler + +This program is free software, licensed under the GNU General Public License (GPL) v3.0 or later. +Please see the [License](LICENSE.md) for further information. +``` diff --git a/adminer/adminer.css b/adminer/adminer.css new file mode 100755 index 0000000..35db73f --- /dev/null +++ b/adminer/adminer.css @@ -0,0 +1,69 @@ +/* +Theme by Hever [http://hev.cz] - September 2019, ver 0.2.5 +Used Silk icon set 1.3 by Mark James - http://www.famfamfam.com/lab/icons/silk +*/ + +.error {background:#FFEEEE url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIsSURBVDjLpVNLSJQBEP7+h6uu62vLVAJDW1KQTMrINQ1vPQzq1GOpa9EppGOHLh0kCEKL7JBEhVCHihAsESyJiE4FWShGRmauu7KYiv6Pma+DGoFrBQ7MzGFmPr5vmDFIYj1mr1WYfrHPovA9VVOqbC7e/1rS9ZlrAVDYHig5WB0oPtBI0TNrUiC5yhP9jeF4X8NPcWfopoY48XT39PjjXeF0vWkZqOjd7LJYrmGasHPCCJbHwhS9/F8M4s8baid764Xi0Ilfp5voorpJfn2wwx/r3l77TwZUvR+qajXVn8PnvocYfXYH6k2ioOaCpaIdf11ivDcayyiMVudsOYqFb60gARJYHG9DbqQFmSVNjaO3K2NpAeK90ZCqtgcrjkP9aUCXp0moetDFEeRXnYCKXhm+uTW0CkBFu4JlxzZkFlbASz4CQGQVBFeEwZm8geyiMuRVntzsL3oXV+YMkvjRsydC1U+lhwZsWXgHb+oWVAEzIwvzyVlk5igsi7DymmHlHsFQR50rjl+981Jy1Fw6Gu0ObTtnU+cgs28AKgDiy+Awpj5OACBAhZ/qh2HOo6i+NeA73jUAML4/qWux8mt6NjW1w599CS9xb0mSEqQBEDAtwqALUmBaG5FV3oYPnTHMjAwetlWksyByaukxQg2wQ9FlccaK/OXA3/uAEUDp3rNIDQ1ctSk6kHh1/jRFoaL4M4snEMeD73gQx4M4PsT1IZ5AfYH68tZY7zv/ApRMY9mnuVMvAAAAAElFTkSuQmCC") no-repeat scroll 0.8em center; padding-left:38px;} +.message, #menu p.message {background:#EEFFEE url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKfSURBVDjLpZPrS1NhHMf9O3bOdmwDCWREIYKEUHsVJBI7mg3FvCxL09290jZj2EyLMnJexkgpLbPUanNOberU5taUMnHZUULMvelCtWF0sW/n7MVMEiN64AsPD8/n83uucQDi/id/DBT4Dolypw/qsz0pTMbj/WHpiDgsdSUyUmeiPt2+V7SrIM+bSss8ySGdR4abQQv6lrui6VxsRonrGCS9VEjSQ9E7CtiqdOZ4UuTqnBHO1X7YXl6Daa4yGq7vWO1D40wVDtj4kWQbn94myPGkCDPdSesczE2sCZShwl8CzcwZ6NiUs6n2nYX99T1cnKqA2EKui6+TwphA5k4yqMayopU5mANV3lNQTBdCMVUA9VQh3GuDMHiVcLCS3J4jSLhCGmKCjBEx0xlshjXYhApfMZRP5CyYD+UkG08+xt+4wLVQZA1tzxthm2tEfD3JxARH7QkbD1ZuozaggdZbxK5kAIsf5qGaKMTY2lAU/rH5HW3PLsEwUYy+YCcERmIjJpDcpzb6l7th9KtQ69fi09ePUej9l7cx2DJbD7UrG3r3afQHOyCo+V3QQzE35pvQvnAZukk5zL5qRL59jsKbPzdheXoBZc4saFhBS6AO7V4zqCpiawuptwQG+UAa7Ct3UT0hh9p9EnXT5Vh6t4C22QaUDh6HwnECOmcO7K+6kW49DKqS2DrEZCtfuI+9GrNHg4fMHVSO5kE7nAPVkAxKBxcOzsajpS4Yh4ohUPPWKTUh3PaQEptIOr6BiJjcZXCwktaAGfrRIpwblqOV3YKdhfXOIvBLeREWpnd8ynsaSJoyESFphwTtfjN6X1jRO2+FxWtCWksqBApeiFIR9K6fiTpPiigDoadqCEag5YUFKl6Yrciw0VOlhOivv/Ff8wtn0KzlebrUYwAAAABJRU5ErkJggg==") no-repeat scroll 0.8em center; padding-left:38px;} + +#dbs span, th a[href*="&db="]:not([href*="&select="]):not([href*="&table="]) {background:transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;} + +.links a {margin-right:8px;} + +a[href$="&sql="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHGSURBVHjaxFPNLkNREP5aB6WhaKLSVtKFiIUqK1sLT2DhTXgDL2FlxSOw8FOLRiyQWhDRiKSEhKQJou49P9fMnFsLsevCJCcz594z3/m+mTmJKIrQjSXRpXUNoGqbm39qcMbAkbyIvbVwYQhD3tIeWsOQ1+QVH86Xyz+JXJPIOb9iAI4ZpOMd/yN/vb/vAdiC93cP0El2dNA6z4RjYyW2MaPU0BB0u+0BOGGsVML49LSA3J+cYDCblb0l6jeHBwg/26isrOB0a8uzYBlBgKShgD8M53J4aTTQqFaRSCYl+WxnG83zcxTmKpKg+vtFu9W8NDQDMCXW+VivYyAzjKmlJahUSpiYUKPVbCKTz0sCGzOyOpBLzdcXlCMdDDIxO4vboyoyhQIKlYocLi0uIjczIyBcA98dYqx9NywxUEyDi/P29IyF1VU5dFeroS+dRnF+Xvajk5N0ayjx8tq6+FuSyiwUF4LRHi/reLg4o9ijs6xG9RjWGowUi/h4fcXexoa0L4oc0mNZuVgFzID09VKBnFXoUb7Pnb5zQrvVovpkZC4QzwfiN6QM1eBqdxcmnq6IAA395Mlz8eTxTZwg/pcl/v01fgswAESqYZbsIsnLAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;} +a[href*="&dump="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJrSURBVHjajFPPaxNREP72V8ymTbGQbRB/IT0otdV6CcWTgqCoUFQQEXoSEQ/+AypK755E1KsULIpGgw1F9KC22lgstFgQLdoWhSab2PRHTNrs7nvObGhSsRa/ZXjv7c6b+eabWUVKiX9AJQuRRci2k+260N91VwgJIQSEV1mVnjf5axTjvCfFFn7hCcBlBzJNVRA0gAZTQ1ODgXC4gDtjV9AW2QNFUTA0/Q66kPLSqVg4shYF8vEdKQ7mln+i+/VVRM0oFpbmETLq/SS6J4R/OfHtHmV24XouHFo94REDAyE9hMZgBMkvT2GZFqxQE6by0/g4P74SoKLB2ZZzWA8ffqRQLBcxNTuFjRTwxpmbfad7Oo/rHhdN6B20/6JvaKyBCnODhqNbL+PRxHXUGXWINV5kl9TDrkQct/pnZKHkyPsDGcl4MJiWq5Ecsf84LxTL8nbyK2+Pke3XHWJAQkLXgMdDNjRNRTxlQ6UmakRD0vN8NEd7EBsFO6Impu1fzGCCrOSXwCro5HEiZiExnEVnrKlaypNhG4fba02aTC8ik1/ibZrM9RlIkkGnjH0jWWJQWRn8TpLI8fcZ6MSA1WrZFERx2eHPTEPqjksBqASDLh7ZZ+HlWA6H9tYyvhjNomNnI8Km7p8/f5+HGdB46/lJeOoYPHV8mbGy8gA59HngU74asNkKYKVzlQCuW9GA6B5si+DVeA4HWmsM4qksTnZY1TMz0NRauysaUAmt2+oxM1tCM6k8mS74WXjIdm8O+JdWg36oKgXqgnzb3TvRXvZEneN6YPNIFw7MY70W5haXnlUHbp3f+b/wW4ABAAtWTLcKdqLcAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;} +a[href$="&dump="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHzSURBVHjajJPPS+NQEMcnaaxpdWsp6Q8vtWtdkIo9+B948SjIgruCUg8F/wGP/glePe5JcBehwl4qePGm0J6KQj30UBHEzaFLUromTfPizJMnrxhhB4bJvDfzme97SZQgCOB/be98J2AsAMYYMP81KjKg0WhMYljHtS30RSz4gjkGdot559F7OLt8vvi1bJRBURS4vr8CTTQ3m80SFv1MpVJlwzBA13XuNGUwGKyY1p+Vk9aPzWw8C7ZjQXximu+9ATA5KhQK5Uwmw+nCIpEIJBIJOLjah3Q8w7379x5urFsOUEUhTl/C6R+ef35mARzPhW6vC+q/iHvyvaYwXwIQje6j1+tBv98H13VhNBpxxyPA5tw2TI50MPQsrMbXbOo53fmtaJIC7iSZAMPhkOe+73MA5Ruz3yCfz9NlvykLBUSjUR41TQPP8zhE7JNSyj8E0CbJpkiXKRoIRFABeQcQd0DFwlVV5evUTFBZRSiATEwnp4lCAa0LI2AoQC4WimRl4qgyYOw12rYNyWSSX6L4mKiBnukDK5VKYJrmmBpZwW6r1TotFotTuVyOQwQgnU7zV9npdKDdbj+hgnXRN/Yz1ev1zwg6QP+KU2disRiXblkWOI7zhJOPce+wWq2aoQDZarXaJ2xYQGfod5VKxQ2rexFgAI4OiAKxKkWeAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;} +a[href*="&import="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEJFDQPlDJUDwAAAiNJREFUOMutk0tI1FEUh7//Y9TJghyc1KQ20lMthRAlgoKgVkWte6wid0EICUHUQjdBErRqHYmQghgU5KLQGB8FKVEMCi0G1JmRbPLJ/O89p8XYOAMZBB24HM5dfL/fOfdcB6Aj1j6kqm2qWv/o5NMk/xBOR6z9dVVpzbmQEyKxPMcBc5svbheHs91YK1hRjJWCY7FGsSKT3VcPtviquqaqVJVVY6xlZu0hYpRrpyJ/Vb7fN3sMwAG4965Hw+ElKrzdlPphPqTHaYw0EdiAQEwuW4MRg7GGzrYu7j6L8/hGg+MD7DNXmF7tpDpSg6MOYpWbzbe2VV/dMATGAuADTLt3UFEmU+OICCpK72hqW8CFExGymwAAnrya15X1QJ+PJFVVtW90QQvjRay4TmfW9XrPpOYdBFYQVXwP+mMpPM9lYCyF44K7KTI4kQJVQj4cqd1BNihowVpBAd9zuNQSZXAizcWWPXmH/WPJonp27ifGCEUOVMB34eXHNJ6Xy5C7+w3xHRDg6N4ylEKAEVSVkAfnm6MMTy1y9nhlXvHNpzSthyrYFfYBiCcylJf6WwAjOZrnOgxPLQLks+tAIDDydSkPrIuWYG2BA2NMbgYunGms5O3nRU43bDkYGEtzuTWar+OJDN5ma1szUKVh/07mv69TVxXm28JK/i/U15YQT2SKdkFEpeAV9P2D3pmmrJXywFgCY7FGCKxgrPnjMv1Y3hjif8QvwdlGGi2XXTgAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;} +a[href$="&import="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEJFDMETKEbQAAAAjZJREFUOMuVkjFoU2EUhc//3gsvptFCIdRHh2CrQ1AcmsUYHTKJDkJrFUdx6uJkpuLspCI4xaJLNik4SMGlOKgEdekQ0EEwFhJqCw+a16RJ//+/x0Heo6XN4B0v537nHLgKAKqNxXckSyTPPyu//IP/GFVtLL6f9INrKZXC791f3UvDysPP3tryjcHt7yTPkRQRaZL8KSKvRGRtbm7OxgCPZJ8kJtOnYaw99ZUfl8UQ5XK5kMlkQBI7OzuzURTNbmxs3Nne3v60srJyd2FhoQ0AztPLtflOv/22tdtCVo3hwvhFUATZbBaO48B1XUxMTCCfz6NUKmF6evqKtfZxnMABgOdXl+c7vTZ87wQUFcRyZOepqSmIyPWkAgA8+HCfFMG3rS8QEVCIvb09pFIpkES/30cYhmi325iZmYGI4BDgReW1Wl1d3apUKrler4coitBqtUASxhh0u10Mh0N4ngeSRwEAQBIk4bou0uk0PM+D53nQWsMYA/JfLRGBtfYoQEQSx/hIKQVrbbJzHGd0ghgQHxhj4LourLXQWkNrDdd1E81IQCy21iaAOEFcU2t9PEBEEvcYeDBZrNvf38ehPwAAay3CMEQul4Pv+4f/XSkEQYBisYhOpzMywb1Go/GmUCiM5fN5+L4PpRRIIggCRFGEZrOJ9fX1TWPMzQR+0Kler58RkUcicstxnPFMJgNjDMIwxGAw2DTG1K21T5aWlraOBRycWq120hhz1hgjWusf1Wp1eJzuL3uxkTGLHB98AAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;} + +@media all and (min-width: 881px) { + #menu .links {height:22px; transition:.2s;} + #menu .links:hover {height:5em;} + #menu .links a {color:transparent; transition:.2s; display:block; margin-bottom:-1.25em;} + #menu .links > a + a {margin-left:22px;} + #menu .links > a + a + a {margin-left:44px;} + #menu .links > a + a + a + a {margin-left:66px;} + #menu .links:hover a {color:blue; margin:0;} + #menu .links a:hover {color:red;} +} + +#menu ul#tables a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll right bottom; display:inline-block; height:16px; margin-right:4px; vertical-align:middle; overflow:hidden; padding-left:16px; width:0;} +#menu ul#tables a.active[href*="&select="] {border-left:2px solid #00f; margin-left:-4px; padding-left:18px;} + +.links a[href*="&create="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ6SURBVDjLpZNZSNRRGMV//2XGsjFrMg2z0so2K21xIFpepYUiAsGIICLffI8eWiBBeg3qQV+KwBYKLB8qpHUmrahcKLc0QsxldNSxdPz/79LD1ChBUXTh8sG93POdc75zDa01/7NsgGvPR09rzQmpVZZSCqlAKIWUCqk0QqoZWyKFRir1uvxIbsAGUFqXHQqkpP1L57M3Pm5MMJBKpQHUdF9BKIGQAlcJXOlOVykSdye3leO6MmkGQNyHw+uO/1X3bzGBK+S0B1IqAKqDg3986HeCZPffwvJtoNT7lOZLvUdtAPEDAKBkRzo3QwMUb89InN1uGGD3spdE214xe8MRUnM2MfppNW0Pqy7YAK5UKK2xLbhdP4hlmdxpGMQwwQT8ziNiI534c7cT6WrFazikzF2Eb8HS1IQEDdiWwcHAQmpehTkQSAcgNvSMiYFW5uUUMdV3HW+ywefGNqITJsbUUL75k4FWYJtQ+yaMZcXrk1ANk/33mbdiD7EvlRieETy+FJLkMFcjRRSW3emIAwiF1hqPBfu2LGSWbbA1uZ41SfWkrtxPrPcypsfFiWYzFGzGKTjFV28WEJeIUHETLdOgrmkI1VdHpCdEet5enP4qLK9mKrqMgedv6cyrAP+qxOTiUxAi7oEJi8frELoFoTLpa7nI/HQvscgSRt+0kV1SSW7qYtp7xrBMphm4Mi5h/VIfTcEq1u0oJaknSEdNiMYHET7UvcMpPEN31Ed7zxgASmk1I0g6dK66s8CRak5mVxjnfS05+TsZCw/T9baTx1nnGb47DrQksjE6HrsHYPz6nYt3+Sc3L8+wA2tz0J6pF5OD4WP7Kpq7f5fO79DfSxjdtCtDAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;} +.links a[href$="&create="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIpSURBVDjLpZNPSFRRFMZ/749/Kt3IqFTSRoSMmrGIYTTbpEJtjBCCok1Em9JVG1dRC8FFEES5aGFEgRRZWq1iLKKxBiNqLDcltQgmHR9hY6LOu+feFm+YGVsZXbh8nHO53/nud8+xjDH8z3IB7r5avGgMZ8XoBq01okFpjYhGtEGJLtmCKINo/XbgVFPUBdDG9PVEq0P/UvnSvdlwQYFoHQIY/3obpRVKFL5W+OIXUVThrL91AN+XihKCwIeTu85sqPryqsJXUvRARAMwkshsiKB7fw25UgKVJwA40V7H/cl5jh+oL+RGk/P0xIqxl11dr8AXjTYG14HRNxkcx+ZhMoNlg52/ND6VAWMoc6F5+2Zy/l9PMIDrWByL1jI+tcDRaN06BaXxbDqLUnq9AqPBteHpuwUcJ0AIcgBXH93h+/wEyyuLrPk5cmv7gNY8gdIYYyhz4PDeWuIpj85IsS2ujQ2zJAk6DkZpqGnixcwYyU+PifUOX7Eh6DoAx7aIpzwA4imPeMrj+bTH+88PaNkZQWwhsrULsXxie9oAzgcESgUe2NAZCeE6AXZGQhwKh/Cyc5RZVXQ39wFwoeMmjXVhgMqiB8awe0cVP36u0Fi/iW9zvwuzkF3+xUz6Nal0gv6uWww+O02lUwGwmv8FM3l55EtLTvQWXwm+EkRpfNEoUZRXHCE5PUFbuJ0nH4cot1wSH14C3LA2Os6x3m2DwDmgGlgChpLX0/1/AIu8MA7WsWBMAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;} + +#content p a[href*="&create="] {padding-left:22px;} +#content p a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;} +#content p a[href*="&page="] {background-image:none; padding-left:0;} +#content p a[href$="&database="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIkSURBVDjLpVNNiFJRFP7eU1E0KSLTMpAwYSxyaidDtChm0WYQ3NSutv2s2kwwm2igNgMtooUQEQhhA9GqhSDTQsZZFDbNDBgVg5bSw9J8rzFF33udc+HGg0ladOHj3nPe+b7zc99VbNvG/yy30yiVSl4SnCNcsixrivYEgY7WJu0faX9EKGUyGVNyFFkBkY/T+WkoFEpFIhEEAgH4/X7w916vB8Mw0Gg00G63y+S7mM1mm4LIAYxisbhSr9c5nT1pjUYju1qt2oVC4YnkqbIUMk6Ew+F/9hyNRkFJLuyaATmFoqZp8Pl88Hq98Hg8wtfv99HpdNBsNhGPx0XsRAG3241ut4vBYCDs8XgMXdcxHA7FN/b9VUD25HK5RAUczKC+hYgcNpNN05xcAQdLkqIoIlj6VFWdXIEUkAQGV8M2k2vaG3z6sYGfVR39XzsHlm/dX3h5d31xlwAHM5goBd5+LuO75z3OnU3jyP4EVrZeKGub2p309cP7VKcAQ2Znoiz3deMVTk1Nw1RNTB+ahamMkD45w7RrfwSYwFdFf6K4Quf6pmvwKHswl7wh7Jvnc4gfTPHR52zhcqVSeZZMJgOxWEyI8BC5CmOnh63WKtZbZczPPsa94hX4XCLJQHG+xnw+f5SEFghZmvhefgvcTqn2HN3gBmZSZ5CInMaHr1Wsvivjy3ZvSZn0nHO5XJDIxwgWDbW2vL10m9xXCUGCQXi49qA1/xvyq6BCh7yZeQAAAABJRU5ErkJggg==") no-repeat scroll 2px bottom; padding-left:22px;} +#content p a[href*="&edit="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJvSURBVDjLpZPrS5NhGIf9W7YvBYOkhlkoqCklWChv2WyKik7blnNris72bi6dus0DLZ0TDxW1odtopDs4D8MDZuLU0kXq61CijSIIasOvv94VTUfLiB74fXngup7nvrnvJABJ/5PfLnTTdcwOj4RsdYmo5glBWP6iOtzwvIKSWstI0Wgx80SBblpKtE9KQs/We7EaWoT/8wbWP61gMmCH0lMDvokT4j25TiQU/ITFkek9Ow6+7WH2gwsmahCPdwyw75uw9HEO2gUZSkfyI9zBPCJOoJ2SMmg46N61YO/rNoa39Xi41oFuXysMfh36/Fp0b7bAfWAH6RGi0HglWNCbzYgJaFjRv6zGuy+b9It96N3SQvNKiV9HvSaDfFEIxXItnPs23BzJQd6DDEVM0OKsoVwBG/1VMzpXVWhbkUM2K4oJBDYuGmbKIJ0qxsAbHfRLzbjcnUbFBIpx/qH3vQv9b3U03IQ/HfFkERTzfFj8w8jSpR7GBE123uFEYAzaDRIqX/2JAtJbDat/COkd7CNBva2cMvq0MGxp0PRSCPF8BXjWG3FgNHc9XPT71Ojy3sMFdfJRCeKxEsVtKwFHwALZfCUk3tIfNR8XiJwc1LmL4dg141JPKtj3WUdNFJqLGFVPC4OkR4BxajTWsChY64wmCnMxsWPCHcutKBxMVp5mxA1S+aMComToaqTRUQknLTH62kHOVEE+VQnjahscNCy0cMBWsSI0TCQcZc5ALkEYckL5A5noWSBhfm2AecMAjbcRWV0pUTh0HE64TNf0mczcnnQyu/MilaFJCae1nw2fbz1DnVOxyGTlKeZft/Ff8x1BRssfACjTwQAAAABJRU5ErkJggg==") no-repeat scroll 2px bottom; padding-left:22px;} +#content p a[href*="&table="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJcSURBVDjLpZPtT5JhFMafrW997I9rscA+FFu2QRurtlw5cQ4InLpwBogIPNFSiNJ4C+JVkj0QTBHQKFPQlJfwlanY1tXz3ARkn2jd27Wz++yc33XOvd0UAOp/RNGR/X5zeH9rOlTDVKAK3fsqJrxlqN27GHPuYHh+G4rXRQzZNjEws47Hli/oo/PxNsAU3qvWT3/gX3TPuHrWBhiC30nSktXDtKLB1NI4NKkxqBMqjDByPFkcxNBCPwbCfXgUeEBq705m0AZM+qsk2e3hau88W+4ANOy+XPLFQrkrcbW31KkOYJx9rBaAOzPR0gVHW6x593q9cDgcqB6e4sZoogMYdXzD0ck5ZhfLsHGKVfAqVoadKcMdzcLr82PuwwZCoRACgQCWVzdhoK2gaVpDAMNzWzhkAXamQpze/I4t13w+j2AwiFwuh7W1NXg8HmQyGSgUCshkssuU3F7AQf0c84kK3n68KFc4hXQ6DavVCqlUCqVSSdaIx+NQq9UGMsHg7Ab2jxtwp5rOvqUqia3CUqnEObWn0mp1KBaLcLlckMvloPpfrhOAl230/SGLxQK3241CoQC9Xg9nskKk1emQzWZZkBZCoRBU3/NP2GMBgXTTObjSjI1GA8lkEgzDwO/3E4iObXY6nYhEIhCJRHoWcIW6b1pF7egMlYNT7NROUKzU8XX3GJ+3D2E0GgmAm4Zbh2s0mUyIRqMcAGKx+BIlMeSiYu1K/fbEMm4+TaFnJIHrSgZX5TFIZNPo7e1Fj9QOs9kMlUqFaw9pCASCnzwe7x15xG6/rUQiAZ/Px9/5XyhZOMVGKlOdAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;} +th a[href*="&table="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;} + +.links #content a[href*="&database="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKRSURBVDjLhVNLTBNRFD3TTju1FCcBaxuaQEr94ydiZIHGpcFISBOi0YREZWHCVoyRxKUxxq0LXcACQyLsjO6KjSEiDfHDz0S0CLSxlFKd2g7MTDudGd+bMAQCxJucuXfuu+fcO/PeYwzDALVoNMqRuI3guq7rR4g/SEBC/Svxc8T3EUTD4bCGTcZQAUI+RvxLr9d70u/3o6KiAm63G3Qtn89DFEUkk0lks9lRkrvW3t6e2lCgRZFI5F0ikaDtjN1MVVVjYmLCGBoa6qccC7Z1kQafz4f/WSAQAGlyaXOOpQ+SNNUymQxcLhc4joPD4TBzkiRBEASkUimEQiGzdlcBlmWRy+WgKIr5Xi6XUSgUUCwWzTVN+IAzeOOde71orP0eAaOkbrDWf6Cw2+3mBLSYgny3KULXPOUY2BUB/hMd4IOn8XfhMGYjvU+2TECLLRLDMNA0zYw5JYa6Ghke/hyEn9/gZEqo3OuHp7qW3yJgESjoNPSdlb8gWCOCr29BMT0Ip5tBYnIWqlL6o8irzVsEaHcKSqQCen4cweok+FAblNRz2JxlODx1cEkzGWmVbTl7Z/jHhgCF1Z3GYjIKf+U8+ANhQn4Gm6OMUiGI9MhHg5Gl1sbu8UnKNc8B7Ui3ipxEcwvlpVFw6hz2N1xGabkXdqeBYqEOmfefEZWac4e6xz9Z22hbn+BmLBZbi8fjEBdG4NF/QdUDSM88hQ4FawKJR6cxLDZl86qzZdtdoDYwMBAkQg/2LL/ovNLVh++Dd7G0OAau9hTkrKgnnE39GW3f/Z6enpUdBSx7ePu4eq+zi4VNw+TbV0gsxFd5b9X5i4+mpnY63tsErl6okhvrfWzT0SAMR3FMXsnean08Pb/b/fgHqpjCspi90kkAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;} +#content p a[href*="&schema="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFOSURBVDjLtVK7SgNRED0b9iuM2lr4QK1DQIyk0FZsJAj+gH+ilRZb2NjaRHTLmA9QFKz9huzm7t37Hu+u7IJgQjR6YLjDzOXMmcMERIR5EE5qXA4z4sqACYWEC5wfLQXf/WtMIuDSoL0A7DZDjBj/uYI0l8jzEEJYJMkvCEZM4PqZIxlzpGk+kSCY18TGtGYcx9Tv96dOqBUMBgNyzsFaC621312Ac+59yJFlGRhj5VvVoigKvniglEK32w1mkd3r9ejPPAjOhqdknYX18p1/rzo3pYqTh0OSRkJI5UMgPn4s61sX66SkhtEGcISGsQad5gH2FvehfV5BaIF2cwet5RZyKeu68pe5ubKG7dUNP5AQGltMN57Mosgr5EIiVQmYGvtc1PVicqHY+dXpk8Dg7v22XKFo1ARe9v1bDOlXKKKCs4Sn1xdU1v3vIc2CD3bN4xJjfJWvAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;} +#content p a[href*="&privileges="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGnSURBVDjLxVM9T8JQFD2lBRQRFPAjEhIwXRgwEUjERRMnZPYXuPoHSJz8BQ7+BCcHJzZHiST4MWC0fsQBJUKCEQnGWihtfa/QBgK6MHiT2/tu3+1559x3y2iahlHMghFtZACuUqmkSdyiiaqqoJJo7HVFUQZi1w+Zcrnc9vl8LAXo7YexHhaNdaFQUDiSsFarFftXClriJz4eTqHJX7DMhDEbiiDlfALP80if1CFKLYjfxCUZR9s8ZcByvadG7w/QLl/guVRC8U2Etnutv5dlGXvr44S+3ZRFjcrgjEQvnFvG2pIfGzYOZ5c3KLCsWZjNZvual0wmOwD0oX/cVnFeXQDHfcDpcuGqtYJaTQKcHYBEImGebrDuY1AvPWImtIhjLoraSwtjHhvmv17Nwnw+/zcD/0QDt+9TUD1TmJ6zQWpImFTfyM64XhiLxdAr17h2E2Bnc9XcEEURzWaTFARM2na7HW63+3eAEul8tVqF1+tFMBiEw+EYmDpBEFAsFhEIBBCJRHQAhgyDQEDCFCgejzO5XE4bNn2Gp1IpJpPJaF05d8y//40/Nlww9OOVWvkAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;} + +#content p a[href*="&event="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJlSURBVDjLpZNbaM9hGMc/v8NsTqF2yMhZKIexmpFyRZIiblwouZDauLYoTVEryg2uXIoIOUU5zJkh4e9QDmtJbWxrbUzz/72/9/m6+P3HLslbT9/3ufm+n/f7Pm8gif9ZMcDxe717JLZ62UQzwxukZnhveBOptyHl8anwZk/3b5pZEwOYtGNDzejSfzm58dTH+b8JvFkpwMizdSCBT8E8OJftkzy4BPIOnONHQzPO+eIhBoM5CCrLwNKslBZM8uDykCbwtgMAl/o/GXhvBYMA2rtAlpGYZSR+UIGKCgCSggGSOHy1Q/0DTifufZUknbr/RZJ0+mHWn3mU9edbMu3qG9DmQ08lKSNw3jCJOIKzjzqJopBzLZ3EEVx40smDr/u4e96QGUXPGpkzYQSJywjCwSsIiKOADUvKiUNYX1tOUQhra8oJg4hZ02cQhhGrqyuyp03tTwbOGzKIQ7j8rIsn3Qd4fEVIIn6+kzAMaH35Fn37wbZD68gnCUl+EbAkI3CpIYmiCNZUlwEwbfIUgiBg1cIyJqbzGFPiWbl8GXUb66mqnkrJ2IvUbq88GEI2dQBRGHDjZTcAbZ8+ERDQnOvm+fszVM1egA89C8avwAeO2nlLAeqRxK7j79TzPa/mXJck6darTG8XdM3uhbry+piGrou5I1pcP17h7wwk5k4aRUfPANMrhtP2pZ8J44bx7nMfff29vGl/SNP1LQA0XdtCa2cO4GdhkPRg78kPVYm3kS71uNTjU8N5I/UpxSWracndZOn8ZVx6dZRhQcz9F3cAjgR/+51rt1c2AXXAaOA7cLTlcHvDL6y6kIpO9lqsAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;} +#content p a[href$="&view="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEJFwohC2f85AAAAsxJREFUOMulk8tr3HUAxD+/1z5+u5smMYlmm6R1rTlEmrY0RKqtWMVWW6qtePBv8NaKUFGUgmBB9CJ48aIH8SKGBhGKKEIaPdgam0gTQ7Bm3U2zTbKPZrP7+32fHkqDx0LnNocZmGHGsdbyIHB5QPj/J8Vi8bDV8m0RtY5qGaeNMVijsdbiOF6cDDNXw47u8/l8/so9jXMvQqlU+lK0m6+LdjMRBAFCCBq1DYRU+L5P944OtIiRxtru/qHvhh7d8/K2QalUutysrx/zHEu5XGZl9TbWDUilsygDSimMbJGyEYVdAwB09g3MPTayb9RfXl7+RLTuHHOtYn5hkYHCCH5nAW0sUmmEVCiliIRisL8HWf8b0apj4qW9CvcL5+bSX6uNjcrD2gkYPTDG7zf+YWsrRinF9I8TWGt5Yvw4QioSgc+rx8e5uThPeWGGRrOt/Np6pa83v4ue3j4AlFBEsUDru+UBxEIihdwue7DwOKl0yPTlS77f0z9kMtmcp7XGdV2ymQRr1Qax1AwfeA6pNHEUEwvNYL4XYwxaa7Kd3QzsLlhnfm6mms11dOU6H8L3fep3WswuFFmrNu7ml4pYaKJwllv2Gk1RRciY8f7nGW7tEd7Zc28WNjcqB0W0heMFpNNJUgkPqRSbm1toY2lnZmj2/cYzB5/khf2naGf+ZerWNyyVVyqOtZbZ63/8EtVWDyV9j0xXby0Z5qJkmBGu5xuAcxOndr924kXHeA6nH3mPj+bO4OPy1beTkQ8wum//U9NXpi7drpRPhBtrXWEYkkikcIMEAGvNFQLTwUs7zwLw1t4JJosXgcnU9pSfPnzkla8//zRZbtRPR7E447ru0cB1soBTjdbTf1Z/4lrtB94d/Z4Pr58k5aYAIud+3jh2Ifhg53D4zpGRZxnuOsRi7VembvxMebH1sXO/dx67EFwE3gBywCbw2dX35fn/ANYEZmpcDQc/AAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;} + +#content p a[href*="&refresh="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAI/SURBVDjLjZPbS9NhHMYH+zNidtCSQrqwQtY5y2QtT2QGrTZf13TkoYFlzsWa/tzcoR3cSc2xYUlGJfzAaIRltY0N12H5I+jaOxG8De+evhtdOP1hu3hv3sPzPO/z4SsBIPnfuvG8cbBlWiEVO5OUItA0VS8oxi9EdhXo+6yV3V3UGHRvVXHNfNv6zRfNuBZVoiFcB/3LdnQ8U+Gk+bhPVKB3qUOuf6/muaQR/qwDkZ9BRFdCmMr5EPz6BN7lMYylLGgNNaKqt3K0SKDnQ7us690t3rNsxeyvaUz+8OJpzo/QNzd8WTtcaQ7WlBmPvxhx1V2Pg7oDziIBimwwf3qAGWESkVwQ7owNujk1ztvk+cg4NnAUTT4FrrjqUKHdF9jxBfXr1rgjaSk4OlMcLrnOrJ7latxbL1V2lgvlbG9MtMTrMw1r1PImtfyn1n5q47TlBLf90n5NmalMtUdKZoyQMkLKlIGLjMyYhFpmlz3nGEVmFJlRZNaf7pIaEndM24XIjCOzjX9mm2S2JsqdkMYIqbB1j5C6yWzVk7YRFTsGFu7l+4nveExIA9aMCcOJh6DIoMigyOh+o4UryRWQOtIjaJtoziM1FD0mpE4uZcTc72gBaUyYKEI6khgqINXO3saR7kM8IZUVCRDS0Ucf+xFbCReQhr97MZ51wpWxYnhpCD3zOrT4lTisr+AJqVx0Fiiyr4/vhP4VyyMFIUWNqRrV96vWKXKckBoIqWzXYcoPDrUslDJoopuEVEpIB0sR+AuErIiZ6OqMKAAAAABJRU5ErkJggg==") no-repeat scroll 2px bottom; padding-left:22px;} + +#content p a[href*="&sql="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ5SURBVHjapFNLaxNRFP4mnZmQZtKYpJ2I8ZE0NSbSWKpgBYNUhIJQUDddCaILwb34C0RcCi60vpa14sZFoSjxUWxTFEubFkxf9kFS+7Jp0yQmM5mH905SF9pSwQt3vnPnnvPNd86cA13Xsds+23XKsdMdQx//s0z/6hi54he3e8/0d3ZuK0FTFGhUJkVVhSbLUAiq5IxSCQrBEkGWOu8Lh38HGrlpWnlXCKhNSbZQo3cEE9FomYAuKZstE2wFa8RR1cpKqK2o4JhxmLVJVAlh5Df6IFj5MgENcHq9EAMBg2RucBDVLpdxVon0iXdvIf8sQHRIsNReht3XjI3ZI8iuPAOrkDyorBq3G6vT08ikUuAsFiN46HkXXL56eI41QV1/BMF+GulvCfCMDFvNXtSIHrC0KDTPhXgc7lAQdQ2thk2XIpewnkzCJvTA4T8PabEbfDWD+ZFxyEUdX94sw6QVCkZlxWAQU+8/YGZgALV+v0HgbWmBNzQMR0M7it8fg+HWwQk2cLkkcvJh5NNFsCVJMgq1ubiE5o4OI5CS8FYrya8b9saLKC48gIlTIG/6sBaLw3PpHrTEMrSXr4kPIaAKFkbjSA0PEVuFlB+DO8Ah2HoB8tITVPE6iplDWOn7jLn0CSQevoDV6TI+zEpUASkkZzaTYrLIrH3C/qMCFEbE4th9OEQexfQBrPYP44d+DuY91eBp+1dGgFVIDb729kKpdJfQtIy2yFNMdN/E5McYzAebUEhOYjZuQXaj5+9W/nOYbl9vLN26doOFScVI9BXmZ6dy9jpnpO1O5dfsRtBxxlk4Xu9mT4Z80DkpVlhZvdp+d3RmpyH7JcAAnHiAVYWMsdkAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:24px;} + +table tbody input[name*="check"] {display:block; float:left;} + +table a[href*="&edit="][href*="&where"] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC") no-repeat scroll right bottom; padding-right:18px;} + +table input + a[href*="&edit="][href*="&where"] {width:0; float:left; display:block; height:16px; overflow:hidden; text-decoration:none; padding:0 0 0 18px; background-position:2px bottom;} + +table thead a[href*="&modify=1"] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEKDjA70u7s9gAAAMZJREFUOMvtksFpwzAUhr9fcUsWyAQewWDIHt6iLrlriBDIBl4maARPYNH6VtAh2FEuCSQksUV77Qc66Ef63nvw5JyLTNA0DXme03UdVVU9PnDOxWEYJk9d109z733MrqLN/oAkiBEJEAjYfqwJIbzsMLu9vC9XoIgxJ94yEX6+meNOoAXACWPAmEsnqQIBx/CFgEGRo0DEdMHuc81vkPd+soy1lqIoaNsWa+2jYG4PkkYoy/IuHMcx6XPf9xj+yL8gYQ/mOAPpeHRKiIdANAAAAABJRU5ErkJggg==") no-repeat scroll right bottom; } +table thead a[href*="&modify=1"] {width:0; display:inline-block; height:16px; overflow:hidden; text-decoration:none; padding:0 0 0 16px; vertical-align: middle;} +table td:first-child {white-space:nowrap;} + +input[name="delete"], input[name="drop"] {background:transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHSSURBVHjapFM5bsJQEB2zSIDFJrHYpEtyAyoKJAp6CrqIkBPkNDlBAKXjBEgUpKOBCyQNijFiEZvZl8z7wsjESYpkpNFfPO/Nmz9j6Xg80n/M9fWi3W7fMOnd4XAo8qogAbvO5xKvL6lU6s0aL1kVMDjP5ye/36+Gw2FyOp3EQFqtVtTr9WixWHT5/JhOp6s2ghP4ORaLyaFQiGazGa3Xa0HgdrvJ6/WSpmk0Go0MjnvIZDLVM0Gr1brm/WskEkkA3O/3abvdQjq5XC6xgoiVka7rNB6PNT6ns9nsu+OkpODxeBLBYJAGgwHt9/uzQ8Vms6Hdbie+KYqC+ASTFrARBMx2HwgEaDKZiHqn0yktl0uxtzrMMAyKx+MCc+4Cs13hwQCC1GQy+W3Lms2mUIUygbEqEBLNun8z8zswVgUfLO0WD4Z6kekn8/l8okNM8GFVUMYDoVWQ6HA4bEAzoyzL1O12kbRsJajwhYZhiUajJEnShWSAQaqqKnU6HahEGysXg9RoNPJ8+cwZZLSKp47m8/k5Kxzg4XBocNxDLper2ka5Xq+LUeatilahJLN1mEJ+ZDHKJthGAKvVauJnYi9ysHIqQee1xOsLg3/+mf5inwIMAJMhb74NwG5wAAAAAElFTkSuQmCC") no-repeat scroll left center; padding:1px 5px 1px 18px; border:0; cursor:pointer; font-size:.9em;} +input[name="delete"]:hover, input[name="drop"]:hover {color:red; background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJdSURBVDjLpZP7S1NhGMf9W7YfogSJboSEUVCY8zJ31trcps6zTI9bLGJpjp1hmkGNxVz4Q6ildtXKXzJNbJRaRmrXoeWx8tJOTWptnrNryre5YCYuI3rh+8vL+/m8PA/PkwIg5X+y5mJWrxfOUBXm91QZM6UluUmthntHqplxUml2lciF6wrmdHriI0Wx3xw2hAediLwZRWRkCPzdDswaSvGqkGCfq8VEUsEyPF1O8Qu3O7A09RbRvjuIttsRbT6HHzebsDjcB4/JgFFlNv9MnkmsEszodIIY7Oaut2OJcSF68Qx8dgv8tmqEL1gQaaARtp5A+N4NzB0lMXxon/uxbI8gIYjB9HytGYuusfiPIQcN71kjgnW6VeFOkgh3XcHLvAwMSDPohOADdYQJdF1FtLMZPmslvhZJk2ahkgRvq4HHUoWHRDqTEDDl2mDkfheiDgt8pw340/EocuClCuFvboQzb0cwIZgki4KhzlaE6w0InipbVzBfqoK/qRH94i0rgokSFeO11iBkp8EdV8cfJo0yD75aE2ZNRvSJ0lZKcBXLaUYmQrCzDT6tDN5SyRqYlWeDLZAg0H4JQ+Jt6M3atNLE10VSwQsN4Z6r0CBwqzXesHmV+BeoyAUri8EyMfi2FowXS5dhd7doo2DVII0V5BAjigP89GEVAtda8b2ehodU4rNaAW+dGfzlFkyo89GTlcrHYCLpKD+V7yeeHNzLjkp24Uu1Ed6G8/F8qjqGRzlbl2H2dzjpMg1KdwsHxOlmJ7GTeZC/nesXbeZ6c9OYnuxUc3fmBuFft/Ff8xMd0s65SXIb/gAAAABJRU5ErkJggg==")} + +input[name="logout"] {background:transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJHSURBVDjLlZPNi81hFMc/z7137p1mTCFvNZfGSzLIWNjZKRvFRoqNhRCSYm8xS3+AxRRZ2JAFJWJHSQqTQkbEzYwIM+6Yid/znJfH4prLXShOnb6r8/nWOd8Tcs78bz0/f+KMu50y05nK/wy+uHDylbutqS5extvGcxaWqtoGDA8PZ3dnrs2srQc2Zko41UXLmLdyDW5OfvsUkUgbYGbU63UAQggdmvMzFmzZCgTi7CQmkZwdEaX0JwDgTnGbTCaE0G4zw80omhPI92lcEtkNkdgJCCHwJX7mZvNaB0A14SaYJlwTrpHsTkoFlV1nt2c3x5YYo1/vM9A/gKpxdfwyu/v3teCayKq4JEwT5EB2R6WgYmrs2bYbcUNNUVfEhIfFYy69uci+1fuRX84mkawFSxd/4nVWUopUVIykwlQxRTJBTIDA4Pp1jBZPuNW4wUAPmCqWIn29X1k4f5Ku8g9mpKCkakRLVEs1auVuauVuyqHMo8ejNCe+sWPVTkQKXCMmkeZUmUZjETF1tc6ooly+fgUVw9So1/tRN6YnZji46QghBFKKuAouERNhMlbAHZFE6e7pB+He8MMw+GGI4xtOMf1+lsl3TQ4NHf19BSlaO1DB9BfMHdX0O0iqSgiBbJkjm491hClJbA1LxCURgpPzXwAHhg63necAIi3XngXLcRU0fof8ETMljIyM5LGxMcbHxzvy/6fuXdWgt6+PWncv1e4euqo1ZmabvHs5+jn8yzufO7hiiZmuNpNBM13rbvVSpbrXJE7/BMkHtU9jFIC/AAAAAElFTkSuQmCC") no-repeat scroll right center; padding:1px 22px 1px 5px; border:0; cursor:pointer; font-size:.9em;} +input[name="logout"]:hover {color:red;} diff --git a/adminer/docker-compose.yml b/adminer/docker-compose.yml new file mode 100755 index 0000000..4f738af --- /dev/null +++ b/adminer/docker-compose.yml @@ -0,0 +1,15 @@ +services: + adminer: + image: adminer:latest + container_name: adminernexus + restart: unless-stopped + ports: + - "5006:8080" + # - 127.0.0.1:8080:8080 + environment: + ADMINER_PASSWORD: "p4ssw0rd" + volumes: + - ../database:/db + # - ./db:/db + - ./plugins-enabled:/var/www/html/plugins-enabled + - ./adminer.css:/var/www/html/adminer.css diff --git a/adminer/plugins-enabled/login-password-less.php b/adminer/plugins-enabled/login-password-less.php new file mode 100755 index 0000000..bbf72ee --- /dev/null +++ b/adminer/plugins-enabled/login-password-less.php @@ -0,0 +1,4 @@ +/eliminar', methods=['POST']) @@ -523,7 +532,6 @@ def historial_eliminar(vid, hid): # 6. Si no queda ningún historial, limpiar el vehículo else: - db.execute(''' UPDATE vehiculos SET @@ -563,33 +571,50 @@ def vehiculos_exportar(): filtro_bajas = '' if incl_bajas else "AND (situacion IS NULL OR UPPER(situacion) != 'BAJA')" terminos = [t.strip() for t in q.split(',') if t.strip()] if q else [] + + # terminos = [t.strip() for t in q.split(',') if t.strip()] if q else [] + + # Filtro base de bajas + filtro_bajas = '' if incl_bajas else "AND (situacion IS NULL OR UPPER(situacion) != 'BAJA')" + if terminos: condiciones = [] params = [] + for t in terminos: - like = f'%{t}%' + t_norm = normalizar(t) + + if t_norm == 'lanzadestellos': + condiciones.append('lanzadestellos = 1') + continue + + like = f'%{t_norm}%' condiciones.append('''( - m_oficial LIKE ? OR m_civil LIKE ? OR VIN LIKE ? - OR marca LIKE ? OR modelo LIKE ? OR poblacion LIKE ? - OR unidad LIKE ? OR grupo LIKE ? OR tipo LIKE ? - OR situacion LIKE ? OR int_operacion LIKE ? - + NORM(m_oficial) LIKE ? OR + NORM(m_reservada) LIKE ? OR + NORM(VIN) LIKE ? OR + NORM(marca) LIKE ? OR + NORM(modelo) LIKE ? OR + NORM(poblacion) LIKE ? OR + NORM(unidad) LIKE ? OR + NORM(denominacion) LIKE ? OR + NORM(situacion) LIKE ? )''') + params.extend([like] * 9) - params.extend([like] * 11) where = ' AND '.join(condiciones) - # incluir_bajas = any(t.lower() == 'baja' for t in terminos) - # if not incluir_bajas: - # where = f"(situacion IS NULL OR UPPER(situacion) != 'BAJA') AND ({where})" - rows = db.execute( - f'SELECT m_oficial, m_civil, marca, modelo, poblacion, unidad, grupo, tipo, situacion FROM vehiculos WHERE {where} {filtro_bajas} ORDER BY id', + f'''SELECT id, m_oficial, m_reservada, marca, modelo, poblacion, unidad, + denominacion, tipo, situacion, lanzadestellos + FROM vehiculos + WHERE {where} {filtro_bajas} + ORDER BY id''', params ).fetchall() else: rows = db.execute( - '''SELECT m_oficial, m_civil, marca, modelo, poblacion, unidad, grupo, tipo, situacion + '''SELECT m_oficial, m_reservada, marca, modelo, poblacion, unidad, grupo, tipo, situacion FROM vehiculos WHERE situacion IS NULL OR UPPER(situacion) != 'BAJA' ORDER BY id''' @@ -638,6 +663,202 @@ def vehiculos_exportar(): +# UPLOADS FICHAS TECNICAS PDF +def allowed_file(filename): + return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS + + +# @app.errorhandler(RequestEntityTooLarge) +# def handle_file_too_large(e): +# flash('Error: El archivo pdf no puede superar los 5 MB.', 'error') +# return redirect(request.referrer or '/') + + +@app.route('/vehiculos//documentos/upload', methods=['POST']) +@login_required +def documentos_upload(id): + q = request.form.get('_q', '') + incl_bajas = request.form.get('_incl_bajas', '0') + desde = request.form.get('_desde', '') + hasta = request.form.get('_hasta', '') + q_itv = request.form.get('_q_itv', '') + origen = request.form.get('_origen', '') + q_viat = request.form.get('_q_viat', '') + nombre = request.form.get('nombre_doc', '').strip() + + if 'pdf' not in request.files: + flash('No se seleccionó ningún archivo.', 'error') + return redirect(f'/vehiculos/{id}/editar') + + file = request.files['pdf'] + if file.filename == '' or not allowed_file(file.filename): + flash('Solo se permiten archivos PDF.', 'error') + return redirect(f'/vehiculos/{id}/editar') + + # Comprobar tamaño máximo: 5 MiB + MAX_FILE_SIZE = 5 * 1024 * 1024 + + file.seek(0, os.SEEK_END) + file_size = file.tell() + file.seek(0) + + if file_size > MAX_FILE_SIZE: + flash('El archivo PDF no puede superar los 5 MB.', 'error') + return redirect(f'/vehiculos/{id}/editar?q={q}') + + os.makedirs(UPLOAD_FOLDER, exist_ok=True) + + # Nombre único: vehiculo_id_timestamp.pdf + import time + filename = f'v{id}_{int(time.time())}.pdf' + file.save(os.path.join(UPLOAD_FOLDER, filename)) + + # Si no puso nombre, usar el nombre original del archivo + if not nombre: + nombre = secure_filename(file.filename) + + db = get_db() + db.execute( + 'INSERT INTO documentos (vehiculo_id, nombre, filename) VALUES (?,?,?)', + (id, nombre, filename) + ) + db.commit() + flash(f'Documento «{nombre}» subido correctamente.', 'ok') + + url = f'/vehiculos/{id}/editar?q={q}' + if origen == 'viat': + url = f'/vehiculos/{id}/editar?origen=viat&q_viat={q_viat}' + elif desde or hasta or q_itv: + url = f'/vehiculos/{id}/editar?desde={desde}&hasta={hasta}&q_itv={q_itv}' + return redirect(url) + + +@app.route('/vehiculos/documentos//ver') +@login_required +def documentos_ver(doc_id): + from flask import send_from_directory + db = get_db() + doc = db.execute('SELECT * FROM documentos WHERE id=?', (doc_id,)).fetchone() + if not doc: + flash('Documento no encontrado.', 'error') + return redirect(url_for('vehiculos_list')) + return send_from_directory(UPLOAD_FOLDER, doc['filename'], as_attachment=False) + + +@app.route('/vehiculos/documentos//descargar') +@login_required +def documentos_descargar(doc_id): + from flask import send_from_directory + db = get_db() + doc = db.execute('SELECT * FROM documentos WHERE id=?', (doc_id,)).fetchone() + if not doc: + flash('Documento no encontrado.', 'error') + return redirect(url_for('vehiculos_list')) + return send_from_directory(UPLOAD_FOLDER, doc['filename'], + as_attachment=True, + download_name=doc['nombre']) + # download_name=doc['nombre'] + '.pdf') + +@app.route('/vehiculos/documentos//eliminar', methods=['POST']) +@login_required +def documentos_eliminar(doc_id): + db = get_db() + vid = request.form.get('vid', '') + q = request.form.get('_q', '') + incl_bajas = request.form.get('_incl_bajas', '0') + + doc = db.execute('SELECT * FROM documentos WHERE id=?', (doc_id,)).fetchone() + if doc: + filepath = os.path.join(UPLOAD_FOLDER, doc['filename']) + if os.path.exists(filepath): + os.remove(filepath) + db.execute('DELETE FROM documentos WHERE id=?', (doc_id,)) + db.commit() + flash('Documento eliminado.', 'ok') + + return redirect(f'/vehiculos/{vid}/editar?q={q}&incl_bajas={incl_bajas}') + + + + + + + + + + + +# @app.route('/vehiculos//upload', methods=['POST']) +# @login_required +# def vehiculos_upload(id): +# q = request.form.get('_q', '') +# incl_bajas = request.form.get('_incl_bajas', '0') +# desde = request.form.get('_desde', '') +# hasta = request.form.get('_hasta', '') +# q_itv = request.form.get('_q_itv', '') +# origen = request.form.get('_origen', '') +# q_viat = request.form.get('_q_viat', '') + +# if 'pdf' not in request.files: +# flash('No se seleccionó ningún archivo.', 'error') +# return redirect(f'/vehiculos/{id}/editar?q={q}&incl_bajas={incl_bajas}') + +# file = request.files['pdf'] +# if file.filename == '': +# flash('No se seleccionó ningún archivo.', 'error') +# return redirect(f'/vehiculos/{id}/editar?q={q}&incl_bajas={incl_bajas}') + +# if file and allowed_file(file.filename): +# # Guardar con nombre único basado en id del vehículo +# os.makedirs(UPLOAD_FOLDER, exist_ok=True) +# filename = f'ficha_tecnica_id_{id}.pdf' +# filepath = os.path.join(UPLOAD_FOLDER, filename) +# file.save(filepath) + +# # Guardar referencia en BD +# db = get_db() +# db.execute('UPDATE vehiculos SET pdf=? WHERE id=?', (filename, id)) +# db.commit() +# flash('Documento PDF subido correctamente.', 'ok') +# else: +# flash('Solo se permiten archivos PDF.', 'error') + +# url = f'/vehiculos/{id}/editar?q={q}&incl_bajas={incl_bajas}' +# if origen == 'viat': +# url = f'/vehiculos/{id}/editar?origen=viat&q_viat={q_viat}' +# elif desde or hasta or q_itv: +# url = f'/vehiculos/{id}/editar?desde={desde}&hasta={hasta}&q_itv={q_itv}' +# return redirect(url) + + +# @app.route('/vehiculos//pdf') +# @login_required +# def vehiculos_pdf(id): +# from flask import send_from_directory +# db = get_db() +# vehiculo = db.execute('SELECT pdf FROM vehiculos WHERE id=?', (id,)).fetchone() +# if not vehiculo or not vehiculo['pdf']: +# flash('No hay documento PDF para este vehículo.', 'error') +# return redirect(f'/vehiculos/{id}/editar') +# return send_from_directory(UPLOAD_FOLDER, vehiculo['pdf'], as_attachment=False) + + +# @app.route('/vehiculos//pdf/eliminar', methods=['POST']) +# @login_required +# def vehiculos_pdf_eliminar(id): +# q = request.form.get('_q', '') +# incl_bajas = request.form.get('_incl_bajas', '0') +# db = get_db() +# vehiculo = db.execute('SELECT pdf FROM vehiculos WHERE id=?', (id,)).fetchone() +# if vehiculo and vehiculo['pdf']: +# filepath = os.path.join(UPLOAD_FOLDER, vehiculo['pdf']) +# if os.path.exists(filepath): +# os.remove(filepath) +# db.execute('UPDATE vehiculos SET pdf=NULL WHERE id=?', (id,)) +# db.commit() +# flash('Documento PDF eliminado.', 'ok') +# return redirect(f'/vehiculos/{id}/editar?q={q}&incl_bajas={incl_bajas}') + # Ruta API que devuelve unidades según población @app.route('/api/unidades/') @@ -683,7 +904,7 @@ def itv_list(): params.extend([like] * 3) where_q = ' AND '.join(condiciones) rows = db.execute(f''' - SELECT id, m_oficial, m_civil, marca, modelo, tipo, + SELECT id, m_oficial, m_reservada, marca, modelo, tipo, tipo, unidad, poblacion, itv FROM vehiculos WHERE itv IS NOT NULL AND itv != '' @@ -693,7 +914,7 @@ def itv_list(): ''', params).fetchall() else: rows = db.execute(''' - SELECT id, m_oficial, m_civil, marca, modelo, tipo, + SELECT id, m_oficial, m_reservada, marca, modelo, tipo, tipo, unidad, poblacion, itv FROM vehiculos WHERE itv IS NOT NULL AND itv != '' @@ -735,7 +956,7 @@ def itv_exportar(): params.extend([like] * 3) where_q = ' AND '.join(condiciones) rows = db.execute(f''' - SELECT m_oficial, m_civil, marca, modelo, tipo, + SELECT m_oficial, m_reservada, marca, modelo, tipo, tipo, unidad, poblacion, itv FROM vehiculos WHERE itv IS NOT NULL AND itv != '' @@ -745,7 +966,7 @@ def itv_exportar(): ''', params).fetchall() else: rows = db.execute(''' - SELECT m_oficial, m_civil, marca, modelo, tipo, + SELECT m_oficial, m_reservada, marca, modelo, tipo, tipo, unidad, poblacion, itv FROM vehiculos WHERE itv IS NOT NULL AND itv != '' @@ -941,6 +1162,104 @@ def editar_unidades(): # return redirect(url_for('unidades_list')) +############### API PARA USAR TABULATOR ###################################### + +# @app.route("/api/unidades/", methods=["PATCH"]) +# @login_required +# def actualizar_unidad(unidad_id): + +# datos = request.get_json(silent=True) or {} + +# campo = datos.get("campo") +# valor = datos.get("valor") + +# # Solo permitimos estos campos +# if campo not in ("poblacion_id", "unidad"): +# return jsonify({ +# "error": "Campo no permitido" +# }), 400 + +# db = get_db() + +# # Comprobar que existe la unidad +# unidad_actual = db.execute( +# "SELECT id FROM unidades WHERE id=?", +# (unidad_id,) +# ).fetchone() + +# if unidad_actual is None: + +# return jsonify({ +# "error": "La unidad no existe" +# }), 404 + +# # CAMBIO DE POBLACIÓN +# if campo == "poblacion_id": + +# try: +# poblacion_id = int(valor) +# except (ValueError, TypeError): + +# return jsonify({ +# "error": "Población no válida" +# }), 400 + + +# poblacion = db.execute( +# """ SELECT id, poblacion FROM poblaciones WHERE id=? """, +# (poblacion_id,) +# ).fetchone() + +# if poblacion is None: + +# return jsonify({ +# "error": "La población no existe" +# }), 400 + +# valor = poblacion_id + +# # CAMBIO DE UNIDAD +# elif campo == "unidad": + +# valor = str(valor or "").strip() + +# if not valor: + +# return jsonify({ +# "error": "El nombre de la unidad no puede estar vacío" +# }), 400 + +# # UPDATE +# db.execute(f""" UPDATE unidades SET {campo}=? WHERE id=?""", +# (valor, unidad_id) +# ) + +# db.commit() + +# # DEVOLVER EL REGISTRO ACTUALIZADO +# fila = db.execute( +# """ +# SELECT +# u.id, +# u.poblacion_id, +# u.unidad, +# p.poblacion +# FROM unidades u +# LEFT JOIN poblaciones p +# ON u.poblacion_id = p.id +# WHERE u.id=? """, +# (unidad_id,) +# ).fetchone() + + +# return jsonify({ +# "id": fila["id"], +# "poblacion_id": fila["poblacion_id"], +# "poblacion": fila["poblacion"], +# "unidad": fila["unidad"] +# }) + + # ── CRUD tipo ───────────────────────────────────────── @app.route('/tipo') @login_required @@ -1023,7 +1342,7 @@ def viat_list(): terminos = [t.strip() for t in q.split(',') if t.strip()] if q else [] sql = ''' - SELECT id, viat, m_oficial, m_civil, marca, modelo, + SELECT id, viat, m_oficial, m_reservada, marca, modelo, poblacion, unidad, tipo FROM vehiculos WHERE viat IS NOT NULL @@ -1040,7 +1359,7 @@ def viat_list(): ( viat LIKE ? OR m_oficial LIKE ? - OR m_civil LIKE ? + OR m_reservada LIKE ? OR marca LIKE ? OR modelo LIKE ? OR poblacion LIKE ? @@ -1076,7 +1395,7 @@ def viat_exportar(): terminos = [t.strip() for t in q.split(',') if t.strip()] if q else [] sql = ''' - SELECT id, viat, m_oficial, m_civil, marca, modelo, + SELECT id, viat, m_oficial, m_reservada, marca, modelo, poblacion, unidad, tipo FROM vehiculos WHERE viat IS NOT NULL @@ -1093,7 +1412,7 @@ def viat_exportar(): ( viat LIKE ? OR m_oficial LIKE ? - OR m_civil LIKE ? + OR m_reservada LIKE ? OR marca LIKE ? OR modelo LIKE ? OR poblacion LIKE ? @@ -1126,7 +1445,7 @@ def viat_exportar(): ws.row_dimensions[1].height = 22 for row in rows: - ws.append([row['viat'], row['m_oficial'], row['m_civil'], + ws.append([row['viat'], row['m_oficial'], row['m_reservada'], row['marca'], row['modelo'], row['poblacion'], row['unidad'], row['tipo']]) @@ -1284,10 +1603,36 @@ def fecha_es(valor): return valor + +# ------------------------------------------------------------ if __name__ == '__main__': init_db() app.run(host="0.0.0.0", port=5000, debug=True) # app.run(debug=True) + + + + # CODIGO PREVIO A INCLUIR NORMALIZACION + # if terminos: + # condiciones = [] + # params = [] + # for t in terminos: + # like = f'%{t}%' + # condiciones.append('''( + # m_oficial LIKE ? OR m_reservada LIKE ? OR VIN LIKE ? + # OR marca LIKE ? OR modelo LIKE ? OR poblacion LIKE ? + # OR unidad LIKE ? OR grupo LIKE ? OR tipo LIKE ? + # OR situacion LIKE ? OR int_operacion LIKE ? + # )''') + + # params.extend([like] * 11) + # where = ' AND '.join(condiciones) + + # rows = db.execute( + # f'SELECT id, m_oficial, m_reservada, marca, modelo, poblacion, unidad, grupo, tipo, situacion FROM vehiculos WHERE {where} {filtro_bajas} ORDER BY id', + # params + # ).fetchall() + diff --git a/database/pyfleet.db b/database/pyfleet.db index 584871010c4de5a965ae9e839d78c0758d44fb7d..05ac89473c9199bf6682e2132366a75b1d1f4c1a 100755 GIT binary patch delta 241465 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%0AH_Sqt9p^|;H&)#UL$7`%J%Z6U1pEPKa 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®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%0A=p8!SRLf!W*YYCi zvQ)!pW#2HT@RQI-zk{!=2YU5tet_0@^t6@l>E*??Sl{9h>f)~NZmq>N!~}9<5nV{j z1bH@#@&Uz)25ORGkRRbz2a2uCh|q?~dohp&$=Yv>=k3tqMEOS$=0iDWq(mOgjq;ED z)&Y#IFHxHTlDrs)2Q;y_LIi^>FEKplo1@*m%c??^o&o)~EJHWe-8VZ?`;VDgxh?WG zR?`O= z?hyY>*NEzPKj7#^2lf1uLw=8q@&k^R4QT$p_%F!CBWx0?l1$i@Fa&5g~xL?wSy$*ZpYvqZ0q`cf1pM)Pc zv}hqr152uz`4v&Ef_%x4;5TyK1hG%13R=8d{(~*@L!iMKgbVt*-NyRp`XJp%wEQu1 z`Qap!5JLm#5F>xbQv8r*8dv0mlA#r4nDF}g1$ei{5{oxh-osk>^-xw+qDdRq)wNcS zB(6ww=ux3gaUq*9hS>GDnxpq&i2=~@Sb-hQ}V z{9T8dRLzigu|fW7#1UhG`HFvIi8^FX_&q}|VFo{(F!t9a-cRbvH(7T-5bwcyM7UcI zJHMkpK2h`6C&Iq^@@6*H55PMhlL$*P<)duAze=Lkt^pCoH;}Ke8h+s1HVug|uA!Xg zjPh6F?uR;FekKYfVITwdHoJ_fsKdXSyAd`|tUnfBnT`2WY8j2?$E>Cw(o1R+>ZC^# zxqx-{L(zPr2~D=4sa#dh68+K8PKP!}_h#~vFrMD4vt5S=+8oPk@=ZC~^cSM2$B8QY zz>qI2)$Qdo?Gtl)`QdR$?ar1&eIz{ zInFEpBAK-B+R9m)xxHMSRqz9C*KJSD`n8vTV9osi+TA)3VMYgeHS6k!`>wMijk!Tb zd5hlJ)?cgCavF!S3bESvD`XcG4p?7PCwT*F&veH|DDQ8TtR?iIhdt9no&;d+hu_7)o%MT#Esy9&% z_LkvMHr)>(UFAb(MRTZ9L(_&Z1v|3j^Q@d7fckD04b|9J{+cO%0P4mDb3E%5Hw=}} zo|V6_+5AmP=OiX0_^iy8cQyLS4={g?leMV+^r&Y2F@H?-15-a3KpiTnuG=it-!LgS zh|ZGggK&hAqSmV0q_gX72Dm$)G9QtTNz08BP+iv;5GY>gPJ+ zjjE-&igdoOFOm_fqfYU6D|>*p*TF-m=P>yUPLHlhT9x7Suy(^`7}4B*z~~_(Xn^@6 z2N3M6G52o2bK;mbgfD9 z%@I^Uo5lxk!2rEi;!y_(_glU&+~?a91un=lFZj6ZvidaS#}eaAF6#Sof%v)D z4`n#L@|&aS{?6NrWRE@lBc6`R!D{lH3`<{kq(F)2AD*I>>?5J~_CCjb0Ye>DcBo&M z;4xMGa1F-(i`Q%iAi(NMA`duz7w}OGfivVm8cu_Qj(j%Q5BFerx+aK&`eY~SO1?bk zcq44L)fee(Y1TiiBP^-r;mDym%QT05WVo&`;_n6ri`=$;=v+5B%VGUXQ12jCzywX9 zmy6^O1!>O!Fi_s$LsrQ@IV@QG5?PM#eN-!$1qsFvMRs_9q9Os`uz;*#0xAq#X3zPd z$Byf2iPRjK7N=NRM4+bDy&kFtbZrD(-am>6RKhtw9_sSwa(t0cBw!=9!*lR2jp2k6 zWc^q4z&p@%kFQ89$ml=5?++}maaR+4a{sAD*)Dy(lb{(&ld1d}M;5=D z7DKOfmRMGub?i1I`4?&5HL@U8(mC#TTr%mL1AaSQ{18HBoF}%`=N(&FGe3k7cnHKB zW7V122of59A#ycBtM$+Y4#juyy!l1>tn>-M?F2EKyZj0)WfD5G- zifD!#7s&_M*gzy=&q9RQ6@XV00}+YZ&~X^YFDqoO-;oFZSe=>A8+Aq%oY7Y$ntnOS%9e=n|ev6F`IB<-wBElQ1hVo!O0bh$X0OUF0Me3>OMfr2qDgfj;e=`v_ZkE?!yg;5UULwM%mm*KF ztU#qCE%Rl5a%+QLmS1D_0Fu<@QVEE96A9$O(z4NwQLqH-;hz9mU#8UT=ycL~5 zG`Jliuy^G@#GHNs_-6+;QlpZM^6n?bizPaHOWRT9xV5&$EZ>xFh$q>7;jvI(w}kKd zp<+&*0CbUOj#9%%N9ARD);Iv5z4$mi?WN=LD)wBUUb5EoJz^R8o_v(=P5|wclf=^P zBzC7WkddM(r|8A&osu8GFc<*Rjyp>%?as0iqy+Dg(8Eymu4NjNRC>3j%=AbM_En{T?|B!%f9`5+YRGE3YKc z!_F&T>X$Yb<|a2sect>Ue7>F zfY}g1`B>h;jDZ%=xqM6<_db^Iu(kmp>l4?A@bDVMgU$f}YTtDtynY=YYwrL6^`K9P zko^fdts8(|`r!>C^t&PZK!9F4OmN(keYWm_Mx}V$T|;Yr*Wor~W+DsoO-PSQpdlg} zZqcyU-I7P*E1ngA(r$MBd-M0&}E9=OK53ToIO^jwP%IbF`u0#m#c;gkBq z7g^;Xki(b*PJYRwwD4S3E(qixzeNPp37)`|AdtfgAp%MOk73n=uz=Tkn?FTEt>3>` zg&=T2--FZyMSG{QX+gk(A3_Aw<2}b*LBN79-XRWD*`3T91jo?0_+wE{cLnPZ1iWkX zE^(kz?j}*S1%dBoI4EQ8YKJnGMFxTIL?;naoXR9-4UPax4iSzxmC;NL4u|ktjySrP zQ*N`x!C^>W7(s+*Ba~}wNN^}1Oe7KdM=A$cau7H!%0+}GE+vQ64?-DyEJS$VQv9{} zc@&|4O=s_C+i&e`dDUVBh&v>^r5UEnrh3Lz;?H6)_L|`>LyRzA{~AXzDn6GE#Zwct zEfRUroRw@ZvWmq(bW>#_1ZCSS7E_F+ahQov&up8?rWRu4HOSeuy#N+u*ZONBxGbKIOZZrk`48uhk$!jmLs z_BfOvNYJKU(?^<61OUcp_yI?XaB#Ea0Uf2dNV(X}C5~ck@^r|=93tFwiR;a8!Mc&X{prb2pqWs|& zlLa<77dqPHibUxSZ$}`n+F8O7NUDA^aheO|0r_{6j zA>Wc4BO}~>Q*-1tV)<7Bc zH0W}MA14ZGQ$rwXueD6k*1U&O(Yg{8on9{l16DCo*UzC$G#@klV9bYgXB}b+59+i{ z-&bjtnw_0Jq@Yu2<&21!nh{hnt+Zw;=_c!`dhT0K^|2D06+H8#l$Uo8}W8Ft-YtPaWU1+Q3MTq~tpH?>(ohyP!X zKy|G(DSi56S1D*;T3#YHCLP5;_>j0=9w|LS(E*iPcBA53f24NnmOZ+l-IEFyu9%up z2ubDq{}9t^q96xEJXGdtp--(-C$CdM+cHfmQxjKuH+n?4w#L({T`vnYhYicCTF@r6 z6?i$0nxQ7T^e4q=X=1bW>U`7(=XJdn3N^cR%To$kheQbYy}05kQvq97&9Ez8NKu>} zr#8&#rYoV!U-6ll{C=?N8|f4X*YXLdvNxFGj866ot04TY|5M+H-w4t8gqmxxKwp_n zr|NIBZL8TlEi+Nm<`CiF9NT5))`0g`&LzTux$xf{s6nr~dma(4EQ{HXqo!_>rp@Px zM6`G2+rDL14SLnr77)kf1-8%8DLfVqEhJ~d&lcKx@+}D+YU9PkGIX(RBkBME?Y%mM zKFbSJlnnNa2DB$mRXEzKF;#)~sJ;eIg`U$WfBoEPicMg(GhEw%U`J`5DVmMd-{H5=IlY+2f>8Tz%%YV#nPnS@ISxYYo7j&iUHjSc z1vW5x>!0IWv$tL>jMdz5gzifNzus5*j{#*6DnO?(fO`0K zfHFd0@mdsexeg{u!C+-BcJvSpqT4quXlBZ_1ehA6xstW_TPlerT}J)%IxSI^zO|C6 zWwcU$K`{ncmuk1B_F1i!%}55P!MgNk8&26;wXGrqySrJWq(|D27p$YD%cdlwELIjy z>1**}mWLy4c@6V3@)RAn%TGC>I`5@ne*Qd7l&WW(kkCeJK<~ZI5ssX5&Uu){Xh82x z&J$tSdFNx4=fLEoPqs#ClP);93QfJ>T&x!hY#Nei?3h9`dwGg&l!4XN8bREeL9;({ zhRrG%25SwqmTsp@E1ZQKKsW($Pey6OB?9ZG%Ysa4wqG@ITQC+}jrg`$9z-ODqjym1o()ApA8} z#?ph|j#c0yIw=S*jmXNx(y+2}5-F#Hyt&)gf7!VNRDg%F)CVs+7l+L*&**F}^9h7!T{R^emxw;35p8S;AaU(8aE470v-<{N zBABp+cER&ooVDSn9fXPC#8#qwv(*WQg2W(@#_m^Xa93V+s#4`(D8GnS>18L+5wLh0 zuK3g-&_>x2$8E=mCj~n|pR=9Xez4tnid74?53}vwL9cLRhjTGY2?AeG<0==bDPkyR z`?#G>_=yGEA|PNV4X45`=L38@SwTPye|I{S_jR}J#)l23`msG|`vrQ~;thBSpo{&z zY5U#mZ9DYjE54z#J+NN2Jdn4DNyvkEgC8g-AVf|K;!w4}N2TQIzh`X=TXWEeeB>vH zvgL#oPF(YXVv5%96qS-wPg#2~)+~q*@uPFZ^XEA$O0bO&;#`e-pK8=KdEa^*g&TuH zvgX}QJo|QAKSR#wAP&~`dx_`hUh6mALt2~ak+y*fYM9EmOtr*&Vg_S|XLZ#>m$Xio zpPyeVr%EXpiHpr3uv4a}Yy_MZr{-t1 zTi2XQIVjxzWOkA(NAcNlQKfVYJ%pEZ>O`J&r_kn}qc%@46~sKjoS1_g z@zwqTU3raW&DYkQrQNwzbZ?<#KtC5zLBNw=; z{rgSJ?0NpCizo6l34_|ZN9tY4$tZ0Zu2j$U-l0CH_~}I-c5p9DNlR0+3L-*JMIPx8 z2S)u=#^CSJ7XN4~I=c5dyLB5`z-!K9vayJYmPf>{np^7YF*l4y8Y# z&7M@ctO8x9-a{P3rDW*MG_P{Z78`lM729gjeMoN-Oe;d@`Lq-1&*k z3QM2z|CII)_i(Rq^+DWrq5Nc2|LQKcr#sKpx-~eY|G|;b>j{VHe{kF@KmG!=tBKd{?KHHpLwsZdlq)?*h1YucK)7D65qM%v+g!2*!d|1i~rRgYhJB% z%^`d1V)2jm-Lvj|XUmr33Ko@ax-#Fv3;pmNq^GOV1q=Vxn-(68(mynsf(8F=G&}mc z+qmk~LHqgtqkZ%MYCp1I-ap!hzvBY~+%5R*RV|qNulE1f+eG23(-H={mpJRx8Cfvr zzx8%*AbP{xR4zX}l{8k8X}`&*eMsh(Ghlh#nHAFOn~E0nfPJG#uq}>QMM2b4zaeZW&!ja z#94Y!p}IFz*5Sg>IGfs`BsNqYPrKu%5o(b`>ru8loI<=7`TVk+{M@<(=*{d0Kb?TnP{(`8PWb|RwMQ}J&xc=-*zS0sY-jC@A$q?1fC!&HP&VQ7YMY`h{gSi+d%jd4O%5q; zgW#O6>4W?0Yb8@)9gABdO!YfzH26E^MfedHw}R>OPBdSG*Y8BX%&HZ)g!jo^BB*zx z7vtn=ff^b2h>(0QdM>M7+#GhU5aH~-=%s9AF%&S*-Y1TQ_oEN7^kOJr0!Nfc?S-Q- zYtdwn{4{zwYg*g{zQmt$&XNkBMI-ICsTj_Pe|^NqsP+Fmy0JF&sN^ z(=A8MhY>B^Sej{i&G@A;0m=7=8H)59LfL=!h-#}~9Ndj>kZ8L8vUMHA_bM}AO zL#|jwQCGK4TAH@$vh~@L!&j`&!9yunnHt2&ap?_*=<1?Y0{^+4w*IPhAR82{l&JlA zmAZ@n*jfTYY$-vw212V~#n1!Mb$Y{kysgHE5mSa*x0D)PhMG}Ig-3UI$musQF{sK+7-^d zdUDe<>weKG>ygmUZ#JNiP@-`Sa|!jeD&Lzw=EZTc8|7J1X0|oivSQna<@AODc^0i* znxnFrr>1QUTLb#*-2 zp{&fmhCkV1;kHr*9n-0!ZnIz1b9sF>d3VdTBY z!*0CYhn9h5i7&8$dF7L}Em<^+=d(m8tDEIPA1ppgl+6C4|D-lrL)78_q+SEn7ORz30<*_NXzA+}ZnmAX76*MrZRkH6 zR9J^@%4tKw)Gh1iktOSt3E%|?h0(HfAf4BPcb*0S`duWnwV$k4_>J^%y>c160H9@g zAG`qGDjEPNQ4cSnehW5myJ-~-2(&Eu;u3D_*MLCFQfH{3Mrh9><8F?Uz*If5Vpqsk zzDBk2zS<*IsY-FcHFJPdt7rh9W!t`=Lp=g~mZeV11$B%D^r@~?;zJG*t~})k8=wJv zg43mamq#!4cbyoTVxJ_U5;Ehtca)u(biS5CK6XKR3Z2Z{1A zxw^Cosd$ze-!L{1N3)ac8AGP9SBTL2bUXR_La{d}AD1^mdn2`7c~nmP-8^Fn)91s@ zB7CK9$VYO*n0&Zd5ZlmYMyeoc!Y~pFQ1(!t4~L5|?~wxV+VjU!3^5;Q+d|_5HZOln zDeTBvYV3{PMu($}*LQVu&H1IJ=%{NxoGzX`gHxw2Gj2s=Y``#PX}KJYyXRx?Jz=vO zS|fS$q2MNl)Dp_(_2(1wNyMbLo`N*Z@|WsC<|^+hat=UzQxLwL(@+x}V_U5`ahRkBkrK?f znkY3_J7pxE58_y8w1z0d);OEN4P8}hQ`FBUG2+WxogokI;F`_g(W<945PO-9hJ1@P|T3KiP$$Srq z%#NGl5yaYo1q{Uoo4!QfDpY=HqNvu$!7aFJGgUIWwAql$rsd!ktn~#Emb_%>%zEYE z7X08Ps$}%@O9lju7<0tL;AvFEZoI|7KmATy3`5zB9LN~2ZJ~CTw-_$4x;X|QxUEDu zyVc-hLJp*hL9Y-Y`xV0tTlXA&$SBTrujyLt3%2rF^Av-KE(=~YY-5#jbV*vhZB&77 zz&68d*p;#uBT>e7>f-n9hEpsl8&=hmJNV$Xe!IhfOk3FtleHgq(rDeg3}3(`5}yqT z!%#$xl8OuqSVA_0i&sK~^F@Y*tYJ1h!Mm=YMl)By1jO&@3*!sqesMh{UHXOy zjlPKvu*~ARh+GX3egq*kyIgTb613*7+LaZ%JE3M&l*=CDvdc=W3lq$CCaYNt8~-!M>AakJToI8PtT+`>a;I?6`ro7e zH@v4jKzB8exbp-x+@a9HP@B>(izhZ<3#ZtQE%ui^w&H2 zk@_XeZd+I*R3?+xbY){yq%ig5@+z6L3RAGj^XTTjlqY_`k_(gJ7W$EhP$E;dT~~4e z;1x;l3zI@pRyeuCoI=D9q!uO;k-v1tQZb)3F04*%NyxKlca~Ds?oXGB5qd*(A!=7P zfCqtNIn`2)TQ2?xsk&;ZeA(0^u4QqB3DhMDczK9T?-l3cLGh&zdfAHyr4~Zqz##dP zd;37BS_pvy;`!6Kcu_RyRD(_v{o?OjApn6R+~D{JXi%-NQusAhgKE)fGcSsN;w>R( za9J|^mTN!6Th=Iqtbv3P{8?F-#N2TH^0PWyTP5GR&eFu(Qywd|Hw`v+5{I+72A}Y? z&`o!iPyEZs1X>7#c8jW%7JE!py$HF-%PScM>aW9m&s%D(dDiz`z z7*d^XjNIy|>^r6~6OaFkKxVZ>;}JHh5WBx@q^>>5h;qh-_yo#Qf96zsA-;p%JpIOn zWV%UjCmX*6Z^l1)AEkgdwh&wWNe@b>uI;rN#-G{fLhN|VZKU=fl{)z~)p!_G?D(?O zdo@8FScurbC!HX-G23$gjjwkX#l;V|}0O=O-^X?i2F#Z@e`Fcsf> zHo?S8*`n`BP1^Z7M6b59TIG?_MAKJP{a!# zI6h@90>CHv7m2X_qGJt93-n0TI(|rmNgq0vv5o;K#s2t^0x%LT@w}|n1Kkp}4wpI0 z)`^!L@c#&Og+Aa4wFzEvyo{g?7{8l;L~TZojzrK#l>iiBm#-4buU8%O*z^FDU~pJ* zY45+TC?OoR?qkP!c*!G$+{9}X0k!Iy177m=109pJ$Qx7`r_l`uLID~FI+Qx0PrK<@ z#byWECu^2l^uRi|93Sdq6T}1h5mtw}KwPqU|)o zsH@JS;DFL9%prX2Jk0O(I#IeJoxQ4Ut8!RrjACUUSbCW!n2mChwB0nz_^UAnqSCvp zmElE0CtFk<$? zj91QrF+G0{mZ1vqmAVpV#dgG(w}U^c@o^3GG&v;N(+aKZk%c|`t9 zeroAzz|u0&SQ)Q(>w>*08<9VQ*ehvG-?y7UZS%hUAbOo%+G_Pi9m=Cxw-y)*Rh24D1ul%{~j@Iyyw`? zniiEu;KqF-%((B+*!&{sgPw$jhQmGUe(Jb_A0iPu@);cm^*(caD6j@aaM7|n2z~1h zP~d~jD1u_B-Iqj}_@$#Was?JS5mE6K^?&ax$M?)$1cCgcheY`Oq2o)8+n%C5_?r54 ze1k-w(H@-9MOfOH|GBhF|BjfS>Voy% z-rcrQ`Ch4Eop0H1i7}6tccV&7glUAak+_V#hq@He!gFwXdaPC1SkA>!1T-^Y6u~YN z4v8)$yv_+N3$b5t$MH!Veg%LgwGjIy+@$(P;22+s&4MeLb6ojId=H=lo23lsICd4F zqh%pBOt_y#A5%Y(rTw(JMgRu;1kDn}5PZ_57{ipK209mBW{XC=+#!*YwRub8da!-c?aFM z^Ip&05~pI!*3vPLz6~W1<_lt5_~p529W3Tj7MRcZ^vIyGfP{IaMH&hHNm%o}tHNA9=7xi7yTw%UFo zJl=0#!|LTjX)>;@J6`Np4=AzZK#ARkh|c`J$m{nev3>t0PTqz2SxMR}2S`lRD%{Z7>=Bbbeo5$0zM#bBE=?!gh5xt#29Cs4z8w@pZ4`o-S zzi+K-FEGUL8>kxnJ*%31rXdv<_JwL8?PfJQ(;Ld;()pu0F~lX>r`RIqab+&~dBr$M znH!<)zHeY5!`XpE`$R)^gas!jQ6Jrt?2Ghf zhDx|?Hq;=7<2CHR7!qf~sFF&5|1{OE8lq8Mb8JnTrNF`pGX&IIysP8US(Yy?ZOlF7 z`KDW@a^i>V1HBeE)OglJ9dy`hM96>5K2OZ)nBM_uu7;A-uxhAr6Eq1dcQvCSARA}W;&~7U7+Osw)zRM?VINVu1U3dXhe4J&eLuY`> zR3wuWW>SIDl$pW+1FNATf_mv3DkHjkj*z2QB2=;skegwQHuYVhBKjOSPngIWs|Lg) z&7;e-_mdyPM!4c!;T5#PA^qfsGLIXV zhgMxw9N1-k#M;nU8srOGF^y2L-Os0KG#3b{SX@Es}>~K^ATmJPk2d>Dw(LH zmS$T4r;Hcn*2c%oZSi_r{apI zXOG=S&z`qW_?it@E2n7By+JFy;tc^O<})f%zQ12Wl%Gq4IDrjNVKi`KmL zTSA7wTq>^lc?anU8x9JSSuZsvS^KiPB|*$?nuCM9;X49c(xX+}%YU_@FUtF_FkMtT ztNdbqy62y)@t`Hb%VCLrw$4^x8D?2$zG*hebx?;~GaeBiiZ0e%aOvCWX7l~j0~T8~ zJ>1izqm(ML%Q4|))=A~!Fz-K1jX4f#brs_9@#8e75048-5!h3$MSPXCJ0}GWn9H3M zc7R&*pVTixRH%Z`XDRQ&Q^X5ZP+4lxX;6Ep(Bpv0clqcu!gkh5O@>bFED;)=71n_R zDx5IK-)F(mQ%(G5N0-i_qsA&=V9t4J_sV%;6>F&?BpWNix7gSV(C#4{l*-jMp@((Y zEo`^8QxihTP%G=4+LW61Xk)fPhkr{d?LkfZa6IP#ojqMSs#LPhwA{9IHm`;^N4oU9 z={u9j=r_8>mP|El5{~N!@Jp^HgvwDW%;!BX(}U+;7LdudpV}HZj;_$yZeI~zX9Lw% zkd)8aT-x@J1P(;r{z%x*ny4*Nh3hJ@t+^@$?Y-3&rP|b(=9RTa8u!$taXS`@w#w`RZ*KDO658=F?@m= z%h76M*iAkm!j?~j8LWcZsPqGAeFGmz2eo0McHjna+`1vW$ZD$%kY@iT5njD1EX8q? z`R{9%+e`=C!f{hhtq&XWEn@!W7EZEiDwIBhZWAHB{9S;*_(qW8gyqW=> z{9&5Jh$8~T_fBdZTD;Poy7;K@Quq__=xloxpJk`{u33Z=)^yYRCK34}%HaZ;0I7*Y zh0&twQUP!r$H>fC@0e{eYpnv`ymE~E=HEYNLnK5CwFlHX?-5JH3ELVrSnUo0?*tJ( zI$?X$o~3pR8C~IL?oPC*o^5f-0E^za}RN|$OE=$$%WuYZbL!*?olbePf*6#UjQ`MxLt= zh2L=Q8+qmkaME)mApwNGY|Doj(iLIguS`y^&kVU?O$ zk2u!Uvkzl7bp-V3Awt#qJS0^e4yAN`;&`LJy$}cXFzkg)B8<+o_dt`OfQ=!-olG=g z>JZFt1LBz4z&?mgRAKY{Jw&L|(B7We)j_avH6)HeL;E;ZR~-m%jSwNek=+N50g2ka zM#OQg5je~$@Oit&L>S-LK9bEM$)} zc*HgpDT#U`naNS&%{yw#PayCOoto_#<+zfBLI}s@dvbqimr)ak8eSJN05!N)t+uFE zQUOsL{YYQfkROFPI520RvM&+#{|7e(TcE<@!2OsuL5s)#r?0mFuj<&|hquhJz4tjM zha`j~gb0KP1VWJD5Znpw65JuU1UUkPqQ|n6QYh|FC=y&MP)hZd3e7uX{7p)*2-5)lLJ0!ADcPIpYJ!{rq$$7Mt`Qv?xOMaXNz>cZIjJffjVe7K&!0_710 zw-Jq4FLR{4nrSZFpskIhCTAn%QMlZK-7dX65xSO_UAC$&34Mg3N@5fB{R8b4LW;?s z<>f`JnhOaZ7evu5*48N5je>73nD44bQwQCmak*E+35DrOi10L8F2wN&jp>CL;&>%S z-UEOHm1#&U5j?T-W~Mm{ko%w_5ppZaw*Xq8Gc}AO!jL%mFl6mqA|x>iC23Mg-pVRE z=OCF)C1O(JT&n!WXrfOUBSME3ykuBHc71q z5)+RMjb&j8c432HuWie>zN_6;t(LRMf)-&I!ZbNjnlFAWHqaAt11mzG*othJ3tHI=Sd0s(whTN~Zf&2=B3zJkYg<#hv#sru?9*Jx`tvO2 zC#tsYSQj0|qPh(d^geCu@3O8gVA#~QoWHblTYDOAeO)j(%xy?4)`w`T;ap7Xv-jOKvI@;F*kh)NV{-;Wl zz4amTc6U=(C_gEU&1O@!v72Ed>n@J~{8*_c3{{R9oT)D0rVlDp`(G=|E>_(I$TY7C z5jIqjm*5r^mb3I^B6LlbpRjQ*0H)lkM3_-keuH&%RYsg+3T?;{DRO1x?REi7FHa?w z{i*0=mdpzYJliM8xK~PXAu;6V6RD9jNq#Dpb9Qwh__HjYC@z-g)V_WRy46HsB8-wb z@=i9;)gC!|T2PypTFAAcZ=P7@k(m)#-=j?D-n^b*sTYA`wZDn|~ zEpW9aZ?+_sodUPG8tvuJSO-@th~L2|CO~G;njPdVte*?o$EO`=YX0gVA7rgv&^``! zB*JGM<(DB@aHS%~v@Tg-2V3%km*%Q;hA$SMlSTMgETNR$?@rtiOu6n@CWk%?n& zk_!q*$6D0clv;8-*3$(AE;6BYuAUw#>77M-T2mk_$u}#LQY>m(L7gQ=z|1+tr)4P)!IkJ+}%1N`<=kpMGf|F6ateNSrxz5Pu4N=^*=M94NqeSVBJ4 zp27AFtiP)Vj-??)=sd)J(6Geh>YlEDHI(*?F%Ok8>DtID92BfSTE}T;)G3xL=7y%B zhJ~!Pd>&G&8&1+Ne>rE2i({scPi160)@+o~cX!)xP$pxbN|kr5KRITM|u zh0ft~?|on@=6Jn=g-tO6VGzs+TUHZ{o`ZIE@V0Xu$nFa%r+==h_#sg)ZQJ zo_fdeJo1viF1>JKH+w(07s2UlK{wh4Tf5o669YzLl25Rw+2-I{wysvJzM?!;rkf8M zzF{q;BQTw86q5v>UTcax9sm!ZND0uZ)C|ZYv7EEHBUOaHCqSa_R6y>fOmtCM9|TG2 z>jN^sglrU)+pvstr%e8Td2?CT~ zCBo*ZzyLj5!0H*(h|qnSyywWhSe8&x6F(H}sn%2QhG?uVQ9iTOHQh7Rl65&o{E$bc zqcX9pwHqL=WCUNo($l!;#3h;=DDK)wT2aF&T=kZBmrK(JjiLqfjIvLH1Dj6cI-yE3mffLQuT=&X%qT4%FW@O;0AL0 zbQ8V(Uz_B;WJluFLaZmWtEd%nA9c_VF&TTwh?*<^t`>qI^LW5QnL=9-sqSXg-9Sbb z#tA$W9c59fyW>y~%s?!NJYT}vyDO&Y-x;F$9zkGvqG-!-$A(UO9;yvr%vP*|@t-hq zWZ!S&20Z%4LVX}kd;^>8Mnc9t3iW|7@U}37xPgxMkjVZ8LG!al7we%anq^@qne+;@wo8EI%-X_7z5obo3 zmt&9b;N{rgjVg|tzavR@={vcW%&NHSrxo3yHYs=Hd3?cIQE$3ld!&dHnY7I$VygyPL36KiwpJmekyu?qUG*W}?W(_Ir+#jjH*^aw+O%cQvECEm^&jRCmyRPRxR+6-;@U#oPrymPd!gVXP%e)u_r&#hu%&gU&f|B7EX=b-vlt-c< zyBlRdt(T}x?Mre~z&bbdj~VY!qZi+i?_eUKe=K{K2>af}M2hapaG`vU2*cl#`?GvE z)Q@u^!man@j;ymA>POx8iKGAf@;1YgTJD6jU>e`H$P{6Qvu_ncv=HDaQ@7cW_FK(U z4qEaIPWGvsCImPln`v0=aKngJ{D7YJ%mWTE)7`kYs{Sicdi*N8;Be&z{<`vrMtb@P zFlL||rIB2}(T3agn|x4aUED2G^}NUQic24(ts~vtBDC-vh{qypl#aZK5eBS0X8+T_ zfRih_0mg91-zl0g6ni1w(ce9M~!em-U1-#)jTpg^hRj z!Y1EJ*_v_B(c00*-Shbojo9<3ME%|dbEI*;$FUgZ@|`YQC7Dfg_dpI;149stet)qo zxira$f3t<|?sSMm=tE76s{{Ea){jka!_fMkiSegk4m*dM_3M>U3})W6o)_oiv?&h*-~zQdLi^m|s;8J~S8*amIXYLtx~Vk6ug zsl*r`simErf+@+}0aXU?(ac2Nm#4yy8CKQh_ldCozC4hj$RaGo4~S6rfjqd(FQ-tj z&#-1`yOhh8@6F3`&l-WNyRArEQpoqs7{lUDZeWysL6VV^HkKPIA}NqPr?g<2U4~)6 z4I^dwEtK)P(Ux*aSV)^2aAn^V5}+SVv5!VlSodIfsm&k>`e=sz0IICIVW`|ai+Dbm zW&Z?kJ@DUe{r+rwXV%XRPxyp6)U53sdo7WTaRa&*%%x@<=h|Om-QE3=9zPaN-UajQ zJSEYpdG=jg2mrv+8Gk+y&F##2^X-FKGdED|>+=c4-kEQYM8av48-~gin`uuR*j#St zkwq0*SQUpbR` zcPfkbMD_09t(UA86{Tt{4s$D08#vsUQ}2q;~PGb5)H?Zxo$Yp_fO?4x-&KUKiI{9yt(bDlY+G9&3NtEP>I?TA*Vg#aRaje zCeo?bciJ;Jeob}5{#UUhJ#2^S(QhN(%RK|9TW4z2q(*cxOLHRv?n(_laOvMQuo(~} z?FQ6++J!#%m)1moUX;sN1x45<*k06zD9tR*QQNMI=~H%FZX|5uAK(iR+#Up29Nr-E z-SEW*kqd4Q90S^KCd!n}qD!=n^O)gffv`E8jnVpn*KrNEVXOi75Gn3(4|4uj+A3n( zPWPDjS4NplVq;O*ka07-X@}UEjq|_~+;@k_CCdCAVk;(k3@Q4XA;J$k!~sb7$#9>w zlQ<^r6hCGaJ%}4@yNjM;(k}5Ak!2&Dk3MRT$mQLtJt7k44fDX-yI~*kT-YZz;WYt% z5v(=TH&xjZFkd&#G`wr*%;qzbcvGAdauoOvo8`fwi7gbNM|(-Urh8c~o94mExxh>F zyV(n|81I4Q?iVjDL9CBGLV%qo2`?B*-I7@O*$Xxdu+FAV9u&DjI)}50AweEJTG00g z*j6^*14CZFAoaN*$ojBk4-9!%g1pZoMQlEjX?fuA=0x^AyweVyHA8M@576qJVrmms z!j`e|9-!5ACB*VZ32TY1;DPl{T}v#PYgsWH>4{0x-&sp657#nWpmy;f>s+06^mz_k zm%M{JQJ^H4!4tqd0oRvEwK+u?x0Q`b`=U7wOq4U6*`Dj3i6 z0LAW@MxDPujeUd+h8}>}Z8K>6OEcJNHrEsR47#{yvL0-*2Rg~snZ)onY7Mf!9;hUp zW)UHO7JHR-^gty^nN6K`nGM|leK?-=Q8I`1WTQN=B;TJyP0G(@XIX8J9i7e%bvhS< zZN3MFGCkP{w<4#J z$jI2*xK%;s*hoX-d}p{&I(7p?*i#cvy%c@sMtZ2V8zEflcb|*u&3{UmY zcMNMqtp33c#yxgk*oAeKJwUZM`S?>9ce6oQ*K}mK-c5uRyVyg@m3^G0^yxlk7NhzJ z_DR-1RfA%&EHxfB6v?Ds3`&nC7$%8zxpY7*c_{ahFtH=}& zjB|gyN*t9AvYVLAW@(&|WbEo};G7Rfu|q6h42$(N<%=1raRA7s*D5wdnBWaGi^rF| zb(sBv@2UwhSRSEi|LzFeDzSwgI0vjbMx7r%2AnqA1KV7=<3z|l&i=#lJ%|jko}e~$ zPOys-o8m#1a`7}#QctsXqSfZ9|7^}9L8cz|x>&6=r#jxg!tEN9UPgTQ2UXM0}E66|RZ02t1 znI)9|Fu_n>w!4}vPJSM&h!cZ5;+YY9-)y8aS}48hvqy?W8!98D80(*}4Yu4fS&aty zo;+9lSmY^wTkuLqPi=EN9iPn|Kb{hTl$v?@b!^x~Plq&psl@`{*}BfLNI!jpp#s%3 z55Q{~hS>EDM7_fUFTBU!(0U}@WVeCwJTNEQZ_y&wxy8OxhIrcWSAq#o|7t(0XmX{v zWKX*Ys>=u%UdSGFm zb(gw-=`I_WQCYA~(>~I=!x?EGs)yY(B+EU7`$8y5owI|7+e0aAJul;7xR z+#zx$sP8>UjKQ8>=|%TRY^UC5btUZ7o-jT@z$hIL_t*1wdp7kpY+UHlcfz9+l z&v+anBs{_ynB&2{!SqMeX6+*uEwYB5TsWEiMs2?QjRkPzc1_o3{7wU{`<)$?*#b`& z9CCjV%YwgHU!2^XA*e%yzyD%0nZ?s7U7z!W+H8D+im#Ore&4}1PR&vdn+L$S-$eRM z{DoUC1a~*j(6nF;z6B5WGVDYV1`qJQB$2@(MKT;`c^<(1ZzbBKnrwisHO@0ARc~*g z{WsZQXervNdj>uav5(H+x_kv=YiBd(9M}Yn1`p2w4)8zHOr5MS8!}Mk#{=+RX4tr) z77v9RWi)U@VCo{K~* zHl^z0HdE6zo2~tk8lu>U_@FJsgUf|}xRfmh9&>G@=$q}^tQ*+yV&E~vHAUz{wo|D+J>`E9;g_*Lxc|w+P2|a9S6UNL)2#DA=@9&gFR#6337xeZyvGr zkytAabc}>!)JyAQw)L!s2Rg=gA%b??wio9jbc|ESiQ~p`+Zoo<107@Q2_n3G!nTfu zd7xvAKS_i&Cv86fSPW0q7o6gWpG&u#vT35Vsb|=;Q%s1||88lBAzROt)3#z}_2j|i za)z3}c*ZumR2&*7=ZYP4!~VD|z0v--kxXhRHRKcVdg<^3akm*$_X|0txkuuL8knXC z*-He6s=_lv<g;=e!rYiT1CP7nU8C!)8ux@1?e7lS~fNJ=!VP1Fv z9b^@bg(J>#5(;gWvlUvU!ZDaq$}tIWyp+XZ{Kw1LY;a-)%Q#}mho*~1mk<% zLabmJVSp2a?u9Tjpkag_v&v|fdGf<>7yLl#7DD!vF@EooS5blwQ|0bbiTF@#7|g6X)SJr;&Z>pDPoc+JvjLLywS^GFU&549qZZexb5k^WwICj^!)FB3SU4! z*@ZYz{>@usx$L#Y7j}QX($G_`Ehjbb`{nW+R<95ytdT2d4PRIxBYe9M$IHKaXt@%j zWfyk+Z|W0Hol*!}mTwhV^^UEQ+XBniEyPKK=6p}gyl-F4Din4~(=89ksFV4?ezz>W zfwV-h+pG@}!CP#4Vv2*K<7Bx|TEYv1jf0(Lf!CIzFHWM6qFqVKXKc9Fnx-$QOkqfS zD=Q~Z^3SXN6W7J3#Tyy%5zFwZxI?c>4cApwma>6f1vif=MChEN9AQyj=+dTC>ZwMm zf{W?|uNg^S(uw7Kx&l8&uZarOB^li{o4JRho>w(xxrCNbng7fnzW5r-eKyGp5gk#J z2n}i~mr~2YTg~3p+C$4%-%^v61(tWryG##JHf53FdqY)xNlacOeIwQ8H$^6iIWwlg zTW=`2j3wnsOXV0?m-gh*&mZPV(`6B2rQI<4dEziQ^BblhMke(0yb5mJd92|==FM5w@nRY$&6TS{Sa`+}@6K`3B6$d8MfLIYbGPx*F?r5#K=KLXUR7s;^r0x% zfRHdxB8H4f($XbEyTUmzX}zVDtsD;W%fe-U!iLn+%R`eAtzv>c zp;M)bgKM6QRs<>08XZ^JYSm6=WoFgO$ZU|2Sv#j?&-T5$cFvnRY~+Lqc`Z8Sc1Xxb z=+!2tbJ|H*W_XMENVNDM)S`YyR)bKBoJrG1=Fb>86-`>VDV;JYDUgVS7H0)}9!`rK z&8ePKephN*UNE0C{f0c~7Fk9X^t1fbK~A2kUTBzyn)6+!f8Jbq$|Ai`Fu%;9y(6_y z?lQ>>1@r3}h|*PBDqJYVv{b%e%nL2^&z7M**Gl<{4f8_F6kF5wO>M0l$3>VITIQvW zN~~U~qoSap+D_SkxIn0yue76vm%k5x89{(GP=BF45l*&O=7A&QImgfr%F7^Be@;m4 z2ts3THR_pv%=bDfMIb=A#88~@N++dAuI>e*Eh{Z;N4NtrHcjrV7!V5Kg;F`Y3vsUN zqMT>3-W2GiU5T)wt1`FJ7{RV+@2e$>&GfUem!XJ#ikR{OTmYHH(ZU!$ZLLsG)(ccV zFPBeK%zmgC!A;L*0qcw7cTR#|zaGgd_yHqzL+--IbNBi?5^wyII&YsE;*2vogKFOitW0qb@5CkZZWrPcy5b4Ej-O%1N@k@Iv z6M3Lz!*u=kJ``4&&{uf~h2IM;GO9oEH0`gTCR~=cK4i-PK2YiT0g5Ktvc1{3g}|{3 zH6#(?bvr7At2OzxR-~(!Ylu+#WT0ZlO`sPhim)N{fOUr`AI4l3Z1b&)p^#Lv978F= z5_rdsU_0dR#QE6zhgq^0V*A!m;>T^!LN?0VHBDcYM~`wiPicxfc5fGa?Zb(s;s^yM zWiMoP=?EfxF+%aNn%+(+`qYt}P^ynqU@2MP?N}B_RaRv5;wT8?re5f9TSrsh?~GOu zoz>q9{q5G6(C}lGLoCk={q6O!#PY*f1v)`3Z`%|-WdgBunxHIaHN0)$3`>NfiAo`2 zZCk@OKam&?OjO=u3%v+Ja8IH>c1=K!CAvY6|eCcsvvurbn0;+9hE z7Z1*#>0X@Khx4hEtNG}pofmq=o~hKyM^lvzBCF)Zp*?FlvAi^0na%2XQCGIY427f3 zrZW^|0jT1|soiZRvCN!_ueF^Qr}pewL|8XV*~B_~abUNcO@uMC6%_mN_Ci*iIW$hg zISR_3D-Pgi78Ny0S|hi?tMC+SpJ%i%{$o(bCf&^L`7fAtCk`LfQWZb$s-XFcjJlRMM8LWtNnFOJcL%V<@$EK`0%3^a77mtP1q zdx6J5+r2nRE3P1xoE6G#u<$BzD??+go*#nk49 zVx=NJ#X0G^QbOHkl_>D82=mUywa;2&xwcjrhc%i7ug{l=FzqD;Y1zCpi4d#e1m^OK z;uy=VQzl^N&q&o>>u7OytW%<4arI8ei0gUl(jV3<6~&n5f_0DjIh55S=6q8>V+6N>zeG5_6Zc*0ZPRs{IyYV(o(T8tSp0EfXK-`G!)XTE%%Fisv z$I|q9JE+a39sKEMBL|ayW+$=S+=(#xWS^9(AK%4aP`|bd@}aX2*B&=^Qya@3Wh)9s z`ver3*-KM;b+1xgssLN|Z?;a_ZWP2EXI^30EjO0hi+zRq-kcbNtD>(wpx%BOV&Z<~ z5u50X#Cdsu2rCXK7uaN91j-J+N`!(}m5Xe=FFajue~?DVKd7{j*dQNF_@#&GDZVfQEGJZDCBZQUl=Cj7_qE9#*+iY`QTJkX6k5oLV>9x&Ic=g8RhCpPD$}u z;gNQlx|w}iaWaEX19A-!l4{1^tb`0P-`dixG3rHBZQNzPh|AN>h8-vrctpwwIdt?f zxNG>Tr0Fxy(%|dPDoap(-G>{Ul-G#T?KH;LnoH*>Q4&ZrC2>&gpCb$mBIT;ZI0i&$>FrIdoD zB78qD65+Lr_)1#(VlgpqhbHE2B^G6VeYnCoeu*g8FM*S3zGzs=-=#)1o5bH@*}e*h z! zX}P>KRGi738&{)hmale7@D-kdC3x9U!bbUk{_;gi$xgHH+@8=>@Q!+4qP72@B#RpGs12(*huMLCL0}H*i;|TAE+2gzh!j5 z)yN0*SIc{-@ylf_wX{UU4@UaYr6UX@XmfrjlTO>*~Za? zuOYlVKP8^`KLwiT>I1;r_!;rM#s9;``T+1AUI}$`Re2pFWvA(1UnLgf=gLBnMf>28 zwd@O`?EgZ^=i9z+ik|!xHR|w{@-<`|w1JGTiO~IPrXx-O7*V-%Ra{FBomO+_(>~ z&KtrVezaXQIH&nw)Od1_o+jzO@-D0CgK_-feHtm|fwB}en0;`?+4_+Bz4TDY1RC`L zF8%!rHLCKf(w9~6!FsXiS0Zfv6=&=mA7F6IBO)|=r1W47eK1@Ug$O4eDFIf^2b)EY z-)NkCn?gNermsS2b)|b^Ktd$Qq>a`HzJ6T=NCisA(mNDYk$JFzT`GBKl8&r-C zUN)!$`Cc4^`7shp6_ffp>+J&?zGEUnm|5MA34;ae4KopLo7D$+Re<3#HHRrG^d289 zSY?FQLIhypGQuJi90Pp7!qFP_(Nt3pVwmw*yH{2jwz=a#q z%WymLjY-oR$x3B|A(7|4@!mv$C#2zMeQC2OO+A0n(km4Zup2@lYd1T1gjV=H1+0G zFgW}8fVR4akxZKv<~YEn_~3m~-4PO%4#(TrfdE^mF~%3aRXN8cob>=(;o(H6AMUsa z(F?Few*Tk|lHutQNYFLeH-oa>@^%rCVAFhXwFVpC66W%b5nQ0c#Pm-xw2neYWPyru zoWfq2TGr#Z3e@Ag3Xa!Vnh%hf#_1hR)#An?A1fS>eZb8~tDB^+iE$V(S}?}(h|e>? z^O{(C%)_yct2k7EoVBjDq)?r-qZLsM+2)&=q8G*y)8078_ZWFXnqE?g9`bCLa&5$l zn+1E4t&(-Bwiou3h34|6Ft}{|2^-MY!e+i{oRE2b+?X6rP`Qrwd4dX=H_2~=16(3) z!^k8RWy<^ja@UiHV63eE&6516erKt|+vqi`sE^qMzYLI`OkYf|Wc3YX+x8>9MO+G} zpa`mZm5uZR$R(u`OZ!w65VE>oKrCV!b^A&hzRbD4h0u!9X}jm8tKB3ZMmQ-QsZK1P zSBD!&st=$X@`5kS%NZ)3U+@8yC)XgB4mB`Pf8RXVC2JC)b4~SFr9*=4s&#-?P5BNo z;)>}@<6WZ&x1h&zj?`HwD=q1c^usrKO^zC&*E}xT4JLs*!v378!WuEf4}6%2s+{~+ zHZw2Fl$BMhf$p7GE zu4kMSYv{K*?>K+Ce|WjEHM5TT28-}J5Y51cU^!W40e)^w}6z6aUQdR}ZVNet_S>DE#bqHrktf zq|ATbp=_l24b;KR=Et4hb8f{MCEzc(>;3n0t!K^sYN~#(A?>yDjnrsSuI^X#yA4(3 z)_f<-##&}i7E1dzR z%6pbwrd7rbhF95X`F-h4@viV2-{2nsYWOR|J-G$7JCk4TJ=Wb1Anct=Zgo3bs;K4e z2M`7!iBZX|1+CO;Y`h;>c=GgeycA1T?b`fJ>gs1(t1GY_0E+2t|Fs>m>V)1E+aX#% z(?(r{Nw4&;NvCznem)=J`kuDL1MvK8;vB?7BW38%c8N*f&`zDhD)=j=>v8Sr%V^zR zy^G|GexT|Bom5EZcmaR)AsyA^ptsxIonOt;{VLSk7f|6`9$j*W`5+VM||6$Q%h-$>+?<%wly2yQ!O zCyVx9d3{}T^=F=8HrL>s;)l}pe2z?^PbNzj2dg#s7eiB2Lw}{K+B;5MFW4nG9P8Rg z>U>LY^I+3RqutP0o+X_Y*Oy`m3vljK^k=5&d%Ke~x!hg-h1K=fOwr%zK`(m0hq{{O z_-mx;o}RQ{cK1|EMAp?09Nw-su}ti(?!>xRPt{}k(C%yAN38~x$PXYsxi7H<`l|1< z>Hc)+hW&`JqM!O6tL#rh1=Rl3?c)CGV>nX!fxbNhLjw&|(_xPC1AUiG`qM$`i>#r) zD!qLYEbwmg5!L6J(79uy}cYpuU=h#%Bv{1pz151Hx*P)FP{KjrEj5r-pdwI4Wr zT`9RLzE&!J%gXy3!1!{M2p=33r?8%W!1Pwfh%ok;xQ|u!1ExP)`*6Ogv+6$oINFvT zKaL1^h{$?n8|2?2vg{*zw)s0@Jpkuv)(TIFD1}Mi=cbe5d*}eT{@HK%zAiZ>uECna z)Q>MYLSI%%0zXY~_tWA|Ci|iAJ^u~-2Vj;%hUPQk7Y28ZzZRw2;jbOmO)VD5(bg{D zzBGTN*{?E3PJTThj14llZ2ry&iyB5-=FMU1_sr}E#yv2c z2%ijBZ?I;5#EpiH=AUX!0e?%s8KFjrvfbZ77pJP_^*yp=wxFhDV&WWO4syMZQg1VZ zA7)>);oG6^X!UE>+7H#F!Wi1TO~~tzVp%*^J;XZrp_w!pM}%SH)Gchd zABu@Go(MI^tEX7DzZK-~_>laaphA1==f^cb`b1*sI#E3+kM_6Fr*xDmvz)jdf?jQs zdXAOzLovzkC?y(&(B3LPS^a_Uy5|39*Y(;jK9a}yn>|m8Y76x<{eXC`EEim|VEfT} zTidL9mDQHz=9Q*g<91;7@$y6zL`dczJooNx;~(&^BSoJ)O*QbHl=*KFdUP62`?-F= zY#>!WQ75LWmq7r`E+ZVB0m3{#VD_4s^ooaPsvolk{ywSts#!D(hi0keV7l`6PC*nR zvD}@lE(8l~&RD}r`kFZ^(xH`>%;CsruD>T7^5+uYM|0JWxOnYBi=D*s5!0)GFb|Kk zzz=0=UqOhgK>ZBoBb2GKEpmB2wnz(qE_ENNf4o2~XA zXjf}UFzpJ)qvZdeYMX(PFC4zL?GuC&ofYg ze^p|g{J2*95Duo8o!>ob6=X2?4@=b(meRboS*m8hnCnNt!z|=W#0#u1RKJ5j8j2`` z;qXyQYvvjxl%zKSktuxHA$&rscf!k8fKhg*eu6OJ;bGae+`HI zp`Cv^6a%jsX9-zYYr&E5b)UM4wethk|IaU0`PGev#e#n-+>8VC3J*y9(6L&!S8=TBUUz77bcjUQI=dh3a4zoGLG?Ul?4X9~TMh{Xz`BlH{V=Wm~%`(4t?*Z>N)Ikd@q#It&N<<=>cc}bohV{3@gSvBXNmY z#{r9TtpJpP8Ffihd8sZ6Cdf(vVL?2TGMM@NyjRb06Ov@%b7H9H&$H39=wE=I>r?Bu z>O1<0kXrNqCAB&(F zWrUwNp^+b2t^+y@<5SIis71}1{|&%2uJvI78^VZ1GaQMu?M;Sx9=hLme|aI6$x;9 z(GmMrFYyC5E1)6SUvDCu>n(oBY6MgmWBL%`L?5wGt{PCda4xS8L~?da=fu9^-)u&} z0)O{@)N^q^@g3yB4ggb+8A$C`4iw*Ha|0$={s$3Z-XQTZs~Lb*zsF#L1ak+AOYr4o z1q}bSu$Fk9c|Wa|LlNc50XUxXaXV$vG7ideJPsvsknMu)pyo!cr!ZVF_AxA#OJzGZ z()4V`mXwt1(MFFS5n~s0n2?+T-SkMQmUIVG^Zt=n=n~Bi2C@nE>36%Fm;&8qE`r zvH<~T0>6a_6$`|}EF*v@iH{5DMV}OivTRsl4^&9g`<$b07Mv4rg)#+b0G)Q5EmnJ^ z?o$G$wT5d5etan16>oK~?x@Lrpb#Akz~d#qI;IZZ!3n3{e&Si&8HD=|QXuJh=lr92JXO3<7IWnikY>86`k`{u za^Aen^p)`s!!7n7L>5mKmk2KYJ?(1xd#EPbhsB#LraAUo6te-Ab~4hZplTj>X84*)?Q zYDa@zX(!!gc>!SM^X-Xnr@eFnlLCmms{;|Ah6$7;i$Z@lc-ckBhjtM{~SIA2wdSKO!%M9((7z&ATw1j=|U;E&U8VJH-l?>0QVy&a%l~2 z!N@7`{H&Q`_ROu1_L1rD{73}fYQq#u!d5}4~@C5{S)$ql##WY;&)QX&ILcCzuN$Y0~aP4Q|5IWUwtdS zi`@wShF5OU#{T4%$i09Az`1q4CzgKSi=VT^0POGeZxhRq+u|JD@da{H^e^rZi})kN z$*@3kEi-T;8&AFgbg{; z8zA5|WK0VptZX5@9-0F&OR&wh?ox{_?^`;WKQuixHD?nguXs?*;t&OxbU^^fQkO$L z%Tiy~KLA)s*q}P26rD|&bcpp0bW78JWi;y*4bpz-y#a*Eeqf}J=69pCO|mr%bbT%c zqau;i1~*n`EfPQNFIc1iS^!oKQD`WSf@H3<0?=tPRU-6KB`EYl07}iy5am5p>d#sS zpwv{?Xxtte@?kPt0KO}~ScwvAlfDJY>JWeylX;zHu-A2Q3uA$HY5J4vH0xDvhy$p2 zQG{9eK(L6&pV~&0o70zfc&Q2^!(L#OP{k20R*h7duUE-@8PLf(*wQJ^uGJ3(ZYR5 z?gkY+&?_Z4fHw**k}k6*0oSO7k*fJN6hsDjk41OZfB7 zXU=hfkKyEc0scM;B`TOo@iqLscL5ih9g!zNQB`*=>t|fFf2{aE~4QE z7fH)unhyXy|D+QoqL`cIn*@eZz*>afxkN&R>(aauDO^Gkx&Q$5oVCQcVJ!j-m@zOo zT`yQiFT7=)G!Tba(*QyTj?J+o8OG+oU{u;~qZB2w%7KBno!vxD*KU&LisgBHmLKT#eW4ciQv83G?InK@o;^nvjbZAOMWYXF#kqJ;=Pi~Jp)55*McD-@Z(SwUy4cOXAqe@~@e z9;tGMi~|-}KgCXsI@#qzNTC)0#$OdiFMco#+5M^n0Ph<(h%nfpEns~DaCf=pptm%Y z(`u9*xRNZ`9@*+@c4dcUllc&075Cx}%PZ}aWIpZRAkkD(P~r}taa<(EhR5S84jZXO zhRQXh)YA&sh@hCFZ?8vVy;Dy+%|-@cU0;~2*3d~Q_S2W@*`oTupBM2`T*Y`Fij{h{)-hgBUdVaA95zaKxzF@-xbK$|$ zlzKhiRBI^OJxPH%&u)Aofl3zD*P;z6&0GV7!!O8x@=XjhT`1AS?UiI5dlhK9olJy@ zvix=EI}vLGOE<Qrd(N(*P%#A?@E<1}Cyu zxN-m?i6tToOaDF3;b&8VfW)hZ5!0bzxN7Sfv>~cyI1#oFckE=Hf{6X;Il{p|`+^aU zO;R+MEEe$(!Dd97ghgscWvl5oW2F4GSn6GrbPc)Oh6PbhV^ANOuEl+{W4MS6CZy{v z`VnPZKg}Ys!NGXg6b8^ct{MJtzgBJ zqL%#U(&UyJGN#oCVr$lEMI8NFX@x8|2*CVph@iCAcCnd30Oq5uY3OUMQE0Es)Ur&_ z-cjE{`IWycDdz5m8|-g+nWPKL_z5uH;8B9r)AWg>>1hI^wHvrk3jzwy9ZN&KJXU*) zO%1}`M8ttB#!1ykS_ zGnrU=Pu6zv#e%K5jIu9R+s*0*VQ3!IjaXdWwACy;2;ZQ{?)-uD#@)3$tRRRBk!n4N zBe#e43Cj#7A+uCZdgN|BHB(vH1|e6l$J_c?{n~l;cgr+XufJ%r8*>aVvy;*oAs60c z)eWAAAOb$cIgV!*9mg!kkMPk70^x$nwcgY@j#LRRS3gDXIghr-oOzC8tWq!==7|C# z3@C8SW*ve6w4a6ue-${kuzEoN+AZ^m9%$E%~XBV|aSy>>OoVmePxM`kAZR*d&ei|GE1icj^sI#=A_!L{D>lbFx^4^`L?U7i+AfkC+o=cPq zb2W#=qJv29@L$Dn_3vA$eX2) zkjA&2uowx=%8g;of?W|z`UN&_4BU*U0(M>f{!$G`<8rH_f4x}C0}sIDfAiG&U!GP$ z;7j890{vheep-rI?i2*ZTwO>rcBoL>hLr-w9K4KPe(^GGBSQUyz?kXFiPCMkwhfNq zLAZoGUO`hwKR6mwc5MbT`)F3e|eh3EIvUmvKGN!^cyY!9P3cNyIT-d zSPrbCm%Fk~LrmzBIl&(3dTs;9SWtt5PoL(+BQE_${ayR=hq_YT67=I(CdDZfYKl^lZbNG{q-lv8^l(+qA$ z5D>Hif{xI2Gp{z5iw~q)+~cE;F2f-bLBv6r`Tq{kOI8VLH$&T1tRmPhqma83p=nmr zK;sF+Rah!A#47x$jd*H95NLIO8*&%;xQ*>=O!0Um32IAWmS4BEy$C;!;J9>setR1~ zrna`X9fw^hI2QAFREyMScck3vg&l3BEG`J^DU8$+`qB9?a|#GX9@EJ-3)4Ru+0r`E z5a!OdrH+}wQGh>XrKualMi@)`>68} z90Bjb4KxW~ZqOp3PX%FMf3%S(aho(mQl|!CU^i{$Yp^|ItM;rY3c$o#ZLnJ2bO{r% z7D@kJ6$D?R~phtt?B$)78(o|=+wBhiwzTZhs3;%z_9O-A?O>RfUQCW);DE-^2S54O6u3ohwYfu7p z{s;b}Eu(6{l;Er; z*S3WBlDUwp^|r|eJoO-gg+mNZW0 zE0v5Tii}3GT&vweF=U}-3eBV&-_^63Omh66NHYD-+sTRg&P&Ppe3o0MIqQ_Bie|9+;Z>{<9)oLCUi> zq3y>vA9ibHecQXqd9=}@o0T-LBG9fC_`ap~^nd!P>Q&QX^6Hf|dH(yTDDHki8ynLj zW>if`ACHdrJsa3sHZUIce+S0KX#^x~hY~}I|H=l)9RJe|TbL19nf|$A^k3R|jrA#!)BLY&g3LMi$);CeYAKOY z{L8lR7W=krV{=Qy6o22X{KxrQFS9`ZKbSZ@xl~;-R=Cx{@b^dCHmeh zSkG$Vs${8e?qkYlM_9JFnM?jde2xY8qd*^9;{R#=-OiSkJ#3~~{CPaB~=S$iwG z@gu_~Hdn~yYungRShXZJU0*zw;KtsuwkOCtT7qbZeG|Dj)jytS`-^3iL}Se+k$nAY zl8uRmrOiu_sj6Bgne%#NO1jJ%mB1YEb8Q+lvJSj0A@IusG}R-X%k`uJ$;=cw6?;H3B-}pds+iIDa?s_Rz3GKuRk#T9!;Zf*I$l>Wt@CTunxNH-gvz*9- zv+qFi8qtxJH3t%;ti#Cg*l<1fU~+l%H|k(=uZZ#EU5&WV;JIgz0<%FH`qMu+n9OaR zHxDL9i4j>@&dOE5L79ufV-sNvi`Fx9qQRk8Ih?$ZKayIxD$i3DjYK}t(HY_V^@M1g z(q)gtC7pAca~jHkA5I=AhIQ>aJc%9&#x;I0>D|h)D0DZVG`X20Gt)Uc5#0$?)UE8d zsG1ptdmH`D(&Yc7wQA)|Pk8o3k^G4&NAm$wXgth86n+ZL=h5UPVVRkeOX#82?>9>*kwPVTLTj}Pp`C(^?F zt4l%1h-x6{UCt!Gnv<2q_hUKa#IRSi9?&MK>y*_>tYy4;qS;`aj#!l!kgzRRye1Au zlzJ_CJ!b+Xf#OC|0Ta8ivlwBHqBqB>`9~LVuB_n>a%NY$k67DP94XI(#bs?6!6?4j zb7MY64On!f!o^+3B#8%25b=oxVpGX^zbnlCr;ii_B8&ER%sE=59mS13TpAz-up_ zpl84m;~~eyriHlLe<@mx|14v3QO<)Ej5-)_nmXW1S9WdJF3~o{I$!-jS%{PCs_C|2 zm;6-v85OkJ!4#BS%{kEN>{sHz-o}M{BA^AfX6V!7>wy&kSjNtyEX|O&z4VuxA;;m} zFey8&MM)UnYq9jvBNN&qy%a@*YNHxT2Ic;-X zmJ<83ZN+Wl;gxAyWtX)k|DI>!yS+X!!eG}Iok2|hig0OahN39$gQ7;5!}ooY3SALuu3U(r&SuQbTc$E73v|#IY9=IYiU5HlU#}L42%c0(_Bh>~}S{YTvp?>rNT% z^lomoqP}RSmFdetFR#>5oQ+G==N(0p+|}<@;CDhg079<5zf!q$ePOgzsak`~2F?K` z%5&zZxH2If9h#xCQJ>+6_PQfRnv`+;wd1Z1B^Im-rLp0QiH2B}=nzhXROc7M`26u# z2iEAUU+iJB`m4V(PM;Dh4b5oXv$eZwi8(Ysc-g3^*wD+yJzp5^h~bwj&uM>$xQ=KXd?Ca`fAA($b8!UD~=WCC1PLK4asP36LI| zP41%1z4-B02c*f-uidj)O24ZlMT^O;ySL`j#VT|aY~4}u>36k><)Nj4xeu-yn!@q; zJ+W5E$OA*(;Nk@-et8E6Dych;vgqRZDgK-Eqh;qbHles6#lL7L|LxYD=UGAVyfpvh zT^te>?dmD92E}vJ{6FvEKS%EMBJ`?w4hL!c=MVSQ1j-s*jN6cJMO&f)&w@hjX`<~Y zt5=L05fHf?QY70Nq^!cV)_RE`!JCo|-k;gUGms2QCKip^ylh@E6#I>g2yjVb`*g#N<*AB}2JCmS1&-eWY?~7NwYwxwo*=Oyweyf~WwylO;hJV*u z6Zka@!;NJaCW&EK7XP+e*PyW%tqrTqdc((zMp4Wg59;65KdJjc_oDU%%`Ek8^$10= zu~_&@_$rzkXWY*n&gGwH!y0XiaEj`*x_qoMsZk?V(udpd9#$0|%{L8aYcx7dW~FkB zGRf&=SBwaU6hjU_%QugWI-H_PV#5QpX@`fYdn#1v>i%5@_t#_|K4=`6YEc?1Ipfd9 zr;QtouN#jVD~%uFpJ-YI>A^`^0Ujh$LCa#q=>DPu?G>dxsi zc?UOp+QczsW5&*8yXow_gPl5d+RU;^V`s*NpYG5wKgrOTcXD&aPMA1)_LTCOy7P{O zIEpxSblI%2J@l)f6@&TNR?coz)kXhiF zMxDk^n>C|6b_ze z=s2Enb{){KTc1L7YFM7J^&il$ptyIR9Yt~Rnnx>NH-2WkZ2ZNz;rZ0me-GdtVSMS^4h$fce4Mi&1ra>x^C@%p7@Nh?w^03_&1@s zO5j4W{KswKHY)f#8yTHwb%Mb`Pd3*k(dwJ-dSqY?@1@V)bbF!~ zZn~diNzWQiq|1MByXk=++|Q8tHLOSn{RndLkM0X(cnu@c0k=UeyzP#X9-EemwD}#7 z!|%9v3et#8OGMf~Pju4-dE!x$ylFAI^Fa>J7iW^mn-+=mKQj48zW6p-xM`u6zR^+i zL~nHz`*U$EH!bi!dO)YcnMALBke(>`G8tcHbaEGQ9ZLpnn(y7%P4v*S^$fjf?@<{_ zTC@OvWjYNPUO4o%(;g=<7N$wX*ov`@a~e0#&S{z5xJhbmlh!#+TQ@uW@T?HW|E_6% zSb23e8(wm4rhcfVzot;rUDHw1R?|G3GrHs9_Fw&=41YdJ7jAyjW4yAdFW%GTO&#&~ zmz#1APr2ERRlgL@1^Hswb@ePgfV-lIEjQXnKoFQA^ zRkufH*Y4FOYi6mwRIOA#P|j4$5ndp-Nf-W2-o>?JPcTzy?lQL3;R({yT(Z)}n3)ut z1@G8m%Qc!ZEQ~{PSj2F_7~EsPpluleB+eXIEKlW^0gi)x$ySt28PCs zTQ$w;UQk?=FU7NBxV+pQp1P)U_+q(-NNHM6ciWME`)V6FU zKV2<`51^sx$~Ixclz3jP62s|J+~GG@is5Nf+VeK07=CVwn;vh+&L+|rg%~cJ>JD#Q zCWfDwTEnOEVz~JjBYsox?J-EVC)^x!h#5RTH)5fOCf9ZuF zUhj6sI0J{$;#gc&hS9L+7(=1HuWqz@vZ|wUoq`HmcsqM8nwH8PVFh3Jh*6|ROI+^gzHGV?ws}~ZM^yg)qjsmcBk3Y7 zYvwZ30}EV6&N+a#TIza7@Yy11BHdq#0q09yzmnOJRFS?{2J&8+>l|@KoFaW|6v$hn z@a$6~^}O`1loz`}w$4QEY?w^~i zqb1{9?a8o+-AlKP!{9IE-VO_`N;-G4)<{#wyS^YJA~td31T56*J#8KxH^DWJ42@Xj zCNuqY0uJB$KH9rabj>CWA}N{l)I_|2`|oRc-m5n}geCPbMy;WdezWdX?dRHfO;6=U z#U~0;=tlw__)c9!+QWv< z3LCeD@77tQ@pe!>R}z+v|kY!N#X(;FWrC0?ulM1A`>{lpBYelY2INp zOe-c5D+DJ7RGIYl5xX~PA3#oWWM%;OSX8g*V!|iC=*BKdtRPOMx z(dVyaOlA3$aNAnuD^=2n##(-6xEWoOueH#Vw=(o3Z8kHTZfg*qPi?m{R`Jck zP52^-Ar#~$F~-w!f+Fjw)!z6ozG|TX;DM;0tVUXbDOnFdiRHnE`$p=j&Zo@ z$R9Jl*jVHs7B$F8qD0Mav(=%ud~gT2{{+P2Zu{;ml?SrLnu zt{ec3dt`uXCrgG$%px5=2m{X_g$Bv$ZdKFw2Dzq@;)qG4?FOUc`IohA>DIxn8Bm`I zBDD-bTbm)S(_~>JK9j13Leu09bro|YD-!3WRl_m&q2Vr`Q_1!!9yf!k&ar9iAz4dT z5=l2w44>NWrdL^5s)y&;e12Am81B2n9iF@6EI(z07ysW9E_piP@bss9QNV)*5q z?(mhJAL$c^;TAY#SvFZx=)HbUGtFzsDJiQoTEcgB4d=6ldc%d!c%o$=vph#6=MXWx zcn@SnjsBy1#`0|ji{aG0ZrbQGb_0=;28rP-pnm*}olYe0Kry^vpF6y5pPz3zKn#of z-QiyQ!*MhF!}i%2`2yKmIZYNSxl9(mfGMCqUSdBWl2|N;FFxxIKYUi=yZ8G?O&WLy zY~{)?*d0V_-&YLxIq0T?zGOEMsk}&La?|9?>}le&_Q5H{K?iBBus_$6k4(#EG5V); zQSGPdCaOk?eZmp)6u*@Hoz0Ssyq*=Lf=Gc#pF4o}Fz}kT12rFXjU{}fyO%CLh{NA? z&@~K5ASKexLtk0z66v+IuKyBqq^pO1whrXOb*|fFMg&^)-g->&#kblv^y@9@URtDb zt7zBnv}J;yjdb?X8)3{A7jX?`2@`={owfn&gKhvc9LjJhY2HWa3i{zTR!LvGp`9rN zQzIR{bmm6L+lcSAgXzc;i!%D>MwgX?kU`NV*I@L+TiRxH>t;9%i)vi+Nm&FsckNTS zclsw_#GFsKUL~cG4w>}I6Oby^ldcw!B93KNu~&3a)m_%g>bOP!{zG%_v3A%kAB`!0YX?Q`&$?E# zF*(&ST^K`!ezEqPW~q9!>XPz%VITiDcN>^DXRXx|E?Sl#NW*L5p( zz++c`cMl<5YM?CI{o(e|KDpxH=xcwtyRt-A1D&9}5AN*y?(4)`WAM`C2XGPd9=K%~ zRipRPxBdeC<6mwQ)ZWw@Al8?zfjfSu^3jnM&+g3 zzrmLOY$JB3E1Fp}w9i(&wd#iMWP0VB3?Z8Lty|0TJ+Y_fdcRa`M+Sgm_gyHs;QldEb)&U3}Gci)B+0t;5KnY3t!*&AJ! z&h_KSm=#PWJ-ZY10~gnZ7yPrTmwIW-J!Vg|bdUK1mN={72Vy}(1)A2f^6mk*kIvK}QP z!t2+SX}?w%DR%SUgZy8AmUpO0&ZM6yL~oP@XyHlgnj|lMN(1-$P55mban~ef(qVe^ z2lV11P6!%nV1xGD!)rWu&pn>w7uJ~nk@t97_Op8+X9QA4JOfl+E;i01r;m-^Ii?qe}SV`SFLhDPgP*UOi4iXfFn+KaUFW=QyJ=W4Z1 zC7Bp$C(_I4} z+`3KuRSorf?#o)96k5K*HJVI_OD_mmquNAI*Hs*e6nU@&D%ld7aJ*wNv@07fP zA@}(?TsBQDiVLqRQVPDAkw#wHX%&>zOQb)~z;jz?;$@7Cz#0C1CdhiTT(1xk z$rR}qvp^cU$9JG7dRWx7$7~lR%_Ckf{dP8{)z5LQVd0T_GU>Lt(2}R;${wjDBGx@L zT)lXDVu9-}j@a#`hZkbZ=L=mnHYQMJ<_`!|Dd(Zai+?GLJ9f9FU(u^cu|re5mroX)qOCer!?Kot#e z*6`-3BK<+8&W_=x5h-^HrWpuw-$3U|zV&2a#6h4&4svebn@ob|EK`ob&eeRqi7~gw z66dMCj%jH|V_I6Hf~j=Xcgq$pvG#ldxpW2m7M^5Ax z10;>ZjTi>bKEs>~c=uS5zAsa|Cvi*RFO3oD?BR0fWbP>O&l~NfgGM+#(WN7t=UHR+ zC|EH^Ei`h&FWJ`AmO`_pam(YSmSz8Y0WKAccKSj& z*UKuaK{fL&qp#Gwt7)tXkiSTCzMPFR-^zFSJs@fcTKw8MtD739b9+fs3I5ZO^Hxvv z+H`Iu5K$)yVFvWqL;NHyO^%lq^D$loaN-#VCgLZzRM3zR|kNQ*M4K& z13qX?wAHOXKFIA7q+SvXG#b<}bg)GpUwy9Q@S`$>^oJ@6pga z#4Tjwq{)(@7Qg@%J2O*gS-Zp}-k6z9KdAZCO z513=k57u2Q=`Lwuxo(3ly=~peCaT#}Iq``@D|cGC|jY4(XSnr)zpy&Ge+8D;NBYBcr^u;0-J={SDU&Y%fyg-S`$r?^~`k z7Fez{llFew<)tIlx_)%kdb=um?rqo0tl(c78R?~~--X`VqSbYe{{60NElY$*NhV!? z23qIX8P{;G*3h#J8AGv7q2*K`D~=KiSI#z+pDz(;y*eXdy+b&R>=?8t|pC;*%;a*zuA=awt7vC-V!H2FUh#oj2!@Tt4Lul>LKfar6 zHI&hw&%5e#BqcJ`OXnZPV{AX{`iUi(ks)46Uj%*PMHj~b*AGSnD~dz86?J`13L=9t z>6xS0b?)%^R5?%)83+V+4E%Y=5Xj1i`6o<0#yDE9*Ui=>DbEOFNfAGgJI4IP)RT%N zSM0r;=^>>pp03o}_LDABhL^T6*gR4D^W0|KtRyM@pPL0YF84*Njp~20&cIbdu+9Gy z#CpkL?wsI@mk@1>Nm0shyH+U&K$6DKr1Oq&w}e2MZ9U(pZOeJAZ8~e)McfjssFlN9-@nQI zg}M4l4QqL5ss@wAy~FL78?zs8%oA+SlD<-d$J<_cx0Vs6R9>}q^qSLhW03@d8f%Qb ztTAV}eS(xP!K_YK;h9>#$2}=Cc^_vQp~f5SD|sHD?fm=lY^^1j)vq)dsM6XtkUR+% z6^HMMp4Qqn)mqd9_DdO}aT)BFve-Wlv3E*cMHJiH1x#-pJs-iBb*V5yTxPbYx?PJ-<)873i~*C^9wp~pQfSh8n9UwC#M5!E!AhR!Wy$rLY_VVjaVG!B2CDEd02&}!FXzN2pO8|jPK_5@H%`zlOtsjXE^GK%izu=||Qa7oU9NnnYgb7hiDO1*xHg=+qV~2Jilos}dxG1aR2b271V4Zh}#Ymzw`OTUyNa{BW6@BuFj^ z@Nj`0jLWWYOKKAW%el+m}{60mr1Blrf!@tp~1nK|-YLay)`cv5xX%$Zh4wu3C=-ZK2@rx_+XUZt`V# zq9=VBa1y$&pWvmrqYW8ENRw=IjTs?9vXitSEfhJnCn}{!W{djuqwImB&YEA-J z)-sZoes0nBrfY{nqh(iS909^x59}dTrC8|w%8WQ_NYZwpC!4yAv~+n!C2_AG>!mlB zXLzV78BvY}p^QFsTUADdYQg$3I37e-ZZFTM$4_J?($=Ajk4fY8KqsbZ?6OUD#tM!! zUq1@UY$deMJ-c>zw9l%H7r7h*VyK3L`YpQGbj`IZ)U#C`6k);4f5JE81mt?<0PCYa zko|d(^A{4$G;Rd$+>pE6ezHWGi%9+myn(EH+-HKXfiwp$a|r~r(N7$~MRiECk+;kP z!{R*KJivunuSEKfBtfcxZ`Bp-TmRs0VmXflba}Wtmb=*9<|DiWcsa5FWXS_= z1oEO10Ooa>*7vX-B{~TJ^K=i8cY4^alR{~-hhFMw6QgV|o2M4xYnT$on65ponWvth z8lupUUVJCc&y>hOtfLS}i_G^@^8*-!whvr?%61WF)cS82kkY>azJ&;m=e|s)J#<|W z{H-H6p7{M1Gkxx=%M_jC(yfOv?-`k$Nr!#~W7%Jn5nv=N-tzHcy8^6EO$ zgl}Cti7o=r{mQp!yZWu`I_Vvm;i2z+=Mtma>+3{BLt}^i}1S!v_fJe|5BO3O#JxQAS1QGTeq{70l#^vx4sH}dVk6ZY$c&R>Kq>06# zdnfXeQF8mZe}Q%yJ@2q3^D@T0QEXdA>iZC{pVA*95$SL9!^Ha-k=h1gaQ;ABfMiQc z@yccL&OlogbT{Gy3kQMRJ_y#LyM*vS-@zc~4z@i_w9=w~CEmd2wirPR?fkcbG*ntx z*HPs%8Tdv_BRayt;|lkX7Chb|Cyd(E<98x+Ce4R`HViYXo%}Bm zd14Emuayr5s@qnOQ@7f}^4Y;SeYXs>PQr!A^1&?SJZa0|a9&$nd{FSE``jY!=mSS@ zH~#=g(g)Bo(GPl!-}WZy;e*B)6u@~d4cIbR%z)J3GeLA8^kTSF<^xI@SP6PWCVvb7 z+6R=*#UdwjKRd7RbfsFgGnQ=~a;3|;rU zHH9Xxz=P%afK1k{0B3Xsgrv96hILkgT(r`*J0`~Q%w`;54xh$umXB{{f+YId#-_`H z{j#`iOjgXXyZ9>PVydr=NJqSe@zZkoZh}FMuYU+LC`skS6;8g;FQ1g*SP!r`A#U%bLR}oD;m$8UVkP3Z0 zWQ!8}&caVcjl{e8{9ZE5SKy_)4r1jG4%%eIo#gADN#`80d81no*~&SR zNg7mRp~8HSi%*eCOk0g*9?Ep~ z>tvqbA6wndOLufMd!pxGC$HfZd8>h&R(1x%(KksE?avTHQcHo^L-S6P{xqk|q@IvZNY8wh6sKuI_CfLfC4^?k$;&FEkG) z#_FbCI=v91YYNSiS+k0{$ml=OEz&Mh*H_IHuJB(o7v?1S0g`~y~btAd|N6h2t}=N8#5w9k(Kouxn8$_!0?Q~oh=X^4Io z<1+UCg(&H*A8l)(ZtZyO@Xy033lsYtKR0plxC7WEE39u7{^s*#U#e&>@p-Bl$q zP7B?ao^hbuPkw2S3j8MN_b(R}HG$#8WM>iRo4RB3#_6fg)wwIGqZ_1!b_%wz+d9Xv$Thka_A=^%Lp$EwOWBE9ZRDtg0_=bSscmEBQ5o z)V!*wjy->s%-*~T5|4$EXOd}Oc@-r7)izE~G`gDa#=2r!nfaSBCL1Q`ujriWBIWZ6 zw;%}#BtitPfPI?zTYh1eaArQhk^4IM>S=oGB9iV~DAMhEkngR-Bl=tV7I8_PS;ppr7KK8&ml*;(xsJ zy=%5^B-J+u0PHJF)b=abMwM?ivJqcF{Q7LB4H_!GvCTqO-3L^E<6F>i z-`RF@q^(az^*2CYy7+-m8khjZUALX@fRicq1HooH(f{WT+4$G@tHcePaFXYr<^#&>J zPp3v~vj_q| zq?+|^c+u>6@k=xOibd57YJNCq`!A00pTLI>VX+guOuxv(!nF@AfpH+RaUkXz(jo*z zoF$mu(Y}H?0a=OAqD(qofsET)h4~^+3PMPjP1V3!RK3clae}XJ2pO|uI%Lc)9LGuF z{oFw+dMw`0Nj{x051Fy@D{4WKY&tx zJG>|FDcN!8?gvKtO{N{~?N1w3{+yU##Dq4j2|d-;ZlZ>=L?yl1-aeW%@;3sS?*Q(( z9qb{&-_8%fv@Fk#DAF7J287;te|GJ7`9?Tt-Xwd9jEncY#g8CM{QysAI%4qMj`ks> z+@FP4*a_sJxA_7=%JBn*pOWe8o$M<}fj`qj=X8dIZSHJOXUTj&VEB6j>#`r}K{iqw*bKm3J!9vIR0m9o9fWNH3ev9P#fx(ME#C=e<+iK&+>(IW-t5Tx;t_K z@8BHoplOHFpA)1pAwbgnHdbJyeERn}{sc)0;jsUH4gQ+zxansyCWNzo#K8WCKaOId zP>z?TeZ|#Nrx>vTgf5e!W!p>~OD2T?PUCA#8AQsKnnl-aH+5o3Q3ydg7#It^wZjxg zAM7ygC-p+Ws4^ordNOXC=?|=fgMPHmg3qvy)GdU=29uk9xy!VJ3=H9{V`FR?H2V^N zNRV2F;Ps#h>YPb4F(#_~oL?^w#IeT)=I_D4{1BXz_$LLQDg-AeHec@n z^gnw|Uz08&gy&w_XYxeLF7umX2Gg!%YZ&8j!)1Lv-44xt%EAVCx9v0nGfPVC@pOJGNL*Wgb1yyL3Os+bvPTeT@dM8J9i@Kd;A!#`UjhW^@8+d7McBuwBKt&+WcpFP*s$1+nu=fe z9?@;Z_LeMh`{53J(I0~z{0hXde3-v;CaoNRCw^{#{V-2@`#X8)xFNVMtA^M;@ag?< z2aXN}|K*|ffYRpAkKGR4WV=n7Buggl#>!##IfVD;;dF;%^@hXkpR=iY;cZ68Rx-vE zLtFhjy2ILQs-w!&%I?BP++r?{t(4#EIF?qjB#s7`+O2fkQhTX#l79f^hi|$S_F!$P zy$k8$M=8t2Qq0Si*&Td5R@8amsM{J@7~c$kv4>`i!EPT2q$f+3_yHJd#$vZ8#zK=! z_5(23$AP@3Bz-APKuMn%XP<^sK>dntJf6DQc>7-*L<7j7`6Mt7pJd-l;`{&(>d82{ z+{yMEWQM;tBDYh}ds|O>A%x@aCDMpYzcR&sgpBt06luNp6P*eiisu z!DlNeh7;N>%_|zasw3IS+u`SQU_W3aSvikH-E{RZ51n5MExxVPoW_#!YCy5=qs(U7 zYm_;j-YPQ}kg?T(Vl79(Qk0A`cOWyW0mZ z_A#&=XU$|f#CTx!0OT4bfMH59If&b2t?rLd%_Pi_Kgm1`wHE+h+xlb84<=#FYgW=- zSRPjmm!rXC%rekM#`9!QHBR&7G>rMK9?2#1tAW03lf5H9=R0JMe}+h>uEn7xr;)xy^iLP*4UoInrXhIg&-Np{Xj+dWe>I)-iz3U_ zlr=Q*%V?ywgw&EDN1qTV|Ai1b*+o{71%9|5iz1jY%}x3X{$~EEUV1-*DYm;wx9Fq| z_HL}9t^Z%=!^8%Tv_8Uf0q;NfvM!xtVCay>=_# zj%h~+Z?cC0Z6;>YJDVUh$u;)lEOGfKi1gAEcK607?GNLV{r@Jqlag#EhMxbzmQ1%d zATtD?*$=m5+f!JiT{gKbLmK!cFK-5YWwX6BzP(=#E62(UktA;dWsI?A65HhEhGdg` z*WsshxBwGM;3(O@+Y4KOZ&5?{xB%G;xU%XL%{OtSyN}hml%TIpT7Wg;|D%48M*wq zbl)M^QOo0qEBgJHH2ugYD3+R2V8Q$^y5R`JPH}9~i z7-ZWz^0mWQHa`S)j1^$Vv~Zu=9WkLOs9~rzJmLz(?buL0T#_)&!1HDe0q~4}ZQuS083Llbql&eo>H!|H2$ITFYJp+uF zw%-Q5G;W*S#ge{$fV9ll?|%v46=wp;=2ax@?IpQAkV6&hA62ci2B8X?}pc zaZiJN<q?I4VQM#R&txadL4trnZU+AG{c0se<+hrdp8yhFbt=ukkQS!Vj@qOgB2COuOC?I`%C`wRUIKtY(Ga zxN6h`K9Puqx5ts=2=)|KD@7Vi!2|~RVzd~*a~{tB!Vd4z-mFHq78KK$poOT zX*HZE)(+Y;g{&sys^LVvER$F4=6o`|8kHq32d3}kFdyX{dUi5nXs2JHU7`6{{e!wf zm9FfDk2r=3+xe$aD1KGhT`m;o5Ho5TKtkiuqxM1(M91b=!qSwrRrEOmfhnnQ|p(*g+0*M5Oup{H6S=rZjS zdjS~~Fp2coCm3|?6Z;FKM<4;^1)pNl6Q9Psf&kuC%q!4d1V$Shz`GiK5!|7R_LHP> z0Pm{zC6IqDAS(s`qJY6m$>$i|;B))OP(!E}q{5fz&-&6HA{_!KAUXOay03m|r|ibk z1VZAO<&ceKB#m7zYhGl$JXJH1@mv6P^ZYX6Bg3j@WYS%WOy1~+i%gAqIpP76huDsV z#)2i!rXk|dpbBO$JKYI193%mpMa!yks3f->@>os)v(u_z#nGh zyPH%^iP8VWS{j7NDtQ!)T5Qx8Vrti;E)p&X14t!_XYa5JSXMsSD`ZZ<+7bqCcOsxHbl!heJoq#1&_ zx$JbNJ#Da!xM|O;_T=coZA6U(XaMGI`ZcVze>=&c?_9Hwk8cuaCVzAzXOoQ%r<_hG zYizYZPEceVoxFo+@eBn4SiMPKW8B)W?K^Q+O@J-G0a@~m{rwoemXFtlDWv28{M1I@ zqOWw9jAON)`qh#b63b9`=v{xXJKJkKaJ= z%{`=8@YM@sBVqMD=<$1j$K_I{f3*Ys@_YMYGA{rZwd5vPs`in7g2V-~>H^AlZvyzR zx9lSfg97y*H?8sSr6kAlg4O%U^GIL>;IFp-0W*w!mTZBg48T!U{s=nz06_+0X#k$; z1)2WyNBbq>4ZuVF?6%z<{rk3E#U_tojOF?VT9rnxUa2@HY$h!CGxHy2j4X;>$&>)F z(ulhlyy_6?MjV0sO#0znyw1N5k)LrM>HzT3-Jj5JKTN(B{KeOfTam8#1G7B;2i%ysfi|$xe}ZiG z3T%I{A^?!2xexZn_wA=SQXW8d;^AMQJ%8J~vj%;jCEj2R!&)3pn!49+qcsohlTkbW z|MD*XKY15oVdJ37&yh?vPJYdokrfN6V(Q9FzgT68r>)PE!=z~lHuhgt*KCz(4H+DQ zosGroV|=$)nGTa?A=ug&Ut2fEzPH-6mZXJXZ(|C%>;gdy-Wr0zjg7M*&d)b)){>?* zcABXDV^V@jju2PZd-6@puyVR-9%&pxAQQ7fv&=B9B90JZi?In}EcZW=6?fw*V9*%P zQ=h`DfkuEaMz^1ZG4-l|IUkMD&^42+f*gZWT}1v2yo>61_g$=eIwX+KNGdA^#dD!vhd8P%hRdegCPX2sTm^7(EWE+<4A5-=B zeA8;;sR9Cx8O>9dk(-14n^iYx$`!J{wmg>|h3}trrRx7G;}shIS6*VjWJk&IgYGQ! zMbDTDH`CVFkl$T#4Q@zk0N;&Vig$RT%CE>g*%}~vvU)4-&z`SkYY`Xdj&FZW=uiEI z+`xV01KmWbNp#@zkwnL3QWEHzNfVMB-e}wFtwz1x?q>tds3m{cEO~k;OUr90yK&t>e_ro5H{QNf( z7M7O<`ef4SUaa)w@8l>?76%IJoQX*d9PxBf1IJ)u3-pGXY=AL;H*m}$sz9$yIxibT zwr4xWa^6h*kcDB2wwdN-RjJ~6p)+@t{fo(b{P7rnQJ@s4G6(zUmE+jUl97RtC{W79 zl+MPES4e4~1f{=?(XHVHlvVmB22hyVv6(}RP89@HHTtsx!@cxSb8vjFKoP$X7!VkS z8oicis8$Kt9PAB3C;vw0u4;s0p|VK;g{LjrfN5kKhmI%10tlXzx5u&@+B;q%xdEiG z`g8y}yMtp5KE1ll7%m$GolAXA8CCqISRfo0-29j9Lgu!t8$L8j>L95-X}NOGNuR%u zlWu(=WlVfYQ2yf8VT*n7n$-lx_uf9Mg>H=(gy@+ADb4Xror6HuCSNlAJYTW{UzG-N ztB3oOfy*tz7*vf1ajkF3bbKIrGoUgqbS#}Z(gEwYJyGZ{NNoeS)wx0NIFp2p2?0xB zv264ISvG@Sdp^OWOiMHQ3VeN|*OG)EaaKivMes1Iu=1ZNf)@q0BLYY#lvSgl&@Q}) z%IX1u1+`{14FzCLoZ(a7S~j*$5omTj;W^oMuVO51w_&rt5rRkWr8N)q82km#7 zE$TI@Wy(nk7dglOz};ltmd^_H+^M0-ne^&k0Kw|NO~0YuVM$1iuf#TMN^>^@7(R74 zQ4V$V?oE$gHC-g7Az;%5UzyT*rd2C??3(Eqg4+{3aubTLzB1KkNypH5FFpG;g3N`Y z(1VsAO)}6v-!N>+|m_ywLnSo?A9Zum^BAuu>(`RDbe z&~rbeqzH^Z#h(&gk}KqLq;JR^3->$e*(QQ2`dJep6B=t#$b^?ymrynmsaPtGW;YZ1 z<8}`ZCB!syI^Tk6LC^b4QIZ>iGZX{#D_RHu^i4zXh8~TM$Cs=E(!`BJ@QGp?JuL{0 z-Y5i@D8>UTW+XnrCqxgm5|(3ymLYgYF(0L@jj$ddFa&QF)5{qGhFQ3fI@$_X5nKqt zscjg-NqO1{RPd1yyxLeUpr9|k(N4H5_?m{`*go0_9z!c>qiHKlx<>_p&oKr`_p2^V zYgeyT>V$^;J@z*9oGe>m!Ph2e@X%B5r-;!@c>)R?mj>~T9{XX6Cz|+iIqP*nR1dPoq|asUH>|E zcJ%d>Eo4|Q(MyNEf$sMP3aB3PwF}|{xL4jpL;b-xGeMdWG>i1XTNp5Lh|rsszn!uy z-V`+bgRgDbPE%U#hsScc>&T(PkAmMAOz=?cyEyr|!-NT#c62ZvCw3asYDWldFl|K; z5{9aybl%aV3#}*-&Y%=A2myQW9+nz2Qh1{Fy9889=w8##P%l=#LaO;Y++8MCGEpW3 zW(Kn}>8j0~H~LJe(32wzgK!KEu+Y=VqlJ%=Aqm1UIKY8U8Y4^>DjNjrXVL;57U{(? zxMPC9Lom}z7bu|jzZox3IrO|~YHkfkkdt#BfBLd~H zm9aqi)e0e(EUoSZXS6SRbNiZylDz7k9=fJ4;{C^`3n^@zzk79$N99K*o2MB)KRdy! zg0x6&I!NWw2mQ?3SgZgD6Io$Br))epd&EoVck`4!d3{Wu09VpA|jD8UQp zT-_Dlq7DMX`MJWN+KQzHgAv;?R(HW=9gL2edBQ}&=cw+CP{$C^4dx5IY8jUdG4CQn zt2=qAXDFuZGt_*TCGD#_dXV73zO#p$lUdTD8op1#2&4xp77MF6QO}-djLZ$jaM4g- zzfkw7&ZPNOeN?Sh6)JWJdr29$oBf`-AVFEe;f5wniIW(GKbP=i6B~pgsiO>Gf!D^+eD6gw-tcc2yRYPMci(c*zlMmu9WU zlG#=DQHPw4A?Jg_S;6nEf*2s8oI!j_pD`+BSS9Se3O->h%=}zKYaDIhwyq~xRi0QI zUQNUFC||0sKP2 zO5q7XO0CKeY1;IZbY9MxK3pj*5TvXsge9;nzN@Qmt;C9Hb)+#1WJXnLEFg~GeGrli z_-!zWr>C;4_v=zgpE1TxhL*av+MQaj#-d79{4U%kPtev9c-ORKRan3bsU=YaQs}>$nghK?KadU&kS8vYs2k#w&ty@jucn zfVD}MCP-oApG-8-xQ&89H-))t#1%vYeQ^ZiQ>pN`e50B|`)t4jA8z2z;0HT`2qip4 z(ckU~;d?Sai0Hv{n?Uw?5=cxk2Xj#hQUm(^CxvMUSqG8he!B+4Z`a`Gbd1Viqes}l zl9ZB7@13%mlok{bbx9jWOScHu09}KKD4cx?Q%v3}glj(rXXi5dxAcrQPxGp#g=)6q zZABAup8tyPO>^$*chkIO>VTRPM(jCZrdYl zz^>R}2i)sDn6G4?Fw7t^LHR2Yd1(exlr|7QI`HxyZWw7BM8qI@FCHgvFNZRp{2(F* z7x!V@!+qRSq(u<9m96{HedmB+wMEHs6AKm$fk~Woas*D-Yq0wj*2;{qaY39LWq0Msf0O7RAZ8SzMthLEz@J?^!o# zoYSHyJ^P}7B3_nr5N!}{Oe2D=NQZ^7vf3Z;zYZ2pVmu-|LCS;uQP{zO^ZXH^z$ht# z_-z9DVdawI6ng$g)<%c%Tq&6x>=#?hOj}eT83mv9y%&WpsJaUFty`+qOY&0MARL?6 z((lA*W3Ugfy?_N~3*02VK3MqA{I=S|R4cggG4_I4_60z{#QNcYO*SrtSfE(nd?P7Sj4F=3M6 zFABox{78*ga_*S02e5++LS^sPqT#HT8_GFjppkipF|IKr=t{I_wWXTb>J!S}m9vCW zZUaYi?vxTo&Z*;|5!gUB76C5St*QlV9o_t3bD)>7EQSTW279*~F%Ra@D#zDZ_ zrPuMy*G~%w1B?&CX~Pj`a1$re&1ZyD5QLI{1)=%>5QGtRZ{z6q>^MVCaCohmlYh>n z5skaX;Wt!nvg&A$n`{UPt{{B5Pj6x2hqu_i_&IEO>tE3Mj##gS#&rJ4hSv4! z`c-z><}lf`&su9LUDU`LkhL^oxG^nVu{Nfq0l{MA^A}(jpy*TT6#cn%)+e!Oa$Wa^ z_28aV1prpm9N)X$|1}XmGu5Ie?Gm=Wh1C-uU;Wgl(9oC)nGWb26h1{_Qvr*`R?54G zm3*!$fc)44+`A~?bAhZXAp2PVYKo;CRWhoVbEVmvV8q&Qvd$xOs(`yNV>&;8!Eat{ zvYv<01ni2jov8s^*_Q%JC9|pwbyL|c%MX=U1xO!bl8s&L6OS{Og$j9#!1l2%UVGB| zL@gv@wfIg4Kj?Kt*HAl1^QL;f%BmcNT+qk(UT{6DmDR^}LE=O60rw367A*|s5;8tC z50P>M;KV6|SuPChADW9K*Il>=zuh%GN4kfQo7{KLg!liounlmnT?nO*bN`Emt^YM` zWD$Owg^$vI0sqKfOlu6oLNjaKCOOibwlQo-Qlv5Xh%i5D{ngZzCEY^!VyEA4a2n_T zW&*e~hNk1ox8E`Rhnv7XQgNsP82%5?OK%CNOXNc3hyncxI_FQ*2r@P_4MjXM`Na>y z38?STR1aNvAJe`4qc9ZP9~zp14BB5{=y69lQfH%EFoq3=2D(GKZrV%Q?&=Y$cNB!v zu#1= zX=yV~O`jUcjS-g5307p%W_d97C3)P3JkV>om*#YaK56)?Kskey5S;ed@IwRHLkgWo8+&rEM|jB;Z$c~ZvkZ`@1=h%h8jp)!d}5SbCn!EMk#_GE#XjZDP>o(5Xd&LqOacI zWIHWC&^Mf7xge2B1W(rV1?!7_xsjwva4BqLKP;8kkJCYbf{2?G6{CAjF}H?{4K5a` zx1#6i znp%OPYkd%cK7KIhRfAy%EWvpQYssW@2v-p&2Itm-2U+cTl1%j4J~L2FTAFhzu;V(d z;-Mfd3?eiNH`qe6K2B8E{*XXH0ewZM_!s~^hzRNNVVLh_y#ko#jie-MH{jbrUytCd z*p@xfFAR$GM?UjD#@IzaSNE=Vw{ncaB6Q*N*tX0*`BK8kH&o)DPyGPu{6d^!f)HRT zb>591;IR0LhaN1kU#DEbq+1;dPrP@PPvsf|OXcp^+ z%T$S9j~hH2_C%V^CK2MOgl8N>QNXYo1@Mh&;&gh}ruYpyrxLO9nEJYFR|Exrk4gb? z$%R;JyF;-9Yqh8(Fqw<7)>NlrT};QvF{7a4Qx#5jl>7v(VSuXIBTCu;_pY#k>2)%$ zs$FbBGi}=dF`m}hrc)%Y3ScOvgVAQ>P#`igU2#*8rc@!1Vs3VL@Z-Oz2mj<$E%j)C8(^Tvdz5S9-aL^%NOX)f{bgm7RL8 z;y7wms(_InHLYr9JwXgrO=H_ZiDjnZhRgw!{D|XDeGKy1tALczl+MqG1N>>0;#WZ$ zTLrYdy)Bmit%2f%Oy|_mSF=I;hE<^s6l37qH&irXH|8V~lECc8apfp7*!}WxEk#iR zypUK?!i5~gAd*_0j#9NW=;Y36<^||YtLwdyW*&&LgVegRg9+)VU|3WQa~d1_eL8v< zRoAN{CuX2`ShXXQzL^2{@5c;tV+4(>?RA6uw!lh@s$oQ9gU`26$b(@-V`NcFkc+Ef zLt~W`XIm;z;LxrbVGJ=7#-T9N3^=>E8dfycAJ+zxEv|;~jFD?W3PDpfq8K-`z;0@* zn9QNyT-U$5eT>~yM|vA!r;Dp$He;jrHZl)`&w%otw{(lOV>R`Z`xWg`*wL0R;&!lm z@R6Wg+~X!wE3sSXySk#OiabSkv|-EJPeC}>j9}j-b1Gr>hn0YoO4##;`jtsBAR)U> zwoIC~$z+k0t?c?O8p#H<(uB&yT81RL>K)b|`+2@gC)qbJFEBuC-gi!6UVSAVCHy+( zeff3v2ANn12(bJe*7bkbd-M3FiavZaCz<3dX_78ENxHW=U4hcF?|XqlOKB+u3KS^& zUZCu2(?Sc)o&bZ02%@4Wn*tHp5fBAg^c59lbH#praKG-Yhday;%jKYca?^-^n7oPI?&-HlcOX(Y9NL|>D0hZ zw80Q#O(+DVrx9V(ovZmpy*#_d@XVX)K2?*d;WzLh6RRX`Y9LH&c9uz@xAQf{G~qLo zKn*$$?!{orYm$^HCWu> zgb_2YP&1n>sKL4pT7`KJhYuuCHCWccr!xiwpJp~Z)fH*LGe*^b;R`;VT7ZbUVhscW zFpDk0z zp*2t%Zyki>M}wFtB%~&}fiajjR5M;}3#oxDAjl}N!{oG3gIySWn-0^AB~xm!3okCf zfFupq^h6T7FqpKJFg?l48tlU0;tQJN-7P_w?wK_*vXvKPFmK#YTrjWSFyxJ|!Nz<#Cr5`d-9o0_8A zQCUsx)zvvQ;9G8=0huwKjoQqR5jDMGck>a*(v6Rz_LI>y;H!hc5vW>EY^`kl1Kq}G zFl19|dNzDk-R|&Sq(x0O+|_r7rv@JF4u_xO^qL+GU5$S`9PZ|ChxZ|^YPw?<-v-V& zFka(Ek#5fxDcyr2ool+L(`|dg(*idqXhg{46*XNN7?_mFnxSNJ4UPwl00J3J)?{Pg za6CL6IP(-uE~(0@=}4K1NK=s0*Wid+WK#v4Q#7!tm|TM+;;AjyZ!SHS*sRm~S zida>Vibz^nu36e3b3CHZzoT8wf5I1WK23$1kmahQsuJZ9Wg=6pI3knw=K;-YOK@n& z+{36}l+Tl>+99Y+-ezyi)Xc`tsU6&q?lVhHn`#H4%QCz0FU0?0mS%>2Y;DlwIw)d@ zjHb9kRI%*@8QnqL{Mty675{USr8l>y=LbVhbKMI~U#gOxPviApkRVQKB`iB<9U0?i8e z)o0cAOQ&6Wqn4eEG^`35vs$<%&h9HWvs4qytSx};l__XkT&ZbXZ(Mu;G^L_}YAl%& zHIS6m%)+NmmSZx>8i~R}`fy6rL87Pu3lQXWZ%mCEh9o$EVDe!VY}st1Yrp~EE!fOe zYYw7LZ~#F%b#XfC99%Ok_|!-{mBW*!e|Z#aO@`Ni3BW7COo3jw9*K~YD>QI1R@4A8 z2P@xDBUc_(1I!#Ox$HYcUw-@__&+Ar%JZVAfx;_T@^CFmR_SYins?V=4;OrcppHFO zYHp%06B_z5``bvFW{z(ta{XHrxwuNMr(X>O08d&7qu%cjgkwR?*oODI*kx+kzh=zS zG6rRj9`yS6k*|~4HKS9g^9L*)mqU}Uwnf*JH57}wiTaz|jGT+nf*>H+&9gTnhhcS( zZ0JIlA5o<6$H)pYvSvgoJ^drp0(X9lY#Y>Z;ItjD(BIYlH{=WLE#VU1jvK}vVq-Lm zRP&YR731ZV+?EdYXmnt>2BgvFuSBE<-n$af2^%|kRUuTPM}gM<@BwD8Shfl_`jaD>Vpruqo0kn+1q}VFehrzjtp)v#%A+-ORo>G~gA&@u zh*J@J;g|!T*We}rPpy|l#%$oXQxUTm60xdpa5EU`h5sN9K{udE&*_NUWa28wd9Vwg zyEP#-v=r2 z|EFE;8qoj$ANJ_~W!R%6o&HyaUa3>)|I%GR0D@3$2jM+o0DqG&=UDc2^*+*3sgrGJ zeq^ZbxF&)|%`!#>`XARIdhy)4i9klPjj4e}Cp7sG#gx~9X%Ean#he@Lv3f znr{5`y3q~g?kzyM3qu*6E?H>IA#>_Le?C}0 zwMZZQLGy{aDxnSsif<*-`)_LgQdeiyO~oLuk_UN}5dzV^byLuo9qH9}ql9plb(3+O zf&&cKw+>^1%7S}16ncX$TARepP#-0k%wuLHV^Fwdnp#1Y*wOl^;UW~lcfk_PwWIMH za*{0-3rK|>Z6j%<<)w)AV=EQ&NrruDI{l)kwCYsv!er@%EVM!@|$L`9NSG# zHY@bBaYe#c!z-=gy`Q6Jqn1n7#;Y z?kuPmTf^Z$IyDtam^~2@v^0d}0%wMr0A$BIaSmM`W=dW=+;mj-028sOV}p7Gcu>nr zLY(cyv2x>O&ZDf3H(`PZ~ z`{8U?b=APy3|Ybk$d$M>JOj4wwP2lqH$*yRBsSoTW#B1S8QGO&axHkMr&#z}Wq3~# zQwv5a&4$MFZQ*~AwA%FGyK!q*;;r(k@G3IB7OGXe6+=T)VtE=}4bYxaoBFhmx}ZYT zRUK|4idwKyK}_MYumDL@YQaaXTaMZfFAqP3PXil;p24YM1xhcdl^Vdzn^7#lOlmFI zsNm!DXx0WGRSP~USX*^%_%OUJ^HDN3E3E>9F(d{9vY-}xR1nj>y%M}EX38X*8h@LzYt)J{d8nHP;X;eUw7~NIym=X(tJ7`Equr z=D%vMDw-K36OZl;9hJz2(?!ROQFLn}+dFXOn6VE`5$!O@X!IUP*+_})E60T91FyVi ze1Pq4$41+H5=8X$No;p{AsKBsb~z|fP$>n|0E4Y9()8{r(2UqrwmmI)A2CHb+94v? z{ywVwA{C2i*M~+n(DbyiBPfPF9HG-cKxvxZ@Pyv_z}OpGJq#w_AL7BNM)eQ&k=Ay| z3MQWcx$!qu@GKvfl?Rt1HokJy#bH*7&Vb`Uu zJ&*3Co;O~xXcg@g`fIu$bgVXs|B>6kj?~Oo9bqofgu7}pwz0Z8(%w3awz!M-hTSy+ zUyZZ3f*0*QW9r)G?7%?3UyYM-IfA_=RO+W z)S4}(ckde~k#_dxX|(hY48*E7Yze*khjBmYV{Zma>j&u8$+ql3+Epv^H2zQHDbmJ{ z5W_$IiQx|Y%NPb@L_4Hu$q(^zeg}4N;N^$LGK34UWB>4fqm|6RjR7*-o{>U-l9Qp2 zjpsvR?M>?W8_0YRLDgu2V_{-q^0;M`|Ht^ZNvANd`20)4ac-ZcBUz>NG9NHHc}w4e z36;Goh(gD-Pn!l>e=?r2rZ+;syNV{Euzt0c+s3cWo7Aw zmxPEwRu6U%h+C!|df-|D61tO!D;d!FjtF_F!As+NVO)YEc2pz&%BVPd2b$hdg#R(j z`_NB#l=rDBrZ;lff^gBV>@MtJceMt*-OM0<8n;!Uf2?n!n-Q{Bdzt@;Ys02!I;uyL z4AlVT0>xH&6spzL`F3!B8$;3iQ=#Hkh7{X@)MtjHj?DvDIL;5Y1EeEu4Vtpej1b=< z&FrwANi~WH;9wL%eFxbA%S%PPQdi8vv1z;=aJ;Pv=@BOJm`-QU`FD<@X&56$2BY@n z4`zQrY!^E;u!*T+9B-BfB(=~sEl@UuoeViRZ--dpY$U$(j}q(_c! z#7WlH4&jD8e`{kfeS_@T4b#_3(TW}(E_bA@y+^|guZu;Id^ah&)%S!#!9 zBRJuuic*>uFMbs#AoQLgPPa8AP4KgKH3QWu(n+O5=8CCygd;Rg!!UK6CZ2#5X%jox zI=%&FC9{PH1k~LQT-ClMDj(HSe1Y_{k4~jbD-kwp3DWB zt?VCYsIQOf#Z*z)a5 zp3NIJi+zoh+ZQ)rnF|L|u1N)pm=R6vP}wXgK;th~u!t7b#J;d0-G4UHRRin`5cIZC zOj$dJ9ZGi=iWh-K=EJOZE*rJByQrnx28cPNtsM@O_XprJ}FEE)IO7X&WR$OULr;Wl9#ZTu*8TO{C2{ zQATe82Th6tv^z8!yz|UTb_=XQ90mmCiUE(=p$ex=|JaB^GR*;U{qN`fQ^odHS5J26 z(y1v9EOnQ-h+_T10M8li#R@qLTCixV)_4g`4lp@*0f&}WNz z44L5IA=~VUZ&}_`>`qt*2al(oSP5NLv4a9Ry~I_FVX{Mx@}f{6Ok6~4q(r@QBBSWT z-ePvxEJywILJdz4S###@a0{K3Bj%C04mF$-b5QfO9AMU|4)V<4m-G>PlO_&T!&raV z2V))WK*;psz9PKB`-;C4#=+o>$i@5DT`b}ybap5Z(??Dx=85YX>DYmY3)ohn+Z)n@ zU&*7qj)pae~4@qFI zVDgWdVn0kH;8xBoJe@vE>``xB*T|9bFOo247$RatgUy6Ix=$|m)hux)Y3l&`Dy%@V z={mL#Jz635MP5=v-cJpA9cg9-k8A0=$>B}U%*I5&_8eOl7&u34r^MG-)2MeI7R$5^ zY%fN;ytgB<0Yp&Omm;qDOiXNCHM2S_aP0*)UYVfNG)It#Yp^2M9o8vAx@ngS{kb>U zbWL}44{)Z}WGHonq1QG8^f$dFYH04)Q35@*L1bynOY99Y$bsW-+Y4wfWeeLBLZc}T z$ZzFYSbH0rcxR=krb}L7PX@!?*vcL4pP2aA#^5(yCPy=$`YL-6xDo;~hBgey&CfmtJG%!DzIZ14eUlLArB=$OaZ{V|mPeJ4fr_B#ZQNjTlPb ze1r9?Z5BK z4v_@7x7dR?Tph6IeDWkBaO-V$I}W;bj_&F8xd&ep_4MdoRudTM6T_55?SL&C%16-s zzlvJkfS?Js#5T5mfeow05e#YJ=$b|!ufhB~_Ot!vE1|f+lC@$hSRFdx^M)6#>Q1o7 zs0du8GBU|>bWW#}asNi(kAp0$YLIZv1t~kq#xir|Gob+MrwAtFhw!N{9%cKGWXAyL z#^j{o82b+bKRUpgg>AvcYt?B&;ND@;fcQR+f)rY^8D(a?$3kdbcS&Cd?nXNPI>_h6GpvO5ln9EQPK$OFhipLU44%3vTiKAE}F4^O{RJcq^W9HN?{BkVVvfG^kn8uYXUv; z5!Qddi|lDtxnmS%u7Nnca!w2nbo!VDFCsc{yuY{$Gr02;c0!=(Zn1{pvA75b10*W@ z-$I|Sy#>NB$^l25fp4SFi{2KY*@;_lU;8jXh$8e0IQoYsfxql*)Y~w3OW) zL(}Q00OtEnKzt7O$~mB|2oApe3P{!z2ecLa4x$O>D%&%p+%Y&P3W^7pP0Kcmv9$au z7Qk4?poYo4ah2_imx>!+%DKk&#A+GXuv+$AV{?MWpgP4QxD4Pjvn#MmTFPG0+<M1wcS^SH*iS%+T2yRG3AHBhDg0r&&Fra~ggwn9v;(Ai(n1?aC zjqkttHH(O3RcVg72n~G^i=orEY&QMpC0t}#_bvOjx;oYYG|=^9jKbva*f}5!^BuDh zoct4fC;tQcF+qWf`lH_2)uN@3e}EW){ZyPQkJqeJYP*C+Ub`g5$g?vO5vng?9e?#1 z$o}om#Jj2)jv4aHG4$`x#gKsTh4=yRhNJu`BobHy7Q76h{=O{Msunq>%jFRec$mnA z;F69Y&Si>hy#u?x6pI)cPaybGg2IrBn?1XSw9yU~`tyCcQ0NLGRo9q=t)MC}RqWu@ zq*LJ$=Ca>C7WeA3cEWOF(_Jj5Ymc#<_}^GPMy0irJe%vhA#cxiPT2Eo`WgeWT>9s>D7`W{ zlb-%b+=XnQ#sA6f{|~z}XptF$yIAz^>)sBTqb(K`><-Nq^&;}3YK?L%f)rI+FRQC2 zIH8Uo9%4d>D2D6GkPIi7Yq>vAJ|!lWC`tmibtaH;jWZNr}y|=_~idzcB*3|Kron{)$h_cfzmbt^Z<7FXMl35prsuX|Z3Y zC4t8G#U>1iaSG4mn>+QPwm-x_NP8y`TX4YKH?3-QrwJ`vwxsuTu=IZCf%p#zb#l)< zRz`H9H~tiVCas)oFgrPLN6#6U#_}x4L^a|}dZ1)*FaiFQJgvOflcbtA@v@P(<)=rmdqhqNuuv<&-YrZXyKO=nZ`nz5#{ zq`(PxmzE5k4rffS!O_`ifwDwGl#>`@3ZqSlsV}|;(IgfVl<9Bb!a+a#I3Z#=phku> zlG}`onNF}Zt5{_0W=*hCpX@XONb=}XzgX^sx_Xim0+i_jo_C7ljy(wz`HMn-OTS3h zT$?VeZR zFAQfhNMI6>J|=M+Apms(IpVpbEH0*{iKa6o%n8`o#EKG2lDVJBG$+6!zA%}3Q@Gyh z&<8k`80_fcaLLQrOM zH&b+)@o?#wr7*P9)rEWzV&u28<2AF$RZ^;2ru-3?h`h|`6tm>9$fL8eIFYXJXAI{>bJgcrakW z1%rdh(pL;NAl|VS_?Qi?xewIKdpHr?ZC^{Q4sRPSN2c0Y0j@0v%d_QUoNd$TzYfzJ}1IN_5gAY)e_?iOq=oH*AzPeP5Sa=9GPjZ%m@LqO&BOdZwWD{ZmX+VZZIf zfu24MkNZzE71du5!F;DMw9vh#YZX!{wBoyH4r>(Z3CwpgR)zmn%~B^USgRbU;thwX z7!guLC(bfjfjZp9Tsdy`a83u$IveSjOnuq7> z=9xaiB7?$W(tLcbcfJYoi)PNrDRl2bJpOW_$xdcCCn4^|A|ySFOt~Pg&`w-igwpI{ z(ZH99`@azj%O{Hbr zkigF`nBIgC(>X7NKK~->IQF8ci+V**=iD@!U5PfPR+=^<=CTv;KwpjYf$fGC|fqtD36d(>2FD0Rxgun>^~_D0bV0Ngu`=%F*#A$sWib*6X7 zA}7x3md~N|(C18-2=Bxx-EzI0TyGjfDx5f-kIBg&)|>J{B7x!BJ&)wb=S`7`s_x@3dtW`a)jE}WB}Q|P*BztHA#>(~*R-mrQnWUT6x@=L{YGR0azpR44; z=($6t=)g~hOeT!kFjqJjtxc$T_$JfdhDa#&R|43gTsYNDoAK;UH3$2F7#B|Sy>i;I zoSUn*aW0(XgI+><@k{7)3zr@@=gCQai^)YITsX*|--6_^EvDO~wJQV;_%CB8fAO*j z!skpEZqB{^3TDUrs;O2PCb)zr1TR7~H&&Sa=a*aP>DNr-$XFK-1Krm#{UxuPI^kkU z7YuOMZ^NrootzIGwM+t)YK6X4NJn7|Ka<Lb7(3$xC!DoZ2zFk#zXEAK*CViUHDo3+WeDbGSAp-xUp+o1E^y zhINUE>rZ z?GeC9{@ioiX+w3f%T#aDFB?%pP+1mbf){(KtxHu{z`33SyIMWRg|qz8eiP)|8@SQ( zZLnOx^{#0w?EPI(6Wl+5CnGm;oeK81`&uX5+GPv*Lkpq@O9jQrCk++MKAB?0k$fPt8{ zjVo4HFK}7YX~Kt?zdPG-S+TsZ5`)ns5zh8aEUXpLu7q@YYGS1byA!y|K3#P85jjI*dLfQT+=>MYM z&A|gD-i3oJXc)QUBIe=fMbko(;%X5z9ILlVoB9@4sa~Guf^Oxa zL8W2B9t2J4_^D|rDRTkbK%4f|>gvb6+yPxxiVJRivin?vv0+ru$obqpZjfwr`3A{% zHHDSxXQ=zH0QV{**pgg9Pf&Q}ym-+R8?=r4a6h*c*6S{ypWMqByqT9xlQ89taSC6? zi<&QG(wOK1_}TUq9$)y%^oV4+($jIXBu4JfD<-WnN~>t8FeK>*g=D}VKZR3ke$=Fq z>B=NUOK&%mx_YXsKRg8QVgZ#MGkYS$)T8 z1BZV#y@qSdUHzar`weB*o#09XcYZT9M<6Iy9_$S6qb~)gxOzn&-FV;BlUQ7kE5P8# zs+y;mN5kIdeuas@t8WS=4^TMcG?z`MKQQef1{XvMDSzVQ3O?XuPpug)2oip|Y_taN zQYt&c<<&3pJr7OuNU{s6jLb(UJ@}F7F|>&;NEJ#RqsC>AO|Ot4uAU8iM*cshcZ^pR z29>TnBwZN5Ue;V!Z&&@vT$KsK37l(Y*AN6xVa#yw{+Jt6zr&^}%_|_maSg@}Q<)(R zC+1Z$)f)8FUo|}N*{2+fZq9WTL-wpO<2J6(xFY&yPw>WLKf`SX%V)a=qGlE~lh5&F zdDSvsWG z>&%mYI$Q;i$apa!xa=v6W*E$$5nee>5fCDAv7s zlBg=f?Z#gunr~uCCgE~lD=NKZHP2*1mbxa&<>dv7%_3N$R7Hv+x-!Z91sU&}kWR-X zo6`cWWbIKgt*40(+!RA z;-WV~zf>A*S*|hlji6IvGg|pavXPZ9(v+F^${nG7=gum1NjYYiZQKh zYW{HT3^RfC2UUc8EsW%ManG}7;L5Rte4w-`sJ!(TsjJ7kfGd1i_@sBU%tsiK?W#zp zOPZsfZ~n?n4urNaza>xTEJUDciE8it#x+~3g?&fA2b_U+{+;UxM+?_X+}G0zPdB$R zA15PSuzi`(8a29Go7*yco(r*A8Hp6&>ikHs-A)%r!lgZfI*xQ8jPTir#5y zj-&|>xJcP;MW8zmm^HN0!V|jmJ5wl)X=jGpwQCw~0c(e5K5u7UpXjh}ThFC#H7K#`%{k*w@)o<~eBhzlOd$;2M!d!Xom9;R$0J7$~TLTih0(S0_i zE?&*IqeVTvz#9h6R*Ga>Vr!(SlVc4cOVhH{4y(C@WXfHF+Z;}h3Br6BilyH1! zI%AJHe62N!&^I|AcRnS%AY=MMe#-E83dwo|E$Cy;B$Hh8aSc{jtfX3o_-t?Re0TJ} zziS@+PWqy>IoG_6G;sk#p3KF7+{!htKzJb+Fy!2Pq&Mc9Co(Z-<PeR*jLVm7GS zz%?o%60ZiYY}@pKIeG1#&{TRfl82SZ5;vf0aL>PS%&ZSOI`)jJFKZ`8H-K#XFjU(s z8hM)*n>o6En0Y-(cLUM39d1qzj2LbvP#n9J;P6UO&{1mMO}e-l5VH{&)k!1F>zHU& zwL)OJD-5QP!H^~1W*=!Ls_v=cG}Pvpbt=rXf~E-Ev>LdxA(AW5UmDS_P4 z<{TylILtD^ZAuw~|72r0qzz)UA*={#O2?qxLu1TMNrhWPP~kDym@!Fwu6&uW5STXB zd>^FF4L~ztJbL6FFO$0IZip!!O+YItY5XFYFtdTJX?(V<^>72Y-kFR#O^x|p_3}tz zK9q*@8uMewJU5{0)hT#NrkV$k4sIw5hfYO3wkCXW;IpabE=n@q4fu)`0)DiW^yc zF}*X(%+f{<+{!ny8Q+8qa6>zlTY2a#NcJaskp=;VU9UKly0b}zMO-qnYrdGq`w>B>g%~k zhPCF0&{6a7xjAktlw9+W_tiY}7BayNcvU?g$v4~Z9q707&9!8qI{^`)79elU0`sS& zksHu>`a&eV?fCB0b-*If>kG~8h{+9y;@CwPxi0Pbp0sWec4v$`76Pm#W~q8j7*%qOHhBV8$vE&Dc+Mh@!e>}Qu8+?#T^BzvNoZ~s zktiCVqQiL=p{NRVM?yL>3T4NSGXK=zgL_nAXoN6TqqVOHSNIUFFPjPZ)CRH_7nvMn zj>@!f18B*7cbf*ZF<3E}{?v{Cg!FW`hGL@{8)0{~IROG>H*n#n%TaqqHs6P4uP}Ee zW88p+H7k&JB^wjEs}A?gYirCSNnbax;q)3jSY3lf-^~qqSEpJtf&jE=){fq7i6sDX zPw1v>4WYHQ=J~|z22xb5#2e`=&A*b)Zh*x2RY>++WqywIbHnWB>s46fLY)~w&9dE1 zQ|KN$9$&VbUnK3^8IYMeko+i@A5GOxb8`~!Mi7t=PK>4_k1q)vbeiJ<{oIX#I$S82 zkg*?=LBZTt|dr$L~ z`g>eN6=32N3ATmq9zi+-7P;UFDO&6`H>RCyd5MM=^393p?vBWdKJ;ZuA&Rtp!yHNv zwG`RFxk4Ul!Rlf+bZF15#^)VdZQj9P?L%o+u@>p)*P0u{9L(JXH(yY6`z|$qM8ez< zgB@FkWWr!RN4DN!p-ix9XvgQwl!UlDK^ihfZ&l?cmeIeTGygzz?v99}z8)`hE8z$J zdlROC4tZS+p_`sJ55fp{NTYu}k0z}fAa6=&)s6>6&D$U!NdWMrpQy7$bqGLk@ z;T(UOJHxJ4&s7aoM#C`_E0M!WEO+;RmTLD_^rpRDGJgnil%GnCThKsO= zxgTOfRb_OkDhn)rSw@Ia?mXD#zlwq0G>-2dyq_3RHOw0rRSS3Sv$uWf6gC|_JOPuD z^`5x}?KF``ysHIn;OnO-@%HQH|A2J#0r=S_5B(%QPo6q2Y3t5``11{O3jJd;hEukl zq6Kf7_mKte-p^K$wH*~Ka06mLtu%AmlQnWnmDGrC-(fBWVd)tx0)g62GfaRNy0aV7 zjmn>t#)?`N97G*6U7@elIYP#R-0tC)vXz?U>XoE}s*4hr70y5aZw_ZjRk9n(x9e|V zB%Yticdf?~w`THhkR&(6b;2HeP}Uy6p84*f4d?3@d(5AZKJJo+^ZLYIoY$Z2HA_IR zZpiF{XYj5$eE$Dpv^cscU>=MjgByw@zJqEOx(5Z5R+UUo;`W1FHg^|85xh^Pfb!r6 z;@>sHE~~$LVDMJy6nbR=|GyVXpC(nq+(q)FNqD7=tsQN)=*eivM?KxPh~H1DtnLB- z2O@AU{-0vp65gh^&2tyR7U~FI%RFMfsIHphE(op^022#Tu{JHPFr~YfHY^&MdE;s5 zGX7SBgtD_jw^RF(@R&QmuFCz}MQa83p5TV)sof1!KJte7A(`!781$b^ z4LGX!vxq;`!M&h<@lE;G91&Rdt=R|;-#x!!UA*xfSdwEao^<;2<$MP1^1XQ=md?Cq zm(J0eCq;rw2jpd-{P}bLkIz3``=r>DQA(vFRss<%@8X`54tIE9?R{UKq*@Yk{4Fv$Qi}s)V=c% zOvCnUfu|kRmK-w91DRW`8b!9NEk}vQW55S!EC9l5c{%3QNDpA{BNoq7*6{=6E^>4+ zXF>cJ55Vqq4iEU}_@Q#$Q^^1i;O+$;c@LiBOX_bQUifR0mX2M|cY&|C2k>{RfXC<7 zV{06FWDck9Kg><(mFGirbme;s~h3mu`3K|x{pJ0wB5NM*d7|Kx;b|GT;&9XU4~RssC^UW ztyNP?RG^@#WtS{)^#HikgrVjaU&1ks*vW`g^b!wivTh#0m$l(|axmPo0UrzaGCTsw z@|QuxE=5>o{_6u_EB3_Ul0TybHj}SlH61ltMw6Bv2>Vh*OL8Djv_NH>;DL^Aq{)&> zr)}j61D~5LX^?z*;MPnmmb5^I#geHcN)PZ0z6|$3zJcMp7G+tk(s6$kGT@H3jKtyRL6yJ8pzVj-F$+Nx#3gT8badhl9`{@i^nmX6i9?MAJD<$n z2XU5x2|A`X2CT0_e_1bR_XxZAI_^K33=*o`#r(?5R`iuau+hG|FkY8BSuFHUC(9?z zuxc}Gl1ILCN)d^hVhpjV@rY??Au-w* zj)UB{Em^2M$Ok+7fKd#cKn&ZLoZO=!W3yxu%as4e1)YZ*AZPMt9EHriJIKK)z zsl5jn@$dE4X!>rkARvagWeu6+X$2tB9EGecEXQFn?Eyx-*%BSlx3auTLOm_g>DgBJ z*xy@OZbH@J0W`eP7LVC>md^}no@P(QtGHvc>j~WD()BE_4hZcnkQgU;fC~*BP<+Nm z{7AaG16FdVClm4cI$98)ucKvBgJPC>q|nbm@R{#JGPOg5Rs1nrEA$OwL!Kq)ah=p7 znR0)QSX;54UjN!zLwZO!psi$WujqZ*GcdW?K%CB2RZ{#CoD|%g+Eu#a@;?Qt0W18zg%n&)&=O zCQ*C3;&!p#NS5`sTqoHc0KA?#NKVPIya;LmfT!<+9RhSVW=6{ZkH$- z=?CqT49YfbXyuoD-+v13 zu9>esL1wF7Qhvfvns6c75A!(ND9^|g`sOH@mtMUNu#MYLOG#S~d_TQqpzud;@WbRh zp2m!h*nv+jO`+#TqwvG8L2mj$Hc7X3T*P6Lb>&@p!W7dl0{S<0JZ!CY~W_wEF~9HT4I6P~hl<2q;f;J-{{porr=_KZ0c*IVoZk zDe(+Sr|(UQNDKTjDWVyeVoxzbIZQ>m@6?FHN;2CsFolMc^?+&D@y=OX2oTP_OO@S&ru(Uu0V9?Vu4ajYP%1E~rsv-i13srG2oAN;1 zh0N3dSEPd3RJdmf*5g0~{9N)I`t|NWRjPiNry*u8LTYKv9-NE;8d znkS3#!q3GjAL-(m2(zI`4V)rS&3>FLz;QUrqJ(( zqM+^}&ZD4AYvMybQ(cwo83Rw=VX9Pm;vp8J?2tl@!&RS0PCHK- z?r<9+cVdKUHO|gaKo294Y&ueP36YpDDsXYwMy*T8=B)^7a#p>AELF8;zEND1M|n3~ zr9BJ5K8?}?!;jMch;-$sn@PF}?r_(dj^l5?Lrs+eK5c+Ob=yF3C zp@6UCiZt&NA8r#1Q*4%p1M$M9dSQUIAt5}Ko(mNk9QL|)1|!%xOn|?+SB21mR(Mmj z3rBaaGguiOYxoK>3lSjeMR^%gczB?z6rP9a^+F!zNkUx*jlxjGQwYbLb6y1kHl`r+ zo=F%c?>mkbnT5Y$#pqd=1{O97uYsn;1Ig<%1JtBRIQaTz9>`w%XQ0%)jPN>Tv}TM#P*y4o z2Ho%4F2V**$x4WiFhONgR?2s9j#bi1s}N4tb&t2u-QD9qC!@VO1Q_TMk1NC_p+BAK zPL2v>CJ6(;{CEKXgUrwRp79^oTL`!HYGt8z(0rr`e$$z~a4X8@6rnTyv{!r|GRzCK zXYGx=+*F}2_4SUQN=#m8WR*E+p-GyML+>U?d|**de4LWRdpQKX>5I}Q8VT*`-+kk| zlIC6(a>m?v$Qg6v?Ml3@!QCePP$n)v{vMg;g={mTKa%bG$DfG`QLIxKM(W?uoe1eI ze9m8C+o{*9K34jfN)Y2v_%l^9DF`U!1#s|IB5*;V67hx%UWm(rUNf?^catsZCshY; z5}gr_E7W#XMUlY4=7JHNe70A@I{**5TYG$$$>^(QAK5iR(gFI6GuDr{9ULPoW72Vkt zE8=61HHzNySRWIk7r5n)*9tPzU8r{|qi~TT^o3L47Z&)ecEWgDfD-xTB7W;vMCApP z(XU3bcXs{G36;rd2;G}4OjoZc^EQLw!y0R9pz|8*yGqj23n=r5qIhNwzA^|Y3KmKs zblEy<50dT83_>fMUF)nHW!IMkTSsrx`eg^8nwk+G3CW)fRBcJ#rnUq;qweQW+rd6U z-oLd8)Y4aog@u_H*cC_({!V>`KL0)rHl~3%S%4-d+Y2lkER&M^zh$0BhdOv6Izx9G zu-@(5|LybhRt{DfkPnT|6JlV~?rrpJ>Fs&{kEI3rLN0J4UeSj)FYZ&2kde>||75gm zUe(x(y9WN%5p=QffoU&T)d&~k1vZ|$5g)Q)qxBSt@bsjmHu6XQ8(Tf}3r^JDUseowv83>p53-diqa+Fqg!5 z0p6x=mK!L1@-+RRMoSIv>sb1@P>6sNhZkT@_Y%r<9Pp$JcN{gWA0V^h=QOJuP$W73&(TR*3J0zG_XSD+Xb;j+_VT^5v^mBcqS@wy(d00$NJ34L#pp zid2`_*s5Y0H$*_}$G!M^U9;qH+Fu(M6?k=sFbR8J;|1)C*oNvl4n+?tcUt*?bDLEs z6a2QoWN%oL11H|FhCr+B1yAswH?gW8y=gTl$xJU;0>e&xRI8oVi!nD8`lY(skV_#} z{xAo_Y0Zo3Y2+={ugogN4f!~Nh9}8e0Ik<9yz$R2>oPLV3;lZ4ZdAB!x3x2Fs`lnX zpZzu-M~xM7>tVv!J=UJ2jkg~nd+))6%VRO58#9u5diMoAOS8ra?bTIHy?H5g(q44b zz1PYkR+u-pff()DXAPt8kN+QHbp5SR=prTv6^MQA?F(hkmC~r<0J-i>~ZcY+f(|>3rPZ#Xfwh9cJEI>nU%kn}PC>_K*eW&7` zwFj-8Nrtx<{3PYP#|Nz|Nre}Jzq&(6?mA>WN0xfwlu>n9{`AAv;Y`#nh2Ew6SbJOB znAdZi*$PdbI)cnXfb3l|`{F?x6<#3Z*N>rs^T$v@Z!ggB=Huwn#aY5oI&y@_1{%F* z?ZSX80t!z%fr9I2V-#hFV%jHN($WXB1q(bTyb${tPFi7TI0y3$q@Dv|S(! z4C?S{o8536IrqpEA2|Afbs}N{dI6K0oWaXQi$Jl0FaJe=Bln%Lw#Mi}*MIj6#=>&e zx}PC!y#t_r_z0yReq{BN>0T)KedqA_-E-Eyj77^>6o#()S9R$jW??virWaUi=hx`u)hfW0=HFQF;9!N>T=KW5x8Jwc zUhszTLY+;&L;A>f)*VXF_;QTGO?ebn3Re)3&pRELj{k`Ci$7Zbz{v&dzWygvd7@4z zk7(7ptGQ#Eg9z)Mq&%TGAn&HE~PuzUG;xw&v8Z$rvetg;Xmd5* zRA>8u*QOFYe(q&d=Ew(Xu6rCAy-zK{{wv9+L4*qpo|e6eNkCIPef3oV29ps!0J#w? z8m!%ljdwj2Pp&^mhSTk1SYQ?0NG9~bR$-C4s;dv6eJ+P8HobJ>C9WB*LNW z#<3*6F1)0+&GP}eAK+2h4PN>fttwM#K#-u-6{N=`&j+Y}T`Pfw43S=e=-sDCr@M7h zTHvxyYNE9CQ0O1%^FwxM^@#oAQ@^FkRt~_GN^ZfJVTb%0QRZCTZxj z44r|d?-$^C8tsFkx;#=I`u)O?`U3(ysxCm@6<}#p9pi)icUKIaw>p2b+vY{P>zcU-(kx%t3h~PQf*UO6*O@MpN}hxeK75-OhEhRjtV&e0RPTVulX<# z&8^5>d|Vh9*kP4$M9ubDF@F-8xgkmCk%TBWn7o{XQa@pwftk;xp~!D(QUFDOnQbev!cL^a zO6AjZX$R@*<@td4&oxFhf1eRx;I$P>MyN^;5Umet=J*WM)#oGh z<9djNqc3Ji_Id}>?mo*C*2oYW8y|EaZH+vd*%WUKItQTRZ7LNLlMl8GKQ%@5q31F4 z5J0>V4^N&DrY$7i`h<|>!e#z80z$l^K0t1(PAFF~ZRJDH!qB!Cfzta!kFa^UYC62pY{@df<@Wcw~Swnj$Kkr$Iq zs>X`OG_5DbE#C(SbphmI-zDKyrasy`>%-meGNTs{#2qWj>ULWN^5~Y{_?q*d2|Z{? zj%3HXz)R2Ppbw`$2XzQ?Eaoo+=<+7|fR}FfL21)vtl&|7rFrNWFw>WPQJQ=yj0}v< zm7rg@_*$pYnmmmEjy!3myh5OFm-6Ld&X=x%TD8P!*&oS*YakS$OlkD!HKEhm0!d?h zUA{udt3AobtHVeim4*3M@w$8-xYbo{e9%?CQXr)S&K5{vFy`{XvG7Kr1c3UrP$-{J z9Cg2lxt;p8@H%v@5k@)ituR=< zQt)NNHMAJ(x#M?2S-p5$W|Y?an35j2P%P!Ch}G8v)~h8b()UN~{VgRD%@DeCK%N>`Vnrw2+UAkCJ(uBr6w2=w&cZDA1YGg3Mf^FX0%5;91;L%7R5 zV)Hd#jR|g64^^9R-OmI0gD>Hx8eeh4+E$lgZJWxZk4RG=ObUM}LsN#)QZ2L;z9I-T z$DpZWW27u#Lm$A!?_=?C(c`2c#O#BvaNam1Ul=FNB=da$sNv(0>~vpfOJ|IiqDea+ z)YNV{Z~uLv1-&_5DkF`2Faqs20n6q$}O8JZ6^i3KIt@T8mM*2 zG-bL1h1pZ+!6MBgodg>_{T#keIT(Q>5h^#_CadKR^a`N3aN(l@Qq5L z0Xcc4LfS~C_#m5w+n}UOZ$sZC+LP*Pm2U*-=p1za1+_Le@bw&dxlHtxLd!iDuf@)j z-Xq06;LUI6A*tuIy=mcmX%a>Y3gyG|k@o|q?O#tQps!(R4_>=k{$3!@f4P;l3#B!r zy${mYf3xUOLHm>=ji!wjNsUkh;PYvbrHk;|P#+Mec`+L5v{>3p1Run(_ZMSC;+IH2 zC{4!|A*X~;KAing^SydE8K-=n*{3*8yA>e7;SApt$j>%FZl1a=(;M*<tYy?ld*Ec@8{e>GAJ$;W z>do4o^k~Z@107Y1nM?LTqWV)U<|V?S?Lrr>lKRt4E2SCSLSHa`S}eU?E5!xlm9$?a zLDB9T1KzC;z3fmYL3GsGH#(huD7)d`i_s1b^mj^ol@Q_YQWzwCf^JU8ZlNW=f{SG> z>U2VsUok%`cF9}G1=`_f;kLgC+vNNvc`;1$YcTtpF-F2m(rJ?92X=u6vXTDuk`x9l zqx26+^pjNj&lU;syOOl+=*X9) z)0W$?2u3#27637H^+B5W)|)8wMH6i<-SL?feBE}b4@va_?J{}qLz)UdV~<^9zr{6w0{Jh|sQM{~Vr5~F z5P!$$7a@@BrZv)y;j&LRtEgfFH+D(W;5Fw53<^6h!R)Cy%${zXlrm`4Nhy-vqS~hP z?px@8D?d~rC}O1gpCnvg(Y#q(xm;Je>uo8IO!9{}JiWbN(yQhu=Fp}swOO>_Cn=hG z8iheFw+FwDw$_^Ii!HUWz?1$k7@^Ab;SB>9tFXnQ&Q|qxj%uads^e# zOM7ikQq{$;rI`mMaqR&qoEke|^F7(Mhp<)v?z0Z!>>qScg1~;EpNEG15H`iiLsAh8 z!TgZ9UOSALRv(f6u^JRZ6b7AQh(1OaiSwleZ{ZrVoi(}YQZf)ej4K&CZ2#k`a{XpR zh7jdHLv(U9!nYallhY;R5|~Vy)>WIT#8q5{U9}t&uy@nyl=SLx%v(1_HyU+Zg4WLu zMEBuww0ifrbe*5+nD{GN=wzG1e5Edc<)OCLe2gd zNQz*p4Zj*OIWm$K&ImWFTiDvcyz1cl(j7#(@B<_6{6I>TyBSBMSMJXxBlAL`duLZTDwWoSiV&l2I{Hq zKOxJ65`Hu{nH4oX$THRYfw%(gLP9;CND+Z9P4u!Mc)lO9(Qcn&R+y&x?sVBD@CI`} z2n~ghSr6aYLVpujo?QYJ>~KkfG2U!H1fi2ZLvhb%faMkbMz}Kmb0q6Za3o&%T&g8j ze>%MLzQAg${z7`lkV1bN1Up|Mz3od0H&b@;Lux4xQgCTJ{z_U;+WAwSeltAVM_@3{ zq$HW?hk4pe+V(0ae3~B)kKMEg|8o_?Re4paYKV?e1FhmHZ7fqGlcZ5<+fqNk$vr&` ztoQ#aY1N8E`L=-FqtH9-BR!p@Pg+h4eu&jj2BN33`UfoCuo<&7!;l0gQk@^dH9W3& zKY8=6bd#`t02dFBEV;VF_oS~$XMZlV!@o&Zc&XyzGkRmJwkP}p5PfEx_9$c?{=O;n zhyP+|631(M$&Ej4L!jlqVWfy3f;H3t&gyrd+-!eNDplRbSa+O=4*~<|hY&6A4?M4) zq#Z`D{R(rUT{|U2$L|1|cjynZj=G5@l=Sffw>El!as>~7$p5_4Xr- z=>E8*l)&}4qy%L2^bc#GZJn8U{-I<2dIKfji*U$QU(e_Acx6| zqs|3dKCpyM!g;>HKQLu&Ch~T1U;r*I)b_^Y;bN0TT7*Mh<}V6PH@M10+Fp2Iq@hAm zrGAMY7YKt&WPpoGhZR;!voRRKKvp7MTpTRvBRW42^uNpJpf>3y>E?&Q9eNtF6-J%5RMW{(YEiRUx(l{ksaofzTyEEq4c6SFO#H z$q97RGC85RdLfHm4^LW8a{WM0OCyp}1FuFTB`Hafe>50(5hMJ&n3TZ~y}u0pR^}vl zdYO}cAV&YFCuXSWU8+h0WtOB{@-)Dq`smtZXhWhP(O4Lj^fwXxBj6_!jqYxaPPz+H zTAEJR#3ZE!4#yYbBAF{Au(PKVs$0v>@14(Z`bj-p0rPid)aGUYZN~cK@n(Zeg4F(hD zhhq7)WHfOuIcW=v?)ECl0;D);?D`GDDF&6+M+7=Pp6fNv(;}KQTx$to6vGY0_5>Hkua{h)z-% zGKQbRb!WXAs@|xIVJ^s0gFV=OIjezc-WidU9Jo3n2}YaCm#)?$YGhXoMei-zVnD|^ zt0DC1+ygD1dIex2=#plA_5Wh*z2lpz{{Qielhq_QY16bBEnP_mP`Vehla}tmE`^q< z?6S+gX=&-8fFwBqWjR1l1OyBqD2NLb1w}<=x==*Gjf(nv-kX&2_WSwc*9Q;UGw#{v z^?IGxRL+61njQR~^jws@x&w~`l&I({xt4l$teqDGb5;rPNp}5Mcn}?xXIU+_+IS%)=_E23!6m^X!Tks>w%p>G_s-MP#ZS6o|YKZT2a&yg?f5GCZ`nWN;Dgc^^AC zhQAi!7zP(xnuSIV_9zf47%poneQFi0@?Fx;BuX+7FsIy1LMmUc`o!XAjAHdSc9;~=(TLX~A0DY6Gd(_>Yro^nXp-yJ&C0=9gS9rSF+ zF!X$InB{4(=FET_p5J4jUdXv{fbw51AfQaf06tH+@2ePb+QuNAW3Wr6CP@+YOQ;zjw-GLhsn za$Woy;yhmU^0bL9)NbKcQ%^O^EPnLH3E->D7`)2v*s#LICzW>e8v)NO%h9jwHDv*8 zB`oFi%5qBrnPCS@tu6(?YtLdROoa@i87nMrft_gwCH7n`H>+C9Z)Cnb6n5x!Nd8!7 zIY%sZP+4z`NAmme*t!{ZaMW&3z&iDQOF5A4tuo2n)e|i&%&P66uFi|_sF+IN-rjs# znN43IaNPggLW7EqoopFMs_jsd+%_2>U*bx^xRud`)07$-I>mB{)Y#3D&PUKu#yeQt z$&XkTkc+Z|?_v*_BA| zS!wx7H$QwGrF0>EnmC zg`x3H04ExIns@cNkHu4h8|dFnmYamJr$Xa*6}s?kwtPow?O=8N(~RVIpDK$vg{fI2 z#}0nimo3OU`poW!>iC?aTmFtP(dG96HU9lv*-C6id!lDd zS6eZrgO|F-wC7c+ifS$^o#4pX6TE}^yA2C`?y{$jki*UEnM z%Pry2v|MhL)4|^;>kwGZ4%y(h8_=58ZW%2k0y{{UnGRGR@hyNAXXfRx0eNqm5IS1l zD(6a8h1$Vko9o2UtNBhj(jyN1(`hk@aH+E(joOH>|NY)`N)&YIMoR;!vuAo4CF)IB zoRCeHW7wWSG4$#t96b5smb9*0J6xc?1Cy_3l)ZgMD>h5tfj2~*c!RJ?Fq}Jysj#N7 zgAw=UG4#RS1%9sm2p1&gdEZ`i#c@j(>2C*1?)Bps+p-^(kMQyYcl9flXN1f$JHmT% z&k#gMR#J%MKCAu!APf+lkRk+i9_*804?`StMhgwLD7}*g@`o#3lcF)>2MZ z*g@)+??Uq3zm&b`_Fa}Zl4}R8dtny_TybBS?H;%rdrH)H$ci^VhfL!?$`S6M=PjLH z9|FRu0`)@WJVmnXTWO*sgDe!c38!+$r5vay$UZrmesvjxRb8=gZZ;mZgIK|x3m4~v zjG(Wdz%3nUp9su-5@Xm(R7Lbe4dBMvx%f}{nk5qeYXU-+zJ}5|iE0oXRT%+7xELO) zPe@d=B#nvo@o-*#3LVs+vb2L!Wv`2NzJX-)8K6eJotaoWWwge8w_HYLcXo z6yfK>WI-#p_wdLPWe1(G-vk0^>Mb0jrME0L5@Cm^l+O$J0eNG5RmHT_gneE5gQX`K zZinP__YWAN#81@+2y3Z*I#irKzzl2rF+*OW=5vODg{Z%(QNq^Q!O`>okSo@!YCKxv zTRyam1iS@B@h4XhdcpD%iMBr)LqEHKp<4n~E5wqP68j@DwB;f)_Fc3*BPLS&6j
U~gC@_7B#W|uz!B}o~*^;I(djlNp-p42X?_2)lmU9vO zq5gv|YySa}B(X!D`4^WA``2<+(%9F&0E9osC)<0?qH`~>s2;-^D6+#CWAqo;gOo_s zVE5@SESKTK(GD_h_gDCojaFq-zppJ%6O|n#+|jR*ckOFXoF(=-QS_Z}ERpW*JynrF z`orw?h}HTnCN%h4ORO0912i1J&h6i0oi~4PImm15Dq&2(Y*IT^&njDdo*FF4?GPhqpW2F`eQN6pY)P0y1d`<^jHJ&`mZfBZ zLx|w*T=Gn+Dwi65wk#$S9Re5`{EWQ)X{tgG4W<3XG7SU`8lz-Unwv^$64%Qxcbo8eyS00cwmR}AN?JNaeqJ5>0(ICn#PifCcBiV-`2+jsZ0VlT2){iw2+HH*YMf&dtLS*`8`y{s@_ ziglPH>8jqS^IUK1YEtF^^CK-5$(mT}ZZh8ijIHbg{roF=syuf?A8QNHfXo3RjrFxg z(OtgQYeeOMAZ(2vlGh7xBLK+dyh9SIacba4S!Z2|0BsHsYFqqK=f^_T1b2+y>H|Gt z2MD#a0BqN|04scSO>}@zTN#MX-!D;x(l-OGA!MinG#Y;v{tg7wQ)95g|F;7)8lU&E zfy*oN+(REa&}iN0z1mFzb(M0CVt{NUv5F%_TH#1RlP7p?xdVKP-Wlj+Z#lryw%?(x z*mdTP?t1BpgcY zh(+I9bzJ$m&t%1X*(1``l9S{gk_cmQukP?Ffg>@RE*gSW-ZsQKN<@Y@Kt23jgpseG zpvr;jnzh!W6FSrp|G;Z(0sf}%6k{!FCZf{u(qI|wUt%3e207wj22_HtUn#L}A~}ve zpsh=h{BDwJ0DZO8T1Un>z>Tt$A#dMgRRyOGtDsjJ;2+_5nKcI<#~mb$l=B@iPQd)E`ow3G>^13iDMMK39PJm3qY1VC zxunzq@}_bsI_a3L>P4TKYQ0aY9pKhHGYx&bGtK%E#x@xCBGWO}J=3jk3W>szhfuvU zk={DfS_iaO=E#MfKsoBCF2MahUXJVmXBe`R_)kOw6%3*fB5pRGkwN_t}oEV=<>lRvja?caI0$Wtz$PILW`gl-> z?yI$K#CIS;9^`S~CI3I)XvbTvTyYXt+?&&xQP7o7s3yXG&jC8+B8urhSX>Tq|4e>&j3|O9S|bsPrty1FxNmIFFsMi@WoEJ0n+-8;3{mEuk zl*r?aO|V}8VfalSq3khftV9G((td7>H%e^%9TOpA--PkKu*nJ|VzmRzp0^%H`p)Cl zZ$u=@0cOvqTda{gwpwwD>Kt`=8nf0&_ZZgN54xugFnb=iVLHcls-|-OXLwL8bN6qw zz5}mrj&T6@t8jpN?^X?Sx303{IUV7ERQ14G z5ESt1_fH|VeV47s32Du-`ro+Jpebj{)azC6s$|M+pJj@}@{6*2vKW}r%@yWzQ-Htb=4fX)e@4TljT!8KrfF{B z9>0G<_GCH3JO`S)(Fxp*hM&k8&QQ1m-e?S0*s3!c6)1`4N=CYme}rp?d+r230_9;O zEFohYt@y-q6`;)diK^O%9pmibc`-qC+!*Ak6M7MN71yP^PVj&0I6r;33O6(mH~d|@ z_Nk|Xg(S-f0*A{Z$q5-ee4<=MkU3qMJXGQ{joz=fxr|TXL&$Kt>hQBcoxV;mp^zD* z4ufrmK!C|4C!}X^b4{XmE~{#|0~~-?d34dymM?aWS+>;&3-s~yR!*Hr^)uMVby z2%NxuD?1>)-1LR2&h4{?`3-I{B~D;K^bGx~C;hIGMNSYp=bl3Hx2OC*Bz>K@*Jq#h zi*o<^wBH7}baPr_XvYqyuU-ERgav1%>h|5~7a<~MXG9E5--XbWb-VoLh&{|n@VJ@X zstCmq`2^`{$rABx(Jvw}zPT~O7~SLqvt#b(0ErtvxBf~dIg=vkW0#OTe93x(EN~{m zUgk0fWq($klQb%v2|%M)07AB2;n1k9&>0_1r>$hbY4}wI)@EaXGY%vd3tOb0e^U*0 zr`i}ObX7Y0MAKo7sI{z-fgEeHGZt>1nvlNG#K5Us2)nUR}+?M6RA%SxeRE8dfiKcm~;Sm7iiQu74MRLzn!%U)d;&~o2 z4arx1)dQ$)ngO~M&hcRIOn{O1scA5;EcHWyd4@qtH~FdIVsE*#&RhKMbQE8iZupdp zb=E=ya0Z&WJ_CmG(M~AsY?+BJkat-wDLd z^EG#g!M2%g>?*$hrCLqjHmV1}#KSr2VcuuF$x~-2$#srIxDbgE;X))vGs12=f$+!5 z&~<9CI)d($8B@qo=Wr;a$}r9&!Rlgq_p@-YROLpf<<4*p11m&<+ARv>TfrXuxJtnI ztF9}5hacuDvK{iFmxb>LdkZ%BWBLNd2dBJ^yftqd z7Le)A6%YoUMl$v^dSQ1XAD1Mz{|i8eFvp59xkG*-!Tj&eVo96*SNgX z7Pa^32}Pj*8gEsHN}6Xlm&DKw@8Tu5+^Wu@p->WXpSG&+i6qT&PCPjypOi+qOA!f2 zjC_E4LE6mA!d3~uGjGa8q#bUTR-|kvbsMPzDdg|8yno^V{}>2x}!eP)KR00av!hJ ztr3z$ssM>T4o%J*r|W>yIEC2a$O){=)e{C6$)iBMOHN`XZ)M;jLQ3P~{{5ukjF4!k z6g>1(sQCRU!%dP(C9v{%9m#)RH>@WUC_$9NHw;$iKy@Y^^ai}klnhjZbEK!hz)Rmm zy&D5@pq9Ud_vP(34HjadB4{RZyS#Fcr=Y+0vHGn*HAitw{~! z+zGb~PYFRLz@yg19}H1DZX19nWEAgbD9`#+*W(N$UIJlwalSf_6FLOZ=kwJoC2S$} zh19wdi#DPF(|fT}H;MG4+DK}yLS9yt&WUx^#L&;H(DIET>XGg-Lv@LOl@ubW$A%+w zb1@Dg|5{~6=oqm-cMYV1lLDq%c~-VZk|GWgoaE-XN76Kc2I0C5(c!uc(ZS_{o|@tN zun0T2sYrJl`U(_^yd5R5YaTZYJ*i4{;5e=hqTo%;x(+*h*LA}$VswqOyzXm&>BC9H8cnVxdF(98wAV_v;-^giIh^>(2V@E)i@>!R znBpsS*rK?;x@VUyNpRU)^zVEhy-svHdaHmj1fU5XIB5Xc|2b<>do)aA46m zfr1vgnu!cqmJabq22#B3-^xb%PPQ%(k1^VVC#*sg2w`9|v(=5$++owzjo6vtG#D=3 z^D)zNGu2fzwLtf|$M2Bf8R%-O2dY*mxB1MMkC7dcrIBV)iBKSThFio{7)3m|=|^x* z>_-eqWC)GJ`~8RkQj>Zhp0?BBKD2BmBjqm&je8bGKsAsLgV+ensDP%v+%VIgm)=`MIA&i;a(z-uejQNo?v zLO|>vLOIC)3BYgFC&tAjgmOThOa6|e*pH5+?VlPgVph0k zAP$Gf>7a|o1g@pw-cQdq;u2hQf{~GV5o$$!n$&?@G2lGk^6aLEisKQRjSl5Y;H+~u zE?Bjonr{Bwc#@2!RnXJ946XHseNwf!NKi!oUgi1JmzFfECrDT$#Y-Jk;L5w%Q<4OB zErn>{>Sf@X#VzV=_mC?_Hx6qA#j_n%BSe9LbaSh>Hr2GLeYke;Ugz5hd(1G87-^|D zdA+TxS+4HbD%xB)36ZA^4_>~0xEpW5G2kJWYAqs1I508(*m9=%z~()!4nWvD8^o{ zQ-}IU3}mVJn&>Byg@&#ppf7{zZ1{592_ks^PUapdq_eyukIuKMXxUaqLO*<#d4^1- zGx-te=@g?$%~Rm7Z17B2LsfS50%D*uy7var!*?@tkvIL}ygtt%&q%?Z=jZm$bId$c z0aKoz8@AM!UUqmIRnTufH^v}VBz@FdJnjO>jRt2|aoHXw7PuS&fBs{>)Ik5IG?-5D zmM+?hrri%p*S^5SkzhLc;nHtkU>0GaLAp)ci`8h`%Pin}2kq9~{?T(Fjm&hy!+E36 z^LZfPy6gRkJSK?Nd7f1;5P%z{kPnS!y6FSsLNoxgmUy7cRBZdY-|WpOJ^Y5 zs93<9QIAoYeRAdB$$QHNOP7)F#FMy#aD9Ebl!~{jb@bPQV53_zBsfh(1TN_K78V6Z zy6cOAIk}<>Z|C=mgQMKP7YC0NdU%@^E(teF-rhYAf779*2=%$RGFk`pz!`2j)Gra00c*YFCDg5{cMn0T?Yp^jDR_!uJ^gAD3tY+P9}TA zheWRk84d*gM4A0+KYDE=V{-qsky(XEb}k_ErpIwyc0bO%N9MVJ$GHhZpB(4yuLE6k ze6AWX$M)r_Bs6YoL@*8AjF)DL3${n|H{%Vpc{9@qML-t=CdpQ`_3TR^dwFni^;(36 zD&6XQNt4orKzp&7z+%hY>O%Ln%;1d(&*FkkEN{Qmc0~P<{gNB@ONgh_G}i@XnkzZM zQ8fBxb*{&_?9ay;m3!sO>YqFt$hqnZ7g?E*WuERRt83H2Xh7tmy(37a$9WI9h$U2%}9nz@J4Yamy) zxuqd=#Q~{5BG;<@BsP(&Poy&lrBhDf5w;-6w1)I{0YA!uv43&FCRlT;UBHiJ`=xqX z(!->sV|$psMXNxDg&|xgA*OXe2QED5C+-9N+_n$&bB+rSdVGQ~-utCnNWKdwFz`hr z2fQeK(s!gQ3MZBK$*eJ_g#fhst}*JxNrEJ*I3R_pp9?tg!~s-4aRwW=O%H9B^n=n_ zB-3SuLdZcBoIfaqTU!@Mnc0VsocXRgpI$yBg*!G^1fSFRrUDa0L=DrnDRQgDV3OM7B-LlF_=FiKay zk0%{p`p;o$@1APu5AdxzP@u^c3}jZT-&fs(h+?+kTHF9+@0>|M8{-U`{878QwW6!CtxeLy#7Ya!aS0*?f zZGa!Q+KdgPk82PtrrVKR+iq+n6I=t~+`j|Ks2l1$dTt-)y!3{83M`vl1NeOp7Y7Og zY0ovrcGBO~AJ2j{Myvbk8e@Qv4~pP%(hs{!sS7XuKRbbdt)JjgTC>*p6pZ9ueIYB; zVw-EUI2lQ<4A@C=$?F%fbluA|)7O+t=D5-$=?-6%zUyl`OBfg4_nZB2jMjaoo(!&9 zl?xC0csp_h z)E-$0gX?+ic8y7X8_OH(Fhs@nq<`n&|N$#`v%~4 zhg2$=Ox|<{T~iwgZJ&Wt@koCri=+LN&PR>Cu;m~M*cn(?`GEh;2X(;b7t90#337ot z;FI5ZlAsRwWZNw8z}X;Ifj7N+P**D~S}%8jFo9?jfO12w+TxO4LJ8e)o zG<2yUmP~Th#n6hSco{8TY8W6wZD8{5+Siw(g>V-zIiI(;76gm+cXgJt&e)%Xx`4YLDLYR_oycGVg9uJs!8OhYQHOJ8z#SZ}h`?g@1Mpbn66TEWQA3 z-u=aQ|64l8HIgsY)72A=TDozf@hr|1h;{xDt((NrC@xUwnbR@agvlT$f?S};`O@=~ z`2z?toKIH#GQdU=Na(4a)EU2&Raeo zc}5pV=lk=~uu{zo;tqNW1_1iGdjKaE@B;wR%nzV;AqHS}flBVK^6x@a33Y)s=JPx^ zYLQ{Fogsi*7X-{Rs_%TJDwe>m=^t6Vv>bf3Ced!;b{e`b{E&9YMxNmF>R^TFX;!sK zPXr}`68f)}Nv9o277%r3K)96pGD8Xcp?bA=Px}HG@mjq7PDSLzmw$%;z z1Rh@M9VExxu|Cb6q2(Y%GqJmiGb0ZZgKHUzvydE<6*-qobAf;NA(#9kEAmaU#0BBi zscdZX_t}v{McQ=NVh^_mL{Ug^NFcp_Haq~_Q#c85Ps@v34;xWeL$os=an9cFfwRMV zK7-Y`jK+j87h*UV=PRgFt5!mBRqvCom?PgO`B#!dsQ4|7LUdh}&1480P=R-dKMp{CAYI=MIEPH%K>GaL3 z!t^{guQZIKg}5F;3xSk3qDTDVdJGE-L7bHk^q5vTBt9WMesFPaLULN#@WE-tIT;0` za?+AhQ!-LhXsr#K@(L>)loKDHmXMN^kdRzimR(jAn(*4u(Xo{e{yxf@i}?w1ntOo} z5#9-6p}Z5sUux>ph}JS1g+*lT8a7B{qPP2tmGn-4D0ouWf+Z!t zb~H48YvdxmA^kN%8;Pz9fG8&`&V!Z4|}Gy(cY+mY76;h|v%KM}8eUFz^4E zRriq&6zBrcS3EbXlw`~*Jt5`4M;eA}{H)gR&>HC7Heq!2g9%}eO7hSf|2vP(&h73j zA;dd1Y?JqR=ma_)ZcYZ@S;F9w!Pu++PK?$Di7b-Ry!^^CS})ha7tm^90KGrb>@yld zUeA3>99CY5PVs*wJ1VEUOFUmZyVmbPm!2z|p3Zj}k1o>_lDH%B@Rd!1w3XYnux})K zx-Tv=fUXP{ML#%3Mxbu>pkeK|Ro)aO-{eOBk z(N}wjnQ;#$oA^-o5B?s^`eXrkc+`Hwj8^Z&{}*^*tkO`^(osQ>f)2@RO zOke#`q@40#CIw|BLvn`X4k@d`N_Hoz*s0|Y_w9kZ9CO5bZh}*E`8cH9CML(H3@$B5 z0^I&j-zm@`;+C>Xt%;-B%iv8!X*9lgqzL_0+*#?9+b6Hj@IIk@j+iYep(`0paAcG~ z7lo$zX{Ducy9DFk|2FNt)!#CjWV)h@LzF(N#q$;C6u}~g$Vbk~R!e`Drb?a_GV8O<#cXDpXMje) z(?P+wr~r8(dNn^lz*7%!NKLEE&4^D*&dJ5PCnsj*3>`AO3`;aPC%s@~c4BHuLP`S6 zR)tV>-*9!IJYslWWo}+*!LZ8Wyy1DJLvx4ZRpk|@WC4-X&!04>F1xrY2M$0*0rcEt zp=5k=Vp?hm9N8se_4wax!=P~PVXimEsm&SiEe-o&42rY*<-<6c1v-|4BEW9RDXEG1 zMMFzx&772&njHUNWDj5N#55X~APV#6AqrR1Gal}*6xy*?7|$=^v9-b+3oFaut`rU) z@NpQ>3Qur&_lrj_z{gWlL_O&G6w#nQ{M|`NPr}_9lg_UraFD=kG<)wNe|O+*P#{={ zfAr53(aT|3tY69lqDBu=ITL7{Z^ zRiT=$$QSySaNQ?nWTYk~vGbGoarnmxM*8$uTsS}NGk*avH34D4zfZooZl1?aUQ-`KR}vn-vQnCDkIpt++h#ymA5bc zUL_?0R3(9Q`OlqBu9)nDu{xg_s`y0SW)ThGBz+{^ecwKQxg|N$uX>LBWW54X}jm?K;oi z5u{e;CTCVHnq@;7`-~m8NPfkxue*lo^vpyO%4V7qQ8~#}s%0rzIfI2Dv3w0ur zAMO*qp--Hwu0B0yDm4XtCTFCh&$MKobm{IBaeCsr``kKN=(C}yA)N0n3f*xuCTmFK zPE#;{QNz639_A%6ahf))U2N2)C5{*zUp#VTeoUGvnml$6Aj1UjytD7}JjCM_c^!!|xXf&+K_Yo}{8 zMxI*Z0<4D!*a7$lvM`AQ95_AM#h{jPhLRGp3UWs$ro^Wvr>3VS(G!KjiE?zqw@fSg zi}qV8Y^iZ*-1B(T$8^Ds?)7AQ2{!auX3!_3r6qZRQF2mY3Vb=l2TH*ldTlKF3`x-ovJIUfy%LpMY03Z=SaR-DWvC=QA);F->jVBiiadoZ5twbL7$$PB{sQpp<8ZFs}_)f4XmmRK7h$mn)^bL%CmjhVkO!ovjz z3^XI^jgKJ!P9la0hS6Z5pVui8Vw`B{9ST8K$YJXcvUFoOyy70lY6pn?a_9mvjPj<5 z{8qyK-bN^J%s7IDH;Db_f`Mk;2$2SQ3>R|`{zC*Uo(s{)L7*BV5nXFzh&Q^{ScxAW z1FjFPJ!b7mqBiz;c%TQ5S#8J*emJl8IPy#zVNd(barDQ$V*Lr4EY^+Y7-)${A6g#y zx0pn1gtp5H0=~^o5_zBW-Uxp7P6_xv?@J;H%sG{9P`BPG(4?x5sCFwK^Lb9OR{j`5 zJ04i$Luo9!e2a&wG7%WlTRj>QUZ3hfWdibCr zle_nFPS9ubr^z@$2Mv+*_!6c+tvzITktk^rw5MLe_x)cod;{S!tXd-72I#1{4VCb! zP7@;O(}z(!b_H&V`G}#6*PQVYEd%Yv^oN7}1Ip|0Z+Kc(AbC@?3>HDnoYv=LA#Fwo zLb_^2kcn7fUL!0$KdlXlatrH%dWd^2Z>)l$3$LB^-LCVX#Nh{1?&wxC0IxM@q>Zvb+(z=Z%ws zpl>-TXcU>&SOL-1WF&u-kqWx4Do92*O%9q#tc|b=RZR(scBf1U`ddUw8_U2noQjHL zrUvaI+Qw1@FPIhtC!f=Tz9n-SOR(tEQF>cV;4flSBP2I=E`4-*&_Obx5dxbY?*@cO zIcmPFjAm)bab6X}Pk0&P({oS+zs#)?;8HiiM2jv>)o<@iQMF)oeDzI>0>iWt~||-_@C+?!#sw)Q>-^ zJnwIIk}4L`yuo@Tr|Zpo$Q%~Zyx;&NV?PxYGxOMi*q2}gf$5MtJFxXgdOev$z6VO!#=`Wf1~`Gi(|d(q^PbT@gK^VSU-u z?$*LKR4fmox2}k$!YMS1^S(F;6<1yrEl=i71_La~yrABqI*uTw?TY#GLDCHpfAPoS z6p;j44{_Yd@&2&o>>^lMzZd|YB{gPWI_j?IIkKFERN;ILn(XzX=pq6;u#hNR7>gB; z`$>e5b!;#Tk-~^fR9Kd2UPSt`kRJSjq&pKo*jN!#PM_ z%Q3S;CXuaoGd&e1j`O@~ZI!Xm1edrh7hrh167u?{|>O%8jqGEwrPZuJ2r_g+Zl(N$hVyMU*=@u57 zql5{b1?nx(%x3ng8xR|Ao6ljz7YegYC71$g99>!}l@Ah@=Ua zT~QH?kR27la2YIbLRY#fXn15)1y3MFO^`=y?UCAZPmzo`(@?{iA~c4nckE!NOvA%zLVGznJPG-`@ou$Ek*T66f>up znecSN0?hbCAsruO-sT&^7V|fiyI}x|a8Fv1g1OB)!{9b1vVb{@qEUBCw0R8~&O%5G zuz+=YhuJ4#N3f6*^I#&RCoW-pPxFf;pM|9Oo1Un%>@2fg(m00AkESp7!f*=TV-9w? z7ReN7hBHs9rurD=JwPlzE|x;KbGBcIJHA#A*Rp$+NwOHOjSHD z50YsmzlftmF9}0AFbx>c=(nagn$8>>5alku&P)|bXRaxVM0D?%YGDMu`~_1WSv6!$ zVGP}s84&IMATwY)Y!BC9$rt7zg!<;3fS-wc4OZKpi{#PVfG>$^4HkQQ9@;yd7cfak zq-zF)BF;y8bbi2CAz8X6FOnWBK=qpMnc+}&Sp$-Dz!0P_f6t7dM~4JVB{ge6cSaYY z$BM#$WU<#|Y?45=)MvBeHTgtYf^?PSF)|EMtw#$caVH$k)#}?-04MwWq0DiYd6)EU zS3;Jy-{0z9vfm%TETbK2-u4&$quj?{^oLFqkm`Mj>a~+T@pwMsNALX*pps&%a|Ai`<`MrFNp-t8hHg9RAMHMU)c*kV(Aq_? z(K&|nu4Dey;zL9u3hmJ;P)}67tbE+3PH|Rlm93NBlbn&nBHE8z)K}Qa?cr4P63s%! zv)WN`z($VS7W0xbPs7n-7{=#HM9% z0C@RwBEh>n{G6&m_uCBj%|ri&zmjbJ0(KO8a!DS8eAh6IV%}m1j zE#?tj4`@e-;3+psGhN(hZJ@PBK`mZ9;?GF*?4#^lcWJa{nUJu)Kv(Y`LASreXr>Wc z8bS`$9mR-SdurgW%oe-=Hoh;T__dc!_r#GvQ^$`X_2n@WD>lxHp;L|{=E}O`rg~AF z{5^rc;9~)^QFTW7o-)g4ui~C!vix^>zU(F00C+0c zo~l_*7O(){gHw=PpQb5?p$!Z5i<4a1CtWkemld<)c#?rfv(^wD-5Ovv(oN}_nplAP z7*@-U?Jn1c=y={8qWJ~mk9pp*>G(}QOEp`aY36*wur+v+q@joUH1ne*iG^~;6)qXt zSF?trS*qdEARXyr=_ppP(8-9&K(Z{uJdrG7p@iY)l9w~gACe*#wl4?!nxoy9`7MUz?$_n!>r0@cOii%xOYX9Q<|?w8B5Cv*G*Y_8yn{sAjPPE^C3|$5 zS<=U5fIZTSfC;BN&8?)TEijS}UyIVEYt2mz>u=*ChX-?tJ%ChqD?{`$506q!-*BA2ZHyxp<(zpQg z&st!93F`kgCYt`W5b5M1&1S%e0-HLDzR>_e=2n9_Tu5qc(024&f(m_?m=6iVIl@LQ zDCL~hj#gKzwgYUxEf19CkQ?F-NZ9WQO5vYA7E3k`u>dZi-~JPCn}d3lxRYZV190hj<8iX7PU9w- zjWBgN5sRnH;_;ecZUn|Vg&F5I`bW}_eS@s-`@TWYqG@Q<;R&O|N4dJ7p+w*42O3p} zr`qefpqWC_w-MfCQ}sxX)dy`5p;2uV{WUNs(j8<7GC_f`5xd*hi1Og+ngtj{Oe2Fx zz9zJHe1@h`!X`ATp?GdadcQfSgGd^Il(K@544I|58p7?ZO0Y|yenp+89PhJGVV3WZ z?U0-i>>|sBdqIC(^9|r)cjVHB*_t?MBCBr1F7KX)@6XK(nu7NkAV=p`Bore-p;FKY*ikbV6?V+iRMKgGB2Mhpxj}DA8b>z5EW7`FRGm0KXg~09 zBVd4WA!-g<81yk(9^-xa4O$dbLPj=L!#HLUY9C${lprKi8gVXuXh7|)i!~=DjTMcf zqG`oQyv}Yf4)SvgmjuC9L)?htfisApz{@l>lBR);I38)s@b;`-7Ni$>$PvK+fhI+L zTBY?_ET1KdBW{sE@Sb1*&U6?+UlY(mW+z_dQ&wsoA$^+gfcXGP_q|R7@aw9iCcIz* z_k;g5Xuq)ofd`x5Qs(^wU{KvVU@S)HoThnEwBRLUq!?f zkwjS<%Yp% zF)BESrN=Y$`WvPIsX#Dj65`!`&jjmnjs~u>L^@i;R>vOkMv}KG0t&%GF%*J@;%%hg zs&IJU5sBe_MK&>B4B%iGTpoIIeM=+jo6KeG%e@5K&Kzqc^mTiOrRsF~PO28Me+9 zdKe3wxTyyzF@>#ntG8>~;Xk0cB8EQxJW%=T&zqn`vTAB`c?=+i8Ki6}V=^irHDDEu zLz?p4n%7LP!LYI!+>4K12PN>=>!ypOUo+knpS)p0yaTMLkmNVxT>)RA{GwAc%%`~?~x)icTn#Z&S(Wu4M@BsWQf=mnua zhwBh(BcK^jxcB!sQH1l4{J1Z-eFCdh8@*B z!ZUD4S%t@Tq^6Eda=&{-GYt1& zdGj#DYS;mStoUUO42YZRn&E+>Whb_3-%eA8h|FmQ#QtFy2Bq6=de^y6L`Z<(Y3|Xf z=_P!coB3=BTiv3-yKgF-bnUJ+X+#wj2neEiNi(lS{s8S717qoahe#*m1g&{t)wKGU z@IBJd0)l(n61>-|jths9;1((0P7iu{4#G2>KQ3HEQd=aEwB!|`)qUa=M>00FfYRna z+4HKf3aqOZad+RaPO3E>Bxx-oJe2D&=uLH|^<-%a$mY25NUGn`;3;Bm5qLitFbl)Q z6<_m~WLKAkl;gOujy*Y&~K38wj^p&2waKa|kZ z8VqH0^HOiM6<-^DJhTe*7dD^P97NqE-nxs=aCJvDFYd0Z5uw`eXEX;;t-)I@Vv1=f ziEoBU?fzyzJzY1&6$-hmAGsjD2<#LZP~f$E zY?{^rNx)2S&FH=wKNU=8{c-?i7PVv{I8?2l)pwPIkx6FYcWe)iDMuCw&cTLksLR;#w0<&RhcWo(jhkslOOTdN}=)m&pdG9*6 zH9;+4U*R*@VSJ%kK&o26Q}P@OD7EBu9gD;iHlPKJtggn?yih>7!dOoPEnqXPT!995 ztT2v7`y88zJLE516AdNC7HGVNeIfFvFPslx_^*0j7a?3$3!Wx?we4SX!!Wdf*@Swa zmA}!zRjarKPZN}f^R@{`zX9fD!&~q?K^;$C)(y>4E)Q>%2YENVd3dOBc@jKop#xI? zvY$Ua_myZ032&M3Q0=;}Maz%{;^RRBpMK|Q6mORYd3(R%tAPZ0kTv`UvWi+j#e8xD zL;m}QXa^bst@@zG*>6!}NDHWu((h0s^9K!VCBj=kjy$NMzO7m6#|~?$=8i6}&#&*5 z#DT3um_%h|(eG}G_7Ou1pe8_)Rjy1dR5APWn7 z)F!h{atnXe{DsfVtAQT6K2y@nFGNzB6#+Z-zxYL7(g zM)yf=h1v-wC;B@aW$?ivLZzA*}pbM z_bQpZIukjIp%31_HwLh%r|u;320ffN@L$aduLI{tq3Eu~0*40V!fkM?1(svaV<5Yq z*PSQ%tr2)MZA7wNsNF7MXS9an-T4C2^)Kk&CONHPVEybxGGDCS41RiRsJA*pxa#?> zA>MSzdfk&~4MYpy+V@36=E_J_n@_Qox&X^*RIEo9YI(H>+9a-qeZk~c7CgouNBU_r~gr@eV_Xhk5K;0n<~#}@CxPA zhtx54u2jL~OnJ$i z`$!k*mVc}RuT$3w!o8~!qBo??p#474-6oH;j`*K^oRC*d+SlMwwiOS(hdw|-=BK(- z_yBC>|ILs6Om~Vgw+{7O9jIaGgX#HOMgv_Dtd+QfKG)3?5>YFN2_9hXx}?+6qnC7- z_|v5otjGNg)rJVybD;ZC2|KCBp|sZOpACmOWSY@H;1DB?m_;e{pEse0kcMJ@cCE1RAM8^qMroWcy9HStm@s?5JLy8 z1Iuw%ytYY12DX8$xce9e8kD3BzzHjC14)r&2NQKnvetqJ*n+kNG1TV37kg5)XGL(Y z-ZmdA?7}BI(zPRyp>G3wPWU)#^nBbOp5g1;@B}k&MunWs{)J$Xx6Ogi%`HeD+2UU$ zgwMS%1!`8s_}uh~kWH3Uf~$L3cul}Fir#`x-FCo;_rC@!NS&ocgn)K{2tFy#)_y3l z&1*+^>CZj@2Uhr@Ka?OE+5sc@@@2UwZ_>5{NK|~}k1^(Hi`;K~t2zV#Va*6(xw zzsRh1$l84`VJ;b${K4*D(r$qJzspGPx$HlJd+;6*F!$B>R9`DU@Of47siKEmDYKGa zNQNjMaXQT#;Bc-T#Q$@lddPFiwRM~W41{M2)Bj6mwvUE~tZ)?6S89iP+%267*W=Ne z){gf;SQH{zfe~FdRJ&f%6x$9a+#L%TAR)uFb?yeM{%I(iwBz=o9$330w8tP~YR9F0 z5dOMPwEiZV!hP*(YVasD#g1a7)+mP3W3JzsM7(@!5R=3*Y)7_EhXO4DBXP~M-_ zo;*%0)KyO%iyj2+kPIO!LX=iV!}{nyM-JX_T{)3)`YS{WRuAHN;F|NiodN*l^bYKE z`4WtMQ=N7LF?YZv#`=YDD4RWAt8)(@uZ7-)Exn@$mj5|D9+u1W{_c;K>3tDRv;$As zo6GT~c7^_~gjIClDQoowJS_6nO(c(Wn4{Pe0ACIFVTS=JztNO*BAjG2kUe! zncD$ufIJA(b-Gd#-2p_fzf-TLokl>XNBwn;_zcLP`!mf{EsIxk2N+V_6^~BU+Rzqw zk$hV-1JG7N2ae*20Eq9dOw$hL!apkMd)fM4?ordVYRr3ihYrD>4H)hE87Tk4phI}6 z4!?){+G^C<$m9;NBdze2N(au;R(Xzar@2DEv2T0ZKD!otXzZ7S7JVMuTO*Lc$ zXz11j0Q&u2*Tc#?paXQP?^7tb^#RPL4{gB+z7jA`sJ~E0s-`Lr``q#=QS6j2l71lh2*KUMX=u6fHAz$7 z&RlrfxrPtP^#DH+8Quwc(DWt7TD(C!g?F+;cm85z+^>EakSO#S)|u_4E$R8Rzz}Nw zI$$4Z=mc5F1Jb`80HlrKop`~W{RX4E@6;~F_c`0@S=M)^SHY!?3DBsu>%w9Na6vka`c=3>*W}TnRbqPg zntZG~))*Lytxf2x1AkhN_*;LB7Be!u5tBLnc;CMiI@%Ez2sOF9&RR%lw1`P__e*&Z zE&R}5OAEh}=So&pcaDR52H!w9yZlOi0F5^_@ z@YV;O(3EwK=~AZChxH1fVO0@<5?lTt+Y-9+J9!1?O|sY>bW`5O@nbrH9 zyb|e2Oyl^;!26_OEv{GBuzYFrel5=xYaz?m;+6RFDb%}uD)3Wr#o7s6fWHWO?e#zj zZ8?By>qZC4>9*6TQTs;VKB8PZK8E_g85r#z@MhqbB60ZII!|c(;8z1R;xtxBi%z4% zh_!IaUUUZ4=A8-r3&Aqhj)POcvuI`G*}!I|X6;zda&T-a7*!?*7)i}ATa>%#y}&~_ zfn(Q#CcgG!phcX=meIFg(Pq*Ua{(O6hhSJCuWGM&*zF=5i$UsHs$AtX#ZCE7vM*#r z8b#)cM~EIUG(@1urmmCW7Vv%)^yUP5U1Ttb2MGqz)jtKkK@97p5N`gAk*zodiec+- z2+Fi|uT=W~vG*R(O}!a zB*toPn_ffj37}9yfDn=pLLiOaQcg$+1ULz4guHJgJCJkVd+WaS|F8A#TlaXKoMg}5 zvo*74mtXxpdiQP2+eJxkxP4)Z0O-Z(fS0ir`nZX&y`E+~;R9%wGya#9#gb1Li6gFko&;G?A16@L%yBL;z4hadh~50Trxm zs+;k(LkQFR4K*O}n#|hgxkcbk{FMiR*V%wRzR*4DV6f)_@rH(n(t$iGfT45$9l`3@?u6;+Omt^21{Bbzxu$L; z(G4l1TOO`0`#7KjeJjt@mK3;4;;6K($?9#^))d8%7&nBB?)j#et+Vpsw&~=Cp?F?9 z+_L+#fI>e@ln>?fk9MX)GSA&Pjuy4Y&2v5vC}o7$wqRSL8$l_41Q@NJkFZ6cOwV^f z7r$N#NEcXP+LFm`SP2@CQT!>;D=!DsheZBIbQCLXb0xsaF0r@~P%*kA6w&G{0ln#; z9b@WIb${(>3Ko+zcSj&a7QyzKQDoA>C*_9i;5jqsq|T;VGTn_R3q>&=Iq7D=d8V$! zM8Z@emq_)c@*?7(ayco>5rw3acslbTlO%Ep+u#HQe0fZ<^yP_oi9HidGeKGpL8tK~ z6iX(Vrji&B1RWIpcCiPOObbbg2XfBj$!M|mi-3Bp_U|W~dVz}E5KB8uLB+T!CQ4>| zAm%(f#G56(M7?OUsix0xDL9_Wrom#IG|lv}n527x@QG#$k9;>ki}gFj1K(TTER&Uv z{Z_H5Hbt;Q4JJDT8r(dy&V=^{kl;!VsI(GKDDD{y9cU^?4$!5rg#|AJYHAW#oP zkWVg}5&8ERy9Z)SeUu`7NoNmYtJi*Pw$cwDV||%EF@H=lJj0cn2djh%lF z$nX=OEW2i2L?S%cHv_MuBICOGH`3SxPhX20X815~m?aF@=CMx>zlpNrrgN_`?=ScX;JtIu5Afb z@xm@9c*-d+ z?pgw>oRfkxa8%Xg`s+iNqsv)F9Y`vcTV|8EDtJkKos_IV6#U2#e}$GVOpYe>#0tx1 z(x?i4Q~WewR#t*u9yGJCl~=C9tGynoD|{iaf5K-WiL~WvOILi^@xFWotb^5-b3|P= z4wjuYxMSBEa4(LkDhKoMS`6)pwU&HJROo2-pBNW3Zu75=UAHYyB*E3K1*RtpBEG`yjCcPX%Q!|7QjG|5 zfqTnGsMPUG%Rh;t8g7N0ukbLVzOoEuP|gyBV?65#tF9f*`iEsb*zO>#-uwryosYw{ zj^9|CfJzS%>&$O(ZS6N8oR6u7#0vI3vmbVW<}}v%IQR;@5AO<;t!dRQpx-o53Q zEN;n^>NG$5&xv~$u>S~zxa*tha%t#2i$juDo%&a$j?x7G^l%E12sHTou-c{juSL@A3|(J#k*In;xXN3glQS9U zL;xc5o^F8`0U74J7sxPwNsm5>Zsxu?i@wZ=J_R;VcZ5i8 zLRRbO9(6g<@}R@&^@?rW1K=x3q$2RWPZuXZxeKWFl*n*!)?hxi~`$2y|n9cx$9 z%u0_sVf5>nhs6dP5=Xb?={{h=p#}7@Q4`V9JyGD$VrrU#*KHC8!7w@cia>;h{qx7k zco5SR5TOmKX^b$eDJV9Y8hwP28f=T#r=qAS&}I9jrcTqq_tT;Vd*j#B(5-rUvh`FYJ z936NbZ?vMDu7mf(^U*0VQ%2Ols`lAFT+Qx*X&@Zz-opLSjm0FS271%1*YOw|UXOkZ zG@Kf!O!OeiZyk&l10ArYH}G@4c;|cG=xd~74MJGXzJWJO?yrM#xG27+XB;&iMf;qi z(Y6MI|8K%+nx>kp6wCjV=gT(B8j&uNdEyG@yy!PU_PEU2N@^k5AVkybgS3n(!-fwo zs6og&L;M)7$Iwfrm}+ngXo1TbiegP@%vo@bXkzJ*Fce=7i`h;JYXO&+7LNR}f#ES5 zp;)|oL8YUK!9B51Rp#9SriwV)nwvFNAiSY2mIq%psM$wd}hCqs*s<>&>O zZ3g;#xh|arSB(_JW->G$G)~vr8_&fcz;j3~i@+s0nqQE|9K)Q3e9AONN~Wf_dY$TH zRkE@R_f+~da`eWDwM=7g)NLhF2Fhw-LulVuc+|cz$4KAW)`*gRP0h?xX~bWm+p9G$cUI#p*Q zs7bXmbX|PB4D{g^9*{l@N>MpgJ&s%D#J1>UN*jfLvd2rj9?E<|FHusbH zc#v=MK`#?tn-23wI~32hi)=eFD#Nju}C`9 zB5roiE+*Fd*)9fZkF<6=aOZY2pr~1->*bxbhgpjEO0I>C-nKr*>fOFRMj-}E%~S-B zY{W0!*ckI3=t*Fq-@Xae7dHv49-+09t#tk77);9wyu4uxfQpp0laPwI1-E>(3=6Tv z)|fidzIGzwOSWQJ->Jlpm28VS)4=ZWHY_pfrpmR7G&v(1N5J8QrM+JCwy+j(IP|Ft z#<{o}p6|7*Lk^I_x*%*_YfzlKCS(igTL-adEKM`&t& z1dqD7E&$JWkX#!o2U{wW0BuHkj+ zIC}pHZW^>wm*Oq>IRrCLQKteb)-PzZ;Fk~_@dN9W$RYR@KcxCCWCs zTgVxIRBM3f7>-J$FEGc1_o@l74Xf(`G2V|j#{&i{>4|~&9lo;^0Hhbyb@$f0Fqls#@2Q7$$eNa8!^C0xzo}KdK?aYHtAXld>CC3N3O=>ytPT!jc!+m^dL>@ zU|L7oAyP(O)jdx+Odv6JP=5Cd6|Fa;Vqb6wh!wRVGE_hf_Ep%lAqxN>T?fUtO8`c~ zvqe`--w6o01MqgZ!guI!?cP>hSFa^71Ywb}bx?F`gV5vApb#5rRM#n%<^-cSZ-=gv z@B@i>nvV5P6S4D!r-@Z&6c*rrwsCdPVypGI=lo6_QeZYy(uwUXgj#p$#v#HC$W#8T z%@qdV%e}R$p$~qyE(T$ib?xh`Zypd>5P?KPNA7NDvzrGFU_f0vP{#21M20=OyZ%q4 z6Ai&9+NX~?7hm@TkA8tsr;z3q2M7sB;d*B~?l z@DxJNXpwC+eefEjUOY9N4Mj>0sX7`How!SSgIMaOz}B-HJf%C`Rm& z{)u^ng=5}}V(uYy;Mpskz}iRGL0bNLuo35HnGsHi>2;8nyAMIwqx%iaisM6!l^A1) z$HhZ&t>Un*K)9x$XNDTBL{|qv8LSF0Asx~A2o)4`;4othQPsg}zZCyPPae@_(Qk$U z+ApRK`N+oM$mGl!ZhS`gI@s&;Mxe>;W4g9}{)3K>)H-_Um@Wt@6m_E^!wS{P8@9 zT%d~RGTK-lBPl8nX-d`Us$%&s+#t4=3;>q;S_qp3K3AkInc@QjKG`gZ5kcNqju8l_ z?R=N?H29=0fX1A}P6r!aD-JVN_^kBpf1-Doz9 z-j7lK>9G;vMZ+nMr|6&XUY&k2o**U)3%BM8ii1AX^``qOK(<}cS!SW@C#ea2^NF#X zSZS*`n(#Bmf5CZOp%>(FsgM~oMX-teB+~Ry%~Dn>)*{0Dlcph8&dHY9Mj^AN^@nw(Uw_kAWCWds2&VNKsG|c+5PIp%dKQp`OS)cu{!Qhz zm?V1Sk}gF6DTmPNYn?O5bV4X&CHczFF8iCO(O0hMQd!%03OzJy1Nt4jLGwN!i*ei} zY((+%tGd2)_eRZFGMZx1gl)pLyiJpSn;aHO7~vJWKSv!lF@dX17YMis3hJu zU)6*$J{OG;M6d{FG~jgymP;7QYYA4f{hsV+bLh@>U!gW}7 zObVoD0lflP60jKnR91)@yY>a-q6T18LX(b36G+_hP+xoOEnoU;<@AP75wRS$KFym* z7Hatw_F0hBE9iwYfY{&n5yyJhyeaiCn&Ral{?&!wh)h1ciE(?M~&~n)82GpSa!S8hUwTq*dg9}19x$x^D5%dJ750>-V#3=g=k$na| ze-Gmf>(5afrpsZ)TT9W?8LHvLO@z-P6UAajP?agal$S`iO1?$$U;dV6W69FX(pcmf z$YQC4WUb(Fa4TXFcdv*=oPEp+Lp<%LM*U)S>|8OsM7sjc>}`)Alw5ceGg2&>vm)59 z>VgGVN6UVMz|>*|9_8qdkPeqU#RNpaKS%E#G@HEre~JN8cG-$RxKe+H$g=w9n4|SR z(N6yc5BNU<55RX+GOI>9b* zNK-t1kq;M>8Lo*qvV~ymhp!+QTNNBwA7s7vC@-Z8jq*lx;ir5r67HH%@5%b%Q$C2w z^?^S5T;(1384oUeh9SkEYPa4*ziYw|_yd}~JS+zM<>zT#*L zYWr0nkma-mVKw(H!ObPO8GDoO=C0}ZrMVT@dVH-frb~sJP4&f+3>4>8gw!|wC_~zd zUDUb)`$%kjFu)MvgKHVoWB2fN7SIx%&8slf7u_hbOM)t}7QbtP=0UBbV-ba40rB0} zd}|wDbBOQ0Vq7AgbY2D4ov*k(F}SyvNeYw%{M!`z|CcGWJrlN1NDYfrPgCtzq{^27 zUfRflYfF5cxhL8uOhYGYPp<~Y!M635Sno&cEeMJkS1ko3`vw^L6dNt?k?3j`%S7O3 z{%#|Tq)#_m{v=TdG@*ZP!u(B$R%X&cuUbwi##T$rlsfxI8|6WQavdeIM|nGM zww#7JsagywgRQXow%%&FN`_U#P8Yfj#SU>wAX!^+2syV|9+M{3FxD;Jj-THhuS}&k zw_CcASyc<-Y3dG3oOe)TWeH3fIaTvPkGu z6Aa9-&{_7Nb;mvU={{AEfUJ8_?7Y`G zujrI8NNd?e!PS`7?p!5kOao!tw97sS(~=^aZ5 zy$^O{`tUV8e_AzW{a?mfp#Xt{8aEgXHO`THE4rrZiWq#CB8h9(*rb~m(W?r$;ikYyo$ z6~?2#8u+%qh;;w222-?XM&0SkuB>fFH8kRec511}ro{iKCZpj2OOlmRIxs^yUuX(t zxuL0+V?;KldGn|2&UBekOCBCT3uQpc-el|vOdNRrNw7P7s`7)hD9lBq?Q9UOQF;)(Pw%T=ny z^yVoX41z)2bjq@eu+`X-&z?eW4^LTc%g0nl`h+kM{pb`d3BGI!FouO05IGrc z>8!V*`Fu~68hX2(5?pK(sYv~riSBLqHTZn+r$3WTYIx&!EQ*4>`GVif>Ek7_MqB<1l_3vA( z!ejcTLING!94x%8zl~ATh_jY`uuS7DKoheRZ;e(|mx1pB%Y*W-MhftsC_7+LRpXrS zJ=)F>urK6x#)P>4fn^8w4`Y4Bz8m%D>dAAKcZIjd$sxQw?V6)B(c8J0&v^R|wApz} zIz5kTLK_?>LL1DA<~U9<4Sh{+cTv_uWefjRx85Q(ekIcO&`|ZKss)NZ@*&(9nO@qK zERekGZB(M1O{n`5OOQ9asb)DWLB-W@4Ca1@UuK$V^5}xkEgVG%L;&sEOjFF-yH+VUbt*oO3c*=)9rT!Gi}io z%kRh(tA>@^ehuXv*DQ@045ZaRkiO~j?7C$o$*hijJ}$6Y48(wa5F5?Yvqj28nsL+8 zND@~Kp(9tRr{iy8NEhC;*blh_NkEuNd|t#3kSzVzR8aAGu;wJWP5SDRg#oOMEE)<( zrMt-M4P6%&K-VXdf&cp~(7}w_mWHfR5szpmWPsC(iP|u$8WBuM?F2X>;h&z}(~43v zQj*e&lA0%_C1<2IRM5K{9b5l*9b1P^1WI!ZVIs{}>Ih{oc@_7HEQLKlMgW9AY%5d=#6T*R zA*!Cg14%RcPB5&n8Oz|y-|_{@=f4Q{AdY8Qyp<093Wu|c1P!L&eHDBfLDz9s`r6mH zc7qKXB5+hI=xqg0XpuDNE7sm^nHBgW-yqm~fGntl?)WD78ex}V*}ifYlJ|Zt=oY&u zcNwBPtG|VC{iZw!o6Dm7Wr*(Va}U33yC+19=PpBdC%it;aC}lir~APx8Dd-p@&4`u zbfftp_zCgEJKO()H5PS^zD7MPyUn3?bOh1qF5!w~O$}?&AcKi`s zn}cJwJ+8Hu%0~zQd)Om(h7o%9?P#_4M0+0b;?Yi6eUb{$O&?C)hE6=d2iBS4xZlOe z8w0$~2_w)Ip_Y-OwjqKpk&JfEL_mu!+#*?kywII;If7JeU7RyueC&kQd?CMsGMtN;9KY}s;EzU&y-y+UL$+StX4>3WENkfPUqD*jv`{IlR z(}>`uN)`dPHz_^0H$c8KirNdngJAfP*pqKqwM!=GkHH-E$Ba5KTKuF0n|}fq@q=5rA{+Btc4GZ+qKV zu!N!fTPMkDtS#T37fbuSfwJw5&~>E1o(tRTVHDRENj8F3)t-ZyDwM}`mLT*k)1D2v z(H)Ac2{qk+B(#R)+1ntO`zTtRD3+{dZH?@$V`;!Klway1nOV=eeMO}HTs2oYSKgSL z!rqd6DY_zP4=34|r1oxz@IHsvla@(tipflS*EqUo1KwXfOmYG5A7DpF;?7ODARi$a z1qCO?4!2Cs7WBVrl*GXg@AV48EQQ=Uh<5o3y=um8mnM|m?#NnRte8F4e6nF*h|)Yk6(FbqGSq@ z+F>Q};evFz4}7e__e0AxsrGVwN*|&f@K9)E_fYsoeP!-9*UZ^8v>ABng81l7By zO9qoU_7M=Uh2q0cLVJ=l`*0u|e2Pgh@zYRbZTGh$bZ+ry7=s^XN)BLyDYZl18GZ@v zKb$Su%Pun6hs1$i6AiY_kxa(c9B40t_4f)cNUw&DWi*}agOSXRmjUfZcsRYVLd>&K z9fsN>ysNK;S{NZSJyHWW6?Hq6L=ht=+$7m{X#^WUHjA$?wM>xcun$nBF&R}+j6B*N z*v&_m1m}@n6`kSn9FOAdiEJ`iP*D_1m0eLx?i$>e#=78#GYng4E;CXAO<79qCGPId!fO_8Eh}VS-ffQ;9R1uz*?Eq8x<>NvZImoSAn&{ z_CdMnEVjtsaDJcQ&7^MyJR;V<=(0;+0c5I8MV^&P`{TJ2`Ue{k8&Cm{NXG#<`6kX| zo#MK|!NjBz!9B5Cc|&nfeuSGY8zfC96C^TmS7sKCyv;NPzMMV2N*Pz%&SE_{&LU<= zk1D8aQy2)-8#X992*&48qaMDz@{pY6PD+pA`$mgTi;fDbbQQap^(=^^ z2Oc6O^ZG;cO{@dY{CIl&u{nDG2}$WmNlOwuNC70jnh~YDLa`XTl-2_;(4pVa_03g^G(lSMMJ_c)7%7ha zPES!WX|=y1kb0k*6N%0<9T`_bMZh2Ca+2+t2G7hN=2-96Kg=OWh4D-UP|-64-G2AX zY+{T`#wgO}XtqFO=M^hqPoBcAB=O<{(A0IG37Wcg(c;C)nncFj@)B~p~{Tk)BzBca>6Nv{-RpbF-yL}lG z%O2*z#yIO+l-GT0{+Z13jEkcyzeAU&D-?Z%{5my_U#7Un+BF^+k&WM@VRogWhhQu= z(*xg|k%{ktGquTm{6hEp=5EMf@?dA&{s0X>dSIS}7sbYy{{xC+elV~8cQo>UA{u!H z1F3nRNaIw0tbCwsBG+(jWK*O?Y!I0&-pcF~q-Hmkz!Xn^4D?B1pii35lMWt4cWpR@ zPj_*$qAwjZP%rZ~e%qYQkZ@05_@Pgu;mWDlTYLe_9pf!Z`pZ;>k+r9J`dF#<9dj&z zkg!KAc*lH(SUkNU1)RYx6V8~Qq3>RpHSeOhYKEeOe)F!m8!7TY`)&Omu8o+9)#h{G z?R?KX2m$D&@aw&g2g#U)nc|DAO5d;7(DP3X5#AH;n@7QF;OP-dn|^?syU$S+`EUM> z7&P?I2j&)Ju%|nM%0IxAGM+OZhQj0N27sFn(faof&DCVQ2SP>Fc~l=cZ|(#zXVD#z zX1;o<>T{J@ew@1_TQ6P5jzeb8W9Ah<^v+w*F+7M1xv~#^{JGD(fDHF^ff-{z`q;7G z+y)p)9-MREzm96tFpSZ@v%xYt?0~r)0`zg>?LL5ttHZGKu1$!M(}!yiCzdo^k;U4Z zd2j-bK8SVfI%q~1%{)(Gz5iw3A+wIYJ3{fIf9LjV0WjZ=R7^o6pQjUChF*-)*^%g1 z{f7A?(#M0N@b(+{E%|8N*Zr`0B*vm3jvhaZc6UcBTF^gfh@8$ks7&+r8>2XlS&-y` z0BJdfdpeclp1Nb^HYCA=6Y{cf?b$K&%VdfN=VHa1DDHa`6J@?9AFqB~c=hAvz6|7m z=_0LCby2xm5h(kov>&^M+#B8pR4J>+|wwOih(aVMsOp^zj%p5Ja zsn*axOB5gt^yDFDW&>(hcWtPRKL!>}?YlTXo^@3qkRrnaVN|^lZCZ6}Xv3XC4=cMV z;7V`qfozIuv&0Id#)lit4rClaJhg4Y9ecWCkno#jgm@sJc7GMu7W4oy_Q6-p7Lw(G zkor6sL{^IKf0)d}YB<{hu=G+zDCj#qtzK+%a(Y{+SxJ!CsUJsgKk$bOg zF@td?)RP4xqd)OUpH4r@vV^dGY%+T(ZPZ&)N^c*;+pCjf0%;ee&g9+FTQM3^nAC$% zxu6~Bu2o+=!NR>}x!1A7j2Me#PX+*xcVe2H-f32Ww$Ov1=TCRx8$8`*){3!}w}_?M zy?Cj#z2=XgAp$#Vh-Qj9U$sPeM)6G10?cwdWOtCx_>=e{b6K=k_$aT?y*Y|N`mx(= zqW9fcroo=nSo(tpy)?_i>mb0BqbH<#Lf4$(IXbJ#ybR}I3Vi$3LX&FqbsPuH5v);z zVuyT1cR_LhT5JlVq6hO8Q6t39vJ+P8ux&XGI(+e}j_Zm`cMv7LDGCfV}+r$?Bz0E4TYD*6crx=J( zdZbjLpbrZFJ{qeqJNm9L2h$Nn3K$AodSF+5-g%cxJ47#{Kcnkjuf4E zf2tsy##%|XP3|4H#>_HgtS1iM{Iz(I)oZb9n>?_^j#!6c{r7VRQFNpIy*`j@<5d!)CI-NE)gF9dt-x0U8rIdB|xd^E`66&Ny5ZB(FS45UBcSSJvI}PVp&`d7vYy&4K7E(7&M~VbvVCgiQ8`t^U;H1WRC`HwRhE!m$9I z$sLWpjs+|FdIMtu_W^g^gJjh+vAFoi0I}ZLF^HqxdBq>dk8v-s((Z9^qRurcGU@Aa zfoDmP8`e=}BwBm`E70U!%J&Wj?jJ*-ta75Q>AqB+j7djPQ9g85Q( zQ5cB*&o1bR0N)4;1~azkgrMYE(&)C91pX?`Mu-LRdW9f2O6NEO{^ zQYpjHqLG?gWV{;+RN^T7dT-9(HQ-7{X(o_HZUoT@uP7N1HHCJPD}Dj`fg76A3$Hz1 zp#Z=U5{nUripxm08msvR>9L5-*-);D+4^p|28l=R3E+7dr-}3aI8GBFhE=HyR;7pX zaHdQcftJLc9D*U6oJw4JxV%79>kMV~|3u_0M*H%!-3#r!1Qpq8b?uHiiPAP7< zR|=%cZ1*U9^qwg0ej+cT{S#phSonL4R5-gy^@T+;s_7+3A=BKjI<@PCW)pvw7y8L- z-|QuskB1xq|571dV_HLf)C?4h`x< zirr9@)(*wBvtQyG6r4a>0u)-R{XBrB3B!VNu!^8OO&S(trE9;Eck@Th&0HF-t{Wb7 zoFuuSKb;zm`@jEMUMeg|8SU^7c{A45-rXmb&KQB3_5YCfppQlbbtX;Sy^+8>5?z&l zBk$=2j!q(Cq}))T{y7Q_P2b{!11Nbg>ErGhPv0I5sIKov2PKQi2zO~bjVedEQ+d#F zWPiG$BdI3fo}?e-pyLtpa4RMR%?5zZ-!jLK{uj?2&#tB9igE(aKZO8s9c z<2+KsJQZmss@JIgp-NQtR=k3#{f6vInTkC}K9a0qo(lT=WuUKwyW9VTz7pi!kYk+A zkY?_7;Nr?N0_pSK7%u5RdE!`tK9vi3$qcetTvwd{amSqI~7?9tG% z+7+NUw!pX!GZpHUrXz~`ugdfMS$GRN8vCJV=vY1gkoU8qwc_-2y6_qnzAsG=4Vu+m zmp6qu-wiFx*XnF1u$y1+WOR}gcgq*AX>K&!mRM-CP(_i^h{GeRzDZUQZYwG>?jR~R zw5i{U@Omq6$_IKEb~Z|xP$9Bb0RTfyIgk^=lwlkvi(xa!Z1Fn+PBha*K;o2QYoF%M z0OUw9Zk}}#YnJO`{DobV?1t90B*_T7`YE{pV4vlN+Vxy-ENgD8#a^9;pKXpt<`m;8 zh758;sk)nr0nwxxkB|U&N<2N6W{mUxlxDmO|AZSF)SV1e%QB6Zv~lj_28*{oG$f7Y zoCcbH&N(^jRb&|%2*Yk@P}-JgKJi2OAX?MXxEft1T4`!4W30DdE8}S9c~I_EjY4@q zu}@yXeTsPL0P#NNG1I}%=tVp2lLykzTN{n^ht|eVQfyXtf)L#hB4}IT)(9|+0?S3v zw*FdZ0)e7lACa1t-n^@Cc|B@lwZ}c8KAfE>3ki{JzPm7~5w!II@XT$8;+ztKaNh~@Ivl<=5?1tBRw-xt) zW;Om!L~dvS`^b#upnU@9ITj%h69B^0@%;o)tH>Yh!FTXC}mYDWT!)&%3z z`axbM(#EMjRuw4o00z@msszAMOQe;K6fF~u__1`^dW>>fGjM>FG&AnQyi&TOkdUoI zFY7kqKy*|g2Ic8S`BK)F>xNoW7l@i;f%vFn-4U_0e-MfjUd7Syd602(;{onQeu!b= zL!{}2EPLS_z3>;}1HH7#>444h&OV~67u=n6-)4DV)}HEyrW30N{&$hy2qcV1cNm}) z3>cMhTjgE7mkq`^(AK*lLl7f|GQns}6ce%A6iWx2@Hk_3%KOk;CgWm>)Ey!qUA+kZ zlx9n_4f47|jf0Tq;YOE_!>||qzFXecr{U3guNl>J)E+s=3VOJCmTj~4@EE(I+NRI2HT2xAV5HVDDz z7_@1|7!Q+??qEP82}PaQc#4#}apGSRqxgr|_%7+`hA8}=1jPpu<9@7Eq`_?>C|;<+ zns2~uQPAD_3OQ}b8Vks9cL1`1STxzqB3DJ~MpE1)DW=TYI=SFm8svuj`c#Jc*yRl` zHJ39E#^+SSG{>Prz5;`RzRNK{P<}4RaqX8C7*nJ{A(iAYBFKiVlxMTHa<>v$s0vh{ zUnxg^!&5$xx_;)H(HpB&YC3;Ypo~sXB15Ur4gF?0{)--08n-||f{$pF3Pq>N_z4Mh z!!d*p7fffVjX_=@7S0r#{*B)Ae-FK91<)CpHX`+2<%f!A+)-JrbUC|%^c4?b+6X7R z8Jk3;YYq?u?!Xo?=nnrond+L2Z0s+1tGCiFKgSSzOV=y`D++qUS3s#+@D&feVUBBN zy;WrA*MP)2xdf7`4?ybjVtE41{s-R!vHdgZoA^+(PQ296SL{-h5JF7N~#y9=bLf4nR=V7o1JL8k(pM-UBKhJ7#g9>0YQ zbRiG+!aY3vFZXyaLpr;lN;M=7Yst{;MZEXgeLh}n`gcmi|2!pP+kbn=G2daUX2y#& zOVyRgn32g3aPwsgrHk2@aolE$!KXHn6fztR3VV#JKUC${5WBT%lDr|v z2iBDXSX4;|5F|F!1*HtwN(hWUz<)wIy5Pj}A-|nI$On2a9po*rPPuy5x7jxhJ8;t5 z;Qe@>XS3dmJe!%WUiD3)-at3AT|Iq8vk$SU(P92GWW>OoC4e}Ah(lykdn1nUh|}rf z>fr-oKz!XS`QI@Z-Xr#YuI@fCINXwM%cRM3{&fi+7FKGve_5%nxqoZM&6C?$+YA?S zoaJxfJrm#JFG8?&A%Lb~{UHrk32H&Qf4=-*()aKC1so<$q!nw3TBcGc&dcB9K9JS0 z(v`ug!0LPaxwDTmd@llYr-^iaOEnUTk72d=nR(KN+sxYHV2*f#y zaj++3Bh-5CtNbIFY+Oi;#^WGvV0isAcmW}>nvtZq3jLcLHY+@*Fn09#NW39FLkev@ zO1=y@fUZt2?r0CTBU?%Af)nh_4!rQg(XdTq?BqQp!&Ly#shxZ*{do+8DW78lU`dCt zCBpmlJl!d2H#(T*YX9Q3#BmLy>f0uF@8L`Fnc)$`ZHNrn%YO>rmJ2GDuiSV-L+iO7 zeu0mQR3(ZOX&S5UDZf+%B60tb^g89RT!eNUC{(D6hPlh)yur+yUOLTq?fvKUacc zPj*2;Lvkwygz_H}oeK)u$>k_U_L3L)%>p?eo29hX3Z4>`3tF1bgjN_;M*mpBe?!zR zsAP9n;)dKl7(5u^0Ng88Xld{5uv)HP#rMRf4nNp$tMHTN)%+HQ5Es<3b8B!*M1Pnb zUOr&d&<6+M<XzFK^t^mHC$#8%R=2`fIvoDin*YE0vqu5?7c&qk_rFJP^Gmn;7S`EAhdmMy}rynhi7ywj#Gz)gI% z7;lx357|9`3EzecbwRs(X$h{~$cN16%T`vt#1A5!Tq%GYc?lIYFY%j6t_x~j>!myr z8bFCoAExp~8u<%H==yvqp-Y$YGYRiXMiS@CxFh~${xNCef~FVo3X1Js;a6aY6XWO? zui)Jj6~YkbyP6@Zb{VR#F5}mcOcz{I^D0sNun>AX>)@M{2v^fM+R}lEQ&}YM<2~l! zVXKXD!Si&>iG~Tqu!bQ*Lq-QTwfHb@6?Be^7lPAVje#gX1#KQokFc;+B1|a;) zUHP|2jtf#R1{w+V-S|}~Ldx|Ook8-ItX=DZG#k?czg^ga|BjTpAa3~f<<6zpmj{>f ziHxMo#l7IpnuZPREdy2tHij4X=S*G>zx_;?tbT)z=*@ou&`jyS?3$4w4eL&jZ|V+! zn(9Od#2ec@7tH$4H#ULSx}C}2b{TRS3BFE0JZAe)Tw6aE+RMs*JYsHKl31G2ACqQa zf1WU;r%Mc<+5j}H9Ki1<*)CY@a|hxxjvmOb5=6l~k=CHp63Mi1d*y@f;g0%pNjm%!Pk7jW0K`cSP-uh$|Twn1SM z{td$z{w!&!$(cT-J-J72-^^s6{+-mmOSk+U-Exb&ckD6td8F*$bn~R7lH6{&k$x3^ z@f4RHL_+mQ91$Tw^!K4inGcJGZCD83@QxeCKLL%iD>#mh9D!GKjo^V4GTw!Z;-@3= zC*b994Ia(@MofDBNJH@tGcAJLP)qT&*pMvJ*5?_7sOE) z#lMN8nPSmwK{GF*vy(8gyCz{|?<8U2`mAD&E3vf=N|rap9ty*OZw0KJ%Z2Hv#5Wk$5v3|zZDgWp6(x?nR{G!w;L>GGEJ ztC`5to$Z3PV8Se1tDOZQqp=Itg7LFa^kl;7<~#~7&h6QJCNa3+^bDVaLCemPx1$wv z5MLhV3P&9NJV7D}64`?2;JN%y*xcao#6^Tf%tQZ$u25hH%*TC}*796BWj_BUiFLsS z(02ivEL^}ZY-w-m5|Zmf;h=8~EZJngSytG`gM_GTVHyhFx-!v(0ef>qt>oGUR8<4`khID)9WQYi;c{ zkf3+|h11eDKXLHfk91A~3}YHB~W$RH;o;6}C(rgIBEgOL|GL0%@rq|yx;d?T@_ zC4H0*oK~H4yp^ub;A17tQ_|=UseFjAzlZ#NQzCT!*MUKAs_2_??O@zPA`j2xH^vKUzV%(zfP*5)-+2oXD$KAFziJ!uh;`cC`}@AAtZJ z)}RoJ5Ig>82H-6PWZNrI{9R&njz$`R86Dm?^OG3We5Zgk;txrodlg2LL;y5=Ihwyh zMmR^t)8R4rEoTgW9D=WNL_96AV$_ni1$6U%VCCl{O~eV`PUm<`iKaUO`qGc$`S%HN z4vVL&8{@_~I|Hr(@Hfdh)c+%bi7J^c{5d9A=J(mE>B2n$9qCU$$5`mSJpqka+eGJ( zdYAjcX8hT@i97+^^mjhEY577~f;6A)ARfi66MZLq+YA3sKuBjTj`<4{TLet(2tOt^ z7DaMI!@ewR$@ao*`vN5HHP7wy*A#zpn@fuuF>Ufl%=@WjJreqsz-7_4W3DfU;RX38 zH7~bQE=_L91ks1lM$S9!4mX4O&tO-d1)Mi?Q>2vuw>e(XO?Fj!o82w>mANS#Hi!jV z%sYF>(W?x;u<~PWsL#IYg?)92uwr@v>Oz9K)QIq}05sm&6UW$W0BW9K1$F5&P6ioj zy0a9rg%neoyTo;;yV@aTa@Zw=qAs55?17$T=$TwbjS$o49moj^KzAo%^|~uiGxsXj z&zETAMWPYnK=Pd35E!b$Z*~W-JkAv-!uBSsQC_JQ&XrltlKS)6XU<5_@|R3XQL0EA zt?8*sP-e(iHM~hNDxdwJoxf4-)%^m`?z3c?n(+j`l1o*U_$QX!tjElvm zIKL_;pqK^I$ger2_xNMOHpE*wp}dUw5p9;A<_36w_z@8Aq_wjMqRJBht(TnPI{D)w z*FG_{!^$hHmnCP2W>DR`++zfjJE5wOU(h(=JuaV)|HW{CXq_E_81SpX>MePn`vwCz z(OKYQ!Z1rZi#pS?54d`8-~+!KW{?;s0@)LvqIIvQhG)Whgr3sp8G2ms%&?jCc0wmv z{}8MJ#eW(OHTpNE{r?Kn9s!HKZM~kRy zSNiQi?x@-x>rC{YH}#x}CW*i@b^Z|7lSW=L>?Fm`W^j~TLf^l6xh;&s7VU&52M1IF zU3bwC?qg#+dzeGkxyIQPGRaj;m`PU+qe%xRJS;b_;zsE;0}?5soRIo=Tu1eV>xQRT z@^GeHxBbhaq&jGa3uzJzOY$&rl2_rxU```uFjO<92YR?4nstb3Bbai)Z{{2Z!_^TbL7~ zQloQd@a-;cI=dv)85vLCI)?_8ySd3?zfnWXiZp4eR*IqWN!($$|9)kyWSV4{c!!u3 zcEYdGPm~k#)S!>hPhu4}7t6m9Fo^b{xO5*#64Xw3P{Q`3SXs?|1L|ofWG5f9@|qeB zj0?q1M2p=Kn3lWLa@$yYoD*Sg2VTc(Tz}mFCtiRP*l~9bpxlLWqwsU7P9x&*4&jD7 z%Q+{oo}4@)Nt(n4)3#o)Jgiv3y{BDN>NNP#gpjw6bf$Wyv;nqkyUy!a$?b+IV4718 zQTs5qsS&HWA^r{AdBiXbB%V$PCcWSHcL_?l>i@R?`P6$?2XJ^!X5)cf6=2EpLl&k6ax#dx8oc2*=}gfkd{s^p03=1Tgx3>mDum466XndVqCaiUkk&C5GT~lzPs@N3wIj^ zk#MIpo_@I-cd7Ome#Dnv;Dl0HP=)&ORfem??1UOwRE?rxI(VdP{hiPr|0$G@P3Mq* zlkG&**QYgDGHYgVM!|pRWRONthX%K1a$h68&M5-rH$}Oa8fFo(V?iwaKqx+iQF+4#g#&FC5Cp2 z173)eLh+lGhGH_#F&j>aRVWTxWq6NdIS{VZWVHeAwfS5VI&Zb%Zaw;JqDZ}1d02j( z(@6!gkikr%u&Q{-7YUA;@pQ}@LmVAY#`X5zTVvP-;7G>|e6n@u_vAW5HoK&qV>&3q z7GmJb7aG>WLGGA_bbv)DA05H}6qRo9RGO3tNHmo^f1BJ!LZUwMd(y-Ufi#g#gsdmL8Xi*pbZF!n3~5urJMb z0Eg3Fi7&Ua(oiZv>Z4;qETvQMoUT$1sgGHX@vxLlMLDh~SHmuz=NK1HA5O&$A=3<{ z;Bs}81LS`O>X*+jd`LPtkmfRaCZ54F(-0{p$&N9Y*RxT5ZMI<7#T~)&O^0lo?%nHi}W%kUk)bUWnp!`CJf97y!L$IwdWf! zFt$X;a3p06#$6xeaUemIJBEQ+NGQ*5%ME31EgVCUlvswcGM{s^_8txh zAnGX9Q5H|DhT@eX+jB}WYcF*Sj-ww8$1n6M;1cjf^$swz#Eis+eI2>`(DfYyK@vY2 zJ)SA#3P@MS0EA@-#q=T$TCv#CKbA_zpxktfVE{2XV3KzT#n;Cerjo%9nB<#`MX~Ex zLrbD}^od7w9e(}rSVKAFJqN7u@#9e4Wt^eAPZ?B-N(6;JU)@&~tu)K$%085~Cbi<- zKy}tO^OQ(yOJqUx;5dWHdtsa*2`9`j2jte+u6W+!t_I{)MmtL5sJ1)GH;8O5rjE)1 zLG_IuxNy6NVK_sYI3S*O?1}QEo`%H?F*_iX{@M%WsNRM-Aa!zd#fj7h4|S%G;YvVr zM~VL&MBZem)fz;j4g>|!0V)~i{h+S_cK;C$Sj(^WGsM*OH=Jl`;~d4kzTD9Y?s2H-<+dvk(QL+zH@F;TJwy&Jl~G#)X37R9Kq@a{lVVU(HRNr0}KGl z)X2Kg{sSZ&JwCv&)2}u&ks{SPF@h}z=&F&28`3rzvLq@$x#Jl&py&+&1NVS|_$9k8>{Xp1*r)7J1$!Z{$i z*5spjB;W8QQ8^&2ZfJ-8-ft(2qtwwJfB_v)?%TmI5Jc$?NUO&R(0sr>O;6w+I`Uy3 z?TGS?dzxPKNJqmMGQiO`p2l^;FLv!@NR`A2L!uQ;7HKop6{`1D!Sda*5z-OlCK(`E zApRCuxUVv5(PUvU6w%2^oSv@iY|ztvN!(--1gb zhU{`Cmxc2v*^v(OV+vRQ7ewJi<&snAOmLMvq)PC)4Qz$0dUgZH8s4D<@>!zb6+z@-CP;3SS}yOJ&|68{k)WvNmhtGqVI*_eve%g3}H12Sn#cL`s(# zE#}2=_i)@agAQdu(G$ycU>6%52|zlx;0LZ*3=aW4dDL~f`f9z-c|xW8GP;U?m29dRJ-X^e9J1ni+?f&(VLK26Ym zK@&qKqIJZ=W7Na|sE9=F?*9{1W&4I_|Ln-Pp%mIH>Pxdd&x7`Z@fE*%}1t4CQ}aD;FhaAA@I za_TEGT-Yx&oMp%uM{uk_as;5UaPBm_XtW~;yO9F*ts8MC89(Ke=vR^EUG?j#Y06TC zNVZ41iJe2%NovKzL`Xj|UuEqh9f5JQzY2H7FkB8p5*#|j*ZigzG^(hmKB7L}2WkT+ z>_reM=RE@P;#kpG8mTqh1`dJ)Vx>=eewT2svG!<(2JDuP^j5n0k^T>y$B-+9u4v*W zJu4Qa&~uOVUyx#lDvrMPPrcQ975^v3c?W04U%%M7^*nErC;Fyf2zDr5xX!okNNqps zf5t$`>w9(GHM4B%k*TSv^pV;SMBn%YWR(F9?uBY`P-}YUSN%Pb=75NaABpk)py9Oj zvO5!rBq>cXuqM)#eHC5gowxvCn}$ekF_C^0m?bS85JeSF^>NFItITY?bwk?_S0M*%Zx! z>F%$=J^0qw`s)}t$ftiBxEa66?f|U35`yZ^Z(yys_>KMmkyXzBmu7qKVtlzu2&fMo z`bZGD>W7Y_N59p7NlGgrrbgb!ga5k2q!Gs?()Yg8@55z?tAD%P7cAF zyK<(#^STH60IGYSUrD-F&H%9P1AVOb?iaGg7?ilm=~fzaQIB)%D_Op@hzqjM^oZxptDFpX z$LIKwZJ+DI7^1J7guwmJF~rv|VTd1G(m#|;tehy^97g}RtXFvzSM=}0RapsP)yEmx zrL$fk^Q&EI`o~rMQpudk@j`n5$bk-06%~~ztPUH~-PXao@0z|lQ@36(&|dwU=<+{H zbXo6b4i;%$+9=HtO@aEVdKdtxlV#P?MAjpjDQ1~q;hcO3vhK<RH

)vQ&zW&ZFpM}VsVzK)0oO@BDhUj~kM|N7TTXrSc+ zFmM*wIe`a1SR*&yz)xN)OBggY49X_~B3&qCh+l?n44}}|P*8+|y^{B$*>57;!?~%d zqf`fqBFYoUlB$!4W9D#h8=Zz@Y5ar+{YGim_dcohg)`2;`U1>%6;am|=ZnE2gw~g- zk?PyB7_?XouC*_SXBk7Ms6&NT%bXpuA5mSvp}uyPqx2FgKQ{lqkt<+A@Q1)94;m<9 zt5(naCYpqx5LQMI1~mS&z-pENS!MYYrE^=V;l>7A3oAP<*V-F*>$v_FMaGQ`y&J0& z_aaLBm)av3MbhYG-EW;6!*t4yRi zZbOuRso`)M{fdFbL&tz>@4#Cy?WY%rM(#DmbX)#n1GP%G`Tc(X?tBW-uEhdtK-*)~ zNL4amgM?Z8AT;1*FBIc;BiOU4^HT^+o@L9`m8S1@z1^L-{~ijayc0~pM*&q=a zkTndGf^}SW43=&{LW*2@FqXi4r~b-KWFuUSTU{ejm@SJG3ymLpC68ZT7%~)MC3o?a zPpdJqD87cxhNo=b6&@Vd=gnt>a242uD9-~74Td6zhK#hy{D;3{C!p|gPw~Z{`!;T5 zal#M%;?#m~;N4$D&}xJF)=2r5vSpgKleRC?Zev6W;-|S5_=|u+uB5zrUhVIT)NpK7 z8T2;Fpqf!|CzDVaMj6tzELujBB+_6L#b@Q`o)BpH^B4FmIaKQ|l0C)5e0zDYzk+or zm!H=WdFo(Nv|vdi;^_oDC5+jx27pkyYpD_|H?&?MaYEK8WK=GOkJ|ER1qeU1|N8Lm z{E4PP1^C%gKf5&V$?B)y4P=CTU#U(6!*g$Mf= zH!ep=uq^}4R78z->qUp7x|AcX?wRg&qjGmoZcRG@kLx{(HNiVmRE`(J^+at#mhJJC zP>afyQ`Ta(DP_mFr-XLmFD3j5vP;eM2 z?S<#K{mAi#QfOkwHFISLW{-z{K3x3_>4jko_YmpQzrHgt`87JRC zBmE-|y%At(`CG<$KzygYtzn88%KgmAL(vhSXv*O$=-H(ijS(OjakTI-yV@8Ysdx|OZ^;@w?yah1I%OSgA+lbEM%c_qi*HC zK++x26LToJDB(W<^_M^CQ6L+G4L1QX2^)B9p1t5euI^F$D+1Q8+-!081zzOaJrSd* zYS6ks@x8)E2Y5mxYj!fR9)7p=3`!{HbgnJtQ{YiR_oA8`R72>j7s#N+WxZQ6Nus)&@TF327mhLbmX zI}XU`B0*%_`CE@$J!0JJXma=Z_SZLWe_No)zSU1fkG4s3c+C^M<|$rPW2SG0$(v#3 z&35UV4;|CzM;+4(_TJpxp7-TBwyA;w6n9&G0AlP6Y!Ck9c^DHNatyG9RgO!{GU(U z`*FGo5PF=jNF3&#kavVZ%p6)z{jvS^-JfsIqOxyOIp-NATf<$(=CDM> zxda>TCd!sI_>6p=8M>z%>d^vT1Wt% zPnXQ-{{0{F$ErDXO)KmL1JhTsW=L+X3A>s|ZFFd~$MMlv33Ppdr3(UlhJg^XZke)h z`bM4iMmf}8m5=o99)V{)i45C6_2gYs=O6CjKLS6LbAW%(%$3!q&@^G~?Dwz#^>Jy& zY*V?oLDLW#z9F?=<5)X435+lFO}+(j7dju-s4hglKRq1!Bk00AhY{x#5r9rFn9(Xk zo*EAFiP}w~E0yPIK{7>zAzfsEkRl5wNU3r~QFJqwPbUGkCnTC05=S9;36fSa`><&p zkfg`wKTBS&qXSkr&8W`}X&U)HD*+sH@HrnwhH=~;CE{j&Md1cW&??}*XNLXc{>EET zsgt=J(CbO)OUi-*2=zEX%s_M{96r4HZMP^EN~6lzt`Z9xMq&-Q&~tDzBNkLI7OvrA zP}bL%va6$42G`eaZS}MAK{c1k2M&7`b_Xp75<=z(AAqBn>qSJ{%ZT_Q&r_vz8WXi4{Z3)PM9thzK@T<&t7oKNJ@UfnquJgA-W?j|RX_q{X!>{4UgGf3zvU#|y!7b%HA`Lr( zq19Z~V%=q)38riKC5rA46g?FMl2bGq<8V`(>kMDPa_z4n<{;ocFHS| z;vP+SB5m}riC_qI?=oDi)pbWdJC>^spi$D%r&r7_aL%VGo_A@w0Q1Wd=;H&$$A2P} zd^W)En9@A7kw0x?=gvJllkx0{ZO<=z!yfQ+a`4$_##_ehuebNR1)Q?UBvaO!`Yg{p z`2~3rXj#LOr*_XA`G8j^2zpX2YuAp_O|DZ~)}UmnoPFo&%MYTUER|m9n^d8eep+iT zUWHoEU_pVoEc9tNx`{0G`C0gVY2ml3;zHH#S@_KhKQh2gtm(Lv(8zNIG*ZnQy3}2` z@so@x>k#?Z0s{Z4k4mwX@X&i6NU$1Z9}zc*hzSf9s#^{d7PB7DnhdKM&CuzJ6s!Dl z?2@cL3xF>u0RCFT{eL~P{yEkkuv2p+-TfJV$~k^Gm+ZS|vZj0~4{ZQ?lT6wVa^kV8Ck|A%9lB(e7PCrOP&jgit-i4%9kE1UnnYt?x=CuhYUu78UeBKjo+b^ z7Oz`RYti{cfABOvmmlLUxB9a>ScL<79tZa66=2bS;ZEGt;B>)*x%aJ*Uyd6W4Jx%U zg8i!U0^^$ZBv!sng3;5(j1)LX5$?Po+md*G6l_P^W}MKPi^Rd&)tv^ z+lmlJ(f+D&rwCa5m+o*r+K2PY6nPZd90^;Ea|CUiO-%0K+!g`fi1|WR4;JNQ z!A@2+)ZwskZih0V2zGLIyGc=KUWJlug2fnfcd5Ao!>e1f-fX+crG6-iDC!R+F6U!o-B9oEQs?X2{ zjQSAQaohdJ+w{yiSSIq*h}UD+@snZK>)54Az7krQ@5eI!}Y{ri_<%nkCo z>xu@cgWjcDD;+-<^=zE^)Kng8<|@_~!XvxBL*ld)Mo%1LA!UC&*%kNpq;WKvE;XX{NN+xt4U2P?$?T*C zS)9}$vm*6jy@9yf_!o6hTXF1^-beRIj>3xL+kqq*E5gxzd?!;lr8O>x+jjfr!}e_I zmt&J^#Yndi$v(@-MGbpV{_INn((nI;DDbCzCAa0TZt&`rXYv9sO8pjYEhUA5PNhUO zvpB(n>LBWYVJT{@61RDBn>l*ACPoM(lV!9`EmNi-LLIh4<##lj9FX*DOO>YS?TU&z zTehqK?`(IC9S(FB14WRnQg;o>mJd|2n4BwavXH;rW#D^h;5n+ygj6PPl5}u=fW{0! zV?Pr#X$%^30?n?N!3djlgpD7-ri0Tj>xp`438>rEg(T8y>fMB-dnj*;kuLG4iXD(! znIC~{k4T0xZwl?TP}BpkT>uKT+;^7%ojw%MHUzDLXEn3fbk8k8>k4S0ghNJ_j)A$% zue%}T2_{jMJ;(B;e!OxCV@k(|f&$ZBk(7vFLj-HM@Fw2(t~s{x?nJf%lQBrbdXSh4 zLE_hf#0)`FQCts`aDqt~!z3SJl2^bacQ9E)u8WSH+mTD>gS%v3XSjbXCi+l^1rG@dk7-jz~Qo5IX#Kn@pI>^Dsy$nO1E4_sQUphiu9Si`X%zCKOATVTP zw#>mCnG8E(Hb^gx=xCY{l99p71nv`U%}ypBTi%!7a($bd+^={-3j#%}5F+UXrhx%Y z7J0H^`;y6%%Ka+bx4*vocz>P%N|RBFmvdeiZowbiHhQU8;nDD9HX2#{MD!`axZp&v zE;N;h6OdE})RTijN@h;7_b+;Ak%0Ubr{AEc)ONrXK(`&#+k}4w>VS0F&IDr20%3Z? zbaLSq={T5^<7gr^$X_9>y2r3AVr*|K4nTcvp%L(D%-~8;x9|gUrCQR|i3o+JLY7%+ zcs2YZ;fyG+z*h>f(<^}<63o#Mj9W`kh=ExZ2l8!MNVT{5s4VWdIw$ZduB@p=l z319~tZt+w}I9q3)so~hDCF2&pJ>zs+dAem}c(z3Z_|x{R*&; zA^vm>)G{$6(oP2Cs|0N#4Rc92okMt#OR#YGfJ4?kS+Fd!toP6ok0W+p2a4V6^YM14 zHVgY8Q}T=oV`Tq>F|4eIM4V_ue-qLA3R-l|c8jV9U~B;#^lHOQvCyoM*;8Z!?}4T1 zizrQlK*BO%w>-Xp#MbcKpy3bAd3UPKaB27|&|S#1b8K=x{Ca!>4tTpkVG^osEZipd z*2QAOv9nGd;87?B;cH08%%6iqJ+2&dnX5t3On z)(i-za2OA_%iBSbu48>-Pd`-0J*T#CL(Oyw6=mK*(L#G;ZlQcp0qcUZf}E)tO2AdSj3Np;&p?LFLgVYh^_*>*0?xQ;YI zC)xa=tXx!~Dl5^0!F?)))>X8mu&{P0rW=YWLkZnb?D?UXhlT=EeKU_IdpVwD2dZSl zv_)}<$b*DviK+I45qzd#E3U`ZB`mX$1iEhblgeQ`?+UvzCvx*j?1j&*f2BhUOZDWumJ*pI`l8=T{@mEIg!{#V6E+)DviC z-)KA+u+ADGG_Q~SxMwg$xeH%HxeJ|g2c<4_%3b`SmAm{?DtFEI{)+acxStiD<>$PH}=wF%9o+6FB;R>#XT2)b2%MPO{U>@y2uzc80pA9=( zXBimBYh41n)nJ=I%r)veWzaR&>tV~El|{d%{dxe;^)xka!T!3u`1OIbW=A+|`LmMe zvl090wn_tfShG0=@O+&8fWOx)IF!9v+7d1T14 zmb)dNVs8rnpWZ~?nasDM>z8VJ2H7!W#~_;uWXn+SSyJ*`2W(VC^_LkZgM9$D0WxQK zLCby&4rwRr>2nH<+dE0_Z_A1%T@to(Jr@jK~1g zVkGIH(M3l%J61_O!Bu3_2KmvE#=@eYfTnf3ZXq1;n5rUUeBsLjY>Bkm>rDpStgY)u zH40DK`UzeUVf0k~G+nsW3ZucW(-_t7!KrRtEaSN4Sudy`LQ1T$TvSb;<;3^mz&Aw81%$iSiSJv%^Q(IJ zbud|DAgP)@bHTH-;McLU49V^SE`KVA!7sP$Kl>9t`xAb%Bj=7wR@iTbEuW?S-_A90 zfc^`l?-RKvemUX${dzC1V9ALw_1Smv2lZWajh|!RIAPy76&Xl#yyne1-EDeEWSlSg zc8SPXD=Qwd7XP3wgvk6m5dv|YtXSF1Jwl|MFH<|IP^(H{c$N`~njcSDZc93Pzi+|! zXpyTH$Yq3F0oM+SPm_?O{?tI1E|@bZ>;);*d=YEI$5}!LM zbJ3)(<$IpJ85Ca61{-z_<}LqI zI*JZW8fXbX{&W?n+OFz@3fBQ0AghJF1ejePk-+p9!E8~OjhkMQsrC-EhgD@Xou2m0 zbv&V62uVl~2js>+J$PijByiSJ)c&_6ph$}$ERgz@)-5oiwfJ{pMHi8m)}$c+GSZvj z+?-oAg+@x-GM|4yfKJcytBq(DP?rdkncBwNTfTq28>kMjnt z&TpTz8O3BhVjpyQ0>L`9`Wfl32a?i!Q~AI0sAAmosWUHP3vXwD1uMuGht&i>urjQ3 z-VnH$1-Ml;;WTsiqu^In+ODe$xfe|+&Xw)9s66mc*=|%B7Wm;vpEd5^wloY6l~LVSMd^=tT?@2T z%Y&I&A1voRQ))unn{lZLnjh;TCaB&wt$3l;q~yi;mNdLcqvEv(KVQV6T08Da0T1CA zQsSrx$J2m)4b%@G-o0)AdHbQ=zI*%e!|nF0EoG+lLP|GELEt7;gw+l3npPN8(k<<5 z&C`QQy8G6(Glfp%c2jTi_{yCSJxV4V z8={Rs+p0QYlP<#1ukZeRyAD5Wxe7OKRD$&cr}#zSr1f%XrVdn(v8S9s@cOUcZ{Pm9 z4qRQ^b;PV5gcykKsX->R42zAK0^dQOm_@iszKB>rzQL5mIr|svTfv z4h8$s-2y%uu=I4%s01;VgGn)^ODTCV-f`S?0a#@DF%)|Acjc7RzMTcusSbJ#m7c5~ zpfw<u|5t!DBGv^wg$2wH#qz7AB2XJS z0nQbcTO1Mu5|RN_$M6Kk^~G~vBO3;77iJwfYd@KFq0<5N>W+Fb!D~({lv$Ax;J6L8UJm#Ap}0H1bDdk`!wI~DU?Dp z7EPl8tOV{lfxlMLyN4yc`i4?1T_b1L3Rrisfb&l#;Fb=jzK~bTia{-%Q&(;y<*#Nd z?b1J*?SJ^|1Aeaj*zR`!uf>nC(L=DHcju>S_PUzAzG(J~Cty{x%3C_?(#Gqne9p{b4 z4_>L{ufj&_J$zMV`f!rO_;jfo2*U?LHUg)F8q45B)Dl!lUn@~ek~MpI3l5bQUJNZ` zdz|<3KHL#hW-bhQ8!o&G@K70HQ55(_z8!ZP<8#-EF5k%IoALvnV(^;}#Swx9r!xx~ z8dz3PLJ14*2Id9JI1Fd$6pG&91sqYT5zjY1VOTPK{Pfw%I3bXYG|6-o4JAfN%U00g z2mewTI12f;4nE7>ib(38e?!ju5%ED%(5I3O^)DkyZ-tpeTrwMQr=p9(dXAi^zL>99} z6-t|pTrrAJt`yv0y#N6?4+xmSG?9mdwV{M8Q6AHwu8$HrH85YX2qx@PrD~8Rpc&C6 zA9g|oI>-!>NQ4fxbaMvu;696z+j7%OUq0}Y8U>_S0c!_v?Ll3r7Y=5F(ajgPg_N0t z1&=bkbTg}OviQ>`%lJ_cTp_ZD#H$e~MJETRFfx~rvd&3Rhi~lQ78T*4BXbbq5>DD!2N()qF$7^X zb`AG<;1${-qI42QkRq8T?NEK{fbgdMCISW}IEfz2$~1jc9ym)zWs@zeW>J>QfCvlk zI&zCv5NDxOk4HKe))T;{pGad1b9C@GIB>GYd+;1@^poh#g* zwJseBb>e%7|MN`eL#dH%ku0zkx=jL)8Wb8MhdS0B1$J6O7&Blo_i~Zp4#K)oazXDX zAt%;n7hGXXEwj~>P%4Z-ftGPQdzO+{kt1TkRg%4S1^Eoma)otWq>zXpZH!YoNBt@a zsRX;d((v15eKZ7$!Gi|KLqG#q3^24|kJC%mU5yZ2QP2XGw!k;oQ*{#q(}7QmoB_Jm zcx&(9{Ql2(w;#^!U5-tvFanvwm92f+ZtCbI__V2!Pn)d*v=EWg>Vw{mJQHsQ8N!Qa zq8)iA+A7>i?(B5!SeWMz%ccvnom-eE=VzbpT4C7nx{T|?_-^3hYsYIc%A29<(S3|l zU4W-W|N2qGr7e+~dYTP)1$K0R)a~dx)nne(F3P>k9V!hVsQUMir`eIN9+v}KrU zJpc}U=f2ovm~Q0hApZsF?!_>MS9ACn*XTB!YlQ$p$9V_~TE}K;!e+w03w*Y2Z+^t@ zueTp>*U$mm)o>i9s};Z;be(=jCfvGF6F+M5DmMAHO4D<&qbAQ%L&fSvPKg}B~r zY~pHcC!WRvoiWwv;`zNB`#3YCVoZz$KMwe*Z~G$C0lM87sfB`NIHSAN=|OM1Q69-5 zEtR4$tDElSO9^8& z_fC^qJ?z@_BTD)Q4_CgO#t0e^lpfP`g=kM{y1b*MSm|_3(-liA=IIKVX}aX`1r%}j z=ItN%YlxvVToM)B7y6;gb7=A;4Zu~H^;&;c`o6i+M=Y-v5QEmwYTxIneT!_eE*tO> zHNWrIu{GN*Ies;h^RJtHHH`8q!%e_MwU>pn`i)kTiQr7_Cf0&NzVa*tz6&7$npiCZ zPK}>Mz-O-g2vL0^#u`OiUV{8T_V=$>A)XC?&duF-wPCnJ@{Nq_MLtwe%Q#AQ*AdBJ z5c!h#JV)aRebtaBpW51MCtC=#y|U9hKsEfG4vd`GqeMb08xRd}>5QOsQBbS4nJ4S+ z8X5K*AwIpAVH8J!7sD_wAZ4dF;~Zu?p1-F{B-CGP2=uSzT?>x%;)70j#fh5-e?0z+ zs@+4LNx66?^(Tq?0nemsmL+I%(~mEm^~il*E5GGh`Pb@&@~`Jr z@@aO+CH8V1TWYm}FLA_j0b^>_ab_BFW_3V%0R@>Av{R){L1GXyT|LcY`OK5$QxIz= zYw^|aUQr^ZNg@b*W)qrA+OQk>r(vaohZ?>&&MSexuEsl^amJu#oz5_#<LmRQd4~J9ZvZ#(8$Pv)LW5++-mi z5e}sQ>1K4>F1R~RUO?hyp_`h@p|y<1HDZN_eKRLXs>)GqdMLNc(d7XaSdRot52YFD zM*gS_FC+3;ySSJKPVK)(PC6|ja4du}@r9{oN3Xy4bagW};H#X{1EOp!`&^luyswxH zo5PkHcPQ))B`vK!-G77=&1HxCX6@;|nH=vwOP_BkeVX{xXTGHXo*fkNktR2}-lJYh zS?lG|tV6)FIQnwp=!+21tmD8()o_X6Ojs>j?m3b(g?Atuj;V#6XNI) z+a597cBq|p{^T0@B{*E`U0`O4Td9rmY2%fi@TOvIhn$d?9m%l)cVi0pm9Egn1m4nv z%Mt&Md0on%Gt$AqL^ZP;lAi60x*Kc;y|0ZG#qnK!N4X)t^hjNtXyU|Qtkur zWGTxJtZu*Dv8n@dDSuTOTncf)4HU3C%jLZP*bnT#%YIWr% zz8F{a;em4uIS%_xW^{RCaY${MOe)*Q`(n(vVqEBn(b47w;_lS^S>Amec_##$3cZ&4 zV<68R@H`fNdbHg{WgmHKK*y{ch00SZ*N5pOew(jRNY(OS9B*0d?}S=wF{AaYokM56 zM8P-{xN~A>qGPQSM*Q0{A;o@`__t6V6vq>D{P` zU&q7)L^Tu7tXcn$LH4uS)vFzM*gnerW4#BFnQ`iuzkohw*0PtlN(rk(!c-D1}7d$v8G5%SX@VKD&!;8e~sHg@sf0H0@R?*Y8&N zOuUG4*7Db=&9fWlk!C zPNE(J?Kd&y0AxU$zv@Ng3$lv6CRQbn)$@RCKrshoH9|VB{C?vUYU`mQu4vx+(_N{v zisG!p7fWuSASy({kYu8RAvr=SC8#V2thB>7HMAg??A?Z0*1d|=Q&!RR`vNQ--*1rk zXQMUQJEBsjX4)lhlL#09)I+{NTtYR^$gO5igF)&uyy>Yw;Rw(K=~SWiJJJkk=GxLI z0O}z`Ez-Xk)Sz`1=QGG3MnwsU(-aO9P02dN(*)6s5{rj2W15lY8;#sg@?(RvW;V*J zC|NIX9*)T=jpR-fe!e~B_j9ODiY#LSi>^l4iv)?Fiwu)5 zRbKD9BtjBaD#hT;P=OK|d^1-qeGRw$aW*{?9#;#SP#p?^IrGAUF8HGlV=`OA(+0o< zrLa+`H6W9vkNKtGMF0%l1!59PDW`J2d`bs;pPmVX0j;~pQfvdnE4Xf@C<_wR0(cHXCU z6E4;daIyOT+54B~wvi-i82&4WXAcJIUKR1ZZ-l}dE~Lf8yrD(!G;B@N&ycodxj8-h z^X}$gBL-@<#aEGx z5HQ!E|JX4?cm^ZrF(c#}5|1)M&+B^NbrVO-?v69NZJFJ*%pO{1k0V}hI)a>nOwgb| z5@jmWG$mPh0ZBHo5Am$*9yu$UiKC-9D=YihVL1~qPz^}MrN5^XuurMNl0%&s;0D1>|~sH{uJj%D_8I1(O;HCVB$)buQcU zHS4U1xWU3&viSjMT*r9sl5s(~>ml2J_}jf6#D{#K}9Farhl zsE1)x*!zj&`KupTo7tV;ubXP|17YE>Fe(E|0ryHTkG2e0 z7~h`Z{L{toBEI-MGF&EL#%k?eK3(Z21)cd(g6@n}T1MJkyI*#_mQR>oFj;yM8&KJv z5};Ay)Df&JB_M+Tl;L1>`?JI6@eU=g+(p-MMTR%)SybPckYscSu(2q4qh|oHLUldO zG^81O#orgjvQ%*!W~&lja6QkM_ob9NPiD@%=&C*fNlyF@db$qNIo;NCz_hiHle-zH zDIeeEK&jSg-gwoRNn>6PM_L*aCN1R?0^L#w7ejZ?;ppwn`;&9THsfF%13tjkqr>?u z)vVl;LJ;%$3^B;G?5~%E^7bp(>2TJ8A{J1Ntjnb5-TkF5*|*ut2qMxMCsDCkgVE2` zV7#2JUq?sw*yw3o#DjliPtKs~MeIK`EE31x*8i2R{~nf$P;|Fn4jQ97t~4E2(dzP~1h?VVko$sv5`o<8Ly4LA|q~(Ob;m zuNE^n!UqfU0w~Wx2^0BPc4d(Iwsy4z|QbTThK^I2SjA= z2oz`S&-`RLje3ZFtM$VfgtUxL`-bH_W95{3Te|PRbf?hx`ZgycD%~*@64>pJVS!y2 zS2LEJv^@?6b~Nw!O@;W|r5!B7|0^5*(n$x9mfwKImZ9xoo|jm2rZ${!7cOZYi$heC zgpB@asy1gn>Ra|rE$dtFNB#SS>n=8k95sWSOL^)?tgdqZVr75?>hA^AqH0!FtA#_$K8VN=YgtFb+-cAu(F}y zowYc8h_WEK-6WZz(%`w5xnUxuMV?))74R%{21JUFq! zw1tgCXatI!T#u&vU9_u5?b-+V0}L!fD=Ihg0qhxav)SwTn3~VQYw#FT_n+oHYn$dr zc|3Xi#&(1N5Ck})#o^md((knvHV;_|FVwJ@EafCs@N&xvEc5~k| zo6mfk))$)AbEM|NovLqH1SEV*mQXLVc53ZMkbX0 zyN=%F0J*>C;87UG)o*M6Hyr#KyT&qww{KVm;Jyjhr-kb?Rj6Nqy}s$tn^!Ja-`4#H zt-JcB>n@5u0@1a3S#^1-wEpvCSPGgvC#=bg_^1GroDzdU@T3WLG<$#{gcCre zc()SnkYlJ*UQV5{B^Y$k%Au7JckXWGbXqkE)uS36QDO&E8UfYW1iM-Jm1aF3C1mUp zqrOl}y$NNVp$3I_g4MfW_{Er_v(nLUg*dNCq1;>*_n9H^LZ-{qjz7OoTI=u;9njV`01J!_K}(vN6@Z&09lvu_3a#ApWj@%B{eM;6Z#@SId1xj zL4udeP6^(7&Vqbfz+nOhJG=#`!PBK*wxp+W67DB82E%0UQVdantk*$TW3`IK?t~q* zt%{PDHA?1Th{=y<&ubCbR+e{&o^ViZ6_508<@v7_%*ZuHy*n(r%&Q#%mmtSOrc7NF zz0C7n<}-xK6&p4{Hn5M|EyE4U`-QI7gQ`r8K0sAY7v&@5p}>N|m78)lu>B#}#S{n_ zit1>$b5cPtR1k(a<92QWB4d&><($C*uHT=}=HK8(`j{RPno z)Vlb)R@Zub1Av?`D?O4IFcR>L0oqGGZOaR_zSiSA>Pd-J->$Mhy2>)!TxFJFsr01P zc$G^9ta(B$+v~?y7sYtFx<_9)UfrTv!?3dRA`XjI^~vO|k7e4HV?{ov)JBfCUiif# z`&D=>p~EWT+$)EfYo)g)Vf_HX5BvAqVIS&@)lWSpf=; zrx~1~0xIY#jhYz&hwaAWq$kRC@;qgOSGUN{g)ZKpR&PQ*<>)PyR~-8kA03px2K1Xh z$j7w7fh{2>HXykc1(7{JuqLjdIFKC)@2~;m@-XgYtAj}aBRWWPV>c|dj3F8xHZ=^S zcsObzCkBrMyh4t`($poCEDq=->M{HLLEg>!%%Ub(s-@5sBRD>Upzb-{1CJjeZ{H^CiwuEv6cX;yDP$oC4i_s;ysa(?b#xT1tjBm3`GKGe@ z__VwE-=axl!!ccc-!Z`{>&cj7ge;leDjX)tp$Ddb-7#HcvI9jskt(V^LKLe;R+%m` zZ6@^*n&7$E3+*2DrU*lrT9pH?%OvI|gE*3S3d^)Vgy~E@oV&KmxngMj6H6aaOI?&h zt~F%@plf6+RAy%g}=yS|=;5juJm!;&@lbN}J~$!TYULI_PX$*r=d zbWv66q7VB>FKS#XcdZ{}+e!yH;<-a@9`@28t<}M7<=FagrC??7pu@F#SUR5ikDE^? z$HYbj$dW=Qt`%O|^c{vPM!p#S#t64={I@9AYTOA^Q z8F<;qB)Mx~pb?t%bFu9o?2I-BQ>}AgE z+FwJpkm)gntR`RJE(dDogUY@SVz~Bj{mt&q`QD3W`IG$lMc%{ z$|xF6v;IBcc>uaKN*<>n}-N<7?PWutCCHPWRhuh0RaEXgZ?WR*PV!N{54 z$}6nALfSWm-Ym`YFydBlN{=`@7aM+Kg519o(V>fziILfAEHl=F< z!U6{5k>gIa3g-Z`v+rc-IEn##S{VRh?$7{hR;0NB}=#l`m1mJM%GdIOED`RH~0o!(%Gyfd!q#b+969BzW;~}a`;bIjSn;lfdG?b z5;Kz6VcQ}TYD^z&Un{3QvfE+7YRKpEr$W>ngX$7q>Y*)z^Mi&xt>N<$Uf^_~=ilbf zkQVY#`1hgMi}NqTERxP$siu6G?Ukq8fw&zB^0(ypP z>^mW24;YB#6Jk-gzle~k+TZsgC}qKu)vb_+J=ASvfe8tsq|S44Y%*(|Ly;!aUvv6F zbV;7)LB?Lu(#u8T`ht%h8jqC%Dqd7LY%=^5TICc`Xy>cpbk++e$|_#@9X zLf;tkrtBR>*h)1td_!+2jm3L|$Y4-Oqb4>75%j`h>SC}r!x$}kx9CIsk%fuyJ^ca7 zRb}9ThE+WOyqMgCXEA&QQ3)(%rNDqqg6veYAA=8MTlHS?y9R6x}S)D8OD%agYuj!0jZW=q#bwN0&~j1fJA$yLiJkZqXT zWFch^^|U?D3g+R8)`f}v2=)fIo!Q3u#bJ6m<-!BCnHixH%#*ZVlooP4Wac+8GsF5} z;$FtJMLcuLZqcHA2_J5y*hal3B?{JRcKr0P%m?R z63^dS2)D;7-`Yd1Uh0dF}B!QtN= zYjwvb{%}6o{rmIB4_}r}Np4(*wV4T9#1m0%b{^IC)$}!?*B9l5eN&nF(-sxLJX$1P z&F)n5JEv%&ulmmCP~2IZIJ)Dd_mG$6(vntk*4k7rcqqx@k<_+wHNJVHvzBoA(mi9z z6r`t2qwLowgh0U1^ts#ep;n~;S}^pFPsJwS+tUAC9-H80mV;2~{~;&ogPt7w4mHcg z&N%E^6quP~?pn>*mGpc>TE&^{i_-(=yr9}b*8X^ZzrA_?`NYxLG9 zoD~}d59^V0$ac~+#oFQV9<{2GIIs;$-%1WOux**M5 z=nh!=2l-@ zd?XCHe2MjfH7=`M&uu{E8mn$4!fYj49+@mxx9VZgk)9z}UXy;i_#U7bf+d^A`u+If@bn zk&s*-u0r2xbSrzqNx<_bH&*#ZB^?-uq_$b+_A!zRqUfItV7Wh8HwiwB=}w?e*f1NU zsknq_ixltbRYJT!6CP#x;Kgt@AUuyB;H`@GU{Qf9dZQ` zCIA8JLhFc;W_5lnKLw|+licS4JB~pp4@V$eyCL5qy=*@q<(9}9ft^G^KRS)yKAFQx zH=s3bBPixel?aDv*@_P2&dl4F4D zxXB-7aT_O#$E9_rme!uRwC0heHL+Y<*RHL5Y;AqFwxL^F^i!3~>nF<#=2TvvSYV0- zks~PwWT?;0u%X7c{y>+By{XV>kLWg0U6F;67=6^n= z@c#MflrUd0kzd7dQSAQJR1204Mg&Hn9x#?g-56$=nm*4Io@)RPLJag1>UT7|z9u}~z;@lbWKkAL{Sr{p3tBfIvB@i zW6V*_NowcElvWf_4NO^Yl=Bqj_#a0({yCK6zdhxIzb)nHo^sM@%1J+ta?*1sCw+U$ z0f5FTE>$cRsAqkvzoClprUSg`0B<_Ln-1`%1H9<~zorgw|K;<|f1g$Wa+4BdEn(SA zSpindcJFpf@3Ux7BmHBQv`nxGtW&uP%E5rTN+2u`Q)nc{jq}Jj#ILAfhHZSpd?G6h zbbxHu1O%ZQm@O;*=={AJ^(!}7+c1_;L>84L4Z(q!_~DR-<_s?(XXxltP{H;Rkivk! zHF}g>3tfT>X0@g5bmb$uj07m5AEaB#fPE8k%27)6mb`O>sYGfIOhBS+@IgqybU*>h z>2oF~SYR$y444OD|2f zAa1a0O{_TFc_D%tXv@7)<}C&cm@>Hssa;53m8)<|U|dPYA{?ENDj`E;rZRqRRxZ#3 zDy)O`BiT~`M1UY^f*=Lw-yu~CA=4HfzF;+DH&IEH{S@hwlT2U}1{@PGDv>Wc_A~=I zsm>FIVxq!HW&=bExrExdw9YFgS^M2lT-MHGTZzXcK#j7^C3;;55EkiwuQg6s?m zPS1wkPz6{J%WPu8Uo#&VLKb_?(kf>phm5Y5KN>jp@;YPR z_fUx}u`;}eSWQY~w5KEUAj@eKWjuY2@JpiNAi@5OBG_L<`2pYs7{Kds-=a&@8}=0j z{kGFyQF-5PBjNm~<^WmN|o(ZvXuJaRDu{SwTr6>@`Tl8`*N1NQ({wfjlsOwqdqA3K{6E zODNQ66eS6ZOeHcR-gA|eBTEgF?%q7_(qu&pMdH~&ZD+nMb1nnGMzyzF=+fZ;K*P9( z`x)DH$&w2KMKUxVPc?=9mYnCGyA`e> zhV2Ek@8OWbAqz=u2%!;kxd$wZ6Lpauc##)oZ4dYsQ%B3qW!hm-hBAucFDqZ zO^b+8*PjHMTxlH89*vs-(EzU+3Ry7kfbY*3D+4%YQ9!9PivEaPZ`Ia4u-b2tMt_aT z;v(SK5%SSc^ysy2n*{`lDS4>oh zLx>GnZm(0T;p5Z_ zo&$IW!#rX`fj}7{TT>uLIs{sBix2n=;GF^@1e{Ieia<3BClGl6L@9?E znX&J1AOe~}B*ul!A3{cmwHQ0}3L&jX$cQE(+072fsJZBhg&c!ul7GpQSOnd`FG z;P4(O+J#6^z6xPI_6&~x^zqLpF~Q1qg&>XyECR{mY@p;kVMXlWe1Q#7kpiq~PjiIb z;0~AwON+vJvUW;{XRS2%dP_;F5q>AD#{EoG7<#Y`kq$_F_>8hF4B8?1K|}Oe1QU72 z#R$70RtXX}=rzvLn=TTM@Ipc7sKWdazzm@+b3n`usu2x$YZvoJVHt=U(+B7(#6Nj= z4Xcj7DC#Ak1O{L;fGPx39^9uji}a}WGmJhS%3=r%@uMb$b0ZF5(wp@;>-YK3Pq$0N zac)eV>t6cRt4FdP&Of3)w>Av41g##h^7^;aX6ob*nVbf z*@-U!;fwtkkW=cCRt}&)MUfSN-_WhUK|z(X#K^D&+y}rFkaLod#kD9f5joX>5#D6J z3xUWh1W7TB(8^dB8twI2Q}@5yC8s;IDni`@Gh9K0vbp2v1Y~GA`mga76${17uDvY0 zpyMUc=cvH@lw@{<&Y-hkLx8lrbcE+-!oUuu1%rx0vJF^_Shi^&LCTJ^i;KL5<+FjQ zvJiWV#(w|tX%!ydm&GGwd&_9pg>?ly;2aj(!Ds~TFJXC;;_il$FQ~zSYAPrhWPqRL z%G4|dq$cHeN)rS~xXDd$IUObV!xcd!5M*d~@KNPB#u9xK_*otxPBbk^8%#b5cS(mA z&(TQ-;Lzyx&eqbge!2bY%gM2_QGp3D&xa#=Sq26GWK|?G7VMV@gS52N7)^B=QNS9u zC`EN4vdR+ywPHaJYqIi_-%>uPnsl6d2s9o)&H#Wb*1NG?oD<@X z-pvUt5*{{r&{Y>iPB3=|EyEg{y$cG!MkWU#V-Tzo0mSrmm}gI115Ya+nJ?aT0k=nG zx=v+B{5~mvA=<_~5h~13F1VnE`aiJOzf|Yq$-<4z=K5hZ~JugcE9Z;Tr@XbO1`( z=-ym;W&k*i$aLsZmWYdrVr1`m}DZU@?D|>!L6 z`RI-aeHm?z{-nmUB^uu4V0=uK#feXz@^D2&DWIyy@#|?8ljYgTG+=S==s&>fX!rtU zeI5Yo8Z9(QYs*_RZNS$hgB0qxBUM=5n{Q<;OSu$6$z7siNq1ACqt%XC6T2tUqm7OyOVCI<)cwfuE>4Op9wsiQ zt;yOdq9P{KO@U%d5;u$o3G-KvCV{2jaDp67Lc3^i&lsjGjC)`KyNXrYGg3IB;ax^# z#1_)h3`&-Cv~kA-3@kbBPWk2qX16b3OCf^{#sjtZ>2%&ovO4AipIyK(cbm1Ym9I^INBz+CwhONiNC z){dV+G0e0&!tYHoRKwY6<7dW3C#<4c=yMNeoBKAA$anm8@>7}RNqvM$&;{5jVaqsYE@8?aXA_@pw3XoXp^J}LP~5Q zJg%FEuH4m@$F+l8mtPbN@XSAP)#s}|U$x7gaK&IvT$HyTawlY8aNLV@f`cpdf=5l! zsdz6iVTn^Lv|4-*e?G!BQkIwUdJ(2P@Q5h4*ooAzYcN#`Zp`^ZVv+};A#zSVtbjFv zRW)nBbF-k5;JDk$op-Hgx4}jrQ{V4@$mI)+&_Ypajbv9D?^a=dCk$<)%w&v&{%V_D zx6hX8!Ms3mF@V`IaM>L&pIddP+u8ON=b3*3u`f?|!$PugX=50SHU9E#W2~;L#uotX zbw!Kd!am6E#_Rs9)`4?y$AExbJWJ-aQx>L>Vx){iR!{j{5EuXCbK3_gtREshG?YUj zFFfiWth7S=7eBZw){vFcWrP7Z8pg$0W>$Kk3({A&9ji$~(Lfn{98YuW4W3Z*Q4V@J zp5>8#>l1ZXrdfO9J%h|@BK4ZAhqg4EsX6N{)yldb2MUwF%G zMdyM&e%!J^ZTk9Mh43fg_~tP&U@REbmz#gx+&{U;wk^h68LL_ollz@RiY_ZJ6HyPo z4AghK*Q}RKcfXIhDKugW^ST1r!R+X97%-KE(cjQ#11b%U#^N0LVNfDL9t9z!6P(;~ z%=QTWLZn_`k}=$S83S70V(<{eP@#$e{JR0cQFg=n#TH)@ZJZCMUql&%{R2oKUWX+; ziKCwM)fyh{Noac#+Ma}Kz6va@7|rV7*TXRbhYR=45~^FYexe*&4ZSs1fa_+>K^+sT zjN=Ru!o}bROpa z~n=WdV4=ChbMpb_aC~=B;avY&2 zLiR^^GRqYLW@y^CaiVuQXdz7MzpIQX;jUjh6K^Q(c{5BVO*Z{AgfLA8g?JFdNS}X@ z+&c2zANPb@`iaKUXI<)}KZ@ST3tJ+uNrQY$xrWDX-w71@Brq@r@zhqE^m0_?EQ= zMD)@!NE=}=$LqIeh$se_<`7D!M&*U7Rdfi$wQmybO`^R?w7;E1JLPa5H+!BuyJCgF z?Hn7_967JPNuW0g^d^D+UJ~fze?KgdKxj6VK&cQwkSnDC0x8M?kZE#&f9Ptn6vz|3 zrUZwomw(|JQB_ksTFsaMw!x1ueFh()rqNgpHLV zj2pLp6Blpd;!RxqGU8$!=tGdHLUE}BGt|e5OF+7rK^3og?T#b$zvh)XkPrQIf#~I8 z?3B-Q+^i@R0Zvzx5G~Vijayo!IO(NHHAs`z6_mvZlaV1$;M%&c2SHMg1xYKeGHGRT zl}W1}XsaH1o3g-i6i7KKFhF4457Mw2NyAC;9TYNF6uYNo+fw&XH|W^8zhdY8LWDy! z35mH5L7o|`0B$lOkfN}>e#eMAq#OAJ>;aF`5BTq%Y1as~6j5)H2@Y@(CixQXJR>3? zFObh-de~&NiKC_4ZGkA)Bj$e6d(=DpRPXRpy~D3rFlJ<@0gyK%IYc6~VTAbb0>egy za*W$7-@;zN(fNbMy<7||^w;%GUy;)exd|KQ)*5E9FIHpjpIrKd+gZ2nu3L83t$Hif z&QQW8q}oY{j%cc$XsTX7z<;b;`QW+5W%)4BOEu6-M=n)QE>%x1S>3es{5m;R6S|4m z5y}|o87$kV`Wn)a6`dont-w@6s!uani$`R1Y-Mz8Wpvof-tGvulH#R2himGI<#LSp zpQQb-5o?{c=cri?nRbT7s`Z|*2bDn=?N@d2`4Z?HEgBe^c&a;79xU~VjT-+{jh=RcX< zQsNT4vF96mzOm;?_Wb!>74;vtPeHOCY5OK9-UP*)pg2QN?9Iv>h2EKnG*{7>iMGTP z=KN9XM7$f+dqB}{53Kl3XHHt>iUi6Kl^oEPp6SuP1$ad%i72CCmTRsv;U^D~2grkV z#4>NJ+sKOnGKOEdD;$;d18J(r0yf11Y63@UwZr@I_zknO+kT|nkD8qzf==$Kn>-`+ z^(Tl(nTV^1E)YMr`;;f6&hW%){tUb_=9h3b0F9Nic-vmEvT0O?X1A3xB=2fZNS;-yRb%&fPSwexS6yL#Y;mRUm$(Y0Sk?5*~Lv>mxn4@#!vcgRSphzQx%>uwI59gY$ zKg4p)h^`NN)=`mvR}S+NDujjSS;6tGRl!YQIU3 zH|g<>q{m-Ng~wlShN(AJd}GDuTd>dAZnNXpV!!P+%OkGfyfOCPb|reA2G zpBm@8?PgpIq~q%|lf6b2My61Y9UE3-Hq4BkfgUrXXAwndMN%bvKFf(lmK}z;Kpis0 z`fJcqYsx&TmHJ%OvFL9sK@Xqka0_{ud)z`E&bNpR>A#BSS(S?}DV6(V7WB!E`_yif zxXYso1q`7UhH%u+{RfMf3t_ZXw3J_H>9(Dv+jf?2Gw2(~^Z8yV8xfUpoS!){0*esX zgl!;1lwt5Vf?(gmlkwqUUq=dZlnZGEIbMSjj)p+F!(Q>k^t#dP=AEM7D5}v$(QZe1 zr%>Hip@t2w?svR;yyLa|QQq?Mew4Soy4&;We$V^uC$#-9HT(Zu7XLS>kvC=jO_~4O zL5(bON&MX2h&RdhCfVL3+uu&IEpeCp^=83*6Af>o;a9X^{w;ktw}VP zm@b?uM?eNOOJfy4C@8_IPBf_lEq=OqJ)f(#?oEGMM~$1wT2~?tD%(!1 zStS!HT3J!jF&jp8t_%-mjEaS>!%c5&Yjp1q?p{b+->ME*qK!{F+YE zky%1ViRqOmDH7V(lsllUkelq}ddp?oT5h-~Zh$(hg`4c`3%)_-ROvZ^0Me~r{`^N? z`D0&z1ni9JPE*ADn?F9^>}&l5E%Z%Jl)Z(c#!adn29)63s%Z^GCdwYBmt}C3Kd5zC zDmSOgP7G$(aa+5?5j$E@QrA^sD|* zn)s$uK)Ke;<{+@`Y!2{9W#xSrQ_nKgeF%Xu;XdA(ty(lNRGW5%V>=(}XlLB2`SpsO zo>b>-|C;wYeWPA4r|VOKu59;tQP_Bbi&M@XsprjqT*Vxr5B5$BQRJl1Fbb4cU)7x?!B#j#l^j?H%# z$3K)?_qCr%>6c|Kk<#Cm4_mDa6o|8MGv8(7y&p^I?$y9D`<$U_Y zB=Y?zKnM3=gGnqiA2!`Q%(9{A6Qj`o=d~`= zVAO(7b4hgfo=%&Whyv%#EFl6tBLW#vKNy9;Juxr#*P_2>QM+a-oi2Rf z!lhV3r}o>>DXm*esA@ikkF>*Iep#9joRj7yiQ1i*ME6G2Ur*Hg7ZuWO3GurhFQgYu z4MJ3wQZ!c@F4ONX`~8XO_HS(RM7w3w4|cLI`M`xsyM&$mueg^ey_8AL;XM0-oOi!@ zYF*^p63)e4Af7Y7QvSTjf3+q}i$H-3z?|d@n9=-K>)rRIVF1+KC)m|CM;DO)*&wC(BlG91l3|eGatfqsq&1H}mKX7MG}opvGe6JNIVy zm(2X4Y5Dm1_opWX4a$T?he-2PYQl~D!A(r}*@^&lRI3Id><&i8E>YO&Rik02Qx=CKWAbwapZCEv)ruxR{J3wnP?w)rTjyeae_xYA7VMZD~?pTGq zZlp-3yOs5(UU{>MIe=QHo5>ImD(8rMfW&=tHdU!N=xb!{yW~bU;RX!b`<*m*?R%64 zq^30F9V)r;dlY(v`RnTmzaQ3j82)#+`Bs0?_%G{eJZ&#sBI)I`^> zSMIn-#AGLfHT=JrDO|8>BR3#x6&7rvuO#z@wVTctXBGplCiI60cA3f}D*?C#S-Q>2 zkR~kV!MRlXm97&Vi_3$*XM|g&x3#^?=uzAkdl%W^Nk1sB}Ao! z^yFSV+sbEq} z={l!nK!7%Y&vNbKYCL!{N`vp@!P8+vTvcYRH+AkEpOPQv^JteY{pl@rXf<{s%0k^y zX0)qZL|&k%n!hPGNrvwILox9RKlRpbbk)*~oFOnPy8Caf-!!p<-$LlGo6Rq&tKke7EWg0_|#O+O0+S`$IRr@bTU|qrfj$T)+wyz zBr;x3*H7Y|tjz@O^|P#K6MxvH7d*j)5!fe>7Fv%NfLgpzdfy-xu#t} zTE}a>o`lPbIy}n#8mHYrooLP(;VIEHZCPfOsb>%FdNNNBd+B*PmC<&3R3AUxemF54 zHYrl39KoYj8tMXh*Yb=}t9xcXQJhg4%5^jbDyPLSH%S>m>Z}&MN9%C_m%_c*qMXe_ zAPs`Au9aInYg7CNXhb%-U6_bp(e+kJp-wBrx@eAEnrl6c+mrv9=#-2_H@v){3E^S+ zTrZ)Yq1||@FcULfXC@KW%AnU%wT*wuu&$>A3VA+iIXhg8oq z$H1nga}UsH(m&!?moQ%lUTG$>Cr6-~B5n=JOl>ZvoaxbUD!Q0pR+i2tUrif&=I2Yp z+5L#cJJe>zE8E$-fKZC2)9cWQU0JQWZUeNZZ4*8{Kz}{LoePFRQSFa4JTimjSi7*^ z<4sR@y-ij*-uCqD<@oAFe1B>e?3=vN)||HXz;?;9aKf?_F1zFMQDsK2?3!|8A~QPq z_^??1t*3%#x%30BpaOEccUclsL_I3~(wWjvAD4ddTS>pCsa?*D|N7VN_6cI|TAVmd z%8vcctX#CM+aP~J?E!pZ9fFNr*@kY9y1iOQ;QqLz>xlpMGJwNENVv zn$b={o6|m{59^f$N{VYtO@LEON@(3C3PeNH7j0~dB5WM7hGoqF!LO0D@4Z~7(OjrP zGg=yH`UG?F8gEFkf_pHwQ@s}MFdtVq&FSHpK; z;76)a03y))1OS?fKU#mTC@Y+=DEjkCdBEoiu}b3&resBw2@fw9Ab4PDO#v>HBxI-f zF9dX!i2@!}{q8mej7tOc9W=Z~NM_3$i?VZ~38Y$6T zHpSf{djZU);YYJE@T$)(yA}k}8hu6v8&*MBBvr$c{pF}@BF*Vw#9)dm>@9aC>Fcg| z?4s$~-F|s`y3pW+Ov4(k;yV;n!5UWCW!u~d)k|M3keC$9rwHRj!n7v~Am9c7O~{D= zTVkp_kfLIMlMRq-3L3S^ILWHH0V;9J3$haLz#Sr#5JVCwkbsShj_ifzh`*-Qg%KX@ z&S)Y6lBK5>el(4w5jwlr6~db*WXCl`l4^J=G6-2o@;ed_>}CZ2CO-(`rs22^32Ut6 z91bjcU=0C0UZgF&$L|sl3tT2E3^uU%j7A@$9&B8XO|PX?5Vb#enLluox5ScDcpb3j zkevd_sm!iBxk374H7G+fpq3)STmbG+SWFzJbi8q^G9JbE3nrRZ?KxSV*g7KiDXSsN zt$|Q8UIXn5H8`PEcviY0pfRA`;Eii)c&UAqCyi+V`l`S3JRuXMYv}~+fCFS{<~TX2 zi|6V@j?=i+8%t%D+R)0`>c@zExrfqR;m5DdUVr}k-%sk3`TK&U0D`iCW)V4OK2V*3 z64F5Da5q5C8#F=G5O8(}1rG?0D8Yo-h%J7U`DZewGgcu1eTGaGVNjL-gE)_0AghAV=HbMw-CPq;obBqwu?`lF7dY%^=L%W-9ED;@v z-5+kGLx4sfDqcXh)LTRYAt`$HE#MUOMuv;nj6}L@MDg>`LxIX($2{9Hz^u*0Mr~>a z3ZY|`!BqMttZ-cFW0y2bWXXUqS`Xzu;daZzn2uCNLCb8W5FQkb=Ru(TXja+OD>G#v z31b#0ys_eqS7}AbBI>S3w2#cF9HE7`Sg)mtq5?-*TqyBY14~UrH%pP-XhcS7Ga`e; zK(1ciRA`E$1nRxZ%N^0xfHIlz_&Prx;(GB; zjW`UsEDAV+%VghKNh=kpd9TQ^7?5cU5#KZdzL?&M0vs_xW+5s@_9bX!Mz2v#8eE^d z4OQ7vuXZ3VX;!mY4j~INM{OVt-caW^D4azdqMN`&k$a(ZN+hFhpk5>N!;uhWcohe^ zP>P(|qeqPjhG|&nu1Vnz;bu7cAqFl$w8^r7C*=@^Xg$zG0wib6&?SWmFo@B@<}E|O ziOS?quWF#RYM`}>w1%@b;+SL?$Ds?^Yw;#o0o$l#ow+0E7Axzm+v5o0a^Dk&%0`z9@+^`!X|cJ#cS5aBnqmZ^yjV zz`WInd9M)v2K_~jnIed^9!z~6CV0x;q}sz6WOa!mp;7e6rClc}b&g6yfE&cLmZz#p zt3mXGj*YPw^OT@=*9cBy}SV!Ck%F#9k!Cq$_Ai1H=MRXdCJPtfkKVB3O)^{z{=&`F8#^ z$SQdnM1z4S2)eD?*p-3v7QB6w>`9N_EosVTarI#0mqcHtgI(Q`;GLp|U zF^g1Z#$^J1AIioV&gPtV}yh$o5jU8R*nJCi;AsGl6zv%c^@CW=$9f8A6|+ zCy~yGDNDi26K;Ii*R2szYqe?j5}m8}C3(LHVxBnx#_w4(wpDfkAe&)*2~F$GeJ*R4 zp!s4m;9b;J*tB9(?tx|xM{KO~JL_S3``N7?n_U8sw6ohyZr#mpJ(}J6==356xt-p2 zb~gZN7lsh_K;VBny*uPN_!_2fvl-^M9wxZ%C%7IaxNax79!>CmG`-zkt?Pb*>tTlb z2_ELR8qaSxy~FI*!}Qjp>0Q7i_qR_9GJIVel$$bINLb&P0K^;ENPt{b#&3mbtuTaI z>|nG85yH$qK9d5i*l2%={1yyN5n$BJ1cF(MDha%IMHC$i55n|8HJ@atORBXlWA?5m zMbEZWO)rD2UBH0G!B#TnE752UVXO4@0!uk3?c@&8w<-3Bc0P-s6Ih>`OHbWduk|E& zH%vokFu(QD3C4-JonTHM<|VZ8HHwT1;|m$L=7L7u#Hjh4{3K1SquEsFj`Id?X~f5Q2uVS-%X`q&DC*h9N!C<!ihI0=KLhAC=WBRx!P;#p*tS4aa{&A=Ge*AG`@1J4so^~Bv*OxfhcaH5L`tv z)wpFIx;+PXyk1I*W(g^pqdK|LlV0YO1nGV~3$8`TpSw0l-Uw4z%r3O(VJ{kab8_Am z4D63To*0mPIZ06-)!%h>Ht;7$HAeJ==<|uYmNUMl?PQf`2~s?pdcw8^dX1E~?{Fls zRGLr;#|7P1Na7PUO_a{b`GA0K3BDwnhFGYT$H>4sNO%+?UXYC*6f3L7{N%#p$CPA* z)y%wF7G~et$b{CS`!xU5*-r&u?Zi*DWI9g~N!MZ=Q+(W&lY8N^M`K< zCQXX>IC_ob87z=GsRknQQ|nrqC@-f8=7f%w0{Fi~Kn6OnRQt1w2(u^?WN|R+l?Le) z3p(YX_TiKWAC<~E(r(lodM}g_J<8$sI3Oc&HjJOEM=9?NG)ah6@oJPFAlm$D^dQu9 zg4Izk36;40zqgwwJpcLYA_!SChuRjIC@ZLaJ5P@yf;Qyz0lOD0$=G*b8)Uwzd|HEp z{ks(_W;v*3h>(C?UbB*wEC;fd)%c6o%bq!kB3`#!Q=^=ECfS zV;WpP;P!=cb&4^EHs5>JUTj`YPsIM?|9xNIeE8$@6DhyrM&Ayh0{aD{a;zzpeomi? zun>+a8nZ6j3dV0uOisB^%hWeGe>8@s-g3965!g+PsW~^Htk4aGizj9`z8#(>>B$~8 z4<$m)#KJ&@Bnl)ivIt;8yw?U{4+s#GVTt0EM+b0Gb_V`DO8{16VaU&WNG>0A%{?6n z!5WAKa7!Tt1_jZe(V+%hSC>aRg)s$>d=D>sqn_mWb)D+_bODn9?E-zEuH5$yK}SZz zIFBwx)MUHQy{X2%soU<<$NSUNLx0X8yilHHpi!u&27ROleS)ry09YtdivPNdr9iFf z4!W4nVLd=!VRT52S(&6gg|?8QeABgH(^0P&WVTWx*rF8-;=(h(iBJaXjB78=#*m{= zrejb%FT^~C{#w`nUEA%$EWjo-K38!W7LOfj|p~@dkk7as%A% zumw#+S7a|%u$j>|9K$NbJ62;uHBgq{6dFK$McXK3+y`kX&yEPB!s8kSPes11t!R2S z%Pf=9lji54E|D7H2@dfFSm1g!DC#g!>Pe~`liKK}RtNqZ&%K7Z91(M)I)R8op^jFP zFz6(NvB45C4Iq;VPk@}z&0Gc6#+z@?9~o#|M_JM|CVfY0Hq|k%?InvNt7plQ_ zKZ}WfKDOUy$x`={C6^zlvt$`RAhizwQI$`?dCVdhC0M`twxoQ2oPQQl`0wu@9!~1M zxzV@V3KCBWZk)6^l(pY|r&_h@oLaRxqg0l8V(~uFW3{NqYSiOPTtZS&*u6xLp~Wcm z6cXM!bhAh(j#{3nx;~32e)tsc&!mYTPQ_RYGmr!k{|1t1mIP;Tp>O~C^!fJw{{6=f zJNb2rEGDhL;lVnq`m;>PF!MKsS*|0oNoRNJxuiiQg;Y8r(g=_W4=lA=Y&F!g$>Y7b#0h(p08HsJPPm2VlGew~S zH=GT#b#T7Q&GtF=dXvXVY3i%?o^~|tK#BX}+o$($>mH+5%=^_dN2JOQ);i35kUS!Y z4$fnkIZ|sgZNsbt8ec0nJphQ)B0p@)`oQvGZ4e1QcH$sDDL7WXF0ZmVQaaoL6}k7k zhCfGfAYHp{-8G{mPpfGoJPQ%D*C`hWM9SJB->KTiL$a&xT85iDaiP}j-CNjc^Y>?5 zD5UF2Zk7#OJt@u4BjrVcr)Yc5k-sH-o>Ym~TOL#&CDDSmUyAHimPfO&1kyI?Qb>F9 zEi5`I97768Q#PSVD!=h?>`B#;ClUAq`N!c1Rd+nmGtI+Zj>RU9I7D?soe4jetk2ym zyh|PFlZ`U%=U2+bi=kP|Guxhth`XRz;BcUK-H~tI60|ybp$3m+danl#IOD={qW-Xe zm_L;0a14c0#GSqHu+LQaXKz1ju%Ri0+bU*0Ay!#4R3zYvWR6NG<~g9P!jFeQT=(3Bv^=5C%X7y9d?Xlj{7ax_eX(?^SjCtU5od z?w-|wYTRf>RmWb-!gx0Ac=B+nZa7#<(WMa+)(!|A`C(hiho$?;bM)A5$&2|^<$Rhv zpLRT-7sY($6`xI}k>9IeGU~R>ZJtYfqM=~6uBlSM_(n3s=KC-3Bb0W9B#fMjk9wAI zDEg{Nz9gT?4V9<(V*_;Op{C$VVWW#v|+9?Fcx-R7QAOIOl*D!VZKi zQ_I4+*rH_*3P>YG*p)1T&8aY;!;0Zs_;inrk8F^ykxXx7!F1@=K|1!ewmZDB<|`Yn zVPpGTP8=_U#V{1_H>=>8W~;NO6(oT4VFaETWN_HT3=1ZC80^G4F-IOrkfPAn=_$GlNw7x+gu<1`_O0-m?CUF9oEqN&+ z&D<)sRTr4GiY*T~0D-FM3Min8dG892Tr51c16gU4SUiP!Q&6T=L<~QE2ORcR${=JJ zCr;!q_B}Qrb8}bc%>@2Yj8)!<%=w707z7$ZwUs?oAxi+&D^kceqC$#eJ|*g@SSY>9 z=vE1URu8oth+#|uGr*mziR6|+`G5|GJrtv%MqozC-qc(Ya|GSk+tg1N(9$$wd{!iP zg+x!S?&NJypEVNrWk&1}MBNswe`^swiFP1t}81Q)Yhyb?`lWHso0*Z*APFy8}7CU6cXW^RNXSb$R`Go)M--`b#5 z4P%%*Ko?L7$KY~l;0_F<@`%+VmWAm7s&L#UWDLVeLAwTPoP+6^wTtBZ!rU!A@eu*# z38rdlC|E>DhDg8$Po2(c@IJyXkXPslFhXcLogrVe`t1y%uxR5L8lDmlzMAkkgUp$F znvg8)nFZ{P&J%(Z1ms6Hp4gd?-JlIiBt7OmLbnw0Yq+V%GZ>l7oOoz%0XjNL4SAf% zJ$3C!NERZCAY14kic!0;e#nQfx1i&cjjhgG9A6A#>A2E=yF{k$@&7g2tI z)R+n;*9O4lZ$+vBAqyN_AAo;THt*sN&#o!$PXvd@bu`fd*S`~CafNq2m1^sOUe62Q006qFpDFb{7~)9{8I z3saB68&oe#X0a8>v|VJ@=%O=zo>&;J)FQSRwfwG3@%k70yRu&W=coJkzu&TO&$1;O z-%zexZy3te8G5vM&LVtNH{(!)k*$$96-PMIFAq_(FA$+-&W=z^B*i$|t~yd2?KU05 z<)x~gvtd2)i03Z$8B996>k$j`u~mJ6N%}d6q2$`p$nKvQ+VlAK&kuj#>S*ON#R(Sy9p!^3<^cySI!tQJ77NZ zqrMo`dxveLitC~57mn3{8G~6pT?}bsLUn%z$mk+c= z#dNzCcp9A;AsYb(xw7j~mBQVYdJcKVYy}M{3LsRHgg1_-f-foJaJW?xa(;qJ{F@0 zpXvyxK0-kZoCH8?Tq`vy6?cq=h`No%%Yh1+i0U~J0kRO8Z(}0j6I&vBAR8vK;SW&fKEJ;|t*v+MzGY&rivXr{nTF83i z#%Bg{<|(tIeK=3dv9ooa%&$0GBN1@&gffYzDUx`aGm?0|JdMvgwE1@Q=S3#8QsZKr zINI)bD#~oqxuz7H0l`fe$B#Ugz#rcFByS0aY*!La;U{NnA>5%(e|HHdIhIghNae~D48p= zb;Dv&R2GeEYhfj3sfJMI7ZCloF^*PLcNz9mSW{-An7E zFU5GOYx%1^1a`9=IlkyfewFGWBUE~eN!DvE&0Fm5I z2VUpt#vG}(beqZ(XSj4z3*uL2R$paqKv|O5g5JRr+@jxkA96|}$|kgIQ9s5OL=(^~ zJ|}G%!bavohIH(>%vPpjNRxZfG2~S%OTsIYCC4RR$S0s<-uiir|8Yw!3sstL#Td)8 z^#1$)!+%b31lzn>B)`U?&fpAdrURVBW;9jj)f|Ur)NO1=Jr2&u1I*siM;xzV8k3>}j15Ckz7mwST~iPM zV-pf#DI4Zp^gi?ZVLhv(>)8x$`El$|?=_!YBypWy`wxfP-N#Q)9gDgaqt%9{FdP>& zvTMdrIs`*~x{CS39w!vW74)$daI-WCJdnPm4^N zJ-Mn=?C)t%1Y)2@e3;K(VFKVOr?oxGgRxr51k*vYIGNuulBCUYE3hmGd>{O7g%YL> zz_P~!2Q<4v$*5g+YnyZwS>jnVa7x}jcE@OjP$me0w(g=Jfs!T=S4MPOcZu8!tLy{F z2$60FET7#WzKf-FU3}Ohz>7d}^!Q$kB==TpLY za-?hjCPluL6#2=h=*tq)DZrg&>PKLB8T`H(JE1g63b;AczAlr;vvRdNqN`ja>>;|N+TR$U=qGTMko>hRIXyB$Qnp`#{1;~IUAWa3Ku|9F}5F(VSyRwj=%^y&GifHLBv0OSo0bW6#pxKL< zkO#yvx12GbKZ5GAIR;_o8GRe+linJP(QKG%igKk2fMF~IifM?zrLiny>0&(aUf7(S z_4vplekekpKj;)_KMWX}=5L|e17sfs9NK9oq>MtL&fEL}QUs4gl95K0On!>Lox|IU z_l7wbxiH#@rTaailm5Gaa+fe)rLp_jvZOsMhVdGbIOc7Exnlld5By^gT0%)o$9kgL zPbCLnJN#pYp7Ab0y!QqP{MMq>iOImruG?oGu5zjSpx77T@lj_W?jbfNFUp$)%3dnl z)=fsThNh%PHL8h@(K0*|?(Bvcb)Zg{O9E(?9f{p%7AU9TlIawhtcgf}o0-!PdDSSogr}U=urA(%bR;_4;;R$o)Hkvr16)QJWezYH98nO=nZ$)AW z_7j~MJ5m~~B3M^`vJiTu-TjRI7I>M=`6{_%#uuIF5>eRY$>k~ZQoe^Wm)|@EcESP za(#dE<^9JcPK9ynzbBubW6g0j>ix~Ep)(WjeiY5oR@;Y`Mjh!dQ5AXDR2H{>de4waL?(L1mj{Kh#cU3b zh7}i;K~Y7yhG3l>oo0njqJ@2gU!O?@OZjEg`1xG3!)C@R^f18!mQrSKlfmFb=Z58j zcvDFM2g#>wsHfo-wE~Ea)DURGzeG>gD0YFQ37`0yJ{6Uwl>C8IZ4T;B5(5-n{x=rhA(ny4>XvRDIgVJVYe zs%AwH&=_(m5rC;OWC{^Z+ULU#7NHctsI5_v#`5`qagU$Y&`27*dpK_~m&%l(ZLzG$s$yW!O7g(!a%8y(t*on2c87#NRH#ix z=atnFE1N*S@sd*zlr6?ci*i3kXiEr!GO%_FkHbc30)+=Kd-MVO@o!jTmt-xxQtcuK z%}WaAV_P!5pEACTjmbd%s>zQvJHD(2NRPQ}au3d(@1^_ssPW0N;Ll>NWgB+rHf&?C zVF%(u#c+pUa41#Ko>rO7u%QxUc^U7tw_wL^)E&`S<$;mm(8%8ynDsiGw`V^s8Bize zyD_5(=fOXEEmt6JHG) zMAd5$)u2J#jH(O*g)4OO!aOA}T4vqRaSI2r9Q`%?OD(RXP+86uk@o;6lE{$QgbR5x zh!a5f(oJkO1lVG6Vj)siGN$61fJd3)4!b`#|6U8&5RI&@XPk(_)!kC(Tjbev8ksRE zN-zB+BxDd!z2E~=S@M(v6qY4Y)<#6DroT?UqcY>*_adbwd)dj-1I9SfF1|1Ee!BT| z`*{J$=5__7O*66W$RG{UNkPD_nbGN(r<>V40*_RBk!=&adfBS^pfG6#apWA zj9Z^rzOe~6n=j(TdZC`4#jn`PFWV)?LTGSOJz?@fxyme_IlP*4cz=wUb9fH^C<76UtgqwtjKYCV-GZ7G{(TTctqP^3IuwKVnkK9%*U zRz?UFXcCj?PIZrKXd3oYaqCb7>q_fMKY^Y?{~zKN_` z3HdsZRK~~IiMR|Dnjww8ZSwcKx-GphqQ$@)lv|?=TVW}(EX^5(A~cl1)!2c8qz8E* zYL_alDCFDZSs^ zJPFQ`zb_`znOqgNz(;L@M_Jb@R~>=y@GOmppLWcMDFrkhA#)B-EKv+ma}g7*<3u*V zd((tVWVp3yPe8Qvag2V1jb2TG#a7sqXS=!FYxIJt`m(+K{NeT~n`+mhP~ONqhbfxB z{J&QE+8)6^%aw)Q#kiXyhu3~K7`vSw-sGZR>-o43VHP5+)C?Hyil$Pfws?SMb>vnH zvAki?mnGcX$h-boB8rU+VP_SLwUW+IJaG!G(J6+S8|8 zcT>NdsKEM^@;kl&lY611t3@TU5B0x4fBf(ie|9ZK<4eqe7rv}P@5 z{2O8&kcxNd5tS$6Nkbz+)hQKYk9tiTs^0=g7twV-7`mff@rsIttK=nc04JbFoqnlqxr0_jV(9xp2LSKvza@fjpf~kTM7!m_HP--#`b$Wr6 zhfK@lLX-oG5AKg(Wqu++B=PHBXT7hHg~K|U&-mFkW&0@!8;<{uAu58 z9!t#}qEXgt>sg|B;uT$)kPy4suVpAZCyU_Zk+PnM23aYDLq_1Ltc1>-x4YKqM` zh@9|IPz{CFEtgTA#$5ESDl$}?CSS*lxYBaH~_V{gc_jk9+5@4a+}Rpk?-#= zCJ(Goi^?lCOu9m$F~e%-yJ5?Xs4Rw@R)xVLpWiN*6Q}gZqS;s? z_Kb8qb%Y3gO(&79|Ed!GMI_?{ok5kewm}3R% zIos7e-_^(YPEjA&j?Ks|6l=$Lbg5FWP`p4S0A2~+mYb!S z>o;aSu^GahGWDFSA-L?+g6D3ger6a8i@aDECq(7g<%yZtC;}q;aH&xK<&b_Le+LA) z;iQzjoYxsL-~z(sP|#T@4geq8MO>BbA@H|1?l59e)g=~9l(cy;RmgLpXW>tiLIh_J z;c1auG#nqJW}zqk@x&SaJwN9Wxv88Q;-=oTdw@;s2M!mn%pFZ$_qtv9x?A{~3y<}}l%`=xXA3``_sy6xGWl@b$8+D& zSWh4Q(u3DFEyNp;)%lJB(A!aOUy#8)GHSl?JAxjFp4|I`z7YGT>Wk~ zt7f_qO}|EYAwW47#Yu`cOxM2Ysp2@*G(A;q=XZ8XpKq<_w{|OhJ@4$W_&(B+rU?{7Z*vGnlLw=Sq4 z87dD-1PziB`kItEul1(5xN5vX)0IL=jQ*m`Pvf8#5;vFSh&FPx^vF1E3_SHrd40ayZyZ;-qgCimBT0IYd^Z-BokZ@PqY9w*%fC~DIV z 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 z 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%0A!(9(RIlsQ8&|;F< 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�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≷?lBp%&RYq%SY4c+5^7kJlS_aUn2d1D8FvB-3 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�Mkj1OgSlJ@ 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ν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%0Dt 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

>Osz=VlA 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 WAPrYcrnfTPAD%YI)xQA#>;D0ap-6B5 diff --git a/static/bootstrap-icons/0-circle-fill.svg b/static/bootstrap-icons-1.13.1/0-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/0-circle-fill.svg rename to static/bootstrap-icons-1.13.1/0-circle-fill.svg diff --git a/static/bootstrap-icons/0-circle.svg b/static/bootstrap-icons-1.13.1/0-circle.svg similarity index 100% rename from static/bootstrap-icons/0-circle.svg rename to static/bootstrap-icons-1.13.1/0-circle.svg diff --git a/static/bootstrap-icons/0-square-fill.svg b/static/bootstrap-icons-1.13.1/0-square-fill.svg similarity index 100% rename from static/bootstrap-icons/0-square-fill.svg rename to static/bootstrap-icons-1.13.1/0-square-fill.svg diff --git a/static/bootstrap-icons/0-square.svg b/static/bootstrap-icons-1.13.1/0-square.svg similarity index 100% rename from static/bootstrap-icons/0-square.svg rename to static/bootstrap-icons-1.13.1/0-square.svg diff --git a/static/bootstrap-icons/1-circle-fill.svg b/static/bootstrap-icons-1.13.1/1-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/1-circle-fill.svg rename to static/bootstrap-icons-1.13.1/1-circle-fill.svg diff --git a/static/bootstrap-icons/1-circle.svg b/static/bootstrap-icons-1.13.1/1-circle.svg similarity index 100% rename from static/bootstrap-icons/1-circle.svg rename to static/bootstrap-icons-1.13.1/1-circle.svg diff --git a/static/bootstrap-icons/1-square-fill.svg b/static/bootstrap-icons-1.13.1/1-square-fill.svg similarity index 100% rename from static/bootstrap-icons/1-square-fill.svg rename to static/bootstrap-icons-1.13.1/1-square-fill.svg diff --git a/static/bootstrap-icons/1-square.svg b/static/bootstrap-icons-1.13.1/1-square.svg similarity index 100% rename from static/bootstrap-icons/1-square.svg rename to static/bootstrap-icons-1.13.1/1-square.svg diff --git a/static/bootstrap-icons/123.svg b/static/bootstrap-icons-1.13.1/123.svg similarity index 100% rename from static/bootstrap-icons/123.svg rename to static/bootstrap-icons-1.13.1/123.svg diff --git a/static/bootstrap-icons/2-circle-fill.svg b/static/bootstrap-icons-1.13.1/2-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/2-circle-fill.svg rename to static/bootstrap-icons-1.13.1/2-circle-fill.svg diff --git a/static/bootstrap-icons/2-circle.svg b/static/bootstrap-icons-1.13.1/2-circle.svg similarity index 100% rename from static/bootstrap-icons/2-circle.svg rename to static/bootstrap-icons-1.13.1/2-circle.svg diff --git a/static/bootstrap-icons/2-square-fill.svg b/static/bootstrap-icons-1.13.1/2-square-fill.svg similarity index 100% rename from static/bootstrap-icons/2-square-fill.svg rename to static/bootstrap-icons-1.13.1/2-square-fill.svg diff --git a/static/bootstrap-icons/2-square.svg b/static/bootstrap-icons-1.13.1/2-square.svg similarity index 100% rename from static/bootstrap-icons/2-square.svg rename to static/bootstrap-icons-1.13.1/2-square.svg diff --git a/static/bootstrap-icons/3-circle-fill.svg b/static/bootstrap-icons-1.13.1/3-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/3-circle-fill.svg rename to static/bootstrap-icons-1.13.1/3-circle-fill.svg diff --git a/static/bootstrap-icons/3-circle.svg b/static/bootstrap-icons-1.13.1/3-circle.svg similarity index 100% rename from static/bootstrap-icons/3-circle.svg rename to static/bootstrap-icons-1.13.1/3-circle.svg diff --git a/static/bootstrap-icons/3-square-fill.svg b/static/bootstrap-icons-1.13.1/3-square-fill.svg similarity index 100% rename from static/bootstrap-icons/3-square-fill.svg rename to static/bootstrap-icons-1.13.1/3-square-fill.svg diff --git a/static/bootstrap-icons/3-square.svg b/static/bootstrap-icons-1.13.1/3-square.svg similarity index 100% rename from static/bootstrap-icons/3-square.svg rename to static/bootstrap-icons-1.13.1/3-square.svg diff --git a/static/bootstrap-icons/4-circle-fill.svg b/static/bootstrap-icons-1.13.1/4-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/4-circle-fill.svg rename to static/bootstrap-icons-1.13.1/4-circle-fill.svg diff --git a/static/bootstrap-icons/4-circle.svg b/static/bootstrap-icons-1.13.1/4-circle.svg similarity index 100% rename from static/bootstrap-icons/4-circle.svg rename to static/bootstrap-icons-1.13.1/4-circle.svg diff --git a/static/bootstrap-icons/4-square-fill.svg b/static/bootstrap-icons-1.13.1/4-square-fill.svg similarity index 100% rename from static/bootstrap-icons/4-square-fill.svg rename to static/bootstrap-icons-1.13.1/4-square-fill.svg diff --git a/static/bootstrap-icons/4-square.svg b/static/bootstrap-icons-1.13.1/4-square.svg similarity index 100% rename from static/bootstrap-icons/4-square.svg rename to static/bootstrap-icons-1.13.1/4-square.svg diff --git a/static/bootstrap-icons/5-circle-fill.svg b/static/bootstrap-icons-1.13.1/5-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/5-circle-fill.svg rename to static/bootstrap-icons-1.13.1/5-circle-fill.svg diff --git a/static/bootstrap-icons/5-circle.svg b/static/bootstrap-icons-1.13.1/5-circle.svg similarity index 100% rename from static/bootstrap-icons/5-circle.svg rename to static/bootstrap-icons-1.13.1/5-circle.svg diff --git a/static/bootstrap-icons/5-square-fill.svg b/static/bootstrap-icons-1.13.1/5-square-fill.svg similarity index 100% rename from static/bootstrap-icons/5-square-fill.svg rename to static/bootstrap-icons-1.13.1/5-square-fill.svg diff --git a/static/bootstrap-icons/5-square.svg b/static/bootstrap-icons-1.13.1/5-square.svg similarity index 100% rename from static/bootstrap-icons/5-square.svg rename to static/bootstrap-icons-1.13.1/5-square.svg diff --git a/static/bootstrap-icons/6-circle-fill.svg b/static/bootstrap-icons-1.13.1/6-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/6-circle-fill.svg rename to static/bootstrap-icons-1.13.1/6-circle-fill.svg diff --git a/static/bootstrap-icons/6-circle.svg b/static/bootstrap-icons-1.13.1/6-circle.svg similarity index 100% rename from static/bootstrap-icons/6-circle.svg rename to static/bootstrap-icons-1.13.1/6-circle.svg diff --git a/static/bootstrap-icons/6-square-fill.svg b/static/bootstrap-icons-1.13.1/6-square-fill.svg similarity index 100% rename from static/bootstrap-icons/6-square-fill.svg rename to static/bootstrap-icons-1.13.1/6-square-fill.svg diff --git a/static/bootstrap-icons/6-square.svg b/static/bootstrap-icons-1.13.1/6-square.svg similarity index 100% rename from static/bootstrap-icons/6-square.svg rename to static/bootstrap-icons-1.13.1/6-square.svg diff --git a/static/bootstrap-icons/7-circle-fill.svg b/static/bootstrap-icons-1.13.1/7-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/7-circle-fill.svg rename to static/bootstrap-icons-1.13.1/7-circle-fill.svg diff --git a/static/bootstrap-icons/7-circle.svg b/static/bootstrap-icons-1.13.1/7-circle.svg similarity index 100% rename from static/bootstrap-icons/7-circle.svg rename to static/bootstrap-icons-1.13.1/7-circle.svg diff --git a/static/bootstrap-icons/7-square-fill.svg b/static/bootstrap-icons-1.13.1/7-square-fill.svg similarity index 100% rename from static/bootstrap-icons/7-square-fill.svg rename to static/bootstrap-icons-1.13.1/7-square-fill.svg diff --git a/static/bootstrap-icons/7-square.svg b/static/bootstrap-icons-1.13.1/7-square.svg similarity index 100% rename from static/bootstrap-icons/7-square.svg rename to static/bootstrap-icons-1.13.1/7-square.svg diff --git a/static/bootstrap-icons/8-circle-fill.svg b/static/bootstrap-icons-1.13.1/8-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/8-circle-fill.svg rename to static/bootstrap-icons-1.13.1/8-circle-fill.svg diff --git a/static/bootstrap-icons/8-circle.svg b/static/bootstrap-icons-1.13.1/8-circle.svg similarity index 100% rename from static/bootstrap-icons/8-circle.svg rename to static/bootstrap-icons-1.13.1/8-circle.svg diff --git a/static/bootstrap-icons/8-square-fill.svg b/static/bootstrap-icons-1.13.1/8-square-fill.svg similarity index 100% rename from static/bootstrap-icons/8-square-fill.svg rename to static/bootstrap-icons-1.13.1/8-square-fill.svg diff --git a/static/bootstrap-icons/8-square.svg b/static/bootstrap-icons-1.13.1/8-square.svg similarity index 100% rename from static/bootstrap-icons/8-square.svg rename to static/bootstrap-icons-1.13.1/8-square.svg diff --git a/static/bootstrap-icons/9-circle-fill.svg b/static/bootstrap-icons-1.13.1/9-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/9-circle-fill.svg rename to static/bootstrap-icons-1.13.1/9-circle-fill.svg diff --git a/static/bootstrap-icons/9-circle.svg b/static/bootstrap-icons-1.13.1/9-circle.svg similarity index 100% rename from static/bootstrap-icons/9-circle.svg rename to static/bootstrap-icons-1.13.1/9-circle.svg diff --git a/static/bootstrap-icons/9-square-fill.svg b/static/bootstrap-icons-1.13.1/9-square-fill.svg similarity index 100% rename from static/bootstrap-icons/9-square-fill.svg rename to static/bootstrap-icons-1.13.1/9-square-fill.svg diff --git a/static/bootstrap-icons/9-square.svg b/static/bootstrap-icons-1.13.1/9-square.svg similarity index 100% rename from static/bootstrap-icons/9-square.svg rename to static/bootstrap-icons-1.13.1/9-square.svg diff --git a/static/bootstrap-icons/activity.svg b/static/bootstrap-icons-1.13.1/activity.svg similarity index 100% rename from static/bootstrap-icons/activity.svg rename to static/bootstrap-icons-1.13.1/activity.svg diff --git a/static/bootstrap-icons/airplane-engines-fill.svg b/static/bootstrap-icons-1.13.1/airplane-engines-fill.svg similarity index 100% rename from static/bootstrap-icons/airplane-engines-fill.svg rename to static/bootstrap-icons-1.13.1/airplane-engines-fill.svg diff --git a/static/bootstrap-icons/airplane-engines.svg b/static/bootstrap-icons-1.13.1/airplane-engines.svg similarity index 100% rename from static/bootstrap-icons/airplane-engines.svg rename to static/bootstrap-icons-1.13.1/airplane-engines.svg diff --git a/static/bootstrap-icons/airplane-fill.svg b/static/bootstrap-icons-1.13.1/airplane-fill.svg similarity index 100% rename from static/bootstrap-icons/airplane-fill.svg rename to static/bootstrap-icons-1.13.1/airplane-fill.svg diff --git a/static/bootstrap-icons/airplane.svg b/static/bootstrap-icons-1.13.1/airplane.svg similarity index 100% rename from static/bootstrap-icons/airplane.svg rename to static/bootstrap-icons-1.13.1/airplane.svg diff --git a/static/bootstrap-icons/alarm-fill.svg b/static/bootstrap-icons-1.13.1/alarm-fill.svg similarity index 100% rename from static/bootstrap-icons/alarm-fill.svg rename to static/bootstrap-icons-1.13.1/alarm-fill.svg diff --git a/static/bootstrap-icons/alarm.svg b/static/bootstrap-icons-1.13.1/alarm.svg similarity index 100% rename from static/bootstrap-icons/alarm.svg rename to static/bootstrap-icons-1.13.1/alarm.svg diff --git a/static/bootstrap-icons/alexa.svg b/static/bootstrap-icons-1.13.1/alexa.svg similarity index 100% rename from static/bootstrap-icons/alexa.svg rename to static/bootstrap-icons-1.13.1/alexa.svg diff --git a/static/bootstrap-icons/align-bottom.svg b/static/bootstrap-icons-1.13.1/align-bottom.svg similarity index 100% rename from static/bootstrap-icons/align-bottom.svg rename to static/bootstrap-icons-1.13.1/align-bottom.svg diff --git a/static/bootstrap-icons/align-center.svg b/static/bootstrap-icons-1.13.1/align-center.svg similarity index 100% rename from static/bootstrap-icons/align-center.svg rename to static/bootstrap-icons-1.13.1/align-center.svg diff --git a/static/bootstrap-icons/align-end.svg b/static/bootstrap-icons-1.13.1/align-end.svg similarity index 100% rename from static/bootstrap-icons/align-end.svg rename to static/bootstrap-icons-1.13.1/align-end.svg diff --git a/static/bootstrap-icons/align-middle.svg b/static/bootstrap-icons-1.13.1/align-middle.svg similarity index 100% rename from static/bootstrap-icons/align-middle.svg rename to static/bootstrap-icons-1.13.1/align-middle.svg diff --git a/static/bootstrap-icons/align-start.svg b/static/bootstrap-icons-1.13.1/align-start.svg similarity index 100% rename from static/bootstrap-icons/align-start.svg rename to static/bootstrap-icons-1.13.1/align-start.svg diff --git a/static/bootstrap-icons/align-top.svg b/static/bootstrap-icons-1.13.1/align-top.svg similarity index 100% rename from static/bootstrap-icons/align-top.svg rename to static/bootstrap-icons-1.13.1/align-top.svg diff --git a/static/bootstrap-icons/alipay.svg b/static/bootstrap-icons-1.13.1/alipay.svg similarity index 100% rename from static/bootstrap-icons/alipay.svg rename to static/bootstrap-icons-1.13.1/alipay.svg diff --git a/static/bootstrap-icons/alphabet-uppercase.svg b/static/bootstrap-icons-1.13.1/alphabet-uppercase.svg similarity index 100% rename from static/bootstrap-icons/alphabet-uppercase.svg rename to static/bootstrap-icons-1.13.1/alphabet-uppercase.svg diff --git a/static/bootstrap-icons/alphabet.svg b/static/bootstrap-icons-1.13.1/alphabet.svg similarity index 100% rename from static/bootstrap-icons/alphabet.svg rename to static/bootstrap-icons-1.13.1/alphabet.svg diff --git a/static/bootstrap-icons/alt.svg b/static/bootstrap-icons-1.13.1/alt.svg similarity index 100% rename from static/bootstrap-icons/alt.svg rename to static/bootstrap-icons-1.13.1/alt.svg diff --git a/static/bootstrap-icons/amazon.svg b/static/bootstrap-icons-1.13.1/amazon.svg similarity index 100% rename from static/bootstrap-icons/amazon.svg rename to static/bootstrap-icons-1.13.1/amazon.svg diff --git a/static/bootstrap-icons/amd.svg b/static/bootstrap-icons-1.13.1/amd.svg similarity index 100% rename from static/bootstrap-icons/amd.svg rename to static/bootstrap-icons-1.13.1/amd.svg diff --git a/static/bootstrap-icons/android.svg b/static/bootstrap-icons-1.13.1/android.svg similarity index 100% rename from static/bootstrap-icons/android.svg rename to static/bootstrap-icons-1.13.1/android.svg diff --git a/static/bootstrap-icons/android2.svg b/static/bootstrap-icons-1.13.1/android2.svg similarity index 100% rename from static/bootstrap-icons/android2.svg rename to static/bootstrap-icons-1.13.1/android2.svg diff --git a/static/bootstrap-icons/anthropic.svg b/static/bootstrap-icons-1.13.1/anthropic.svg similarity index 100% rename from static/bootstrap-icons/anthropic.svg rename to static/bootstrap-icons-1.13.1/anthropic.svg diff --git a/static/bootstrap-icons/app-indicator.svg b/static/bootstrap-icons-1.13.1/app-indicator.svg similarity index 100% rename from static/bootstrap-icons/app-indicator.svg rename to static/bootstrap-icons-1.13.1/app-indicator.svg diff --git a/static/bootstrap-icons/app.svg b/static/bootstrap-icons-1.13.1/app.svg similarity index 100% rename from static/bootstrap-icons/app.svg rename to static/bootstrap-icons-1.13.1/app.svg diff --git a/static/bootstrap-icons/apple-music.svg b/static/bootstrap-icons-1.13.1/apple-music.svg similarity index 100% rename from static/bootstrap-icons/apple-music.svg rename to static/bootstrap-icons-1.13.1/apple-music.svg diff --git a/static/bootstrap-icons/apple.svg b/static/bootstrap-icons-1.13.1/apple.svg similarity index 100% rename from static/bootstrap-icons/apple.svg rename to static/bootstrap-icons-1.13.1/apple.svg diff --git a/static/bootstrap-icons/archive-fill.svg b/static/bootstrap-icons-1.13.1/archive-fill.svg similarity index 100% rename from static/bootstrap-icons/archive-fill.svg rename to static/bootstrap-icons-1.13.1/archive-fill.svg diff --git a/static/bootstrap-icons/archive.svg b/static/bootstrap-icons-1.13.1/archive.svg similarity index 100% rename from static/bootstrap-icons/archive.svg rename to static/bootstrap-icons-1.13.1/archive.svg diff --git a/static/bootstrap-icons/arrow-90deg-down.svg b/static/bootstrap-icons-1.13.1/arrow-90deg-down.svg similarity index 100% rename from static/bootstrap-icons/arrow-90deg-down.svg rename to static/bootstrap-icons-1.13.1/arrow-90deg-down.svg diff --git a/static/bootstrap-icons/arrow-90deg-left.svg b/static/bootstrap-icons-1.13.1/arrow-90deg-left.svg similarity index 100% rename from static/bootstrap-icons/arrow-90deg-left.svg rename to static/bootstrap-icons-1.13.1/arrow-90deg-left.svg diff --git a/static/bootstrap-icons/arrow-90deg-right.svg b/static/bootstrap-icons-1.13.1/arrow-90deg-right.svg similarity index 100% rename from static/bootstrap-icons/arrow-90deg-right.svg rename to static/bootstrap-icons-1.13.1/arrow-90deg-right.svg diff --git a/static/bootstrap-icons/arrow-90deg-up.svg b/static/bootstrap-icons-1.13.1/arrow-90deg-up.svg similarity index 100% rename from static/bootstrap-icons/arrow-90deg-up.svg rename to static/bootstrap-icons-1.13.1/arrow-90deg-up.svg diff --git a/static/bootstrap-icons/arrow-bar-down.svg b/static/bootstrap-icons-1.13.1/arrow-bar-down.svg similarity index 100% rename from static/bootstrap-icons/arrow-bar-down.svg rename to static/bootstrap-icons-1.13.1/arrow-bar-down.svg diff --git a/static/bootstrap-icons/arrow-bar-left.svg b/static/bootstrap-icons-1.13.1/arrow-bar-left.svg similarity index 100% rename from static/bootstrap-icons/arrow-bar-left.svg rename to static/bootstrap-icons-1.13.1/arrow-bar-left.svg diff --git a/static/bootstrap-icons/arrow-bar-right.svg b/static/bootstrap-icons-1.13.1/arrow-bar-right.svg similarity index 100% rename from static/bootstrap-icons/arrow-bar-right.svg rename to static/bootstrap-icons-1.13.1/arrow-bar-right.svg diff --git a/static/bootstrap-icons/arrow-bar-up.svg b/static/bootstrap-icons-1.13.1/arrow-bar-up.svg similarity index 100% rename from static/bootstrap-icons/arrow-bar-up.svg rename to static/bootstrap-icons-1.13.1/arrow-bar-up.svg diff --git a/static/bootstrap-icons/arrow-clockwise.svg b/static/bootstrap-icons-1.13.1/arrow-clockwise.svg similarity index 100% rename from static/bootstrap-icons/arrow-clockwise.svg rename to static/bootstrap-icons-1.13.1/arrow-clockwise.svg diff --git a/static/bootstrap-icons/arrow-counterclockwise.svg b/static/bootstrap-icons-1.13.1/arrow-counterclockwise.svg similarity index 100% rename from static/bootstrap-icons/arrow-counterclockwise.svg rename to static/bootstrap-icons-1.13.1/arrow-counterclockwise.svg diff --git a/static/bootstrap-icons/arrow-down-circle-fill.svg b/static/bootstrap-icons-1.13.1/arrow-down-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-circle-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-down-circle-fill.svg diff --git a/static/bootstrap-icons/arrow-down-circle.svg b/static/bootstrap-icons-1.13.1/arrow-down-circle.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-circle.svg rename to static/bootstrap-icons-1.13.1/arrow-down-circle.svg diff --git a/static/bootstrap-icons/arrow-down-left-circle-fill.svg b/static/bootstrap-icons-1.13.1/arrow-down-left-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-left-circle-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-down-left-circle-fill.svg diff --git a/static/bootstrap-icons/arrow-down-left-circle.svg b/static/bootstrap-icons-1.13.1/arrow-down-left-circle.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-left-circle.svg rename to static/bootstrap-icons-1.13.1/arrow-down-left-circle.svg diff --git a/static/bootstrap-icons/arrow-down-left-square-fill.svg b/static/bootstrap-icons-1.13.1/arrow-down-left-square-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-left-square-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-down-left-square-fill.svg diff --git a/static/bootstrap-icons/arrow-down-left-square.svg b/static/bootstrap-icons-1.13.1/arrow-down-left-square.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-left-square.svg rename to static/bootstrap-icons-1.13.1/arrow-down-left-square.svg diff --git a/static/bootstrap-icons/arrow-down-left.svg b/static/bootstrap-icons-1.13.1/arrow-down-left.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-left.svg rename to static/bootstrap-icons-1.13.1/arrow-down-left.svg diff --git a/static/bootstrap-icons/arrow-down-right-circle-fill.svg b/static/bootstrap-icons-1.13.1/arrow-down-right-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-right-circle-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-down-right-circle-fill.svg diff --git a/static/bootstrap-icons/arrow-down-right-circle.svg b/static/bootstrap-icons-1.13.1/arrow-down-right-circle.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-right-circle.svg rename to static/bootstrap-icons-1.13.1/arrow-down-right-circle.svg diff --git a/static/bootstrap-icons/arrow-down-right-square-fill.svg b/static/bootstrap-icons-1.13.1/arrow-down-right-square-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-right-square-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-down-right-square-fill.svg diff --git a/static/bootstrap-icons/arrow-down-right-square.svg b/static/bootstrap-icons-1.13.1/arrow-down-right-square.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-right-square.svg rename to static/bootstrap-icons-1.13.1/arrow-down-right-square.svg diff --git a/static/bootstrap-icons/arrow-down-right.svg b/static/bootstrap-icons-1.13.1/arrow-down-right.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-right.svg rename to static/bootstrap-icons-1.13.1/arrow-down-right.svg diff --git a/static/bootstrap-icons/arrow-down-short.svg b/static/bootstrap-icons-1.13.1/arrow-down-short.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-short.svg rename to static/bootstrap-icons-1.13.1/arrow-down-short.svg diff --git a/static/bootstrap-icons/arrow-down-square-fill.svg b/static/bootstrap-icons-1.13.1/arrow-down-square-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-square-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-down-square-fill.svg diff --git a/static/bootstrap-icons/arrow-down-square.svg b/static/bootstrap-icons-1.13.1/arrow-down-square.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-square.svg rename to static/bootstrap-icons-1.13.1/arrow-down-square.svg diff --git a/static/bootstrap-icons/arrow-down-up.svg b/static/bootstrap-icons-1.13.1/arrow-down-up.svg similarity index 100% rename from static/bootstrap-icons/arrow-down-up.svg rename to static/bootstrap-icons-1.13.1/arrow-down-up.svg diff --git a/static/bootstrap-icons/arrow-down.svg b/static/bootstrap-icons-1.13.1/arrow-down.svg similarity index 100% rename from static/bootstrap-icons/arrow-down.svg rename to static/bootstrap-icons-1.13.1/arrow-down.svg diff --git a/static/bootstrap-icons/arrow-left-circle-fill.svg b/static/bootstrap-icons-1.13.1/arrow-left-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-left-circle-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-left-circle-fill.svg diff --git a/static/bootstrap-icons/arrow-left-circle.svg b/static/bootstrap-icons-1.13.1/arrow-left-circle.svg similarity index 100% rename from static/bootstrap-icons/arrow-left-circle.svg rename to static/bootstrap-icons-1.13.1/arrow-left-circle.svg diff --git a/static/bootstrap-icons/arrow-left-right.svg b/static/bootstrap-icons-1.13.1/arrow-left-right.svg similarity index 100% rename from static/bootstrap-icons/arrow-left-right.svg rename to static/bootstrap-icons-1.13.1/arrow-left-right.svg diff --git a/static/bootstrap-icons/arrow-left-short.svg b/static/bootstrap-icons-1.13.1/arrow-left-short.svg similarity index 100% rename from static/bootstrap-icons/arrow-left-short.svg rename to static/bootstrap-icons-1.13.1/arrow-left-short.svg diff --git a/static/bootstrap-icons/arrow-left-square-fill.svg b/static/bootstrap-icons-1.13.1/arrow-left-square-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-left-square-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-left-square-fill.svg diff --git a/static/bootstrap-icons/arrow-left-square.svg b/static/bootstrap-icons-1.13.1/arrow-left-square.svg similarity index 100% rename from static/bootstrap-icons/arrow-left-square.svg rename to static/bootstrap-icons-1.13.1/arrow-left-square.svg diff --git a/static/bootstrap-icons/arrow-left.svg b/static/bootstrap-icons-1.13.1/arrow-left.svg similarity index 100% rename from static/bootstrap-icons/arrow-left.svg rename to static/bootstrap-icons-1.13.1/arrow-left.svg diff --git a/static/bootstrap-icons/arrow-repeat.svg b/static/bootstrap-icons-1.13.1/arrow-repeat.svg similarity index 100% rename from static/bootstrap-icons/arrow-repeat.svg rename to static/bootstrap-icons-1.13.1/arrow-repeat.svg diff --git a/static/bootstrap-icons/arrow-return-left.svg b/static/bootstrap-icons-1.13.1/arrow-return-left.svg similarity index 100% rename from static/bootstrap-icons/arrow-return-left.svg rename to static/bootstrap-icons-1.13.1/arrow-return-left.svg diff --git a/static/bootstrap-icons/arrow-return-right.svg b/static/bootstrap-icons-1.13.1/arrow-return-right.svg similarity index 100% rename from static/bootstrap-icons/arrow-return-right.svg rename to static/bootstrap-icons-1.13.1/arrow-return-right.svg diff --git a/static/bootstrap-icons/arrow-right-circle-fill.svg b/static/bootstrap-icons-1.13.1/arrow-right-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-right-circle-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-right-circle-fill.svg diff --git a/static/bootstrap-icons/arrow-right-circle.svg b/static/bootstrap-icons-1.13.1/arrow-right-circle.svg similarity index 100% rename from static/bootstrap-icons/arrow-right-circle.svg rename to static/bootstrap-icons-1.13.1/arrow-right-circle.svg diff --git a/static/bootstrap-icons/arrow-right-short.svg b/static/bootstrap-icons-1.13.1/arrow-right-short.svg similarity index 100% rename from static/bootstrap-icons/arrow-right-short.svg rename to static/bootstrap-icons-1.13.1/arrow-right-short.svg diff --git a/static/bootstrap-icons/arrow-right-square-fill.svg b/static/bootstrap-icons-1.13.1/arrow-right-square-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-right-square-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-right-square-fill.svg diff --git a/static/bootstrap-icons/arrow-right-square.svg b/static/bootstrap-icons-1.13.1/arrow-right-square.svg similarity index 100% rename from static/bootstrap-icons/arrow-right-square.svg rename to static/bootstrap-icons-1.13.1/arrow-right-square.svg diff --git a/static/bootstrap-icons/arrow-right.svg b/static/bootstrap-icons-1.13.1/arrow-right.svg similarity index 100% rename from static/bootstrap-icons/arrow-right.svg rename to static/bootstrap-icons-1.13.1/arrow-right.svg diff --git a/static/bootstrap-icons/arrow-through-heart-fill.svg b/static/bootstrap-icons-1.13.1/arrow-through-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-through-heart-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-through-heart-fill.svg diff --git a/static/bootstrap-icons/arrow-through-heart.svg b/static/bootstrap-icons-1.13.1/arrow-through-heart.svg similarity index 100% rename from static/bootstrap-icons/arrow-through-heart.svg rename to static/bootstrap-icons-1.13.1/arrow-through-heart.svg diff --git a/static/bootstrap-icons/arrow-up-circle-fill.svg b/static/bootstrap-icons-1.13.1/arrow-up-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-circle-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-up-circle-fill.svg diff --git a/static/bootstrap-icons/arrow-up-circle.svg b/static/bootstrap-icons-1.13.1/arrow-up-circle.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-circle.svg rename to static/bootstrap-icons-1.13.1/arrow-up-circle.svg diff --git a/static/bootstrap-icons/arrow-up-left-circle-fill.svg b/static/bootstrap-icons-1.13.1/arrow-up-left-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-left-circle-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-up-left-circle-fill.svg diff --git a/static/bootstrap-icons/arrow-up-left-circle.svg b/static/bootstrap-icons-1.13.1/arrow-up-left-circle.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-left-circle.svg rename to static/bootstrap-icons-1.13.1/arrow-up-left-circle.svg diff --git a/static/bootstrap-icons/arrow-up-left-square-fill.svg b/static/bootstrap-icons-1.13.1/arrow-up-left-square-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-left-square-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-up-left-square-fill.svg diff --git a/static/bootstrap-icons/arrow-up-left-square.svg b/static/bootstrap-icons-1.13.1/arrow-up-left-square.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-left-square.svg rename to static/bootstrap-icons-1.13.1/arrow-up-left-square.svg diff --git a/static/bootstrap-icons/arrow-up-left.svg b/static/bootstrap-icons-1.13.1/arrow-up-left.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-left.svg rename to static/bootstrap-icons-1.13.1/arrow-up-left.svg diff --git a/static/bootstrap-icons/arrow-up-right-circle-fill.svg b/static/bootstrap-icons-1.13.1/arrow-up-right-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-right-circle-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-up-right-circle-fill.svg diff --git a/static/bootstrap-icons/arrow-up-right-circle.svg b/static/bootstrap-icons-1.13.1/arrow-up-right-circle.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-right-circle.svg rename to static/bootstrap-icons-1.13.1/arrow-up-right-circle.svg diff --git a/static/bootstrap-icons/arrow-up-right-square-fill.svg b/static/bootstrap-icons-1.13.1/arrow-up-right-square-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-right-square-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-up-right-square-fill.svg diff --git a/static/bootstrap-icons/arrow-up-right-square.svg b/static/bootstrap-icons-1.13.1/arrow-up-right-square.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-right-square.svg rename to static/bootstrap-icons-1.13.1/arrow-up-right-square.svg diff --git a/static/bootstrap-icons/arrow-up-right.svg b/static/bootstrap-icons-1.13.1/arrow-up-right.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-right.svg rename to static/bootstrap-icons-1.13.1/arrow-up-right.svg diff --git a/static/bootstrap-icons/arrow-up-short.svg b/static/bootstrap-icons-1.13.1/arrow-up-short.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-short.svg rename to static/bootstrap-icons-1.13.1/arrow-up-short.svg diff --git a/static/bootstrap-icons/arrow-up-square-fill.svg b/static/bootstrap-icons-1.13.1/arrow-up-square-fill.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-square-fill.svg rename to static/bootstrap-icons-1.13.1/arrow-up-square-fill.svg diff --git a/static/bootstrap-icons/arrow-up-square.svg b/static/bootstrap-icons-1.13.1/arrow-up-square.svg similarity index 100% rename from static/bootstrap-icons/arrow-up-square.svg rename to static/bootstrap-icons-1.13.1/arrow-up-square.svg diff --git a/static/bootstrap-icons/arrow-up.svg b/static/bootstrap-icons-1.13.1/arrow-up.svg similarity index 100% rename from static/bootstrap-icons/arrow-up.svg rename to static/bootstrap-icons-1.13.1/arrow-up.svg diff --git a/static/bootstrap-icons/arrows-angle-contract.svg b/static/bootstrap-icons-1.13.1/arrows-angle-contract.svg similarity index 100% rename from static/bootstrap-icons/arrows-angle-contract.svg rename to static/bootstrap-icons-1.13.1/arrows-angle-contract.svg diff --git a/static/bootstrap-icons/arrows-angle-expand.svg b/static/bootstrap-icons-1.13.1/arrows-angle-expand.svg similarity index 100% rename from static/bootstrap-icons/arrows-angle-expand.svg rename to static/bootstrap-icons-1.13.1/arrows-angle-expand.svg diff --git a/static/bootstrap-icons/arrows-collapse-vertical.svg b/static/bootstrap-icons-1.13.1/arrows-collapse-vertical.svg similarity index 100% rename from static/bootstrap-icons/arrows-collapse-vertical.svg rename to static/bootstrap-icons-1.13.1/arrows-collapse-vertical.svg diff --git a/static/bootstrap-icons/arrows-collapse.svg b/static/bootstrap-icons-1.13.1/arrows-collapse.svg similarity index 100% rename from static/bootstrap-icons/arrows-collapse.svg rename to static/bootstrap-icons-1.13.1/arrows-collapse.svg diff --git a/static/bootstrap-icons/arrows-expand-vertical.svg b/static/bootstrap-icons-1.13.1/arrows-expand-vertical.svg similarity index 100% rename from static/bootstrap-icons/arrows-expand-vertical.svg rename to static/bootstrap-icons-1.13.1/arrows-expand-vertical.svg diff --git a/static/bootstrap-icons/arrows-expand.svg b/static/bootstrap-icons-1.13.1/arrows-expand.svg similarity index 100% rename from static/bootstrap-icons/arrows-expand.svg rename to static/bootstrap-icons-1.13.1/arrows-expand.svg diff --git a/static/bootstrap-icons/arrows-fullscreen.svg b/static/bootstrap-icons-1.13.1/arrows-fullscreen.svg similarity index 100% rename from static/bootstrap-icons/arrows-fullscreen.svg rename to static/bootstrap-icons-1.13.1/arrows-fullscreen.svg diff --git a/static/bootstrap-icons/arrows-move.svg b/static/bootstrap-icons-1.13.1/arrows-move.svg similarity index 100% rename from static/bootstrap-icons/arrows-move.svg rename to static/bootstrap-icons-1.13.1/arrows-move.svg diff --git a/static/bootstrap-icons/arrows-vertical.svg b/static/bootstrap-icons-1.13.1/arrows-vertical.svg similarity index 100% rename from static/bootstrap-icons/arrows-vertical.svg rename to static/bootstrap-icons-1.13.1/arrows-vertical.svg diff --git a/static/bootstrap-icons/arrows.svg b/static/bootstrap-icons-1.13.1/arrows.svg similarity index 100% rename from static/bootstrap-icons/arrows.svg rename to static/bootstrap-icons-1.13.1/arrows.svg diff --git a/static/bootstrap-icons/aspect-ratio-fill.svg b/static/bootstrap-icons-1.13.1/aspect-ratio-fill.svg similarity index 100% rename from static/bootstrap-icons/aspect-ratio-fill.svg rename to static/bootstrap-icons-1.13.1/aspect-ratio-fill.svg diff --git a/static/bootstrap-icons/aspect-ratio.svg b/static/bootstrap-icons-1.13.1/aspect-ratio.svg similarity index 100% rename from static/bootstrap-icons/aspect-ratio.svg rename to static/bootstrap-icons-1.13.1/aspect-ratio.svg diff --git a/static/bootstrap-icons/asterisk.svg b/static/bootstrap-icons-1.13.1/asterisk.svg similarity index 100% rename from static/bootstrap-icons/asterisk.svg rename to static/bootstrap-icons-1.13.1/asterisk.svg diff --git a/static/bootstrap-icons/at.svg b/static/bootstrap-icons-1.13.1/at.svg similarity index 100% rename from static/bootstrap-icons/at.svg rename to static/bootstrap-icons-1.13.1/at.svg diff --git a/static/bootstrap-icons/award-fill.svg b/static/bootstrap-icons-1.13.1/award-fill.svg similarity index 100% rename from static/bootstrap-icons/award-fill.svg rename to static/bootstrap-icons-1.13.1/award-fill.svg diff --git a/static/bootstrap-icons/award.svg b/static/bootstrap-icons-1.13.1/award.svg similarity index 100% rename from static/bootstrap-icons/award.svg rename to static/bootstrap-icons-1.13.1/award.svg diff --git a/static/bootstrap-icons/back.svg b/static/bootstrap-icons-1.13.1/back.svg similarity index 100% rename from static/bootstrap-icons/back.svg rename to static/bootstrap-icons-1.13.1/back.svg diff --git a/static/bootstrap-icons/backpack-fill.svg b/static/bootstrap-icons-1.13.1/backpack-fill.svg similarity index 100% rename from static/bootstrap-icons/backpack-fill.svg rename to static/bootstrap-icons-1.13.1/backpack-fill.svg diff --git a/static/bootstrap-icons/backpack.svg b/static/bootstrap-icons-1.13.1/backpack.svg similarity index 100% rename from static/bootstrap-icons/backpack.svg rename to static/bootstrap-icons-1.13.1/backpack.svg diff --git a/static/bootstrap-icons/backpack2-fill.svg b/static/bootstrap-icons-1.13.1/backpack2-fill.svg similarity index 100% rename from static/bootstrap-icons/backpack2-fill.svg rename to static/bootstrap-icons-1.13.1/backpack2-fill.svg diff --git a/static/bootstrap-icons/backpack2.svg b/static/bootstrap-icons-1.13.1/backpack2.svg similarity index 100% rename from static/bootstrap-icons/backpack2.svg rename to static/bootstrap-icons-1.13.1/backpack2.svg diff --git a/static/bootstrap-icons/backpack3-fill.svg b/static/bootstrap-icons-1.13.1/backpack3-fill.svg similarity index 100% rename from static/bootstrap-icons/backpack3-fill.svg rename to static/bootstrap-icons-1.13.1/backpack3-fill.svg diff --git a/static/bootstrap-icons/backpack3.svg b/static/bootstrap-icons-1.13.1/backpack3.svg similarity index 100% rename from static/bootstrap-icons/backpack3.svg rename to static/bootstrap-icons-1.13.1/backpack3.svg diff --git a/static/bootstrap-icons/backpack4-fill.svg b/static/bootstrap-icons-1.13.1/backpack4-fill.svg similarity index 100% rename from static/bootstrap-icons/backpack4-fill.svg rename to static/bootstrap-icons-1.13.1/backpack4-fill.svg diff --git a/static/bootstrap-icons/backpack4.svg b/static/bootstrap-icons-1.13.1/backpack4.svg similarity index 100% rename from static/bootstrap-icons/backpack4.svg rename to static/bootstrap-icons-1.13.1/backpack4.svg diff --git a/static/bootstrap-icons/backspace-fill.svg b/static/bootstrap-icons-1.13.1/backspace-fill.svg similarity index 100% rename from static/bootstrap-icons/backspace-fill.svg rename to static/bootstrap-icons-1.13.1/backspace-fill.svg diff --git a/static/bootstrap-icons/backspace-reverse-fill.svg b/static/bootstrap-icons-1.13.1/backspace-reverse-fill.svg similarity index 100% rename from static/bootstrap-icons/backspace-reverse-fill.svg rename to static/bootstrap-icons-1.13.1/backspace-reverse-fill.svg diff --git a/static/bootstrap-icons/backspace-reverse.svg b/static/bootstrap-icons-1.13.1/backspace-reverse.svg similarity index 100% rename from static/bootstrap-icons/backspace-reverse.svg rename to static/bootstrap-icons-1.13.1/backspace-reverse.svg diff --git a/static/bootstrap-icons/backspace.svg b/static/bootstrap-icons-1.13.1/backspace.svg similarity index 100% rename from static/bootstrap-icons/backspace.svg rename to static/bootstrap-icons-1.13.1/backspace.svg diff --git a/static/bootstrap-icons/badge-3d-fill.svg b/static/bootstrap-icons-1.13.1/badge-3d-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-3d-fill.svg rename to static/bootstrap-icons-1.13.1/badge-3d-fill.svg diff --git a/static/bootstrap-icons/badge-3d.svg b/static/bootstrap-icons-1.13.1/badge-3d.svg similarity index 100% rename from static/bootstrap-icons/badge-3d.svg rename to static/bootstrap-icons-1.13.1/badge-3d.svg diff --git a/static/bootstrap-icons/badge-4k-fill.svg b/static/bootstrap-icons-1.13.1/badge-4k-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-4k-fill.svg rename to static/bootstrap-icons-1.13.1/badge-4k-fill.svg diff --git a/static/bootstrap-icons/badge-4k.svg b/static/bootstrap-icons-1.13.1/badge-4k.svg similarity index 100% rename from static/bootstrap-icons/badge-4k.svg rename to static/bootstrap-icons-1.13.1/badge-4k.svg diff --git a/static/bootstrap-icons/badge-8k-fill.svg b/static/bootstrap-icons-1.13.1/badge-8k-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-8k-fill.svg rename to static/bootstrap-icons-1.13.1/badge-8k-fill.svg diff --git a/static/bootstrap-icons/badge-8k.svg b/static/bootstrap-icons-1.13.1/badge-8k.svg similarity index 100% rename from static/bootstrap-icons/badge-8k.svg rename to static/bootstrap-icons-1.13.1/badge-8k.svg diff --git a/static/bootstrap-icons/badge-ad-fill.svg b/static/bootstrap-icons-1.13.1/badge-ad-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-ad-fill.svg rename to static/bootstrap-icons-1.13.1/badge-ad-fill.svg diff --git a/static/bootstrap-icons/badge-ad.svg b/static/bootstrap-icons-1.13.1/badge-ad.svg similarity index 100% rename from static/bootstrap-icons/badge-ad.svg rename to static/bootstrap-icons-1.13.1/badge-ad.svg diff --git a/static/bootstrap-icons/badge-ar-fill.svg b/static/bootstrap-icons-1.13.1/badge-ar-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-ar-fill.svg rename to static/bootstrap-icons-1.13.1/badge-ar-fill.svg diff --git a/static/bootstrap-icons/badge-ar.svg b/static/bootstrap-icons-1.13.1/badge-ar.svg similarity index 100% rename from static/bootstrap-icons/badge-ar.svg rename to static/bootstrap-icons-1.13.1/badge-ar.svg diff --git a/static/bootstrap-icons/badge-cc-fill.svg b/static/bootstrap-icons-1.13.1/badge-cc-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-cc-fill.svg rename to static/bootstrap-icons-1.13.1/badge-cc-fill.svg diff --git a/static/bootstrap-icons/badge-cc.svg b/static/bootstrap-icons-1.13.1/badge-cc.svg similarity index 100% rename from static/bootstrap-icons/badge-cc.svg rename to static/bootstrap-icons-1.13.1/badge-cc.svg diff --git a/static/bootstrap-icons/badge-hd-fill.svg b/static/bootstrap-icons-1.13.1/badge-hd-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-hd-fill.svg rename to static/bootstrap-icons-1.13.1/badge-hd-fill.svg diff --git a/static/bootstrap-icons/badge-hd.svg b/static/bootstrap-icons-1.13.1/badge-hd.svg similarity index 100% rename from static/bootstrap-icons/badge-hd.svg rename to static/bootstrap-icons-1.13.1/badge-hd.svg diff --git a/static/bootstrap-icons/badge-sd-fill.svg b/static/bootstrap-icons-1.13.1/badge-sd-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-sd-fill.svg rename to static/bootstrap-icons-1.13.1/badge-sd-fill.svg diff --git a/static/bootstrap-icons/badge-sd.svg b/static/bootstrap-icons-1.13.1/badge-sd.svg similarity index 100% rename from static/bootstrap-icons/badge-sd.svg rename to static/bootstrap-icons-1.13.1/badge-sd.svg diff --git a/static/bootstrap-icons/badge-tm-fill.svg b/static/bootstrap-icons-1.13.1/badge-tm-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-tm-fill.svg rename to static/bootstrap-icons-1.13.1/badge-tm-fill.svg diff --git a/static/bootstrap-icons/badge-tm.svg b/static/bootstrap-icons-1.13.1/badge-tm.svg similarity index 100% rename from static/bootstrap-icons/badge-tm.svg rename to static/bootstrap-icons-1.13.1/badge-tm.svg diff --git a/static/bootstrap-icons/badge-vo-fill.svg b/static/bootstrap-icons-1.13.1/badge-vo-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-vo-fill.svg rename to static/bootstrap-icons-1.13.1/badge-vo-fill.svg diff --git a/static/bootstrap-icons/badge-vo.svg b/static/bootstrap-icons-1.13.1/badge-vo.svg similarity index 100% rename from static/bootstrap-icons/badge-vo.svg rename to static/bootstrap-icons-1.13.1/badge-vo.svg diff --git a/static/bootstrap-icons/badge-vr-fill.svg b/static/bootstrap-icons-1.13.1/badge-vr-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-vr-fill.svg rename to static/bootstrap-icons-1.13.1/badge-vr-fill.svg diff --git a/static/bootstrap-icons/badge-vr.svg b/static/bootstrap-icons-1.13.1/badge-vr.svg similarity index 100% rename from static/bootstrap-icons/badge-vr.svg rename to static/bootstrap-icons-1.13.1/badge-vr.svg diff --git a/static/bootstrap-icons/badge-wc-fill.svg b/static/bootstrap-icons-1.13.1/badge-wc-fill.svg similarity index 100% rename from static/bootstrap-icons/badge-wc-fill.svg rename to static/bootstrap-icons-1.13.1/badge-wc-fill.svg diff --git a/static/bootstrap-icons/badge-wc.svg b/static/bootstrap-icons-1.13.1/badge-wc.svg similarity index 100% rename from static/bootstrap-icons/badge-wc.svg rename to static/bootstrap-icons-1.13.1/badge-wc.svg diff --git a/static/bootstrap-icons/bag-check-fill.svg b/static/bootstrap-icons-1.13.1/bag-check-fill.svg similarity index 100% rename from static/bootstrap-icons/bag-check-fill.svg rename to static/bootstrap-icons-1.13.1/bag-check-fill.svg diff --git a/static/bootstrap-icons/bag-check.svg b/static/bootstrap-icons-1.13.1/bag-check.svg similarity index 100% rename from static/bootstrap-icons/bag-check.svg rename to static/bootstrap-icons-1.13.1/bag-check.svg diff --git a/static/bootstrap-icons/bag-dash-fill.svg b/static/bootstrap-icons-1.13.1/bag-dash-fill.svg similarity index 100% rename from static/bootstrap-icons/bag-dash-fill.svg rename to static/bootstrap-icons-1.13.1/bag-dash-fill.svg diff --git a/static/bootstrap-icons/bag-dash.svg b/static/bootstrap-icons-1.13.1/bag-dash.svg similarity index 100% rename from static/bootstrap-icons/bag-dash.svg rename to static/bootstrap-icons-1.13.1/bag-dash.svg diff --git a/static/bootstrap-icons/bag-fill.svg b/static/bootstrap-icons-1.13.1/bag-fill.svg similarity index 100% rename from static/bootstrap-icons/bag-fill.svg rename to static/bootstrap-icons-1.13.1/bag-fill.svg diff --git a/static/bootstrap-icons/bag-heart-fill.svg b/static/bootstrap-icons-1.13.1/bag-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/bag-heart-fill.svg rename to static/bootstrap-icons-1.13.1/bag-heart-fill.svg diff --git a/static/bootstrap-icons/bag-heart.svg b/static/bootstrap-icons-1.13.1/bag-heart.svg similarity index 100% rename from static/bootstrap-icons/bag-heart.svg rename to static/bootstrap-icons-1.13.1/bag-heart.svg diff --git a/static/bootstrap-icons/bag-plus-fill.svg b/static/bootstrap-icons-1.13.1/bag-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/bag-plus-fill.svg rename to static/bootstrap-icons-1.13.1/bag-plus-fill.svg diff --git a/static/bootstrap-icons/bag-plus.svg b/static/bootstrap-icons-1.13.1/bag-plus.svg similarity index 100% rename from static/bootstrap-icons/bag-plus.svg rename to static/bootstrap-icons-1.13.1/bag-plus.svg diff --git a/static/bootstrap-icons/bag-x-fill.svg b/static/bootstrap-icons-1.13.1/bag-x-fill.svg similarity index 100% rename from static/bootstrap-icons/bag-x-fill.svg rename to static/bootstrap-icons-1.13.1/bag-x-fill.svg diff --git a/static/bootstrap-icons/bag-x.svg b/static/bootstrap-icons-1.13.1/bag-x.svg similarity index 100% rename from static/bootstrap-icons/bag-x.svg rename to static/bootstrap-icons-1.13.1/bag-x.svg diff --git a/static/bootstrap-icons/bag.svg b/static/bootstrap-icons-1.13.1/bag.svg similarity index 100% rename from static/bootstrap-icons/bag.svg rename to static/bootstrap-icons-1.13.1/bag.svg diff --git a/static/bootstrap-icons/balloon-fill.svg b/static/bootstrap-icons-1.13.1/balloon-fill.svg similarity index 100% rename from static/bootstrap-icons/balloon-fill.svg rename to static/bootstrap-icons-1.13.1/balloon-fill.svg diff --git a/static/bootstrap-icons/balloon-heart-fill.svg b/static/bootstrap-icons-1.13.1/balloon-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/balloon-heart-fill.svg rename to static/bootstrap-icons-1.13.1/balloon-heart-fill.svg diff --git a/static/bootstrap-icons/balloon-heart.svg b/static/bootstrap-icons-1.13.1/balloon-heart.svg similarity index 100% rename from static/bootstrap-icons/balloon-heart.svg rename to static/bootstrap-icons-1.13.1/balloon-heart.svg diff --git a/static/bootstrap-icons/balloon.svg b/static/bootstrap-icons-1.13.1/balloon.svg similarity index 100% rename from static/bootstrap-icons/balloon.svg rename to static/bootstrap-icons-1.13.1/balloon.svg diff --git a/static/bootstrap-icons/ban-fill.svg b/static/bootstrap-icons-1.13.1/ban-fill.svg similarity index 100% rename from static/bootstrap-icons/ban-fill.svg rename to static/bootstrap-icons-1.13.1/ban-fill.svg diff --git a/static/bootstrap-icons/ban.svg b/static/bootstrap-icons-1.13.1/ban.svg similarity index 100% rename from static/bootstrap-icons/ban.svg rename to static/bootstrap-icons-1.13.1/ban.svg diff --git a/static/bootstrap-icons/bandaid-fill.svg b/static/bootstrap-icons-1.13.1/bandaid-fill.svg similarity index 100% rename from static/bootstrap-icons/bandaid-fill.svg rename to static/bootstrap-icons-1.13.1/bandaid-fill.svg diff --git a/static/bootstrap-icons/bandaid.svg b/static/bootstrap-icons-1.13.1/bandaid.svg similarity index 100% rename from static/bootstrap-icons/bandaid.svg rename to static/bootstrap-icons-1.13.1/bandaid.svg diff --git a/static/bootstrap-icons/bank.svg b/static/bootstrap-icons-1.13.1/bank.svg similarity index 100% rename from static/bootstrap-icons/bank.svg rename to static/bootstrap-icons-1.13.1/bank.svg diff --git a/static/bootstrap-icons/bank2.svg b/static/bootstrap-icons-1.13.1/bank2.svg similarity index 100% rename from static/bootstrap-icons/bank2.svg rename to static/bootstrap-icons-1.13.1/bank2.svg diff --git a/static/bootstrap-icons/bar-chart-fill.svg b/static/bootstrap-icons-1.13.1/bar-chart-fill.svg similarity index 100% rename from static/bootstrap-icons/bar-chart-fill.svg rename to static/bootstrap-icons-1.13.1/bar-chart-fill.svg diff --git a/static/bootstrap-icons/bar-chart-line-fill.svg b/static/bootstrap-icons-1.13.1/bar-chart-line-fill.svg similarity index 100% rename from static/bootstrap-icons/bar-chart-line-fill.svg rename to static/bootstrap-icons-1.13.1/bar-chart-line-fill.svg diff --git a/static/bootstrap-icons/bar-chart-line.svg b/static/bootstrap-icons-1.13.1/bar-chart-line.svg similarity index 100% rename from static/bootstrap-icons/bar-chart-line.svg rename to static/bootstrap-icons-1.13.1/bar-chart-line.svg diff --git a/static/bootstrap-icons/bar-chart-steps.svg b/static/bootstrap-icons-1.13.1/bar-chart-steps.svg similarity index 100% rename from static/bootstrap-icons/bar-chart-steps.svg rename to static/bootstrap-icons-1.13.1/bar-chart-steps.svg diff --git a/static/bootstrap-icons/bar-chart.svg b/static/bootstrap-icons-1.13.1/bar-chart.svg similarity index 100% rename from static/bootstrap-icons/bar-chart.svg rename to static/bootstrap-icons-1.13.1/bar-chart.svg diff --git a/static/bootstrap-icons/basket-fill.svg b/static/bootstrap-icons-1.13.1/basket-fill.svg similarity index 100% rename from static/bootstrap-icons/basket-fill.svg rename to static/bootstrap-icons-1.13.1/basket-fill.svg diff --git a/static/bootstrap-icons/basket.svg b/static/bootstrap-icons-1.13.1/basket.svg similarity index 100% rename from static/bootstrap-icons/basket.svg rename to static/bootstrap-icons-1.13.1/basket.svg diff --git a/static/bootstrap-icons/basket2-fill.svg b/static/bootstrap-icons-1.13.1/basket2-fill.svg similarity index 100% rename from static/bootstrap-icons/basket2-fill.svg rename to static/bootstrap-icons-1.13.1/basket2-fill.svg diff --git a/static/bootstrap-icons/basket2.svg b/static/bootstrap-icons-1.13.1/basket2.svg similarity index 100% rename from static/bootstrap-icons/basket2.svg rename to static/bootstrap-icons-1.13.1/basket2.svg diff --git a/static/bootstrap-icons/basket3-fill.svg b/static/bootstrap-icons-1.13.1/basket3-fill.svg similarity index 100% rename from static/bootstrap-icons/basket3-fill.svg rename to static/bootstrap-icons-1.13.1/basket3-fill.svg diff --git a/static/bootstrap-icons/basket3.svg b/static/bootstrap-icons-1.13.1/basket3.svg similarity index 100% rename from static/bootstrap-icons/basket3.svg rename to static/bootstrap-icons-1.13.1/basket3.svg diff --git a/static/bootstrap-icons/battery-charging.svg b/static/bootstrap-icons-1.13.1/battery-charging.svg similarity index 100% rename from static/bootstrap-icons/battery-charging.svg rename to static/bootstrap-icons-1.13.1/battery-charging.svg diff --git a/static/bootstrap-icons/battery-full.svg b/static/bootstrap-icons-1.13.1/battery-full.svg similarity index 100% rename from static/bootstrap-icons/battery-full.svg rename to static/bootstrap-icons-1.13.1/battery-full.svg diff --git a/static/bootstrap-icons/battery-half.svg b/static/bootstrap-icons-1.13.1/battery-half.svg similarity index 100% rename from static/bootstrap-icons/battery-half.svg rename to static/bootstrap-icons-1.13.1/battery-half.svg diff --git a/static/bootstrap-icons/battery-low.svg b/static/bootstrap-icons-1.13.1/battery-low.svg similarity index 100% rename from static/bootstrap-icons/battery-low.svg rename to static/bootstrap-icons-1.13.1/battery-low.svg diff --git a/static/bootstrap-icons/battery.svg b/static/bootstrap-icons-1.13.1/battery.svg similarity index 100% rename from static/bootstrap-icons/battery.svg rename to static/bootstrap-icons-1.13.1/battery.svg diff --git a/static/bootstrap-icons/beaker-fill.svg b/static/bootstrap-icons-1.13.1/beaker-fill.svg similarity index 100% rename from static/bootstrap-icons/beaker-fill.svg rename to static/bootstrap-icons-1.13.1/beaker-fill.svg diff --git a/static/bootstrap-icons/beaker.svg b/static/bootstrap-icons-1.13.1/beaker.svg similarity index 100% rename from static/bootstrap-icons/beaker.svg rename to static/bootstrap-icons-1.13.1/beaker.svg diff --git a/static/bootstrap-icons/behance.svg b/static/bootstrap-icons-1.13.1/behance.svg similarity index 100% rename from static/bootstrap-icons/behance.svg rename to static/bootstrap-icons-1.13.1/behance.svg diff --git a/static/bootstrap-icons/bell-fill.svg b/static/bootstrap-icons-1.13.1/bell-fill.svg similarity index 100% rename from static/bootstrap-icons/bell-fill.svg rename to static/bootstrap-icons-1.13.1/bell-fill.svg diff --git a/static/bootstrap-icons/bell-slash-fill.svg b/static/bootstrap-icons-1.13.1/bell-slash-fill.svg similarity index 100% rename from static/bootstrap-icons/bell-slash-fill.svg rename to static/bootstrap-icons-1.13.1/bell-slash-fill.svg diff --git a/static/bootstrap-icons/bell-slash.svg b/static/bootstrap-icons-1.13.1/bell-slash.svg similarity index 100% rename from static/bootstrap-icons/bell-slash.svg rename to static/bootstrap-icons-1.13.1/bell-slash.svg diff --git a/static/bootstrap-icons/bell.svg b/static/bootstrap-icons-1.13.1/bell.svg similarity index 100% rename from static/bootstrap-icons/bell.svg rename to static/bootstrap-icons-1.13.1/bell.svg diff --git a/static/bootstrap-icons/bezier.svg b/static/bootstrap-icons-1.13.1/bezier.svg similarity index 100% rename from static/bootstrap-icons/bezier.svg rename to static/bootstrap-icons-1.13.1/bezier.svg diff --git a/static/bootstrap-icons/bezier2.svg b/static/bootstrap-icons-1.13.1/bezier2.svg similarity index 100% rename from static/bootstrap-icons/bezier2.svg rename to static/bootstrap-icons-1.13.1/bezier2.svg diff --git a/static/bootstrap-icons/bicycle.svg b/static/bootstrap-icons-1.13.1/bicycle.svg similarity index 100% rename from static/bootstrap-icons/bicycle.svg rename to static/bootstrap-icons-1.13.1/bicycle.svg diff --git a/static/bootstrap-icons/bing.svg b/static/bootstrap-icons-1.13.1/bing.svg similarity index 100% rename from static/bootstrap-icons/bing.svg rename to static/bootstrap-icons-1.13.1/bing.svg diff --git a/static/bootstrap-icons/binoculars-fill.svg b/static/bootstrap-icons-1.13.1/binoculars-fill.svg similarity index 100% rename from static/bootstrap-icons/binoculars-fill.svg rename to static/bootstrap-icons-1.13.1/binoculars-fill.svg diff --git a/static/bootstrap-icons/binoculars.svg b/static/bootstrap-icons-1.13.1/binoculars.svg similarity index 100% rename from static/bootstrap-icons/binoculars.svg rename to static/bootstrap-icons-1.13.1/binoculars.svg diff --git a/static/bootstrap-icons/blockquote-left.svg b/static/bootstrap-icons-1.13.1/blockquote-left.svg similarity index 100% rename from static/bootstrap-icons/blockquote-left.svg rename to static/bootstrap-icons-1.13.1/blockquote-left.svg diff --git a/static/bootstrap-icons/blockquote-right.svg b/static/bootstrap-icons-1.13.1/blockquote-right.svg similarity index 100% rename from static/bootstrap-icons/blockquote-right.svg rename to static/bootstrap-icons-1.13.1/blockquote-right.svg diff --git a/static/bootstrap-icons/bluesky.svg b/static/bootstrap-icons-1.13.1/bluesky.svg similarity index 100% rename from static/bootstrap-icons/bluesky.svg rename to static/bootstrap-icons-1.13.1/bluesky.svg diff --git a/static/bootstrap-icons/bluetooth.svg b/static/bootstrap-icons-1.13.1/bluetooth.svg similarity index 100% rename from static/bootstrap-icons/bluetooth.svg rename to static/bootstrap-icons-1.13.1/bluetooth.svg diff --git a/static/bootstrap-icons/body-text.svg b/static/bootstrap-icons-1.13.1/body-text.svg similarity index 100% rename from static/bootstrap-icons/body-text.svg rename to static/bootstrap-icons-1.13.1/body-text.svg diff --git a/static/bootstrap-icons/book-fill.svg b/static/bootstrap-icons-1.13.1/book-fill.svg similarity index 100% rename from static/bootstrap-icons/book-fill.svg rename to static/bootstrap-icons-1.13.1/book-fill.svg diff --git a/static/bootstrap-icons/book-half.svg b/static/bootstrap-icons-1.13.1/book-half.svg similarity index 100% rename from static/bootstrap-icons/book-half.svg rename to static/bootstrap-icons-1.13.1/book-half.svg diff --git a/static/bootstrap-icons/book.svg b/static/bootstrap-icons-1.13.1/book.svg similarity index 100% rename from static/bootstrap-icons/book.svg rename to static/bootstrap-icons-1.13.1/book.svg diff --git a/static/bootstrap-icons/bookmark-check-fill.svg b/static/bootstrap-icons-1.13.1/bookmark-check-fill.svg similarity index 100% rename from static/bootstrap-icons/bookmark-check-fill.svg rename to static/bootstrap-icons-1.13.1/bookmark-check-fill.svg diff --git a/static/bootstrap-icons/bookmark-check.svg b/static/bootstrap-icons-1.13.1/bookmark-check.svg similarity index 100% rename from static/bootstrap-icons/bookmark-check.svg rename to static/bootstrap-icons-1.13.1/bookmark-check.svg diff --git a/static/bootstrap-icons/bookmark-dash-fill.svg b/static/bootstrap-icons-1.13.1/bookmark-dash-fill.svg similarity index 100% rename from static/bootstrap-icons/bookmark-dash-fill.svg rename to static/bootstrap-icons-1.13.1/bookmark-dash-fill.svg diff --git a/static/bootstrap-icons/bookmark-dash.svg b/static/bootstrap-icons-1.13.1/bookmark-dash.svg similarity index 100% rename from static/bootstrap-icons/bookmark-dash.svg rename to static/bootstrap-icons-1.13.1/bookmark-dash.svg diff --git a/static/bootstrap-icons/bookmark-fill.svg b/static/bootstrap-icons-1.13.1/bookmark-fill.svg similarity index 100% rename from static/bootstrap-icons/bookmark-fill.svg rename to static/bootstrap-icons-1.13.1/bookmark-fill.svg diff --git a/static/bootstrap-icons/bookmark-heart-fill.svg b/static/bootstrap-icons-1.13.1/bookmark-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/bookmark-heart-fill.svg rename to static/bootstrap-icons-1.13.1/bookmark-heart-fill.svg diff --git a/static/bootstrap-icons/bookmark-heart.svg b/static/bootstrap-icons-1.13.1/bookmark-heart.svg similarity index 100% rename from static/bootstrap-icons/bookmark-heart.svg rename to static/bootstrap-icons-1.13.1/bookmark-heart.svg diff --git a/static/bootstrap-icons/bookmark-plus-fill.svg b/static/bootstrap-icons-1.13.1/bookmark-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/bookmark-plus-fill.svg rename to static/bootstrap-icons-1.13.1/bookmark-plus-fill.svg diff --git a/static/bootstrap-icons/bookmark-plus.svg b/static/bootstrap-icons-1.13.1/bookmark-plus.svg similarity index 100% rename from static/bootstrap-icons/bookmark-plus.svg rename to static/bootstrap-icons-1.13.1/bookmark-plus.svg diff --git a/static/bootstrap-icons/bookmark-star-fill.svg b/static/bootstrap-icons-1.13.1/bookmark-star-fill.svg similarity index 100% rename from static/bootstrap-icons/bookmark-star-fill.svg rename to static/bootstrap-icons-1.13.1/bookmark-star-fill.svg diff --git a/static/bootstrap-icons/bookmark-star.svg b/static/bootstrap-icons-1.13.1/bookmark-star.svg similarity index 100% rename from static/bootstrap-icons/bookmark-star.svg rename to static/bootstrap-icons-1.13.1/bookmark-star.svg diff --git a/static/bootstrap-icons/bookmark-x-fill.svg b/static/bootstrap-icons-1.13.1/bookmark-x-fill.svg similarity index 100% rename from static/bootstrap-icons/bookmark-x-fill.svg rename to static/bootstrap-icons-1.13.1/bookmark-x-fill.svg diff --git a/static/bootstrap-icons/bookmark-x.svg b/static/bootstrap-icons-1.13.1/bookmark-x.svg similarity index 100% rename from static/bootstrap-icons/bookmark-x.svg rename to static/bootstrap-icons-1.13.1/bookmark-x.svg diff --git a/static/bootstrap-icons/bookmark.svg b/static/bootstrap-icons-1.13.1/bookmark.svg similarity index 100% rename from static/bootstrap-icons/bookmark.svg rename to static/bootstrap-icons-1.13.1/bookmark.svg diff --git a/static/bootstrap-icons/bookmarks-fill.svg b/static/bootstrap-icons-1.13.1/bookmarks-fill.svg similarity index 100% rename from static/bootstrap-icons/bookmarks-fill.svg rename to static/bootstrap-icons-1.13.1/bookmarks-fill.svg diff --git a/static/bootstrap-icons/bookmarks.svg b/static/bootstrap-icons-1.13.1/bookmarks.svg similarity index 100% rename from static/bootstrap-icons/bookmarks.svg rename to static/bootstrap-icons-1.13.1/bookmarks.svg diff --git a/static/bootstrap-icons/bookshelf.svg b/static/bootstrap-icons-1.13.1/bookshelf.svg similarity index 100% rename from static/bootstrap-icons/bookshelf.svg rename to static/bootstrap-icons-1.13.1/bookshelf.svg diff --git a/static/bootstrap-icons/boombox-fill.svg b/static/bootstrap-icons-1.13.1/boombox-fill.svg similarity index 100% rename from static/bootstrap-icons/boombox-fill.svg rename to static/bootstrap-icons-1.13.1/boombox-fill.svg diff --git a/static/bootstrap-icons/boombox.svg b/static/bootstrap-icons-1.13.1/boombox.svg similarity index 100% rename from static/bootstrap-icons/boombox.svg rename to static/bootstrap-icons-1.13.1/boombox.svg diff --git a/static/bootstrap-icons/bootstrap-fill.svg b/static/bootstrap-icons-1.13.1/bootstrap-fill.svg similarity index 100% rename from static/bootstrap-icons/bootstrap-fill.svg rename to static/bootstrap-icons-1.13.1/bootstrap-fill.svg diff --git a/static/bootstrap-icons/bootstrap-icons.css b/static/bootstrap-icons-1.13.1/bootstrap-icons.css similarity index 100% rename from static/bootstrap-icons/bootstrap-icons.css rename to static/bootstrap-icons-1.13.1/bootstrap-icons.css diff --git a/static/bootstrap-icons/bootstrap-icons.json b/static/bootstrap-icons-1.13.1/bootstrap-icons.json similarity index 100% rename from static/bootstrap-icons/bootstrap-icons.json rename to static/bootstrap-icons-1.13.1/bootstrap-icons.json diff --git a/static/bootstrap-icons/bootstrap-icons.min.css b/static/bootstrap-icons-1.13.1/bootstrap-icons.min.css similarity index 100% rename from static/bootstrap-icons/bootstrap-icons.min.css rename to static/bootstrap-icons-1.13.1/bootstrap-icons.min.css diff --git a/static/bootstrap-icons/bootstrap-icons.scss b/static/bootstrap-icons-1.13.1/bootstrap-icons.scss similarity index 100% rename from static/bootstrap-icons/bootstrap-icons.scss rename to static/bootstrap-icons-1.13.1/bootstrap-icons.scss diff --git a/static/bootstrap-icons/bootstrap-icons.svg b/static/bootstrap-icons-1.13.1/bootstrap-icons.svg similarity index 100% rename from static/bootstrap-icons/bootstrap-icons.svg rename to static/bootstrap-icons-1.13.1/bootstrap-icons.svg diff --git a/static/bootstrap-icons/bootstrap-reboot.svg b/static/bootstrap-icons-1.13.1/bootstrap-reboot.svg similarity index 100% rename from static/bootstrap-icons/bootstrap-reboot.svg rename to static/bootstrap-icons-1.13.1/bootstrap-reboot.svg diff --git a/static/bootstrap-icons/bootstrap.svg b/static/bootstrap-icons-1.13.1/bootstrap.svg similarity index 100% rename from static/bootstrap-icons/bootstrap.svg rename to static/bootstrap-icons-1.13.1/bootstrap.svg diff --git a/static/bootstrap-icons/border-all.svg b/static/bootstrap-icons-1.13.1/border-all.svg similarity index 100% rename from static/bootstrap-icons/border-all.svg rename to static/bootstrap-icons-1.13.1/border-all.svg diff --git a/static/bootstrap-icons/border-bottom.svg b/static/bootstrap-icons-1.13.1/border-bottom.svg similarity index 100% rename from static/bootstrap-icons/border-bottom.svg rename to static/bootstrap-icons-1.13.1/border-bottom.svg diff --git a/static/bootstrap-icons/border-center.svg b/static/bootstrap-icons-1.13.1/border-center.svg similarity index 100% rename from static/bootstrap-icons/border-center.svg rename to static/bootstrap-icons-1.13.1/border-center.svg diff --git a/static/bootstrap-icons/border-inner.svg b/static/bootstrap-icons-1.13.1/border-inner.svg similarity index 100% rename from static/bootstrap-icons/border-inner.svg rename to static/bootstrap-icons-1.13.1/border-inner.svg diff --git a/static/bootstrap-icons/border-left.svg b/static/bootstrap-icons-1.13.1/border-left.svg similarity index 100% rename from static/bootstrap-icons/border-left.svg rename to static/bootstrap-icons-1.13.1/border-left.svg diff --git a/static/bootstrap-icons/border-middle.svg b/static/bootstrap-icons-1.13.1/border-middle.svg similarity index 100% rename from static/bootstrap-icons/border-middle.svg rename to static/bootstrap-icons-1.13.1/border-middle.svg diff --git a/static/bootstrap-icons/border-outer.svg b/static/bootstrap-icons-1.13.1/border-outer.svg similarity index 100% rename from static/bootstrap-icons/border-outer.svg rename to static/bootstrap-icons-1.13.1/border-outer.svg diff --git a/static/bootstrap-icons/border-right.svg b/static/bootstrap-icons-1.13.1/border-right.svg similarity index 100% rename from static/bootstrap-icons/border-right.svg rename to static/bootstrap-icons-1.13.1/border-right.svg diff --git a/static/bootstrap-icons/border-style.svg b/static/bootstrap-icons-1.13.1/border-style.svg similarity index 100% rename from static/bootstrap-icons/border-style.svg rename to static/bootstrap-icons-1.13.1/border-style.svg diff --git a/static/bootstrap-icons/border-top.svg b/static/bootstrap-icons-1.13.1/border-top.svg similarity index 100% rename from static/bootstrap-icons/border-top.svg rename to static/bootstrap-icons-1.13.1/border-top.svg diff --git a/static/bootstrap-icons/border-width.svg b/static/bootstrap-icons-1.13.1/border-width.svg similarity index 100% rename from static/bootstrap-icons/border-width.svg rename to static/bootstrap-icons-1.13.1/border-width.svg diff --git a/static/bootstrap-icons/border.svg b/static/bootstrap-icons-1.13.1/border.svg similarity index 100% rename from static/bootstrap-icons/border.svg rename to static/bootstrap-icons-1.13.1/border.svg diff --git a/static/bootstrap-icons/bounding-box-circles.svg b/static/bootstrap-icons-1.13.1/bounding-box-circles.svg similarity index 100% rename from static/bootstrap-icons/bounding-box-circles.svg rename to static/bootstrap-icons-1.13.1/bounding-box-circles.svg diff --git a/static/bootstrap-icons/bounding-box.svg b/static/bootstrap-icons-1.13.1/bounding-box.svg similarity index 100% rename from static/bootstrap-icons/bounding-box.svg rename to static/bootstrap-icons-1.13.1/bounding-box.svg diff --git a/static/bootstrap-icons/box-arrow-down-left.svg b/static/bootstrap-icons-1.13.1/box-arrow-down-left.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-down-left.svg rename to static/bootstrap-icons-1.13.1/box-arrow-down-left.svg diff --git a/static/bootstrap-icons/box-arrow-down-right.svg b/static/bootstrap-icons-1.13.1/box-arrow-down-right.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-down-right.svg rename to static/bootstrap-icons-1.13.1/box-arrow-down-right.svg diff --git a/static/bootstrap-icons/box-arrow-down.svg b/static/bootstrap-icons-1.13.1/box-arrow-down.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-down.svg rename to static/bootstrap-icons-1.13.1/box-arrow-down.svg diff --git a/static/bootstrap-icons/box-arrow-in-down-left.svg b/static/bootstrap-icons-1.13.1/box-arrow-in-down-left.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-in-down-left.svg rename to static/bootstrap-icons-1.13.1/box-arrow-in-down-left.svg diff --git a/static/bootstrap-icons/box-arrow-in-down-right.svg b/static/bootstrap-icons-1.13.1/box-arrow-in-down-right.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-in-down-right.svg rename to static/bootstrap-icons-1.13.1/box-arrow-in-down-right.svg diff --git a/static/bootstrap-icons/box-arrow-in-down.svg b/static/bootstrap-icons-1.13.1/box-arrow-in-down.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-in-down.svg rename to static/bootstrap-icons-1.13.1/box-arrow-in-down.svg diff --git a/static/bootstrap-icons/box-arrow-in-left.svg b/static/bootstrap-icons-1.13.1/box-arrow-in-left.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-in-left.svg rename to static/bootstrap-icons-1.13.1/box-arrow-in-left.svg diff --git a/static/bootstrap-icons/box-arrow-in-right.svg b/static/bootstrap-icons-1.13.1/box-arrow-in-right.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-in-right.svg rename to static/bootstrap-icons-1.13.1/box-arrow-in-right.svg diff --git a/static/bootstrap-icons/box-arrow-in-up-left.svg b/static/bootstrap-icons-1.13.1/box-arrow-in-up-left.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-in-up-left.svg rename to static/bootstrap-icons-1.13.1/box-arrow-in-up-left.svg diff --git a/static/bootstrap-icons/box-arrow-in-up-right.svg b/static/bootstrap-icons-1.13.1/box-arrow-in-up-right.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-in-up-right.svg rename to static/bootstrap-icons-1.13.1/box-arrow-in-up-right.svg diff --git a/static/bootstrap-icons/box-arrow-in-up.svg b/static/bootstrap-icons-1.13.1/box-arrow-in-up.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-in-up.svg rename to static/bootstrap-icons-1.13.1/box-arrow-in-up.svg diff --git a/static/bootstrap-icons/box-arrow-left.svg b/static/bootstrap-icons-1.13.1/box-arrow-left.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-left.svg rename to static/bootstrap-icons-1.13.1/box-arrow-left.svg diff --git a/static/bootstrap-icons/box-arrow-right.svg b/static/bootstrap-icons-1.13.1/box-arrow-right.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-right.svg rename to static/bootstrap-icons-1.13.1/box-arrow-right.svg diff --git a/static/bootstrap-icons/box-arrow-up-left.svg b/static/bootstrap-icons-1.13.1/box-arrow-up-left.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-up-left.svg rename to static/bootstrap-icons-1.13.1/box-arrow-up-left.svg diff --git a/static/bootstrap-icons/box-arrow-up-right.svg b/static/bootstrap-icons-1.13.1/box-arrow-up-right.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-up-right.svg rename to static/bootstrap-icons-1.13.1/box-arrow-up-right.svg diff --git a/static/bootstrap-icons/box-arrow-up.svg b/static/bootstrap-icons-1.13.1/box-arrow-up.svg similarity index 100% rename from static/bootstrap-icons/box-arrow-up.svg rename to static/bootstrap-icons-1.13.1/box-arrow-up.svg diff --git a/static/bootstrap-icons/box-fill.svg b/static/bootstrap-icons-1.13.1/box-fill.svg similarity index 100% rename from static/bootstrap-icons/box-fill.svg rename to static/bootstrap-icons-1.13.1/box-fill.svg diff --git a/static/bootstrap-icons/box-seam-fill.svg b/static/bootstrap-icons-1.13.1/box-seam-fill.svg similarity index 100% rename from static/bootstrap-icons/box-seam-fill.svg rename to static/bootstrap-icons-1.13.1/box-seam-fill.svg diff --git a/static/bootstrap-icons/box-seam.svg b/static/bootstrap-icons-1.13.1/box-seam.svg similarity index 100% rename from static/bootstrap-icons/box-seam.svg rename to static/bootstrap-icons-1.13.1/box-seam.svg diff --git a/static/bootstrap-icons/box.svg b/static/bootstrap-icons-1.13.1/box.svg similarity index 100% rename from static/bootstrap-icons/box.svg rename to static/bootstrap-icons-1.13.1/box.svg diff --git a/static/bootstrap-icons/box2-fill.svg b/static/bootstrap-icons-1.13.1/box2-fill.svg similarity index 100% rename from static/bootstrap-icons/box2-fill.svg rename to static/bootstrap-icons-1.13.1/box2-fill.svg diff --git a/static/bootstrap-icons/box2-heart-fill.svg b/static/bootstrap-icons-1.13.1/box2-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/box2-heart-fill.svg rename to static/bootstrap-icons-1.13.1/box2-heart-fill.svg diff --git a/static/bootstrap-icons/box2-heart.svg b/static/bootstrap-icons-1.13.1/box2-heart.svg similarity index 100% rename from static/bootstrap-icons/box2-heart.svg rename to static/bootstrap-icons-1.13.1/box2-heart.svg diff --git a/static/bootstrap-icons/box2.svg b/static/bootstrap-icons-1.13.1/box2.svg similarity index 100% rename from static/bootstrap-icons/box2.svg rename to static/bootstrap-icons-1.13.1/box2.svg diff --git a/static/bootstrap-icons/boxes.svg b/static/bootstrap-icons-1.13.1/boxes.svg similarity index 100% rename from static/bootstrap-icons/boxes.svg rename to static/bootstrap-icons-1.13.1/boxes.svg diff --git a/static/bootstrap-icons/braces-asterisk.svg b/static/bootstrap-icons-1.13.1/braces-asterisk.svg similarity index 100% rename from static/bootstrap-icons/braces-asterisk.svg rename to static/bootstrap-icons-1.13.1/braces-asterisk.svg diff --git a/static/bootstrap-icons/braces.svg b/static/bootstrap-icons-1.13.1/braces.svg similarity index 100% rename from static/bootstrap-icons/braces.svg rename to static/bootstrap-icons-1.13.1/braces.svg diff --git a/static/bootstrap-icons/bricks.svg b/static/bootstrap-icons-1.13.1/bricks.svg similarity index 100% rename from static/bootstrap-icons/bricks.svg rename to static/bootstrap-icons-1.13.1/bricks.svg diff --git a/static/bootstrap-icons/briefcase-fill.svg b/static/bootstrap-icons-1.13.1/briefcase-fill.svg similarity index 100% rename from static/bootstrap-icons/briefcase-fill.svg rename to static/bootstrap-icons-1.13.1/briefcase-fill.svg diff --git a/static/bootstrap-icons/briefcase.svg b/static/bootstrap-icons-1.13.1/briefcase.svg similarity index 100% rename from static/bootstrap-icons/briefcase.svg rename to static/bootstrap-icons-1.13.1/briefcase.svg diff --git a/static/bootstrap-icons/brightness-alt-high-fill.svg b/static/bootstrap-icons-1.13.1/brightness-alt-high-fill.svg similarity index 100% rename from static/bootstrap-icons/brightness-alt-high-fill.svg rename to static/bootstrap-icons-1.13.1/brightness-alt-high-fill.svg diff --git a/static/bootstrap-icons/brightness-alt-high.svg b/static/bootstrap-icons-1.13.1/brightness-alt-high.svg similarity index 100% rename from static/bootstrap-icons/brightness-alt-high.svg rename to static/bootstrap-icons-1.13.1/brightness-alt-high.svg diff --git a/static/bootstrap-icons/brightness-alt-low-fill.svg b/static/bootstrap-icons-1.13.1/brightness-alt-low-fill.svg similarity index 100% rename from static/bootstrap-icons/brightness-alt-low-fill.svg rename to static/bootstrap-icons-1.13.1/brightness-alt-low-fill.svg diff --git a/static/bootstrap-icons/brightness-alt-low.svg b/static/bootstrap-icons-1.13.1/brightness-alt-low.svg similarity index 100% rename from static/bootstrap-icons/brightness-alt-low.svg rename to static/bootstrap-icons-1.13.1/brightness-alt-low.svg diff --git a/static/bootstrap-icons/brightness-high-fill.svg b/static/bootstrap-icons-1.13.1/brightness-high-fill.svg similarity index 100% rename from static/bootstrap-icons/brightness-high-fill.svg rename to static/bootstrap-icons-1.13.1/brightness-high-fill.svg diff --git a/static/bootstrap-icons/brightness-high.svg b/static/bootstrap-icons-1.13.1/brightness-high.svg similarity index 100% rename from static/bootstrap-icons/brightness-high.svg rename to static/bootstrap-icons-1.13.1/brightness-high.svg diff --git a/static/bootstrap-icons/brightness-low-fill.svg b/static/bootstrap-icons-1.13.1/brightness-low-fill.svg similarity index 100% rename from static/bootstrap-icons/brightness-low-fill.svg rename to static/bootstrap-icons-1.13.1/brightness-low-fill.svg diff --git a/static/bootstrap-icons/brightness-low.svg b/static/bootstrap-icons-1.13.1/brightness-low.svg similarity index 100% rename from static/bootstrap-icons/brightness-low.svg rename to static/bootstrap-icons-1.13.1/brightness-low.svg diff --git a/static/bootstrap-icons/brilliance.svg b/static/bootstrap-icons-1.13.1/brilliance.svg similarity index 100% rename from static/bootstrap-icons/brilliance.svg rename to static/bootstrap-icons-1.13.1/brilliance.svg diff --git a/static/bootstrap-icons/broadcast-pin.svg b/static/bootstrap-icons-1.13.1/broadcast-pin.svg similarity index 100% rename from static/bootstrap-icons/broadcast-pin.svg rename to static/bootstrap-icons-1.13.1/broadcast-pin.svg diff --git a/static/bootstrap-icons/broadcast.svg b/static/bootstrap-icons-1.13.1/broadcast.svg similarity index 100% rename from static/bootstrap-icons/broadcast.svg rename to static/bootstrap-icons-1.13.1/broadcast.svg diff --git a/static/bootstrap-icons/browser-chrome.svg b/static/bootstrap-icons-1.13.1/browser-chrome.svg similarity index 100% rename from static/bootstrap-icons/browser-chrome.svg rename to static/bootstrap-icons-1.13.1/browser-chrome.svg diff --git a/static/bootstrap-icons/browser-edge.svg b/static/bootstrap-icons-1.13.1/browser-edge.svg similarity index 100% rename from static/bootstrap-icons/browser-edge.svg rename to static/bootstrap-icons-1.13.1/browser-edge.svg diff --git a/static/bootstrap-icons/browser-firefox.svg b/static/bootstrap-icons-1.13.1/browser-firefox.svg similarity index 100% rename from static/bootstrap-icons/browser-firefox.svg rename to static/bootstrap-icons-1.13.1/browser-firefox.svg diff --git a/static/bootstrap-icons/browser-safari.svg b/static/bootstrap-icons-1.13.1/browser-safari.svg similarity index 100% rename from static/bootstrap-icons/browser-safari.svg rename to static/bootstrap-icons-1.13.1/browser-safari.svg diff --git a/static/bootstrap-icons/brush-fill.svg b/static/bootstrap-icons-1.13.1/brush-fill.svg similarity index 100% rename from static/bootstrap-icons/brush-fill.svg rename to static/bootstrap-icons-1.13.1/brush-fill.svg diff --git a/static/bootstrap-icons/brush.svg b/static/bootstrap-icons-1.13.1/brush.svg similarity index 100% rename from static/bootstrap-icons/brush.svg rename to static/bootstrap-icons-1.13.1/brush.svg diff --git a/static/bootstrap-icons/bucket-fill.svg b/static/bootstrap-icons-1.13.1/bucket-fill.svg similarity index 100% rename from static/bootstrap-icons/bucket-fill.svg rename to static/bootstrap-icons-1.13.1/bucket-fill.svg diff --git a/static/bootstrap-icons/bucket.svg b/static/bootstrap-icons-1.13.1/bucket.svg similarity index 100% rename from static/bootstrap-icons/bucket.svg rename to static/bootstrap-icons-1.13.1/bucket.svg diff --git a/static/bootstrap-icons/bug-fill.svg b/static/bootstrap-icons-1.13.1/bug-fill.svg similarity index 100% rename from static/bootstrap-icons/bug-fill.svg rename to static/bootstrap-icons-1.13.1/bug-fill.svg diff --git a/static/bootstrap-icons/bug.svg b/static/bootstrap-icons-1.13.1/bug.svg similarity index 100% rename from static/bootstrap-icons/bug.svg rename to static/bootstrap-icons-1.13.1/bug.svg diff --git a/static/bootstrap-icons/building-add.svg b/static/bootstrap-icons-1.13.1/building-add.svg similarity index 100% rename from static/bootstrap-icons/building-add.svg rename to static/bootstrap-icons-1.13.1/building-add.svg diff --git a/static/bootstrap-icons/building-check.svg b/static/bootstrap-icons-1.13.1/building-check.svg similarity index 100% rename from static/bootstrap-icons/building-check.svg rename to static/bootstrap-icons-1.13.1/building-check.svg diff --git a/static/bootstrap-icons/building-dash.svg b/static/bootstrap-icons-1.13.1/building-dash.svg similarity index 100% rename from static/bootstrap-icons/building-dash.svg rename to static/bootstrap-icons-1.13.1/building-dash.svg diff --git a/static/bootstrap-icons/building-down.svg b/static/bootstrap-icons-1.13.1/building-down.svg similarity index 100% rename from static/bootstrap-icons/building-down.svg rename to static/bootstrap-icons-1.13.1/building-down.svg diff --git a/static/bootstrap-icons/building-exclamation.svg b/static/bootstrap-icons-1.13.1/building-exclamation.svg similarity index 100% rename from static/bootstrap-icons/building-exclamation.svg rename to static/bootstrap-icons-1.13.1/building-exclamation.svg diff --git a/static/bootstrap-icons/building-fill-add.svg b/static/bootstrap-icons-1.13.1/building-fill-add.svg similarity index 100% rename from static/bootstrap-icons/building-fill-add.svg rename to static/bootstrap-icons-1.13.1/building-fill-add.svg diff --git a/static/bootstrap-icons/building-fill-check.svg b/static/bootstrap-icons-1.13.1/building-fill-check.svg similarity index 100% rename from static/bootstrap-icons/building-fill-check.svg rename to static/bootstrap-icons-1.13.1/building-fill-check.svg diff --git a/static/bootstrap-icons/building-fill-dash.svg b/static/bootstrap-icons-1.13.1/building-fill-dash.svg similarity index 100% rename from static/bootstrap-icons/building-fill-dash.svg rename to static/bootstrap-icons-1.13.1/building-fill-dash.svg diff --git a/static/bootstrap-icons/building-fill-down.svg b/static/bootstrap-icons-1.13.1/building-fill-down.svg similarity index 100% rename from static/bootstrap-icons/building-fill-down.svg rename to static/bootstrap-icons-1.13.1/building-fill-down.svg diff --git a/static/bootstrap-icons/building-fill-exclamation.svg b/static/bootstrap-icons-1.13.1/building-fill-exclamation.svg similarity index 100% rename from static/bootstrap-icons/building-fill-exclamation.svg rename to static/bootstrap-icons-1.13.1/building-fill-exclamation.svg diff --git a/static/bootstrap-icons/building-fill-gear.svg b/static/bootstrap-icons-1.13.1/building-fill-gear.svg similarity index 100% rename from static/bootstrap-icons/building-fill-gear.svg rename to static/bootstrap-icons-1.13.1/building-fill-gear.svg diff --git a/static/bootstrap-icons/building-fill-lock.svg b/static/bootstrap-icons-1.13.1/building-fill-lock.svg similarity index 100% rename from static/bootstrap-icons/building-fill-lock.svg rename to static/bootstrap-icons-1.13.1/building-fill-lock.svg diff --git a/static/bootstrap-icons/building-fill-slash.svg b/static/bootstrap-icons-1.13.1/building-fill-slash.svg similarity index 100% rename from static/bootstrap-icons/building-fill-slash.svg rename to static/bootstrap-icons-1.13.1/building-fill-slash.svg diff --git a/static/bootstrap-icons/building-fill-up.svg b/static/bootstrap-icons-1.13.1/building-fill-up.svg similarity index 100% rename from static/bootstrap-icons/building-fill-up.svg rename to static/bootstrap-icons-1.13.1/building-fill-up.svg diff --git a/static/bootstrap-icons/building-fill-x.svg b/static/bootstrap-icons-1.13.1/building-fill-x.svg similarity index 100% rename from static/bootstrap-icons/building-fill-x.svg rename to static/bootstrap-icons-1.13.1/building-fill-x.svg diff --git a/static/bootstrap-icons/building-fill.svg b/static/bootstrap-icons-1.13.1/building-fill.svg similarity index 100% rename from static/bootstrap-icons/building-fill.svg rename to static/bootstrap-icons-1.13.1/building-fill.svg diff --git a/static/bootstrap-icons/building-gear.svg b/static/bootstrap-icons-1.13.1/building-gear.svg similarity index 100% rename from static/bootstrap-icons/building-gear.svg rename to static/bootstrap-icons-1.13.1/building-gear.svg diff --git a/static/bootstrap-icons/building-lock.svg b/static/bootstrap-icons-1.13.1/building-lock.svg similarity index 100% rename from static/bootstrap-icons/building-lock.svg rename to static/bootstrap-icons-1.13.1/building-lock.svg diff --git a/static/bootstrap-icons/building-slash.svg b/static/bootstrap-icons-1.13.1/building-slash.svg similarity index 100% rename from static/bootstrap-icons/building-slash.svg rename to static/bootstrap-icons-1.13.1/building-slash.svg diff --git a/static/bootstrap-icons/building-up.svg b/static/bootstrap-icons-1.13.1/building-up.svg similarity index 100% rename from static/bootstrap-icons/building-up.svg rename to static/bootstrap-icons-1.13.1/building-up.svg diff --git a/static/bootstrap-icons/building-x.svg b/static/bootstrap-icons-1.13.1/building-x.svg similarity index 100% rename from static/bootstrap-icons/building-x.svg rename to static/bootstrap-icons-1.13.1/building-x.svg diff --git a/static/bootstrap-icons/building.svg b/static/bootstrap-icons-1.13.1/building.svg similarity index 100% rename from static/bootstrap-icons/building.svg rename to static/bootstrap-icons-1.13.1/building.svg diff --git a/static/bootstrap-icons/buildings-fill.svg b/static/bootstrap-icons-1.13.1/buildings-fill.svg similarity index 100% rename from static/bootstrap-icons/buildings-fill.svg rename to static/bootstrap-icons-1.13.1/buildings-fill.svg diff --git a/static/bootstrap-icons/buildings.svg b/static/bootstrap-icons-1.13.1/buildings.svg similarity index 100% rename from static/bootstrap-icons/buildings.svg rename to static/bootstrap-icons-1.13.1/buildings.svg diff --git a/static/bootstrap-icons/bullseye.svg b/static/bootstrap-icons-1.13.1/bullseye.svg similarity index 100% rename from static/bootstrap-icons/bullseye.svg rename to static/bootstrap-icons-1.13.1/bullseye.svg diff --git a/static/bootstrap-icons/bus-front-fill.svg b/static/bootstrap-icons-1.13.1/bus-front-fill.svg similarity index 100% rename from static/bootstrap-icons/bus-front-fill.svg rename to static/bootstrap-icons-1.13.1/bus-front-fill.svg diff --git a/static/bootstrap-icons/bus-front.svg b/static/bootstrap-icons-1.13.1/bus-front.svg similarity index 100% rename from static/bootstrap-icons/bus-front.svg rename to static/bootstrap-icons-1.13.1/bus-front.svg diff --git a/static/bootstrap-icons/c-circle-fill.svg b/static/bootstrap-icons-1.13.1/c-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/c-circle-fill.svg rename to static/bootstrap-icons-1.13.1/c-circle-fill.svg diff --git a/static/bootstrap-icons/c-circle.svg b/static/bootstrap-icons-1.13.1/c-circle.svg similarity index 100% rename from static/bootstrap-icons/c-circle.svg rename to static/bootstrap-icons-1.13.1/c-circle.svg diff --git a/static/bootstrap-icons/c-square-fill.svg b/static/bootstrap-icons-1.13.1/c-square-fill.svg similarity index 100% rename from static/bootstrap-icons/c-square-fill.svg rename to static/bootstrap-icons-1.13.1/c-square-fill.svg diff --git a/static/bootstrap-icons/c-square.svg b/static/bootstrap-icons-1.13.1/c-square.svg similarity index 100% rename from static/bootstrap-icons/c-square.svg rename to static/bootstrap-icons-1.13.1/c-square.svg diff --git a/static/bootstrap-icons/cake-fill.svg b/static/bootstrap-icons-1.13.1/cake-fill.svg similarity index 100% rename from static/bootstrap-icons/cake-fill.svg rename to static/bootstrap-icons-1.13.1/cake-fill.svg diff --git a/static/bootstrap-icons/cake.svg b/static/bootstrap-icons-1.13.1/cake.svg similarity index 100% rename from static/bootstrap-icons/cake.svg rename to static/bootstrap-icons-1.13.1/cake.svg diff --git a/static/bootstrap-icons/cake2-fill.svg b/static/bootstrap-icons-1.13.1/cake2-fill.svg similarity index 100% rename from static/bootstrap-icons/cake2-fill.svg rename to static/bootstrap-icons-1.13.1/cake2-fill.svg diff --git a/static/bootstrap-icons/cake2.svg b/static/bootstrap-icons-1.13.1/cake2.svg similarity index 100% rename from static/bootstrap-icons/cake2.svg rename to static/bootstrap-icons-1.13.1/cake2.svg diff --git a/static/bootstrap-icons/calculator-fill.svg b/static/bootstrap-icons-1.13.1/calculator-fill.svg similarity index 100% rename from static/bootstrap-icons/calculator-fill.svg rename to static/bootstrap-icons-1.13.1/calculator-fill.svg diff --git a/static/bootstrap-icons/calculator.svg b/static/bootstrap-icons-1.13.1/calculator.svg similarity index 100% rename from static/bootstrap-icons/calculator.svg rename to static/bootstrap-icons-1.13.1/calculator.svg diff --git a/static/bootstrap-icons/calendar-check-fill.svg b/static/bootstrap-icons-1.13.1/calendar-check-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-check-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-check-fill.svg diff --git a/static/bootstrap-icons/calendar-check.svg b/static/bootstrap-icons-1.13.1/calendar-check.svg similarity index 100% rename from static/bootstrap-icons/calendar-check.svg rename to static/bootstrap-icons-1.13.1/calendar-check.svg diff --git a/static/bootstrap-icons/calendar-date-fill.svg b/static/bootstrap-icons-1.13.1/calendar-date-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-date-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-date-fill.svg diff --git a/static/bootstrap-icons/calendar-date.svg b/static/bootstrap-icons-1.13.1/calendar-date.svg similarity index 100% rename from static/bootstrap-icons/calendar-date.svg rename to static/bootstrap-icons-1.13.1/calendar-date.svg diff --git a/static/bootstrap-icons/calendar-day-fill.svg b/static/bootstrap-icons-1.13.1/calendar-day-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-day-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-day-fill.svg diff --git a/static/bootstrap-icons/calendar-day.svg b/static/bootstrap-icons-1.13.1/calendar-day.svg similarity index 100% rename from static/bootstrap-icons/calendar-day.svg rename to static/bootstrap-icons-1.13.1/calendar-day.svg diff --git a/static/bootstrap-icons/calendar-event-fill.svg b/static/bootstrap-icons-1.13.1/calendar-event-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-event-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-event-fill.svg diff --git a/static/bootstrap-icons/calendar-event.svg b/static/bootstrap-icons-1.13.1/calendar-event.svg similarity index 100% rename from static/bootstrap-icons/calendar-event.svg rename to static/bootstrap-icons-1.13.1/calendar-event.svg diff --git a/static/bootstrap-icons/calendar-fill.svg b/static/bootstrap-icons-1.13.1/calendar-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-fill.svg diff --git a/static/bootstrap-icons/calendar-heart-fill.svg b/static/bootstrap-icons-1.13.1/calendar-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-heart-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-heart-fill.svg diff --git a/static/bootstrap-icons/calendar-heart.svg b/static/bootstrap-icons-1.13.1/calendar-heart.svg similarity index 100% rename from static/bootstrap-icons/calendar-heart.svg rename to static/bootstrap-icons-1.13.1/calendar-heart.svg diff --git a/static/bootstrap-icons/calendar-minus-fill.svg b/static/bootstrap-icons-1.13.1/calendar-minus-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-minus-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-minus-fill.svg diff --git a/static/bootstrap-icons/calendar-minus.svg b/static/bootstrap-icons-1.13.1/calendar-minus.svg similarity index 100% rename from static/bootstrap-icons/calendar-minus.svg rename to static/bootstrap-icons-1.13.1/calendar-minus.svg diff --git a/static/bootstrap-icons/calendar-month-fill.svg b/static/bootstrap-icons-1.13.1/calendar-month-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-month-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-month-fill.svg diff --git a/static/bootstrap-icons/calendar-month.svg b/static/bootstrap-icons-1.13.1/calendar-month.svg similarity index 100% rename from static/bootstrap-icons/calendar-month.svg rename to static/bootstrap-icons-1.13.1/calendar-month.svg diff --git a/static/bootstrap-icons/calendar-plus-fill.svg b/static/bootstrap-icons-1.13.1/calendar-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-plus-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-plus-fill.svg diff --git a/static/bootstrap-icons/calendar-plus.svg b/static/bootstrap-icons-1.13.1/calendar-plus.svg similarity index 100% rename from static/bootstrap-icons/calendar-plus.svg rename to static/bootstrap-icons-1.13.1/calendar-plus.svg diff --git a/static/bootstrap-icons/calendar-range-fill.svg b/static/bootstrap-icons-1.13.1/calendar-range-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-range-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-range-fill.svg diff --git a/static/bootstrap-icons/calendar-range.svg b/static/bootstrap-icons-1.13.1/calendar-range.svg similarity index 100% rename from static/bootstrap-icons/calendar-range.svg rename to static/bootstrap-icons-1.13.1/calendar-range.svg diff --git a/static/bootstrap-icons/calendar-week-fill.svg b/static/bootstrap-icons-1.13.1/calendar-week-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-week-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-week-fill.svg diff --git a/static/bootstrap-icons/calendar-week.svg b/static/bootstrap-icons-1.13.1/calendar-week.svg similarity index 100% rename from static/bootstrap-icons/calendar-week.svg rename to static/bootstrap-icons-1.13.1/calendar-week.svg diff --git a/static/bootstrap-icons/calendar-x-fill.svg b/static/bootstrap-icons-1.13.1/calendar-x-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar-x-fill.svg rename to static/bootstrap-icons-1.13.1/calendar-x-fill.svg diff --git a/static/bootstrap-icons/calendar-x.svg b/static/bootstrap-icons-1.13.1/calendar-x.svg similarity index 100% rename from static/bootstrap-icons/calendar-x.svg rename to static/bootstrap-icons-1.13.1/calendar-x.svg diff --git a/static/bootstrap-icons/calendar.svg b/static/bootstrap-icons-1.13.1/calendar.svg similarity index 100% rename from static/bootstrap-icons/calendar.svg rename to static/bootstrap-icons-1.13.1/calendar.svg diff --git a/static/bootstrap-icons/calendar2-check-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-check-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-check-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-check-fill.svg diff --git a/static/bootstrap-icons/calendar2-check.svg b/static/bootstrap-icons-1.13.1/calendar2-check.svg similarity index 100% rename from static/bootstrap-icons/calendar2-check.svg rename to static/bootstrap-icons-1.13.1/calendar2-check.svg diff --git a/static/bootstrap-icons/calendar2-date-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-date-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-date-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-date-fill.svg diff --git a/static/bootstrap-icons/calendar2-date.svg b/static/bootstrap-icons-1.13.1/calendar2-date.svg similarity index 100% rename from static/bootstrap-icons/calendar2-date.svg rename to static/bootstrap-icons-1.13.1/calendar2-date.svg diff --git a/static/bootstrap-icons/calendar2-day-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-day-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-day-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-day-fill.svg diff --git a/static/bootstrap-icons/calendar2-day.svg b/static/bootstrap-icons-1.13.1/calendar2-day.svg similarity index 100% rename from static/bootstrap-icons/calendar2-day.svg rename to static/bootstrap-icons-1.13.1/calendar2-day.svg diff --git a/static/bootstrap-icons/calendar2-event-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-event-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-event-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-event-fill.svg diff --git a/static/bootstrap-icons/calendar2-event.svg b/static/bootstrap-icons-1.13.1/calendar2-event.svg similarity index 100% rename from static/bootstrap-icons/calendar2-event.svg rename to static/bootstrap-icons-1.13.1/calendar2-event.svg diff --git a/static/bootstrap-icons/calendar2-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-fill.svg diff --git a/static/bootstrap-icons/calendar2-heart-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-heart-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-heart-fill.svg diff --git a/static/bootstrap-icons/calendar2-heart.svg b/static/bootstrap-icons-1.13.1/calendar2-heart.svg similarity index 100% rename from static/bootstrap-icons/calendar2-heart.svg rename to static/bootstrap-icons-1.13.1/calendar2-heart.svg diff --git a/static/bootstrap-icons/calendar2-minus-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-minus-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-minus-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-minus-fill.svg diff --git a/static/bootstrap-icons/calendar2-minus.svg b/static/bootstrap-icons-1.13.1/calendar2-minus.svg similarity index 100% rename from static/bootstrap-icons/calendar2-minus.svg rename to static/bootstrap-icons-1.13.1/calendar2-minus.svg diff --git a/static/bootstrap-icons/calendar2-month-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-month-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-month-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-month-fill.svg diff --git a/static/bootstrap-icons/calendar2-month.svg b/static/bootstrap-icons-1.13.1/calendar2-month.svg similarity index 100% rename from static/bootstrap-icons/calendar2-month.svg rename to static/bootstrap-icons-1.13.1/calendar2-month.svg diff --git a/static/bootstrap-icons/calendar2-plus-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-plus-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-plus-fill.svg diff --git a/static/bootstrap-icons/calendar2-plus.svg b/static/bootstrap-icons-1.13.1/calendar2-plus.svg similarity index 100% rename from static/bootstrap-icons/calendar2-plus.svg rename to static/bootstrap-icons-1.13.1/calendar2-plus.svg diff --git a/static/bootstrap-icons/calendar2-range-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-range-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-range-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-range-fill.svg diff --git a/static/bootstrap-icons/calendar2-range.svg b/static/bootstrap-icons-1.13.1/calendar2-range.svg similarity index 100% rename from static/bootstrap-icons/calendar2-range.svg rename to static/bootstrap-icons-1.13.1/calendar2-range.svg diff --git a/static/bootstrap-icons/calendar2-week-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-week-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-week-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-week-fill.svg diff --git a/static/bootstrap-icons/calendar2-week.svg b/static/bootstrap-icons-1.13.1/calendar2-week.svg similarity index 100% rename from static/bootstrap-icons/calendar2-week.svg rename to static/bootstrap-icons-1.13.1/calendar2-week.svg diff --git a/static/bootstrap-icons/calendar2-x-fill.svg b/static/bootstrap-icons-1.13.1/calendar2-x-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar2-x-fill.svg rename to static/bootstrap-icons-1.13.1/calendar2-x-fill.svg diff --git a/static/bootstrap-icons/calendar2-x.svg b/static/bootstrap-icons-1.13.1/calendar2-x.svg similarity index 100% rename from static/bootstrap-icons/calendar2-x.svg rename to static/bootstrap-icons-1.13.1/calendar2-x.svg diff --git a/static/bootstrap-icons/calendar2.svg b/static/bootstrap-icons-1.13.1/calendar2.svg similarity index 100% rename from static/bootstrap-icons/calendar2.svg rename to static/bootstrap-icons-1.13.1/calendar2.svg diff --git a/static/bootstrap-icons/calendar3-event-fill.svg b/static/bootstrap-icons-1.13.1/calendar3-event-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar3-event-fill.svg rename to static/bootstrap-icons-1.13.1/calendar3-event-fill.svg diff --git a/static/bootstrap-icons/calendar3-event.svg b/static/bootstrap-icons-1.13.1/calendar3-event.svg similarity index 100% rename from static/bootstrap-icons/calendar3-event.svg rename to static/bootstrap-icons-1.13.1/calendar3-event.svg diff --git a/static/bootstrap-icons/calendar3-fill.svg b/static/bootstrap-icons-1.13.1/calendar3-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar3-fill.svg rename to static/bootstrap-icons-1.13.1/calendar3-fill.svg diff --git a/static/bootstrap-icons/calendar3-range-fill.svg b/static/bootstrap-icons-1.13.1/calendar3-range-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar3-range-fill.svg rename to static/bootstrap-icons-1.13.1/calendar3-range-fill.svg diff --git a/static/bootstrap-icons/calendar3-range.svg b/static/bootstrap-icons-1.13.1/calendar3-range.svg similarity index 100% rename from static/bootstrap-icons/calendar3-range.svg rename to static/bootstrap-icons-1.13.1/calendar3-range.svg diff --git a/static/bootstrap-icons/calendar3-week-fill.svg b/static/bootstrap-icons-1.13.1/calendar3-week-fill.svg similarity index 100% rename from static/bootstrap-icons/calendar3-week-fill.svg rename to static/bootstrap-icons-1.13.1/calendar3-week-fill.svg diff --git a/static/bootstrap-icons/calendar3-week.svg b/static/bootstrap-icons-1.13.1/calendar3-week.svg similarity index 100% rename from static/bootstrap-icons/calendar3-week.svg rename to static/bootstrap-icons-1.13.1/calendar3-week.svg diff --git a/static/bootstrap-icons/calendar3.svg b/static/bootstrap-icons-1.13.1/calendar3.svg similarity index 100% rename from static/bootstrap-icons/calendar3.svg rename to static/bootstrap-icons-1.13.1/calendar3.svg diff --git a/static/bootstrap-icons/calendar4-event.svg b/static/bootstrap-icons-1.13.1/calendar4-event.svg similarity index 100% rename from static/bootstrap-icons/calendar4-event.svg rename to static/bootstrap-icons-1.13.1/calendar4-event.svg diff --git a/static/bootstrap-icons/calendar4-range.svg b/static/bootstrap-icons-1.13.1/calendar4-range.svg similarity index 100% rename from static/bootstrap-icons/calendar4-range.svg rename to static/bootstrap-icons-1.13.1/calendar4-range.svg diff --git a/static/bootstrap-icons/calendar4-week.svg b/static/bootstrap-icons-1.13.1/calendar4-week.svg similarity index 100% rename from static/bootstrap-icons/calendar4-week.svg rename to static/bootstrap-icons-1.13.1/calendar4-week.svg diff --git a/static/bootstrap-icons/calendar4.svg b/static/bootstrap-icons-1.13.1/calendar4.svg similarity index 100% rename from static/bootstrap-icons/calendar4.svg rename to static/bootstrap-icons-1.13.1/calendar4.svg diff --git a/static/bootstrap-icons/camera-fill.svg b/static/bootstrap-icons-1.13.1/camera-fill.svg similarity index 100% rename from static/bootstrap-icons/camera-fill.svg rename to static/bootstrap-icons-1.13.1/camera-fill.svg diff --git a/static/bootstrap-icons/camera-reels-fill.svg b/static/bootstrap-icons-1.13.1/camera-reels-fill.svg similarity index 100% rename from static/bootstrap-icons/camera-reels-fill.svg rename to static/bootstrap-icons-1.13.1/camera-reels-fill.svg diff --git a/static/bootstrap-icons/camera-reels.svg b/static/bootstrap-icons-1.13.1/camera-reels.svg similarity index 100% rename from static/bootstrap-icons/camera-reels.svg rename to static/bootstrap-icons-1.13.1/camera-reels.svg diff --git a/static/bootstrap-icons/camera-video-fill.svg b/static/bootstrap-icons-1.13.1/camera-video-fill.svg similarity index 100% rename from static/bootstrap-icons/camera-video-fill.svg rename to static/bootstrap-icons-1.13.1/camera-video-fill.svg diff --git a/static/bootstrap-icons/camera-video-off-fill.svg b/static/bootstrap-icons-1.13.1/camera-video-off-fill.svg similarity index 100% rename from static/bootstrap-icons/camera-video-off-fill.svg rename to static/bootstrap-icons-1.13.1/camera-video-off-fill.svg diff --git a/static/bootstrap-icons/camera-video-off.svg b/static/bootstrap-icons-1.13.1/camera-video-off.svg similarity index 100% rename from static/bootstrap-icons/camera-video-off.svg rename to static/bootstrap-icons-1.13.1/camera-video-off.svg diff --git a/static/bootstrap-icons/camera-video.svg b/static/bootstrap-icons-1.13.1/camera-video.svg similarity index 100% rename from static/bootstrap-icons/camera-video.svg rename to static/bootstrap-icons-1.13.1/camera-video.svg diff --git a/static/bootstrap-icons/camera.svg b/static/bootstrap-icons-1.13.1/camera.svg similarity index 100% rename from static/bootstrap-icons/camera.svg rename to static/bootstrap-icons-1.13.1/camera.svg diff --git a/static/bootstrap-icons/camera2.svg b/static/bootstrap-icons-1.13.1/camera2.svg similarity index 100% rename from static/bootstrap-icons/camera2.svg rename to static/bootstrap-icons-1.13.1/camera2.svg diff --git a/static/bootstrap-icons/capslock-fill.svg b/static/bootstrap-icons-1.13.1/capslock-fill.svg similarity index 100% rename from static/bootstrap-icons/capslock-fill.svg rename to static/bootstrap-icons-1.13.1/capslock-fill.svg diff --git a/static/bootstrap-icons/capslock.svg b/static/bootstrap-icons-1.13.1/capslock.svg similarity index 100% rename from static/bootstrap-icons/capslock.svg rename to static/bootstrap-icons-1.13.1/capslock.svg diff --git a/static/bootstrap-icons/capsule-pill.svg b/static/bootstrap-icons-1.13.1/capsule-pill.svg similarity index 100% rename from static/bootstrap-icons/capsule-pill.svg rename to static/bootstrap-icons-1.13.1/capsule-pill.svg diff --git a/static/bootstrap-icons/capsule.svg b/static/bootstrap-icons-1.13.1/capsule.svg similarity index 100% rename from static/bootstrap-icons/capsule.svg rename to static/bootstrap-icons-1.13.1/capsule.svg diff --git a/static/bootstrap-icons/car-front-fill.svg b/static/bootstrap-icons-1.13.1/car-front-fill.svg similarity index 100% rename from static/bootstrap-icons/car-front-fill.svg rename to static/bootstrap-icons-1.13.1/car-front-fill.svg diff --git a/static/bootstrap-icons/car-front.svg b/static/bootstrap-icons-1.13.1/car-front.svg similarity index 100% rename from static/bootstrap-icons/car-front.svg rename to static/bootstrap-icons-1.13.1/car-front.svg diff --git a/static/bootstrap-icons/card-checklist.svg b/static/bootstrap-icons-1.13.1/card-checklist.svg similarity index 100% rename from static/bootstrap-icons/card-checklist.svg rename to static/bootstrap-icons-1.13.1/card-checklist.svg diff --git a/static/bootstrap-icons/card-heading.svg b/static/bootstrap-icons-1.13.1/card-heading.svg similarity index 100% rename from static/bootstrap-icons/card-heading.svg rename to static/bootstrap-icons-1.13.1/card-heading.svg diff --git a/static/bootstrap-icons/card-image.svg b/static/bootstrap-icons-1.13.1/card-image.svg similarity index 100% rename from static/bootstrap-icons/card-image.svg rename to static/bootstrap-icons-1.13.1/card-image.svg diff --git a/static/bootstrap-icons/card-list.svg b/static/bootstrap-icons-1.13.1/card-list.svg similarity index 100% rename from static/bootstrap-icons/card-list.svg rename to static/bootstrap-icons-1.13.1/card-list.svg diff --git a/static/bootstrap-icons/card-text.svg b/static/bootstrap-icons-1.13.1/card-text.svg similarity index 100% rename from static/bootstrap-icons/card-text.svg rename to static/bootstrap-icons-1.13.1/card-text.svg diff --git a/static/bootstrap-icons/caret-down-fill.svg b/static/bootstrap-icons-1.13.1/caret-down-fill.svg similarity index 100% rename from static/bootstrap-icons/caret-down-fill.svg rename to static/bootstrap-icons-1.13.1/caret-down-fill.svg diff --git a/static/bootstrap-icons/caret-down-square-fill.svg b/static/bootstrap-icons-1.13.1/caret-down-square-fill.svg similarity index 100% rename from static/bootstrap-icons/caret-down-square-fill.svg rename to static/bootstrap-icons-1.13.1/caret-down-square-fill.svg diff --git a/static/bootstrap-icons/caret-down-square.svg b/static/bootstrap-icons-1.13.1/caret-down-square.svg similarity index 100% rename from static/bootstrap-icons/caret-down-square.svg rename to static/bootstrap-icons-1.13.1/caret-down-square.svg diff --git a/static/bootstrap-icons/caret-down.svg b/static/bootstrap-icons-1.13.1/caret-down.svg similarity index 100% rename from static/bootstrap-icons/caret-down.svg rename to static/bootstrap-icons-1.13.1/caret-down.svg diff --git a/static/bootstrap-icons/caret-left-fill.svg b/static/bootstrap-icons-1.13.1/caret-left-fill.svg similarity index 100% rename from static/bootstrap-icons/caret-left-fill.svg rename to static/bootstrap-icons-1.13.1/caret-left-fill.svg diff --git a/static/bootstrap-icons/caret-left-square-fill.svg b/static/bootstrap-icons-1.13.1/caret-left-square-fill.svg similarity index 100% rename from static/bootstrap-icons/caret-left-square-fill.svg rename to static/bootstrap-icons-1.13.1/caret-left-square-fill.svg diff --git a/static/bootstrap-icons/caret-left-square.svg b/static/bootstrap-icons-1.13.1/caret-left-square.svg similarity index 100% rename from static/bootstrap-icons/caret-left-square.svg rename to static/bootstrap-icons-1.13.1/caret-left-square.svg diff --git a/static/bootstrap-icons/caret-left.svg b/static/bootstrap-icons-1.13.1/caret-left.svg similarity index 100% rename from static/bootstrap-icons/caret-left.svg rename to static/bootstrap-icons-1.13.1/caret-left.svg diff --git a/static/bootstrap-icons/caret-right-fill.svg b/static/bootstrap-icons-1.13.1/caret-right-fill.svg similarity index 100% rename from static/bootstrap-icons/caret-right-fill.svg rename to static/bootstrap-icons-1.13.1/caret-right-fill.svg diff --git a/static/bootstrap-icons/caret-right-square-fill.svg b/static/bootstrap-icons-1.13.1/caret-right-square-fill.svg similarity index 100% rename from static/bootstrap-icons/caret-right-square-fill.svg rename to static/bootstrap-icons-1.13.1/caret-right-square-fill.svg diff --git a/static/bootstrap-icons/caret-right-square.svg b/static/bootstrap-icons-1.13.1/caret-right-square.svg similarity index 100% rename from static/bootstrap-icons/caret-right-square.svg rename to static/bootstrap-icons-1.13.1/caret-right-square.svg diff --git a/static/bootstrap-icons/caret-right.svg b/static/bootstrap-icons-1.13.1/caret-right.svg similarity index 100% rename from static/bootstrap-icons/caret-right.svg rename to static/bootstrap-icons-1.13.1/caret-right.svg diff --git a/static/bootstrap-icons/caret-up-fill.svg b/static/bootstrap-icons-1.13.1/caret-up-fill.svg similarity index 100% rename from static/bootstrap-icons/caret-up-fill.svg rename to static/bootstrap-icons-1.13.1/caret-up-fill.svg diff --git a/static/bootstrap-icons/caret-up-square-fill.svg b/static/bootstrap-icons-1.13.1/caret-up-square-fill.svg similarity index 100% rename from static/bootstrap-icons/caret-up-square-fill.svg rename to static/bootstrap-icons-1.13.1/caret-up-square-fill.svg diff --git a/static/bootstrap-icons/caret-up-square.svg b/static/bootstrap-icons-1.13.1/caret-up-square.svg similarity index 100% rename from static/bootstrap-icons/caret-up-square.svg rename to static/bootstrap-icons-1.13.1/caret-up-square.svg diff --git a/static/bootstrap-icons/caret-up.svg b/static/bootstrap-icons-1.13.1/caret-up.svg similarity index 100% rename from static/bootstrap-icons/caret-up.svg rename to static/bootstrap-icons-1.13.1/caret-up.svg diff --git a/static/bootstrap-icons/cart-check-fill.svg b/static/bootstrap-icons-1.13.1/cart-check-fill.svg similarity index 100% rename from static/bootstrap-icons/cart-check-fill.svg rename to static/bootstrap-icons-1.13.1/cart-check-fill.svg diff --git a/static/bootstrap-icons/cart-check.svg b/static/bootstrap-icons-1.13.1/cart-check.svg similarity index 100% rename from static/bootstrap-icons/cart-check.svg rename to static/bootstrap-icons-1.13.1/cart-check.svg diff --git a/static/bootstrap-icons/cart-dash-fill.svg b/static/bootstrap-icons-1.13.1/cart-dash-fill.svg similarity index 100% rename from static/bootstrap-icons/cart-dash-fill.svg rename to static/bootstrap-icons-1.13.1/cart-dash-fill.svg diff --git a/static/bootstrap-icons/cart-dash.svg b/static/bootstrap-icons-1.13.1/cart-dash.svg similarity index 100% rename from static/bootstrap-icons/cart-dash.svg rename to static/bootstrap-icons-1.13.1/cart-dash.svg diff --git a/static/bootstrap-icons/cart-fill.svg b/static/bootstrap-icons-1.13.1/cart-fill.svg similarity index 100% rename from static/bootstrap-icons/cart-fill.svg rename to static/bootstrap-icons-1.13.1/cart-fill.svg diff --git a/static/bootstrap-icons/cart-plus-fill.svg b/static/bootstrap-icons-1.13.1/cart-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/cart-plus-fill.svg rename to static/bootstrap-icons-1.13.1/cart-plus-fill.svg diff --git a/static/bootstrap-icons/cart-plus.svg b/static/bootstrap-icons-1.13.1/cart-plus.svg similarity index 100% rename from static/bootstrap-icons/cart-plus.svg rename to static/bootstrap-icons-1.13.1/cart-plus.svg diff --git a/static/bootstrap-icons/cart-x-fill.svg b/static/bootstrap-icons-1.13.1/cart-x-fill.svg similarity index 100% rename from static/bootstrap-icons/cart-x-fill.svg rename to static/bootstrap-icons-1.13.1/cart-x-fill.svg diff --git a/static/bootstrap-icons/cart-x.svg b/static/bootstrap-icons-1.13.1/cart-x.svg similarity index 100% rename from static/bootstrap-icons/cart-x.svg rename to static/bootstrap-icons-1.13.1/cart-x.svg diff --git a/static/bootstrap-icons/cart.svg b/static/bootstrap-icons-1.13.1/cart.svg similarity index 100% rename from static/bootstrap-icons/cart.svg rename to static/bootstrap-icons-1.13.1/cart.svg diff --git a/static/bootstrap-icons/cart2.svg b/static/bootstrap-icons-1.13.1/cart2.svg similarity index 100% rename from static/bootstrap-icons/cart2.svg rename to static/bootstrap-icons-1.13.1/cart2.svg diff --git a/static/bootstrap-icons/cart3.svg b/static/bootstrap-icons-1.13.1/cart3.svg similarity index 100% rename from static/bootstrap-icons/cart3.svg rename to static/bootstrap-icons-1.13.1/cart3.svg diff --git a/static/bootstrap-icons/cart4.svg b/static/bootstrap-icons-1.13.1/cart4.svg similarity index 100% rename from static/bootstrap-icons/cart4.svg rename to static/bootstrap-icons-1.13.1/cart4.svg diff --git a/static/bootstrap-icons/cash-coin.svg b/static/bootstrap-icons-1.13.1/cash-coin.svg similarity index 100% rename from static/bootstrap-icons/cash-coin.svg rename to static/bootstrap-icons-1.13.1/cash-coin.svg diff --git a/static/bootstrap-icons/cash-stack.svg b/static/bootstrap-icons-1.13.1/cash-stack.svg similarity index 100% rename from static/bootstrap-icons/cash-stack.svg rename to static/bootstrap-icons-1.13.1/cash-stack.svg diff --git a/static/bootstrap-icons/cash.svg b/static/bootstrap-icons-1.13.1/cash.svg similarity index 100% rename from static/bootstrap-icons/cash.svg rename to static/bootstrap-icons-1.13.1/cash.svg diff --git a/static/bootstrap-icons/cassette-fill.svg b/static/bootstrap-icons-1.13.1/cassette-fill.svg similarity index 100% rename from static/bootstrap-icons/cassette-fill.svg rename to static/bootstrap-icons-1.13.1/cassette-fill.svg diff --git a/static/bootstrap-icons/cassette.svg b/static/bootstrap-icons-1.13.1/cassette.svg similarity index 100% rename from static/bootstrap-icons/cassette.svg rename to static/bootstrap-icons-1.13.1/cassette.svg diff --git a/static/bootstrap-icons/cast.svg b/static/bootstrap-icons-1.13.1/cast.svg similarity index 100% rename from static/bootstrap-icons/cast.svg rename to static/bootstrap-icons-1.13.1/cast.svg diff --git a/static/bootstrap-icons/cc-circle-fill.svg b/static/bootstrap-icons-1.13.1/cc-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/cc-circle-fill.svg rename to static/bootstrap-icons-1.13.1/cc-circle-fill.svg diff --git a/static/bootstrap-icons/cc-circle.svg b/static/bootstrap-icons-1.13.1/cc-circle.svg similarity index 100% rename from static/bootstrap-icons/cc-circle.svg rename to static/bootstrap-icons-1.13.1/cc-circle.svg diff --git a/static/bootstrap-icons/cc-square-fill.svg b/static/bootstrap-icons-1.13.1/cc-square-fill.svg similarity index 100% rename from static/bootstrap-icons/cc-square-fill.svg rename to static/bootstrap-icons-1.13.1/cc-square-fill.svg diff --git a/static/bootstrap-icons/cc-square.svg b/static/bootstrap-icons-1.13.1/cc-square.svg similarity index 100% rename from static/bootstrap-icons/cc-square.svg rename to static/bootstrap-icons-1.13.1/cc-square.svg diff --git a/static/bootstrap-icons/chat-dots-fill.svg b/static/bootstrap-icons-1.13.1/chat-dots-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-dots-fill.svg rename to static/bootstrap-icons-1.13.1/chat-dots-fill.svg diff --git a/static/bootstrap-icons/chat-dots.svg b/static/bootstrap-icons-1.13.1/chat-dots.svg similarity index 100% rename from static/bootstrap-icons/chat-dots.svg rename to static/bootstrap-icons-1.13.1/chat-dots.svg diff --git a/static/bootstrap-icons/chat-fill.svg b/static/bootstrap-icons-1.13.1/chat-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-fill.svg rename to static/bootstrap-icons-1.13.1/chat-fill.svg diff --git a/static/bootstrap-icons/chat-heart-fill.svg b/static/bootstrap-icons-1.13.1/chat-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-heart-fill.svg rename to static/bootstrap-icons-1.13.1/chat-heart-fill.svg diff --git a/static/bootstrap-icons/chat-heart.svg b/static/bootstrap-icons-1.13.1/chat-heart.svg similarity index 100% rename from static/bootstrap-icons/chat-heart.svg rename to static/bootstrap-icons-1.13.1/chat-heart.svg diff --git a/static/bootstrap-icons/chat-left-dots-fill.svg b/static/bootstrap-icons-1.13.1/chat-left-dots-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-left-dots-fill.svg rename to static/bootstrap-icons-1.13.1/chat-left-dots-fill.svg diff --git a/static/bootstrap-icons/chat-left-dots.svg b/static/bootstrap-icons-1.13.1/chat-left-dots.svg similarity index 100% rename from static/bootstrap-icons/chat-left-dots.svg rename to static/bootstrap-icons-1.13.1/chat-left-dots.svg diff --git a/static/bootstrap-icons/chat-left-fill.svg b/static/bootstrap-icons-1.13.1/chat-left-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-left-fill.svg rename to static/bootstrap-icons-1.13.1/chat-left-fill.svg diff --git a/static/bootstrap-icons/chat-left-heart-fill.svg b/static/bootstrap-icons-1.13.1/chat-left-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-left-heart-fill.svg rename to static/bootstrap-icons-1.13.1/chat-left-heart-fill.svg diff --git a/static/bootstrap-icons/chat-left-heart.svg b/static/bootstrap-icons-1.13.1/chat-left-heart.svg similarity index 100% rename from static/bootstrap-icons/chat-left-heart.svg rename to static/bootstrap-icons-1.13.1/chat-left-heart.svg diff --git a/static/bootstrap-icons/chat-left-quote-fill.svg b/static/bootstrap-icons-1.13.1/chat-left-quote-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-left-quote-fill.svg rename to static/bootstrap-icons-1.13.1/chat-left-quote-fill.svg diff --git a/static/bootstrap-icons/chat-left-quote.svg b/static/bootstrap-icons-1.13.1/chat-left-quote.svg similarity index 100% rename from static/bootstrap-icons/chat-left-quote.svg rename to static/bootstrap-icons-1.13.1/chat-left-quote.svg diff --git a/static/bootstrap-icons/chat-left-text-fill.svg b/static/bootstrap-icons-1.13.1/chat-left-text-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-left-text-fill.svg rename to static/bootstrap-icons-1.13.1/chat-left-text-fill.svg diff --git a/static/bootstrap-icons/chat-left-text.svg b/static/bootstrap-icons-1.13.1/chat-left-text.svg similarity index 100% rename from static/bootstrap-icons/chat-left-text.svg rename to static/bootstrap-icons-1.13.1/chat-left-text.svg diff --git a/static/bootstrap-icons/chat-left.svg b/static/bootstrap-icons-1.13.1/chat-left.svg similarity index 100% rename from static/bootstrap-icons/chat-left.svg rename to static/bootstrap-icons-1.13.1/chat-left.svg diff --git a/static/bootstrap-icons/chat-quote-fill.svg b/static/bootstrap-icons-1.13.1/chat-quote-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-quote-fill.svg rename to static/bootstrap-icons-1.13.1/chat-quote-fill.svg diff --git a/static/bootstrap-icons/chat-quote.svg b/static/bootstrap-icons-1.13.1/chat-quote.svg similarity index 100% rename from static/bootstrap-icons/chat-quote.svg rename to static/bootstrap-icons-1.13.1/chat-quote.svg diff --git a/static/bootstrap-icons/chat-right-dots-fill.svg b/static/bootstrap-icons-1.13.1/chat-right-dots-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-right-dots-fill.svg rename to static/bootstrap-icons-1.13.1/chat-right-dots-fill.svg diff --git a/static/bootstrap-icons/chat-right-dots.svg b/static/bootstrap-icons-1.13.1/chat-right-dots.svg similarity index 100% rename from static/bootstrap-icons/chat-right-dots.svg rename to static/bootstrap-icons-1.13.1/chat-right-dots.svg diff --git a/static/bootstrap-icons/chat-right-fill.svg b/static/bootstrap-icons-1.13.1/chat-right-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-right-fill.svg rename to static/bootstrap-icons-1.13.1/chat-right-fill.svg diff --git a/static/bootstrap-icons/chat-right-heart-fill.svg b/static/bootstrap-icons-1.13.1/chat-right-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-right-heart-fill.svg rename to static/bootstrap-icons-1.13.1/chat-right-heart-fill.svg diff --git a/static/bootstrap-icons/chat-right-heart.svg b/static/bootstrap-icons-1.13.1/chat-right-heart.svg similarity index 100% rename from static/bootstrap-icons/chat-right-heart.svg rename to static/bootstrap-icons-1.13.1/chat-right-heart.svg diff --git a/static/bootstrap-icons/chat-right-quote-fill.svg b/static/bootstrap-icons-1.13.1/chat-right-quote-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-right-quote-fill.svg rename to static/bootstrap-icons-1.13.1/chat-right-quote-fill.svg diff --git a/static/bootstrap-icons/chat-right-quote.svg b/static/bootstrap-icons-1.13.1/chat-right-quote.svg similarity index 100% rename from static/bootstrap-icons/chat-right-quote.svg rename to static/bootstrap-icons-1.13.1/chat-right-quote.svg diff --git a/static/bootstrap-icons/chat-right-text-fill.svg b/static/bootstrap-icons-1.13.1/chat-right-text-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-right-text-fill.svg rename to static/bootstrap-icons-1.13.1/chat-right-text-fill.svg diff --git a/static/bootstrap-icons/chat-right-text.svg b/static/bootstrap-icons-1.13.1/chat-right-text.svg similarity index 100% rename from static/bootstrap-icons/chat-right-text.svg rename to static/bootstrap-icons-1.13.1/chat-right-text.svg diff --git a/static/bootstrap-icons/chat-right.svg b/static/bootstrap-icons-1.13.1/chat-right.svg similarity index 100% rename from static/bootstrap-icons/chat-right.svg rename to static/bootstrap-icons-1.13.1/chat-right.svg diff --git a/static/bootstrap-icons/chat-square-dots-fill.svg b/static/bootstrap-icons-1.13.1/chat-square-dots-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-square-dots-fill.svg rename to static/bootstrap-icons-1.13.1/chat-square-dots-fill.svg diff --git a/static/bootstrap-icons/chat-square-dots.svg b/static/bootstrap-icons-1.13.1/chat-square-dots.svg similarity index 100% rename from static/bootstrap-icons/chat-square-dots.svg rename to static/bootstrap-icons-1.13.1/chat-square-dots.svg diff --git a/static/bootstrap-icons/chat-square-fill.svg b/static/bootstrap-icons-1.13.1/chat-square-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-square-fill.svg rename to static/bootstrap-icons-1.13.1/chat-square-fill.svg diff --git a/static/bootstrap-icons/chat-square-heart-fill.svg b/static/bootstrap-icons-1.13.1/chat-square-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-square-heart-fill.svg rename to static/bootstrap-icons-1.13.1/chat-square-heart-fill.svg diff --git a/static/bootstrap-icons/chat-square-heart.svg b/static/bootstrap-icons-1.13.1/chat-square-heart.svg similarity index 100% rename from static/bootstrap-icons/chat-square-heart.svg rename to static/bootstrap-icons-1.13.1/chat-square-heart.svg diff --git a/static/bootstrap-icons/chat-square-quote-fill.svg b/static/bootstrap-icons-1.13.1/chat-square-quote-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-square-quote-fill.svg rename to static/bootstrap-icons-1.13.1/chat-square-quote-fill.svg diff --git a/static/bootstrap-icons/chat-square-quote.svg b/static/bootstrap-icons-1.13.1/chat-square-quote.svg similarity index 100% rename from static/bootstrap-icons/chat-square-quote.svg rename to static/bootstrap-icons-1.13.1/chat-square-quote.svg diff --git a/static/bootstrap-icons/chat-square-text-fill.svg b/static/bootstrap-icons-1.13.1/chat-square-text-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-square-text-fill.svg rename to static/bootstrap-icons-1.13.1/chat-square-text-fill.svg diff --git a/static/bootstrap-icons/chat-square-text.svg b/static/bootstrap-icons-1.13.1/chat-square-text.svg similarity index 100% rename from static/bootstrap-icons/chat-square-text.svg rename to static/bootstrap-icons-1.13.1/chat-square-text.svg diff --git a/static/bootstrap-icons/chat-square.svg b/static/bootstrap-icons-1.13.1/chat-square.svg similarity index 100% rename from static/bootstrap-icons/chat-square.svg rename to static/bootstrap-icons-1.13.1/chat-square.svg diff --git a/static/bootstrap-icons/chat-text-fill.svg b/static/bootstrap-icons-1.13.1/chat-text-fill.svg similarity index 100% rename from static/bootstrap-icons/chat-text-fill.svg rename to static/bootstrap-icons-1.13.1/chat-text-fill.svg diff --git a/static/bootstrap-icons/chat-text.svg b/static/bootstrap-icons-1.13.1/chat-text.svg similarity index 100% rename from static/bootstrap-icons/chat-text.svg rename to static/bootstrap-icons-1.13.1/chat-text.svg diff --git a/static/bootstrap-icons/chat.svg b/static/bootstrap-icons-1.13.1/chat.svg similarity index 100% rename from static/bootstrap-icons/chat.svg rename to static/bootstrap-icons-1.13.1/chat.svg diff --git a/static/bootstrap-icons/check-all.svg b/static/bootstrap-icons-1.13.1/check-all.svg similarity index 100% rename from static/bootstrap-icons/check-all.svg rename to static/bootstrap-icons-1.13.1/check-all.svg diff --git a/static/bootstrap-icons/check-circle-fill.svg b/static/bootstrap-icons-1.13.1/check-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/check-circle-fill.svg rename to static/bootstrap-icons-1.13.1/check-circle-fill.svg diff --git a/static/bootstrap-icons/check-circle.svg b/static/bootstrap-icons-1.13.1/check-circle.svg similarity index 100% rename from static/bootstrap-icons/check-circle.svg rename to static/bootstrap-icons-1.13.1/check-circle.svg diff --git a/static/bootstrap-icons/check-lg.svg b/static/bootstrap-icons-1.13.1/check-lg.svg similarity index 100% rename from static/bootstrap-icons/check-lg.svg rename to static/bootstrap-icons-1.13.1/check-lg.svg diff --git a/static/bootstrap-icons/check-square-fill.svg b/static/bootstrap-icons-1.13.1/check-square-fill.svg similarity index 100% rename from static/bootstrap-icons/check-square-fill.svg rename to static/bootstrap-icons-1.13.1/check-square-fill.svg diff --git a/static/bootstrap-icons/check-square.svg b/static/bootstrap-icons-1.13.1/check-square.svg similarity index 100% rename from static/bootstrap-icons/check-square.svg rename to static/bootstrap-icons-1.13.1/check-square.svg diff --git a/static/bootstrap-icons/check.svg b/static/bootstrap-icons-1.13.1/check.svg similarity index 100% rename from static/bootstrap-icons/check.svg rename to static/bootstrap-icons-1.13.1/check.svg diff --git a/static/bootstrap-icons/check2-all.svg b/static/bootstrap-icons-1.13.1/check2-all.svg similarity index 100% rename from static/bootstrap-icons/check2-all.svg rename to static/bootstrap-icons-1.13.1/check2-all.svg diff --git a/static/bootstrap-icons/check2-circle.svg b/static/bootstrap-icons-1.13.1/check2-circle.svg similarity index 100% rename from static/bootstrap-icons/check2-circle.svg rename to static/bootstrap-icons-1.13.1/check2-circle.svg diff --git a/static/bootstrap-icons/check2-square.svg b/static/bootstrap-icons-1.13.1/check2-square.svg similarity index 100% rename from static/bootstrap-icons/check2-square.svg rename to static/bootstrap-icons-1.13.1/check2-square.svg diff --git a/static/bootstrap-icons/check2.svg b/static/bootstrap-icons-1.13.1/check2.svg similarity index 100% rename from static/bootstrap-icons/check2.svg rename to static/bootstrap-icons-1.13.1/check2.svg diff --git a/static/bootstrap-icons/chevron-bar-contract.svg b/static/bootstrap-icons-1.13.1/chevron-bar-contract.svg similarity index 100% rename from static/bootstrap-icons/chevron-bar-contract.svg rename to static/bootstrap-icons-1.13.1/chevron-bar-contract.svg diff --git a/static/bootstrap-icons/chevron-bar-down.svg b/static/bootstrap-icons-1.13.1/chevron-bar-down.svg similarity index 100% rename from static/bootstrap-icons/chevron-bar-down.svg rename to static/bootstrap-icons-1.13.1/chevron-bar-down.svg diff --git a/static/bootstrap-icons/chevron-bar-expand.svg b/static/bootstrap-icons-1.13.1/chevron-bar-expand.svg similarity index 100% rename from static/bootstrap-icons/chevron-bar-expand.svg rename to static/bootstrap-icons-1.13.1/chevron-bar-expand.svg diff --git a/static/bootstrap-icons/chevron-bar-left.svg b/static/bootstrap-icons-1.13.1/chevron-bar-left.svg similarity index 100% rename from static/bootstrap-icons/chevron-bar-left.svg rename to static/bootstrap-icons-1.13.1/chevron-bar-left.svg diff --git a/static/bootstrap-icons/chevron-bar-right.svg b/static/bootstrap-icons-1.13.1/chevron-bar-right.svg similarity index 100% rename from static/bootstrap-icons/chevron-bar-right.svg rename to static/bootstrap-icons-1.13.1/chevron-bar-right.svg diff --git a/static/bootstrap-icons/chevron-bar-up.svg b/static/bootstrap-icons-1.13.1/chevron-bar-up.svg similarity index 100% rename from static/bootstrap-icons/chevron-bar-up.svg rename to static/bootstrap-icons-1.13.1/chevron-bar-up.svg diff --git a/static/bootstrap-icons/chevron-compact-down.svg b/static/bootstrap-icons-1.13.1/chevron-compact-down.svg similarity index 100% rename from static/bootstrap-icons/chevron-compact-down.svg rename to static/bootstrap-icons-1.13.1/chevron-compact-down.svg diff --git a/static/bootstrap-icons/chevron-compact-left.svg b/static/bootstrap-icons-1.13.1/chevron-compact-left.svg similarity index 100% rename from static/bootstrap-icons/chevron-compact-left.svg rename to static/bootstrap-icons-1.13.1/chevron-compact-left.svg diff --git a/static/bootstrap-icons/chevron-compact-right.svg b/static/bootstrap-icons-1.13.1/chevron-compact-right.svg similarity index 100% rename from static/bootstrap-icons/chevron-compact-right.svg rename to static/bootstrap-icons-1.13.1/chevron-compact-right.svg diff --git a/static/bootstrap-icons/chevron-compact-up.svg b/static/bootstrap-icons-1.13.1/chevron-compact-up.svg similarity index 100% rename from static/bootstrap-icons/chevron-compact-up.svg rename to static/bootstrap-icons-1.13.1/chevron-compact-up.svg diff --git a/static/bootstrap-icons/chevron-contract.svg b/static/bootstrap-icons-1.13.1/chevron-contract.svg similarity index 100% rename from static/bootstrap-icons/chevron-contract.svg rename to static/bootstrap-icons-1.13.1/chevron-contract.svg diff --git a/static/bootstrap-icons/chevron-double-down.svg b/static/bootstrap-icons-1.13.1/chevron-double-down.svg similarity index 100% rename from static/bootstrap-icons/chevron-double-down.svg rename to static/bootstrap-icons-1.13.1/chevron-double-down.svg diff --git a/static/bootstrap-icons/chevron-double-left.svg b/static/bootstrap-icons-1.13.1/chevron-double-left.svg similarity index 100% rename from static/bootstrap-icons/chevron-double-left.svg rename to static/bootstrap-icons-1.13.1/chevron-double-left.svg diff --git a/static/bootstrap-icons/chevron-double-right.svg b/static/bootstrap-icons-1.13.1/chevron-double-right.svg similarity index 100% rename from static/bootstrap-icons/chevron-double-right.svg rename to static/bootstrap-icons-1.13.1/chevron-double-right.svg diff --git a/static/bootstrap-icons/chevron-double-up.svg b/static/bootstrap-icons-1.13.1/chevron-double-up.svg similarity index 100% rename from static/bootstrap-icons/chevron-double-up.svg rename to static/bootstrap-icons-1.13.1/chevron-double-up.svg diff --git a/static/bootstrap-icons/chevron-down.svg b/static/bootstrap-icons-1.13.1/chevron-down.svg similarity index 100% rename from static/bootstrap-icons/chevron-down.svg rename to static/bootstrap-icons-1.13.1/chevron-down.svg diff --git a/static/bootstrap-icons/chevron-expand.svg b/static/bootstrap-icons-1.13.1/chevron-expand.svg similarity index 100% rename from static/bootstrap-icons/chevron-expand.svg rename to static/bootstrap-icons-1.13.1/chevron-expand.svg diff --git a/static/bootstrap-icons/chevron-left.svg b/static/bootstrap-icons-1.13.1/chevron-left.svg similarity index 100% rename from static/bootstrap-icons/chevron-left.svg rename to static/bootstrap-icons-1.13.1/chevron-left.svg diff --git a/static/bootstrap-icons/chevron-right.svg b/static/bootstrap-icons-1.13.1/chevron-right.svg similarity index 100% rename from static/bootstrap-icons/chevron-right.svg rename to static/bootstrap-icons-1.13.1/chevron-right.svg diff --git a/static/bootstrap-icons/chevron-up.svg b/static/bootstrap-icons-1.13.1/chevron-up.svg similarity index 100% rename from static/bootstrap-icons/chevron-up.svg rename to static/bootstrap-icons-1.13.1/chevron-up.svg diff --git a/static/bootstrap-icons/circle-fill.svg b/static/bootstrap-icons-1.13.1/circle-fill.svg similarity index 100% rename from static/bootstrap-icons/circle-fill.svg rename to static/bootstrap-icons-1.13.1/circle-fill.svg diff --git a/static/bootstrap-icons/circle-half.svg b/static/bootstrap-icons-1.13.1/circle-half.svg similarity index 100% rename from static/bootstrap-icons/circle-half.svg rename to static/bootstrap-icons-1.13.1/circle-half.svg diff --git a/static/bootstrap-icons/circle-square.svg b/static/bootstrap-icons-1.13.1/circle-square.svg similarity index 100% rename from static/bootstrap-icons/circle-square.svg rename to static/bootstrap-icons-1.13.1/circle-square.svg diff --git a/static/bootstrap-icons/circle.svg b/static/bootstrap-icons-1.13.1/circle.svg similarity index 100% rename from static/bootstrap-icons/circle.svg rename to static/bootstrap-icons-1.13.1/circle.svg diff --git a/static/bootstrap-icons/claude.svg b/static/bootstrap-icons-1.13.1/claude.svg similarity index 100% rename from static/bootstrap-icons/claude.svg rename to static/bootstrap-icons-1.13.1/claude.svg diff --git a/static/bootstrap-icons/clipboard-check-fill.svg b/static/bootstrap-icons-1.13.1/clipboard-check-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard-check-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard-check-fill.svg diff --git a/static/bootstrap-icons/clipboard-check.svg b/static/bootstrap-icons-1.13.1/clipboard-check.svg similarity index 100% rename from static/bootstrap-icons/clipboard-check.svg rename to static/bootstrap-icons-1.13.1/clipboard-check.svg diff --git a/static/bootstrap-icons/clipboard-data-fill.svg b/static/bootstrap-icons-1.13.1/clipboard-data-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard-data-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard-data-fill.svg diff --git a/static/bootstrap-icons/clipboard-data.svg b/static/bootstrap-icons-1.13.1/clipboard-data.svg similarity index 100% rename from static/bootstrap-icons/clipboard-data.svg rename to static/bootstrap-icons-1.13.1/clipboard-data.svg diff --git a/static/bootstrap-icons/clipboard-fill.svg b/static/bootstrap-icons-1.13.1/clipboard-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard-fill.svg diff --git a/static/bootstrap-icons/clipboard-heart-fill.svg b/static/bootstrap-icons-1.13.1/clipboard-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard-heart-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard-heart-fill.svg diff --git a/static/bootstrap-icons/clipboard-heart.svg b/static/bootstrap-icons-1.13.1/clipboard-heart.svg similarity index 100% rename from static/bootstrap-icons/clipboard-heart.svg rename to static/bootstrap-icons-1.13.1/clipboard-heart.svg diff --git a/static/bootstrap-icons/clipboard-minus-fill.svg b/static/bootstrap-icons-1.13.1/clipboard-minus-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard-minus-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard-minus-fill.svg diff --git a/static/bootstrap-icons/clipboard-minus.svg b/static/bootstrap-icons-1.13.1/clipboard-minus.svg similarity index 100% rename from static/bootstrap-icons/clipboard-minus.svg rename to static/bootstrap-icons-1.13.1/clipboard-minus.svg diff --git a/static/bootstrap-icons/clipboard-plus-fill.svg b/static/bootstrap-icons-1.13.1/clipboard-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard-plus-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard-plus-fill.svg diff --git a/static/bootstrap-icons/clipboard-plus.svg b/static/bootstrap-icons-1.13.1/clipboard-plus.svg similarity index 100% rename from static/bootstrap-icons/clipboard-plus.svg rename to static/bootstrap-icons-1.13.1/clipboard-plus.svg diff --git a/static/bootstrap-icons/clipboard-pulse.svg b/static/bootstrap-icons-1.13.1/clipboard-pulse.svg similarity index 100% rename from static/bootstrap-icons/clipboard-pulse.svg rename to static/bootstrap-icons-1.13.1/clipboard-pulse.svg diff --git a/static/bootstrap-icons/clipboard-x-fill.svg b/static/bootstrap-icons-1.13.1/clipboard-x-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard-x-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard-x-fill.svg diff --git a/static/bootstrap-icons/clipboard-x.svg b/static/bootstrap-icons-1.13.1/clipboard-x.svg similarity index 100% rename from static/bootstrap-icons/clipboard-x.svg rename to static/bootstrap-icons-1.13.1/clipboard-x.svg diff --git a/static/bootstrap-icons/clipboard.svg b/static/bootstrap-icons-1.13.1/clipboard.svg similarity index 100% rename from static/bootstrap-icons/clipboard.svg rename to static/bootstrap-icons-1.13.1/clipboard.svg diff --git a/static/bootstrap-icons/clipboard2-check-fill.svg b/static/bootstrap-icons-1.13.1/clipboard2-check-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-check-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard2-check-fill.svg diff --git a/static/bootstrap-icons/clipboard2-check.svg b/static/bootstrap-icons-1.13.1/clipboard2-check.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-check.svg rename to static/bootstrap-icons-1.13.1/clipboard2-check.svg diff --git a/static/bootstrap-icons/clipboard2-data-fill.svg b/static/bootstrap-icons-1.13.1/clipboard2-data-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-data-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard2-data-fill.svg diff --git a/static/bootstrap-icons/clipboard2-data.svg b/static/bootstrap-icons-1.13.1/clipboard2-data.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-data.svg rename to static/bootstrap-icons-1.13.1/clipboard2-data.svg diff --git a/static/bootstrap-icons/clipboard2-fill.svg b/static/bootstrap-icons-1.13.1/clipboard2-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard2-fill.svg diff --git a/static/bootstrap-icons/clipboard2-heart-fill.svg b/static/bootstrap-icons-1.13.1/clipboard2-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-heart-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard2-heart-fill.svg diff --git a/static/bootstrap-icons/clipboard2-heart.svg b/static/bootstrap-icons-1.13.1/clipboard2-heart.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-heart.svg rename to static/bootstrap-icons-1.13.1/clipboard2-heart.svg diff --git a/static/bootstrap-icons/clipboard2-minus-fill.svg b/static/bootstrap-icons-1.13.1/clipboard2-minus-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-minus-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard2-minus-fill.svg diff --git a/static/bootstrap-icons/clipboard2-minus.svg b/static/bootstrap-icons-1.13.1/clipboard2-minus.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-minus.svg rename to static/bootstrap-icons-1.13.1/clipboard2-minus.svg diff --git a/static/bootstrap-icons/clipboard2-plus-fill.svg b/static/bootstrap-icons-1.13.1/clipboard2-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-plus-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard2-plus-fill.svg diff --git a/static/bootstrap-icons/clipboard2-plus.svg b/static/bootstrap-icons-1.13.1/clipboard2-plus.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-plus.svg rename to static/bootstrap-icons-1.13.1/clipboard2-plus.svg diff --git a/static/bootstrap-icons/clipboard2-pulse-fill.svg b/static/bootstrap-icons-1.13.1/clipboard2-pulse-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-pulse-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard2-pulse-fill.svg diff --git a/static/bootstrap-icons/clipboard2-pulse.svg b/static/bootstrap-icons-1.13.1/clipboard2-pulse.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-pulse.svg rename to static/bootstrap-icons-1.13.1/clipboard2-pulse.svg diff --git a/static/bootstrap-icons/clipboard2-x-fill.svg b/static/bootstrap-icons-1.13.1/clipboard2-x-fill.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-x-fill.svg rename to static/bootstrap-icons-1.13.1/clipboard2-x-fill.svg diff --git a/static/bootstrap-icons/clipboard2-x.svg b/static/bootstrap-icons-1.13.1/clipboard2-x.svg similarity index 100% rename from static/bootstrap-icons/clipboard2-x.svg rename to static/bootstrap-icons-1.13.1/clipboard2-x.svg diff --git a/static/bootstrap-icons/clipboard2.svg b/static/bootstrap-icons-1.13.1/clipboard2.svg similarity index 100% rename from static/bootstrap-icons/clipboard2.svg rename to static/bootstrap-icons-1.13.1/clipboard2.svg diff --git a/static/bootstrap-icons/clock-fill.svg b/static/bootstrap-icons-1.13.1/clock-fill.svg similarity index 100% rename from static/bootstrap-icons/clock-fill.svg rename to static/bootstrap-icons-1.13.1/clock-fill.svg diff --git a/static/bootstrap-icons/clock-history.svg b/static/bootstrap-icons-1.13.1/clock-history.svg similarity index 100% rename from static/bootstrap-icons/clock-history.svg rename to static/bootstrap-icons-1.13.1/clock-history.svg diff --git a/static/bootstrap-icons/clock.svg b/static/bootstrap-icons-1.13.1/clock.svg similarity index 100% rename from static/bootstrap-icons/clock.svg rename to static/bootstrap-icons-1.13.1/clock.svg diff --git a/static/bootstrap-icons/cloud-arrow-down-fill.svg b/static/bootstrap-icons-1.13.1/cloud-arrow-down-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-arrow-down-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-arrow-down-fill.svg diff --git a/static/bootstrap-icons/cloud-arrow-down.svg b/static/bootstrap-icons-1.13.1/cloud-arrow-down.svg similarity index 100% rename from static/bootstrap-icons/cloud-arrow-down.svg rename to static/bootstrap-icons-1.13.1/cloud-arrow-down.svg diff --git a/static/bootstrap-icons/cloud-arrow-up-fill.svg b/static/bootstrap-icons-1.13.1/cloud-arrow-up-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-arrow-up-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-arrow-up-fill.svg diff --git a/static/bootstrap-icons/cloud-arrow-up.svg b/static/bootstrap-icons-1.13.1/cloud-arrow-up.svg similarity index 100% rename from static/bootstrap-icons/cloud-arrow-up.svg rename to static/bootstrap-icons-1.13.1/cloud-arrow-up.svg diff --git a/static/bootstrap-icons/cloud-check-fill.svg b/static/bootstrap-icons-1.13.1/cloud-check-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-check-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-check-fill.svg diff --git a/static/bootstrap-icons/cloud-check.svg b/static/bootstrap-icons-1.13.1/cloud-check.svg similarity index 100% rename from static/bootstrap-icons/cloud-check.svg rename to static/bootstrap-icons-1.13.1/cloud-check.svg diff --git a/static/bootstrap-icons/cloud-download-fill.svg b/static/bootstrap-icons-1.13.1/cloud-download-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-download-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-download-fill.svg diff --git a/static/bootstrap-icons/cloud-download.svg b/static/bootstrap-icons-1.13.1/cloud-download.svg similarity index 100% rename from static/bootstrap-icons/cloud-download.svg rename to static/bootstrap-icons-1.13.1/cloud-download.svg diff --git a/static/bootstrap-icons/cloud-drizzle-fill.svg b/static/bootstrap-icons-1.13.1/cloud-drizzle-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-drizzle-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-drizzle-fill.svg diff --git a/static/bootstrap-icons/cloud-drizzle.svg b/static/bootstrap-icons-1.13.1/cloud-drizzle.svg similarity index 100% rename from static/bootstrap-icons/cloud-drizzle.svg rename to static/bootstrap-icons-1.13.1/cloud-drizzle.svg diff --git a/static/bootstrap-icons/cloud-fill.svg b/static/bootstrap-icons-1.13.1/cloud-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-fill.svg diff --git a/static/bootstrap-icons/cloud-fog-fill.svg b/static/bootstrap-icons-1.13.1/cloud-fog-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-fog-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-fog-fill.svg diff --git a/static/bootstrap-icons/cloud-fog.svg b/static/bootstrap-icons-1.13.1/cloud-fog.svg similarity index 100% rename from static/bootstrap-icons/cloud-fog.svg rename to static/bootstrap-icons-1.13.1/cloud-fog.svg diff --git a/static/bootstrap-icons/cloud-fog2-fill.svg b/static/bootstrap-icons-1.13.1/cloud-fog2-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-fog2-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-fog2-fill.svg diff --git a/static/bootstrap-icons/cloud-fog2.svg b/static/bootstrap-icons-1.13.1/cloud-fog2.svg similarity index 100% rename from static/bootstrap-icons/cloud-fog2.svg rename to static/bootstrap-icons-1.13.1/cloud-fog2.svg diff --git a/static/bootstrap-icons/cloud-hail-fill.svg b/static/bootstrap-icons-1.13.1/cloud-hail-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-hail-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-hail-fill.svg diff --git a/static/bootstrap-icons/cloud-hail.svg b/static/bootstrap-icons-1.13.1/cloud-hail.svg similarity index 100% rename from static/bootstrap-icons/cloud-hail.svg rename to static/bootstrap-icons-1.13.1/cloud-hail.svg diff --git a/static/bootstrap-icons/cloud-haze-fill.svg b/static/bootstrap-icons-1.13.1/cloud-haze-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-haze-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-haze-fill.svg diff --git a/static/bootstrap-icons/cloud-haze.svg b/static/bootstrap-icons-1.13.1/cloud-haze.svg similarity index 100% rename from static/bootstrap-icons/cloud-haze.svg rename to static/bootstrap-icons-1.13.1/cloud-haze.svg diff --git a/static/bootstrap-icons/cloud-haze2-fill.svg b/static/bootstrap-icons-1.13.1/cloud-haze2-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-haze2-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-haze2-fill.svg diff --git a/static/bootstrap-icons/cloud-haze2.svg b/static/bootstrap-icons-1.13.1/cloud-haze2.svg similarity index 100% rename from static/bootstrap-icons/cloud-haze2.svg rename to static/bootstrap-icons-1.13.1/cloud-haze2.svg diff --git a/static/bootstrap-icons/cloud-lightning-fill.svg b/static/bootstrap-icons-1.13.1/cloud-lightning-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-lightning-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-lightning-fill.svg diff --git a/static/bootstrap-icons/cloud-lightning-rain-fill.svg b/static/bootstrap-icons-1.13.1/cloud-lightning-rain-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-lightning-rain-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-lightning-rain-fill.svg diff --git a/static/bootstrap-icons/cloud-lightning-rain.svg b/static/bootstrap-icons-1.13.1/cloud-lightning-rain.svg similarity index 100% rename from static/bootstrap-icons/cloud-lightning-rain.svg rename to static/bootstrap-icons-1.13.1/cloud-lightning-rain.svg diff --git a/static/bootstrap-icons/cloud-lightning.svg b/static/bootstrap-icons-1.13.1/cloud-lightning.svg similarity index 100% rename from static/bootstrap-icons/cloud-lightning.svg rename to static/bootstrap-icons-1.13.1/cloud-lightning.svg diff --git a/static/bootstrap-icons/cloud-minus-fill.svg b/static/bootstrap-icons-1.13.1/cloud-minus-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-minus-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-minus-fill.svg diff --git a/static/bootstrap-icons/cloud-minus.svg b/static/bootstrap-icons-1.13.1/cloud-minus.svg similarity index 100% rename from static/bootstrap-icons/cloud-minus.svg rename to static/bootstrap-icons-1.13.1/cloud-minus.svg diff --git a/static/bootstrap-icons/cloud-moon-fill.svg b/static/bootstrap-icons-1.13.1/cloud-moon-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-moon-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-moon-fill.svg diff --git a/static/bootstrap-icons/cloud-moon.svg b/static/bootstrap-icons-1.13.1/cloud-moon.svg similarity index 100% rename from static/bootstrap-icons/cloud-moon.svg rename to static/bootstrap-icons-1.13.1/cloud-moon.svg diff --git a/static/bootstrap-icons/cloud-plus-fill.svg b/static/bootstrap-icons-1.13.1/cloud-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-plus-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-plus-fill.svg diff --git a/static/bootstrap-icons/cloud-plus.svg b/static/bootstrap-icons-1.13.1/cloud-plus.svg similarity index 100% rename from static/bootstrap-icons/cloud-plus.svg rename to static/bootstrap-icons-1.13.1/cloud-plus.svg diff --git a/static/bootstrap-icons/cloud-rain-fill.svg b/static/bootstrap-icons-1.13.1/cloud-rain-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-rain-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-rain-fill.svg diff --git a/static/bootstrap-icons/cloud-rain-heavy-fill.svg b/static/bootstrap-icons-1.13.1/cloud-rain-heavy-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-rain-heavy-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-rain-heavy-fill.svg diff --git a/static/bootstrap-icons/cloud-rain-heavy.svg b/static/bootstrap-icons-1.13.1/cloud-rain-heavy.svg similarity index 100% rename from static/bootstrap-icons/cloud-rain-heavy.svg rename to static/bootstrap-icons-1.13.1/cloud-rain-heavy.svg diff --git a/static/bootstrap-icons/cloud-rain.svg b/static/bootstrap-icons-1.13.1/cloud-rain.svg similarity index 100% rename from static/bootstrap-icons/cloud-rain.svg rename to static/bootstrap-icons-1.13.1/cloud-rain.svg diff --git a/static/bootstrap-icons/cloud-slash-fill.svg b/static/bootstrap-icons-1.13.1/cloud-slash-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-slash-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-slash-fill.svg diff --git a/static/bootstrap-icons/cloud-slash.svg b/static/bootstrap-icons-1.13.1/cloud-slash.svg similarity index 100% rename from static/bootstrap-icons/cloud-slash.svg rename to static/bootstrap-icons-1.13.1/cloud-slash.svg diff --git a/static/bootstrap-icons/cloud-sleet-fill.svg b/static/bootstrap-icons-1.13.1/cloud-sleet-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-sleet-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-sleet-fill.svg diff --git a/static/bootstrap-icons/cloud-sleet.svg b/static/bootstrap-icons-1.13.1/cloud-sleet.svg similarity index 100% rename from static/bootstrap-icons/cloud-sleet.svg rename to static/bootstrap-icons-1.13.1/cloud-sleet.svg diff --git a/static/bootstrap-icons/cloud-snow-fill.svg b/static/bootstrap-icons-1.13.1/cloud-snow-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-snow-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-snow-fill.svg diff --git a/static/bootstrap-icons/cloud-snow.svg b/static/bootstrap-icons-1.13.1/cloud-snow.svg similarity index 100% rename from static/bootstrap-icons/cloud-snow.svg rename to static/bootstrap-icons-1.13.1/cloud-snow.svg diff --git a/static/bootstrap-icons/cloud-sun-fill.svg b/static/bootstrap-icons-1.13.1/cloud-sun-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-sun-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-sun-fill.svg diff --git a/static/bootstrap-icons/cloud-sun.svg b/static/bootstrap-icons-1.13.1/cloud-sun.svg similarity index 100% rename from static/bootstrap-icons/cloud-sun.svg rename to static/bootstrap-icons-1.13.1/cloud-sun.svg diff --git a/static/bootstrap-icons/cloud-upload-fill.svg b/static/bootstrap-icons-1.13.1/cloud-upload-fill.svg similarity index 100% rename from static/bootstrap-icons/cloud-upload-fill.svg rename to static/bootstrap-icons-1.13.1/cloud-upload-fill.svg diff --git a/static/bootstrap-icons/cloud-upload.svg b/static/bootstrap-icons-1.13.1/cloud-upload.svg similarity index 100% rename from static/bootstrap-icons/cloud-upload.svg rename to static/bootstrap-icons-1.13.1/cloud-upload.svg diff --git a/static/bootstrap-icons/cloud.svg b/static/bootstrap-icons-1.13.1/cloud.svg similarity index 100% rename from static/bootstrap-icons/cloud.svg rename to static/bootstrap-icons-1.13.1/cloud.svg diff --git a/static/bootstrap-icons/clouds-fill.svg b/static/bootstrap-icons-1.13.1/clouds-fill.svg similarity index 100% rename from static/bootstrap-icons/clouds-fill.svg rename to static/bootstrap-icons-1.13.1/clouds-fill.svg diff --git a/static/bootstrap-icons/clouds.svg b/static/bootstrap-icons-1.13.1/clouds.svg similarity index 100% rename from static/bootstrap-icons/clouds.svg rename to static/bootstrap-icons-1.13.1/clouds.svg diff --git a/static/bootstrap-icons/cloudy-fill.svg b/static/bootstrap-icons-1.13.1/cloudy-fill.svg similarity index 100% rename from static/bootstrap-icons/cloudy-fill.svg rename to static/bootstrap-icons-1.13.1/cloudy-fill.svg diff --git a/static/bootstrap-icons/cloudy.svg b/static/bootstrap-icons-1.13.1/cloudy.svg similarity index 100% rename from static/bootstrap-icons/cloudy.svg rename to static/bootstrap-icons-1.13.1/cloudy.svg diff --git a/static/bootstrap-icons/code-slash.svg b/static/bootstrap-icons-1.13.1/code-slash.svg similarity index 100% rename from static/bootstrap-icons/code-slash.svg rename to static/bootstrap-icons-1.13.1/code-slash.svg diff --git a/static/bootstrap-icons/code-square.svg b/static/bootstrap-icons-1.13.1/code-square.svg similarity index 100% rename from static/bootstrap-icons/code-square.svg rename to static/bootstrap-icons-1.13.1/code-square.svg diff --git a/static/bootstrap-icons/code.svg b/static/bootstrap-icons-1.13.1/code.svg similarity index 100% rename from static/bootstrap-icons/code.svg rename to static/bootstrap-icons-1.13.1/code.svg diff --git a/static/bootstrap-icons/coin.svg b/static/bootstrap-icons-1.13.1/coin.svg similarity index 100% rename from static/bootstrap-icons/coin.svg rename to static/bootstrap-icons-1.13.1/coin.svg diff --git a/static/bootstrap-icons/collection-fill.svg b/static/bootstrap-icons-1.13.1/collection-fill.svg similarity index 100% rename from static/bootstrap-icons/collection-fill.svg rename to static/bootstrap-icons-1.13.1/collection-fill.svg diff --git a/static/bootstrap-icons/collection-play-fill.svg b/static/bootstrap-icons-1.13.1/collection-play-fill.svg similarity index 100% rename from static/bootstrap-icons/collection-play-fill.svg rename to static/bootstrap-icons-1.13.1/collection-play-fill.svg diff --git a/static/bootstrap-icons/collection-play.svg b/static/bootstrap-icons-1.13.1/collection-play.svg similarity index 100% rename from static/bootstrap-icons/collection-play.svg rename to static/bootstrap-icons-1.13.1/collection-play.svg diff --git a/static/bootstrap-icons/collection.svg b/static/bootstrap-icons-1.13.1/collection.svg similarity index 100% rename from static/bootstrap-icons/collection.svg rename to static/bootstrap-icons-1.13.1/collection.svg diff --git a/static/bootstrap-icons/columns-gap.svg b/static/bootstrap-icons-1.13.1/columns-gap.svg similarity index 100% rename from static/bootstrap-icons/columns-gap.svg rename to static/bootstrap-icons-1.13.1/columns-gap.svg diff --git a/static/bootstrap-icons/columns.svg b/static/bootstrap-icons-1.13.1/columns.svg similarity index 100% rename from static/bootstrap-icons/columns.svg rename to static/bootstrap-icons-1.13.1/columns.svg diff --git a/static/bootstrap-icons/command.svg b/static/bootstrap-icons-1.13.1/command.svg similarity index 100% rename from static/bootstrap-icons/command.svg rename to static/bootstrap-icons-1.13.1/command.svg diff --git a/static/bootstrap-icons/compass-fill.svg b/static/bootstrap-icons-1.13.1/compass-fill.svg similarity index 100% rename from static/bootstrap-icons/compass-fill.svg rename to static/bootstrap-icons-1.13.1/compass-fill.svg diff --git a/static/bootstrap-icons/compass.svg b/static/bootstrap-icons-1.13.1/compass.svg similarity index 100% rename from static/bootstrap-icons/compass.svg rename to static/bootstrap-icons-1.13.1/compass.svg diff --git a/static/bootstrap-icons/cone-striped.svg b/static/bootstrap-icons-1.13.1/cone-striped.svg similarity index 100% rename from static/bootstrap-icons/cone-striped.svg rename to static/bootstrap-icons-1.13.1/cone-striped.svg diff --git a/static/bootstrap-icons/cone.svg b/static/bootstrap-icons-1.13.1/cone.svg similarity index 100% rename from static/bootstrap-icons/cone.svg rename to static/bootstrap-icons-1.13.1/cone.svg diff --git a/static/bootstrap-icons/controller.svg b/static/bootstrap-icons-1.13.1/controller.svg similarity index 100% rename from static/bootstrap-icons/controller.svg rename to static/bootstrap-icons-1.13.1/controller.svg diff --git a/static/bootstrap-icons/cookie.svg b/static/bootstrap-icons-1.13.1/cookie.svg similarity index 100% rename from static/bootstrap-icons/cookie.svg rename to static/bootstrap-icons-1.13.1/cookie.svg diff --git a/static/bootstrap-icons/copy.svg b/static/bootstrap-icons-1.13.1/copy.svg similarity index 100% rename from static/bootstrap-icons/copy.svg rename to static/bootstrap-icons-1.13.1/copy.svg diff --git a/static/bootstrap-icons/cpu-fill.svg b/static/bootstrap-icons-1.13.1/cpu-fill.svg similarity index 100% rename from static/bootstrap-icons/cpu-fill.svg rename to static/bootstrap-icons-1.13.1/cpu-fill.svg diff --git a/static/bootstrap-icons/cpu.svg b/static/bootstrap-icons-1.13.1/cpu.svg similarity index 100% rename from static/bootstrap-icons/cpu.svg rename to static/bootstrap-icons-1.13.1/cpu.svg diff --git a/static/bootstrap-icons/credit-card-2-back-fill.svg b/static/bootstrap-icons-1.13.1/credit-card-2-back-fill.svg similarity index 100% rename from static/bootstrap-icons/credit-card-2-back-fill.svg rename to static/bootstrap-icons-1.13.1/credit-card-2-back-fill.svg diff --git a/static/bootstrap-icons/credit-card-2-back.svg b/static/bootstrap-icons-1.13.1/credit-card-2-back.svg similarity index 100% rename from static/bootstrap-icons/credit-card-2-back.svg rename to static/bootstrap-icons-1.13.1/credit-card-2-back.svg diff --git a/static/bootstrap-icons/credit-card-2-front-fill.svg b/static/bootstrap-icons-1.13.1/credit-card-2-front-fill.svg similarity index 100% rename from static/bootstrap-icons/credit-card-2-front-fill.svg rename to static/bootstrap-icons-1.13.1/credit-card-2-front-fill.svg diff --git a/static/bootstrap-icons/credit-card-2-front.svg b/static/bootstrap-icons-1.13.1/credit-card-2-front.svg similarity index 100% rename from static/bootstrap-icons/credit-card-2-front.svg rename to static/bootstrap-icons-1.13.1/credit-card-2-front.svg diff --git a/static/bootstrap-icons/credit-card-fill.svg b/static/bootstrap-icons-1.13.1/credit-card-fill.svg similarity index 100% rename from static/bootstrap-icons/credit-card-fill.svg rename to static/bootstrap-icons-1.13.1/credit-card-fill.svg diff --git a/static/bootstrap-icons/credit-card.svg b/static/bootstrap-icons-1.13.1/credit-card.svg similarity index 100% rename from static/bootstrap-icons/credit-card.svg rename to static/bootstrap-icons-1.13.1/credit-card.svg diff --git a/static/bootstrap-icons/crop.svg b/static/bootstrap-icons-1.13.1/crop.svg similarity index 100% rename from static/bootstrap-icons/crop.svg rename to static/bootstrap-icons-1.13.1/crop.svg diff --git a/static/bootstrap-icons/crosshair.svg b/static/bootstrap-icons-1.13.1/crosshair.svg similarity index 100% rename from static/bootstrap-icons/crosshair.svg rename to static/bootstrap-icons-1.13.1/crosshair.svg diff --git a/static/bootstrap-icons/crosshair2.svg b/static/bootstrap-icons-1.13.1/crosshair2.svg similarity index 100% rename from static/bootstrap-icons/crosshair2.svg rename to static/bootstrap-icons-1.13.1/crosshair2.svg diff --git a/static/bootstrap-icons/css.svg b/static/bootstrap-icons-1.13.1/css.svg similarity index 100% rename from static/bootstrap-icons/css.svg rename to static/bootstrap-icons-1.13.1/css.svg diff --git a/static/bootstrap-icons/cup-fill.svg b/static/bootstrap-icons-1.13.1/cup-fill.svg similarity index 100% rename from static/bootstrap-icons/cup-fill.svg rename to static/bootstrap-icons-1.13.1/cup-fill.svg diff --git a/static/bootstrap-icons/cup-hot-fill.svg b/static/bootstrap-icons-1.13.1/cup-hot-fill.svg similarity index 100% rename from static/bootstrap-icons/cup-hot-fill.svg rename to static/bootstrap-icons-1.13.1/cup-hot-fill.svg diff --git a/static/bootstrap-icons/cup-hot.svg b/static/bootstrap-icons-1.13.1/cup-hot.svg similarity index 100% rename from static/bootstrap-icons/cup-hot.svg rename to static/bootstrap-icons-1.13.1/cup-hot.svg diff --git a/static/bootstrap-icons/cup-straw.svg b/static/bootstrap-icons-1.13.1/cup-straw.svg similarity index 100% rename from static/bootstrap-icons/cup-straw.svg rename to static/bootstrap-icons-1.13.1/cup-straw.svg diff --git a/static/bootstrap-icons/cup.svg b/static/bootstrap-icons-1.13.1/cup.svg similarity index 100% rename from static/bootstrap-icons/cup.svg rename to static/bootstrap-icons-1.13.1/cup.svg diff --git a/static/bootstrap-icons/currency-bitcoin.svg b/static/bootstrap-icons-1.13.1/currency-bitcoin.svg similarity index 100% rename from static/bootstrap-icons/currency-bitcoin.svg rename to static/bootstrap-icons-1.13.1/currency-bitcoin.svg diff --git a/static/bootstrap-icons/currency-dollar.svg b/static/bootstrap-icons-1.13.1/currency-dollar.svg similarity index 100% rename from static/bootstrap-icons/currency-dollar.svg rename to static/bootstrap-icons-1.13.1/currency-dollar.svg diff --git a/static/bootstrap-icons/currency-euro.svg b/static/bootstrap-icons-1.13.1/currency-euro.svg similarity index 100% rename from static/bootstrap-icons/currency-euro.svg rename to static/bootstrap-icons-1.13.1/currency-euro.svg diff --git a/static/bootstrap-icons/currency-exchange.svg b/static/bootstrap-icons-1.13.1/currency-exchange.svg similarity index 100% rename from static/bootstrap-icons/currency-exchange.svg rename to static/bootstrap-icons-1.13.1/currency-exchange.svg diff --git a/static/bootstrap-icons/currency-pound.svg b/static/bootstrap-icons-1.13.1/currency-pound.svg similarity index 100% rename from static/bootstrap-icons/currency-pound.svg rename to static/bootstrap-icons-1.13.1/currency-pound.svg diff --git a/static/bootstrap-icons/currency-rupee.svg b/static/bootstrap-icons-1.13.1/currency-rupee.svg similarity index 100% rename from static/bootstrap-icons/currency-rupee.svg rename to static/bootstrap-icons-1.13.1/currency-rupee.svg diff --git a/static/bootstrap-icons/currency-yen.svg b/static/bootstrap-icons-1.13.1/currency-yen.svg similarity index 100% rename from static/bootstrap-icons/currency-yen.svg rename to static/bootstrap-icons-1.13.1/currency-yen.svg diff --git a/static/bootstrap-icons/cursor-fill.svg b/static/bootstrap-icons-1.13.1/cursor-fill.svg similarity index 100% rename from static/bootstrap-icons/cursor-fill.svg rename to static/bootstrap-icons-1.13.1/cursor-fill.svg diff --git a/static/bootstrap-icons/cursor-text.svg b/static/bootstrap-icons-1.13.1/cursor-text.svg similarity index 100% rename from static/bootstrap-icons/cursor-text.svg rename to static/bootstrap-icons-1.13.1/cursor-text.svg diff --git a/static/bootstrap-icons/cursor.svg b/static/bootstrap-icons-1.13.1/cursor.svg similarity index 100% rename from static/bootstrap-icons/cursor.svg rename to static/bootstrap-icons-1.13.1/cursor.svg diff --git a/static/bootstrap-icons/dash-circle-dotted.svg b/static/bootstrap-icons-1.13.1/dash-circle-dotted.svg similarity index 100% rename from static/bootstrap-icons/dash-circle-dotted.svg rename to static/bootstrap-icons-1.13.1/dash-circle-dotted.svg diff --git a/static/bootstrap-icons/dash-circle-fill.svg b/static/bootstrap-icons-1.13.1/dash-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/dash-circle-fill.svg rename to static/bootstrap-icons-1.13.1/dash-circle-fill.svg diff --git a/static/bootstrap-icons/dash-circle.svg b/static/bootstrap-icons-1.13.1/dash-circle.svg similarity index 100% rename from static/bootstrap-icons/dash-circle.svg rename to static/bootstrap-icons-1.13.1/dash-circle.svg diff --git a/static/bootstrap-icons/dash-lg.svg b/static/bootstrap-icons-1.13.1/dash-lg.svg similarity index 100% rename from static/bootstrap-icons/dash-lg.svg rename to static/bootstrap-icons-1.13.1/dash-lg.svg diff --git a/static/bootstrap-icons/dash-square-dotted.svg b/static/bootstrap-icons-1.13.1/dash-square-dotted.svg similarity index 100% rename from static/bootstrap-icons/dash-square-dotted.svg rename to static/bootstrap-icons-1.13.1/dash-square-dotted.svg diff --git a/static/bootstrap-icons/dash-square-fill.svg b/static/bootstrap-icons-1.13.1/dash-square-fill.svg similarity index 100% rename from static/bootstrap-icons/dash-square-fill.svg rename to static/bootstrap-icons-1.13.1/dash-square-fill.svg diff --git a/static/bootstrap-icons/dash-square.svg b/static/bootstrap-icons-1.13.1/dash-square.svg similarity index 100% rename from static/bootstrap-icons/dash-square.svg rename to static/bootstrap-icons-1.13.1/dash-square.svg diff --git a/static/bootstrap-icons/dash.svg b/static/bootstrap-icons-1.13.1/dash.svg similarity index 100% rename from static/bootstrap-icons/dash.svg rename to static/bootstrap-icons-1.13.1/dash.svg diff --git a/static/bootstrap-icons/database-add.svg b/static/bootstrap-icons-1.13.1/database-add.svg similarity index 100% rename from static/bootstrap-icons/database-add.svg rename to static/bootstrap-icons-1.13.1/database-add.svg diff --git a/static/bootstrap-icons/database-check.svg b/static/bootstrap-icons-1.13.1/database-check.svg similarity index 100% rename from static/bootstrap-icons/database-check.svg rename to static/bootstrap-icons-1.13.1/database-check.svg diff --git a/static/bootstrap-icons/database-dash.svg b/static/bootstrap-icons-1.13.1/database-dash.svg similarity index 100% rename from static/bootstrap-icons/database-dash.svg rename to static/bootstrap-icons-1.13.1/database-dash.svg diff --git a/static/bootstrap-icons/database-down.svg b/static/bootstrap-icons-1.13.1/database-down.svg similarity index 100% rename from static/bootstrap-icons/database-down.svg rename to static/bootstrap-icons-1.13.1/database-down.svg diff --git a/static/bootstrap-icons/database-exclamation.svg b/static/bootstrap-icons-1.13.1/database-exclamation.svg similarity index 100% rename from static/bootstrap-icons/database-exclamation.svg rename to static/bootstrap-icons-1.13.1/database-exclamation.svg diff --git a/static/bootstrap-icons/database-fill-add.svg b/static/bootstrap-icons-1.13.1/database-fill-add.svg similarity index 100% rename from static/bootstrap-icons/database-fill-add.svg rename to static/bootstrap-icons-1.13.1/database-fill-add.svg diff --git a/static/bootstrap-icons/database-fill-check.svg b/static/bootstrap-icons-1.13.1/database-fill-check.svg similarity index 100% rename from static/bootstrap-icons/database-fill-check.svg rename to static/bootstrap-icons-1.13.1/database-fill-check.svg diff --git a/static/bootstrap-icons/database-fill-dash.svg b/static/bootstrap-icons-1.13.1/database-fill-dash.svg similarity index 100% rename from static/bootstrap-icons/database-fill-dash.svg rename to static/bootstrap-icons-1.13.1/database-fill-dash.svg diff --git a/static/bootstrap-icons/database-fill-down.svg b/static/bootstrap-icons-1.13.1/database-fill-down.svg similarity index 100% rename from static/bootstrap-icons/database-fill-down.svg rename to static/bootstrap-icons-1.13.1/database-fill-down.svg diff --git a/static/bootstrap-icons/database-fill-exclamation.svg b/static/bootstrap-icons-1.13.1/database-fill-exclamation.svg similarity index 100% rename from static/bootstrap-icons/database-fill-exclamation.svg rename to static/bootstrap-icons-1.13.1/database-fill-exclamation.svg diff --git a/static/bootstrap-icons/database-fill-gear.svg b/static/bootstrap-icons-1.13.1/database-fill-gear.svg similarity index 100% rename from static/bootstrap-icons/database-fill-gear.svg rename to static/bootstrap-icons-1.13.1/database-fill-gear.svg diff --git a/static/bootstrap-icons/database-fill-lock.svg b/static/bootstrap-icons-1.13.1/database-fill-lock.svg similarity index 100% rename from static/bootstrap-icons/database-fill-lock.svg rename to static/bootstrap-icons-1.13.1/database-fill-lock.svg diff --git a/static/bootstrap-icons/database-fill-slash.svg b/static/bootstrap-icons-1.13.1/database-fill-slash.svg similarity index 100% rename from static/bootstrap-icons/database-fill-slash.svg rename to static/bootstrap-icons-1.13.1/database-fill-slash.svg diff --git a/static/bootstrap-icons/database-fill-up.svg b/static/bootstrap-icons-1.13.1/database-fill-up.svg similarity index 100% rename from static/bootstrap-icons/database-fill-up.svg rename to static/bootstrap-icons-1.13.1/database-fill-up.svg diff --git a/static/bootstrap-icons/database-fill-x.svg b/static/bootstrap-icons-1.13.1/database-fill-x.svg similarity index 100% rename from static/bootstrap-icons/database-fill-x.svg rename to static/bootstrap-icons-1.13.1/database-fill-x.svg diff --git a/static/bootstrap-icons/database-fill.svg b/static/bootstrap-icons-1.13.1/database-fill.svg similarity index 100% rename from static/bootstrap-icons/database-fill.svg rename to static/bootstrap-icons-1.13.1/database-fill.svg diff --git a/static/bootstrap-icons/database-gear.svg b/static/bootstrap-icons-1.13.1/database-gear.svg similarity index 100% rename from static/bootstrap-icons/database-gear.svg rename to static/bootstrap-icons-1.13.1/database-gear.svg diff --git a/static/bootstrap-icons/database-lock.svg b/static/bootstrap-icons-1.13.1/database-lock.svg similarity index 100% rename from static/bootstrap-icons/database-lock.svg rename to static/bootstrap-icons-1.13.1/database-lock.svg diff --git a/static/bootstrap-icons/database-slash.svg b/static/bootstrap-icons-1.13.1/database-slash.svg similarity index 100% rename from static/bootstrap-icons/database-slash.svg rename to static/bootstrap-icons-1.13.1/database-slash.svg diff --git a/static/bootstrap-icons/database-up.svg b/static/bootstrap-icons-1.13.1/database-up.svg similarity index 100% rename from static/bootstrap-icons/database-up.svg rename to static/bootstrap-icons-1.13.1/database-up.svg diff --git a/static/bootstrap-icons/database-x.svg b/static/bootstrap-icons-1.13.1/database-x.svg similarity index 100% rename from static/bootstrap-icons/database-x.svg rename to static/bootstrap-icons-1.13.1/database-x.svg diff --git a/static/bootstrap-icons/database.svg b/static/bootstrap-icons-1.13.1/database.svg similarity index 100% rename from static/bootstrap-icons/database.svg rename to static/bootstrap-icons-1.13.1/database.svg diff --git a/static/bootstrap-icons/device-hdd-fill.svg b/static/bootstrap-icons-1.13.1/device-hdd-fill.svg similarity index 100% rename from static/bootstrap-icons/device-hdd-fill.svg rename to static/bootstrap-icons-1.13.1/device-hdd-fill.svg diff --git a/static/bootstrap-icons/device-hdd.svg b/static/bootstrap-icons-1.13.1/device-hdd.svg similarity index 100% rename from static/bootstrap-icons/device-hdd.svg rename to static/bootstrap-icons-1.13.1/device-hdd.svg diff --git a/static/bootstrap-icons/device-ssd-fill.svg b/static/bootstrap-icons-1.13.1/device-ssd-fill.svg similarity index 100% rename from static/bootstrap-icons/device-ssd-fill.svg rename to static/bootstrap-icons-1.13.1/device-ssd-fill.svg diff --git a/static/bootstrap-icons/device-ssd.svg b/static/bootstrap-icons-1.13.1/device-ssd.svg similarity index 100% rename from static/bootstrap-icons/device-ssd.svg rename to static/bootstrap-icons-1.13.1/device-ssd.svg diff --git a/static/bootstrap-icons/diagram-2-fill.svg b/static/bootstrap-icons-1.13.1/diagram-2-fill.svg similarity index 100% rename from static/bootstrap-icons/diagram-2-fill.svg rename to static/bootstrap-icons-1.13.1/diagram-2-fill.svg diff --git a/static/bootstrap-icons/diagram-2.svg b/static/bootstrap-icons-1.13.1/diagram-2.svg similarity index 100% rename from static/bootstrap-icons/diagram-2.svg rename to static/bootstrap-icons-1.13.1/diagram-2.svg diff --git a/static/bootstrap-icons/diagram-3-fill.svg b/static/bootstrap-icons-1.13.1/diagram-3-fill.svg similarity index 100% rename from static/bootstrap-icons/diagram-3-fill.svg rename to static/bootstrap-icons-1.13.1/diagram-3-fill.svg diff --git a/static/bootstrap-icons/diagram-3.svg b/static/bootstrap-icons-1.13.1/diagram-3.svg similarity index 100% rename from static/bootstrap-icons/diagram-3.svg rename to static/bootstrap-icons-1.13.1/diagram-3.svg diff --git a/static/bootstrap-icons/diamond-fill.svg b/static/bootstrap-icons-1.13.1/diamond-fill.svg similarity index 100% rename from static/bootstrap-icons/diamond-fill.svg rename to static/bootstrap-icons-1.13.1/diamond-fill.svg diff --git a/static/bootstrap-icons/diamond-half.svg b/static/bootstrap-icons-1.13.1/diamond-half.svg similarity index 100% rename from static/bootstrap-icons/diamond-half.svg rename to static/bootstrap-icons-1.13.1/diamond-half.svg diff --git a/static/bootstrap-icons/diamond.svg b/static/bootstrap-icons-1.13.1/diamond.svg similarity index 100% rename from static/bootstrap-icons/diamond.svg rename to static/bootstrap-icons-1.13.1/diamond.svg diff --git a/static/bootstrap-icons/dice-1-fill.svg b/static/bootstrap-icons-1.13.1/dice-1-fill.svg similarity index 100% rename from static/bootstrap-icons/dice-1-fill.svg rename to static/bootstrap-icons-1.13.1/dice-1-fill.svg diff --git a/static/bootstrap-icons/dice-1.svg b/static/bootstrap-icons-1.13.1/dice-1.svg similarity index 100% rename from static/bootstrap-icons/dice-1.svg rename to static/bootstrap-icons-1.13.1/dice-1.svg diff --git a/static/bootstrap-icons/dice-2-fill.svg b/static/bootstrap-icons-1.13.1/dice-2-fill.svg similarity index 100% rename from static/bootstrap-icons/dice-2-fill.svg rename to static/bootstrap-icons-1.13.1/dice-2-fill.svg diff --git a/static/bootstrap-icons/dice-2.svg b/static/bootstrap-icons-1.13.1/dice-2.svg similarity index 100% rename from static/bootstrap-icons/dice-2.svg rename to static/bootstrap-icons-1.13.1/dice-2.svg diff --git a/static/bootstrap-icons/dice-3-fill.svg b/static/bootstrap-icons-1.13.1/dice-3-fill.svg similarity index 100% rename from static/bootstrap-icons/dice-3-fill.svg rename to static/bootstrap-icons-1.13.1/dice-3-fill.svg diff --git a/static/bootstrap-icons/dice-3.svg b/static/bootstrap-icons-1.13.1/dice-3.svg similarity index 100% rename from static/bootstrap-icons/dice-3.svg rename to static/bootstrap-icons-1.13.1/dice-3.svg diff --git a/static/bootstrap-icons/dice-4-fill.svg b/static/bootstrap-icons-1.13.1/dice-4-fill.svg similarity index 100% rename from static/bootstrap-icons/dice-4-fill.svg rename to static/bootstrap-icons-1.13.1/dice-4-fill.svg diff --git a/static/bootstrap-icons/dice-4.svg b/static/bootstrap-icons-1.13.1/dice-4.svg similarity index 100% rename from static/bootstrap-icons/dice-4.svg rename to static/bootstrap-icons-1.13.1/dice-4.svg diff --git a/static/bootstrap-icons/dice-5-fill.svg b/static/bootstrap-icons-1.13.1/dice-5-fill.svg similarity index 100% rename from static/bootstrap-icons/dice-5-fill.svg rename to static/bootstrap-icons-1.13.1/dice-5-fill.svg diff --git a/static/bootstrap-icons/dice-5.svg b/static/bootstrap-icons-1.13.1/dice-5.svg similarity index 100% rename from static/bootstrap-icons/dice-5.svg rename to static/bootstrap-icons-1.13.1/dice-5.svg diff --git a/static/bootstrap-icons/dice-6-fill.svg b/static/bootstrap-icons-1.13.1/dice-6-fill.svg similarity index 100% rename from static/bootstrap-icons/dice-6-fill.svg rename to static/bootstrap-icons-1.13.1/dice-6-fill.svg diff --git a/static/bootstrap-icons/dice-6.svg b/static/bootstrap-icons-1.13.1/dice-6.svg similarity index 100% rename from static/bootstrap-icons/dice-6.svg rename to static/bootstrap-icons-1.13.1/dice-6.svg diff --git a/static/bootstrap-icons/disc-fill.svg b/static/bootstrap-icons-1.13.1/disc-fill.svg similarity index 100% rename from static/bootstrap-icons/disc-fill.svg rename to static/bootstrap-icons-1.13.1/disc-fill.svg diff --git a/static/bootstrap-icons/disc.svg b/static/bootstrap-icons-1.13.1/disc.svg similarity index 100% rename from static/bootstrap-icons/disc.svg rename to static/bootstrap-icons-1.13.1/disc.svg diff --git a/static/bootstrap-icons/discord.svg b/static/bootstrap-icons-1.13.1/discord.svg similarity index 100% rename from static/bootstrap-icons/discord.svg rename to static/bootstrap-icons-1.13.1/discord.svg diff --git a/static/bootstrap-icons/display-fill.svg b/static/bootstrap-icons-1.13.1/display-fill.svg similarity index 100% rename from static/bootstrap-icons/display-fill.svg rename to static/bootstrap-icons-1.13.1/display-fill.svg diff --git a/static/bootstrap-icons/display.svg b/static/bootstrap-icons-1.13.1/display.svg similarity index 100% rename from static/bootstrap-icons/display.svg rename to static/bootstrap-icons-1.13.1/display.svg diff --git a/static/bootstrap-icons/displayport-fill.svg b/static/bootstrap-icons-1.13.1/displayport-fill.svg similarity index 100% rename from static/bootstrap-icons/displayport-fill.svg rename to static/bootstrap-icons-1.13.1/displayport-fill.svg diff --git a/static/bootstrap-icons/displayport.svg b/static/bootstrap-icons-1.13.1/displayport.svg similarity index 100% rename from static/bootstrap-icons/displayport.svg rename to static/bootstrap-icons-1.13.1/displayport.svg diff --git a/static/bootstrap-icons/distribute-horizontal.svg b/static/bootstrap-icons-1.13.1/distribute-horizontal.svg similarity index 100% rename from static/bootstrap-icons/distribute-horizontal.svg rename to static/bootstrap-icons-1.13.1/distribute-horizontal.svg diff --git a/static/bootstrap-icons/distribute-vertical.svg b/static/bootstrap-icons-1.13.1/distribute-vertical.svg similarity index 100% rename from static/bootstrap-icons/distribute-vertical.svg rename to static/bootstrap-icons-1.13.1/distribute-vertical.svg diff --git a/static/bootstrap-icons/door-closed-fill.svg b/static/bootstrap-icons-1.13.1/door-closed-fill.svg similarity index 100% rename from static/bootstrap-icons/door-closed-fill.svg rename to static/bootstrap-icons-1.13.1/door-closed-fill.svg diff --git a/static/bootstrap-icons/door-closed.svg b/static/bootstrap-icons-1.13.1/door-closed.svg similarity index 100% rename from static/bootstrap-icons/door-closed.svg rename to static/bootstrap-icons-1.13.1/door-closed.svg diff --git a/static/bootstrap-icons/door-open-fill.svg b/static/bootstrap-icons-1.13.1/door-open-fill.svg similarity index 100% rename from static/bootstrap-icons/door-open-fill.svg rename to static/bootstrap-icons-1.13.1/door-open-fill.svg diff --git a/static/bootstrap-icons/door-open.svg b/static/bootstrap-icons-1.13.1/door-open.svg similarity index 100% rename from static/bootstrap-icons/door-open.svg rename to static/bootstrap-icons-1.13.1/door-open.svg diff --git a/static/bootstrap-icons/dot.svg b/static/bootstrap-icons-1.13.1/dot.svg similarity index 100% rename from static/bootstrap-icons/dot.svg rename to static/bootstrap-icons-1.13.1/dot.svg diff --git a/static/bootstrap-icons/download.svg b/static/bootstrap-icons-1.13.1/download.svg similarity index 100% rename from static/bootstrap-icons/download.svg rename to static/bootstrap-icons-1.13.1/download.svg diff --git a/static/bootstrap-icons/dpad-fill.svg b/static/bootstrap-icons-1.13.1/dpad-fill.svg similarity index 100% rename from static/bootstrap-icons/dpad-fill.svg rename to static/bootstrap-icons-1.13.1/dpad-fill.svg diff --git a/static/bootstrap-icons/dpad.svg b/static/bootstrap-icons-1.13.1/dpad.svg similarity index 100% rename from static/bootstrap-icons/dpad.svg rename to static/bootstrap-icons-1.13.1/dpad.svg diff --git a/static/bootstrap-icons/dribbble.svg b/static/bootstrap-icons-1.13.1/dribbble.svg similarity index 100% rename from static/bootstrap-icons/dribbble.svg rename to static/bootstrap-icons-1.13.1/dribbble.svg diff --git a/static/bootstrap-icons/dropbox.svg b/static/bootstrap-icons-1.13.1/dropbox.svg similarity index 100% rename from static/bootstrap-icons/dropbox.svg rename to static/bootstrap-icons-1.13.1/dropbox.svg diff --git a/static/bootstrap-icons/droplet-fill.svg b/static/bootstrap-icons-1.13.1/droplet-fill.svg similarity index 100% rename from static/bootstrap-icons/droplet-fill.svg rename to static/bootstrap-icons-1.13.1/droplet-fill.svg diff --git a/static/bootstrap-icons/droplet-half.svg b/static/bootstrap-icons-1.13.1/droplet-half.svg similarity index 100% rename from static/bootstrap-icons/droplet-half.svg rename to static/bootstrap-icons-1.13.1/droplet-half.svg diff --git a/static/bootstrap-icons/droplet.svg b/static/bootstrap-icons-1.13.1/droplet.svg similarity index 100% rename from static/bootstrap-icons/droplet.svg rename to static/bootstrap-icons-1.13.1/droplet.svg diff --git a/static/bootstrap-icons/duffle-fill.svg b/static/bootstrap-icons-1.13.1/duffle-fill.svg similarity index 100% rename from static/bootstrap-icons/duffle-fill.svg rename to static/bootstrap-icons-1.13.1/duffle-fill.svg diff --git a/static/bootstrap-icons/duffle.svg b/static/bootstrap-icons-1.13.1/duffle.svg similarity index 100% rename from static/bootstrap-icons/duffle.svg rename to static/bootstrap-icons-1.13.1/duffle.svg diff --git a/static/bootstrap-icons/ear-fill.svg b/static/bootstrap-icons-1.13.1/ear-fill.svg similarity index 100% rename from static/bootstrap-icons/ear-fill.svg rename to static/bootstrap-icons-1.13.1/ear-fill.svg diff --git a/static/bootstrap-icons/ear.svg b/static/bootstrap-icons-1.13.1/ear.svg similarity index 100% rename from static/bootstrap-icons/ear.svg rename to static/bootstrap-icons-1.13.1/ear.svg diff --git a/static/bootstrap-icons/earbuds.svg b/static/bootstrap-icons-1.13.1/earbuds.svg similarity index 100% rename from static/bootstrap-icons/earbuds.svg rename to static/bootstrap-icons-1.13.1/earbuds.svg diff --git a/static/bootstrap-icons/easel-fill.svg b/static/bootstrap-icons-1.13.1/easel-fill.svg similarity index 100% rename from static/bootstrap-icons/easel-fill.svg rename to static/bootstrap-icons-1.13.1/easel-fill.svg diff --git a/static/bootstrap-icons/easel.svg b/static/bootstrap-icons-1.13.1/easel.svg similarity index 100% rename from static/bootstrap-icons/easel.svg rename to static/bootstrap-icons-1.13.1/easel.svg diff --git a/static/bootstrap-icons/easel2-fill.svg b/static/bootstrap-icons-1.13.1/easel2-fill.svg similarity index 100% rename from static/bootstrap-icons/easel2-fill.svg rename to static/bootstrap-icons-1.13.1/easel2-fill.svg diff --git a/static/bootstrap-icons/easel2.svg b/static/bootstrap-icons-1.13.1/easel2.svg similarity index 100% rename from static/bootstrap-icons/easel2.svg rename to static/bootstrap-icons-1.13.1/easel2.svg diff --git a/static/bootstrap-icons/easel3-fill.svg b/static/bootstrap-icons-1.13.1/easel3-fill.svg similarity index 100% rename from static/bootstrap-icons/easel3-fill.svg rename to static/bootstrap-icons-1.13.1/easel3-fill.svg diff --git a/static/bootstrap-icons/easel3.svg b/static/bootstrap-icons-1.13.1/easel3.svg similarity index 100% rename from static/bootstrap-icons/easel3.svg rename to static/bootstrap-icons-1.13.1/easel3.svg diff --git a/static/bootstrap-icons/egg-fill.svg b/static/bootstrap-icons-1.13.1/egg-fill.svg similarity index 100% rename from static/bootstrap-icons/egg-fill.svg rename to static/bootstrap-icons-1.13.1/egg-fill.svg diff --git a/static/bootstrap-icons/egg-fried.svg b/static/bootstrap-icons-1.13.1/egg-fried.svg similarity index 100% rename from static/bootstrap-icons/egg-fried.svg rename to static/bootstrap-icons-1.13.1/egg-fried.svg diff --git a/static/bootstrap-icons/egg.svg b/static/bootstrap-icons-1.13.1/egg.svg similarity index 100% rename from static/bootstrap-icons/egg.svg rename to static/bootstrap-icons-1.13.1/egg.svg diff --git a/static/bootstrap-icons/eject-fill.svg b/static/bootstrap-icons-1.13.1/eject-fill.svg similarity index 100% rename from static/bootstrap-icons/eject-fill.svg rename to static/bootstrap-icons-1.13.1/eject-fill.svg diff --git a/static/bootstrap-icons/eject.svg b/static/bootstrap-icons-1.13.1/eject.svg similarity index 100% rename from static/bootstrap-icons/eject.svg rename to static/bootstrap-icons-1.13.1/eject.svg diff --git a/static/bootstrap-icons/emoji-angry-fill.svg b/static/bootstrap-icons-1.13.1/emoji-angry-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-angry-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-angry-fill.svg diff --git a/static/bootstrap-icons/emoji-angry.svg b/static/bootstrap-icons-1.13.1/emoji-angry.svg similarity index 100% rename from static/bootstrap-icons/emoji-angry.svg rename to static/bootstrap-icons-1.13.1/emoji-angry.svg diff --git a/static/bootstrap-icons/emoji-astonished-fill.svg b/static/bootstrap-icons-1.13.1/emoji-astonished-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-astonished-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-astonished-fill.svg diff --git a/static/bootstrap-icons/emoji-astonished.svg b/static/bootstrap-icons-1.13.1/emoji-astonished.svg similarity index 100% rename from static/bootstrap-icons/emoji-astonished.svg rename to static/bootstrap-icons-1.13.1/emoji-astonished.svg diff --git a/static/bootstrap-icons/emoji-dizzy-fill.svg b/static/bootstrap-icons-1.13.1/emoji-dizzy-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-dizzy-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-dizzy-fill.svg diff --git a/static/bootstrap-icons/emoji-dizzy.svg b/static/bootstrap-icons-1.13.1/emoji-dizzy.svg similarity index 100% rename from static/bootstrap-icons/emoji-dizzy.svg rename to static/bootstrap-icons-1.13.1/emoji-dizzy.svg diff --git a/static/bootstrap-icons/emoji-expressionless-fill.svg b/static/bootstrap-icons-1.13.1/emoji-expressionless-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-expressionless-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-expressionless-fill.svg diff --git a/static/bootstrap-icons/emoji-expressionless.svg b/static/bootstrap-icons-1.13.1/emoji-expressionless.svg similarity index 100% rename from static/bootstrap-icons/emoji-expressionless.svg rename to static/bootstrap-icons-1.13.1/emoji-expressionless.svg diff --git a/static/bootstrap-icons/emoji-frown-fill.svg b/static/bootstrap-icons-1.13.1/emoji-frown-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-frown-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-frown-fill.svg diff --git a/static/bootstrap-icons/emoji-frown.svg b/static/bootstrap-icons-1.13.1/emoji-frown.svg similarity index 100% rename from static/bootstrap-icons/emoji-frown.svg rename to static/bootstrap-icons-1.13.1/emoji-frown.svg diff --git a/static/bootstrap-icons/emoji-grimace-fill.svg b/static/bootstrap-icons-1.13.1/emoji-grimace-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-grimace-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-grimace-fill.svg diff --git a/static/bootstrap-icons/emoji-grimace.svg b/static/bootstrap-icons-1.13.1/emoji-grimace.svg similarity index 100% rename from static/bootstrap-icons/emoji-grimace.svg rename to static/bootstrap-icons-1.13.1/emoji-grimace.svg diff --git a/static/bootstrap-icons/emoji-grin-fill.svg b/static/bootstrap-icons-1.13.1/emoji-grin-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-grin-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-grin-fill.svg diff --git a/static/bootstrap-icons/emoji-grin.svg b/static/bootstrap-icons-1.13.1/emoji-grin.svg similarity index 100% rename from static/bootstrap-icons/emoji-grin.svg rename to static/bootstrap-icons-1.13.1/emoji-grin.svg diff --git a/static/bootstrap-icons/emoji-heart-eyes-fill.svg b/static/bootstrap-icons-1.13.1/emoji-heart-eyes-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-heart-eyes-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-heart-eyes-fill.svg diff --git a/static/bootstrap-icons/emoji-heart-eyes.svg b/static/bootstrap-icons-1.13.1/emoji-heart-eyes.svg similarity index 100% rename from static/bootstrap-icons/emoji-heart-eyes.svg rename to static/bootstrap-icons-1.13.1/emoji-heart-eyes.svg diff --git a/static/bootstrap-icons/emoji-kiss-fill.svg b/static/bootstrap-icons-1.13.1/emoji-kiss-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-kiss-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-kiss-fill.svg diff --git a/static/bootstrap-icons/emoji-kiss.svg b/static/bootstrap-icons-1.13.1/emoji-kiss.svg similarity index 100% rename from static/bootstrap-icons/emoji-kiss.svg rename to static/bootstrap-icons-1.13.1/emoji-kiss.svg diff --git a/static/bootstrap-icons/emoji-laughing-fill.svg b/static/bootstrap-icons-1.13.1/emoji-laughing-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-laughing-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-laughing-fill.svg diff --git a/static/bootstrap-icons/emoji-laughing.svg b/static/bootstrap-icons-1.13.1/emoji-laughing.svg similarity index 100% rename from static/bootstrap-icons/emoji-laughing.svg rename to static/bootstrap-icons-1.13.1/emoji-laughing.svg diff --git a/static/bootstrap-icons/emoji-neutral-fill.svg b/static/bootstrap-icons-1.13.1/emoji-neutral-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-neutral-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-neutral-fill.svg diff --git a/static/bootstrap-icons/emoji-neutral.svg b/static/bootstrap-icons-1.13.1/emoji-neutral.svg similarity index 100% rename from static/bootstrap-icons/emoji-neutral.svg rename to static/bootstrap-icons-1.13.1/emoji-neutral.svg diff --git a/static/bootstrap-icons/emoji-smile-fill.svg b/static/bootstrap-icons-1.13.1/emoji-smile-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-smile-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-smile-fill.svg diff --git a/static/bootstrap-icons/emoji-smile-upside-down-fill.svg b/static/bootstrap-icons-1.13.1/emoji-smile-upside-down-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-smile-upside-down-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-smile-upside-down-fill.svg diff --git a/static/bootstrap-icons/emoji-smile-upside-down.svg b/static/bootstrap-icons-1.13.1/emoji-smile-upside-down.svg similarity index 100% rename from static/bootstrap-icons/emoji-smile-upside-down.svg rename to static/bootstrap-icons-1.13.1/emoji-smile-upside-down.svg diff --git a/static/bootstrap-icons/emoji-smile.svg b/static/bootstrap-icons-1.13.1/emoji-smile.svg similarity index 100% rename from static/bootstrap-icons/emoji-smile.svg rename to static/bootstrap-icons-1.13.1/emoji-smile.svg diff --git a/static/bootstrap-icons/emoji-sunglasses-fill.svg b/static/bootstrap-icons-1.13.1/emoji-sunglasses-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-sunglasses-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-sunglasses-fill.svg diff --git a/static/bootstrap-icons/emoji-sunglasses.svg b/static/bootstrap-icons-1.13.1/emoji-sunglasses.svg similarity index 100% rename from static/bootstrap-icons/emoji-sunglasses.svg rename to static/bootstrap-icons-1.13.1/emoji-sunglasses.svg diff --git a/static/bootstrap-icons/emoji-surprise-fill.svg b/static/bootstrap-icons-1.13.1/emoji-surprise-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-surprise-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-surprise-fill.svg diff --git a/static/bootstrap-icons/emoji-surprise.svg b/static/bootstrap-icons-1.13.1/emoji-surprise.svg similarity index 100% rename from static/bootstrap-icons/emoji-surprise.svg rename to static/bootstrap-icons-1.13.1/emoji-surprise.svg diff --git a/static/bootstrap-icons/emoji-tear-fill.svg b/static/bootstrap-icons-1.13.1/emoji-tear-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-tear-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-tear-fill.svg diff --git a/static/bootstrap-icons/emoji-tear.svg b/static/bootstrap-icons-1.13.1/emoji-tear.svg similarity index 100% rename from static/bootstrap-icons/emoji-tear.svg rename to static/bootstrap-icons-1.13.1/emoji-tear.svg diff --git a/static/bootstrap-icons/emoji-wink-fill.svg b/static/bootstrap-icons-1.13.1/emoji-wink-fill.svg similarity index 100% rename from static/bootstrap-icons/emoji-wink-fill.svg rename to static/bootstrap-icons-1.13.1/emoji-wink-fill.svg diff --git a/static/bootstrap-icons/emoji-wink.svg b/static/bootstrap-icons-1.13.1/emoji-wink.svg similarity index 100% rename from static/bootstrap-icons/emoji-wink.svg rename to static/bootstrap-icons-1.13.1/emoji-wink.svg diff --git a/static/bootstrap-icons/envelope-arrow-down-fill.svg b/static/bootstrap-icons-1.13.1/envelope-arrow-down-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-arrow-down-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-arrow-down-fill.svg diff --git a/static/bootstrap-icons/envelope-arrow-down.svg b/static/bootstrap-icons-1.13.1/envelope-arrow-down.svg similarity index 100% rename from static/bootstrap-icons/envelope-arrow-down.svg rename to static/bootstrap-icons-1.13.1/envelope-arrow-down.svg diff --git a/static/bootstrap-icons/envelope-arrow-up-fill.svg b/static/bootstrap-icons-1.13.1/envelope-arrow-up-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-arrow-up-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-arrow-up-fill.svg diff --git a/static/bootstrap-icons/envelope-arrow-up.svg b/static/bootstrap-icons-1.13.1/envelope-arrow-up.svg similarity index 100% rename from static/bootstrap-icons/envelope-arrow-up.svg rename to static/bootstrap-icons-1.13.1/envelope-arrow-up.svg diff --git a/static/bootstrap-icons/envelope-at-fill.svg b/static/bootstrap-icons-1.13.1/envelope-at-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-at-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-at-fill.svg diff --git a/static/bootstrap-icons/envelope-at.svg b/static/bootstrap-icons-1.13.1/envelope-at.svg similarity index 100% rename from static/bootstrap-icons/envelope-at.svg rename to static/bootstrap-icons-1.13.1/envelope-at.svg diff --git a/static/bootstrap-icons/envelope-check-fill.svg b/static/bootstrap-icons-1.13.1/envelope-check-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-check-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-check-fill.svg diff --git a/static/bootstrap-icons/envelope-check.svg b/static/bootstrap-icons-1.13.1/envelope-check.svg similarity index 100% rename from static/bootstrap-icons/envelope-check.svg rename to static/bootstrap-icons-1.13.1/envelope-check.svg diff --git a/static/bootstrap-icons/envelope-dash-fill.svg b/static/bootstrap-icons-1.13.1/envelope-dash-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-dash-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-dash-fill.svg diff --git a/static/bootstrap-icons/envelope-dash.svg b/static/bootstrap-icons-1.13.1/envelope-dash.svg similarity index 100% rename from static/bootstrap-icons/envelope-dash.svg rename to static/bootstrap-icons-1.13.1/envelope-dash.svg diff --git a/static/bootstrap-icons/envelope-exclamation-fill.svg b/static/bootstrap-icons-1.13.1/envelope-exclamation-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-exclamation-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-exclamation-fill.svg diff --git a/static/bootstrap-icons/envelope-exclamation.svg b/static/bootstrap-icons-1.13.1/envelope-exclamation.svg similarity index 100% rename from static/bootstrap-icons/envelope-exclamation.svg rename to static/bootstrap-icons-1.13.1/envelope-exclamation.svg diff --git a/static/bootstrap-icons/envelope-fill.svg b/static/bootstrap-icons-1.13.1/envelope-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-fill.svg diff --git a/static/bootstrap-icons/envelope-heart-fill.svg b/static/bootstrap-icons-1.13.1/envelope-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-heart-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-heart-fill.svg diff --git a/static/bootstrap-icons/envelope-heart.svg b/static/bootstrap-icons-1.13.1/envelope-heart.svg similarity index 100% rename from static/bootstrap-icons/envelope-heart.svg rename to static/bootstrap-icons-1.13.1/envelope-heart.svg diff --git a/static/bootstrap-icons/envelope-open-fill.svg b/static/bootstrap-icons-1.13.1/envelope-open-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-open-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-open-fill.svg diff --git a/static/bootstrap-icons/envelope-open-heart-fill.svg b/static/bootstrap-icons-1.13.1/envelope-open-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-open-heart-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-open-heart-fill.svg diff --git a/static/bootstrap-icons/envelope-open-heart.svg b/static/bootstrap-icons-1.13.1/envelope-open-heart.svg similarity index 100% rename from static/bootstrap-icons/envelope-open-heart.svg rename to static/bootstrap-icons-1.13.1/envelope-open-heart.svg diff --git a/static/bootstrap-icons/envelope-open.svg b/static/bootstrap-icons-1.13.1/envelope-open.svg similarity index 100% rename from static/bootstrap-icons/envelope-open.svg rename to static/bootstrap-icons-1.13.1/envelope-open.svg diff --git a/static/bootstrap-icons/envelope-paper-fill.svg b/static/bootstrap-icons-1.13.1/envelope-paper-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-paper-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-paper-fill.svg diff --git a/static/bootstrap-icons/envelope-paper-heart-fill.svg b/static/bootstrap-icons-1.13.1/envelope-paper-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-paper-heart-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-paper-heart-fill.svg diff --git a/static/bootstrap-icons/envelope-paper-heart.svg b/static/bootstrap-icons-1.13.1/envelope-paper-heart.svg similarity index 100% rename from static/bootstrap-icons/envelope-paper-heart.svg rename to static/bootstrap-icons-1.13.1/envelope-paper-heart.svg diff --git a/static/bootstrap-icons/envelope-paper.svg b/static/bootstrap-icons-1.13.1/envelope-paper.svg similarity index 100% rename from static/bootstrap-icons/envelope-paper.svg rename to static/bootstrap-icons-1.13.1/envelope-paper.svg diff --git a/static/bootstrap-icons/envelope-plus-fill.svg b/static/bootstrap-icons-1.13.1/envelope-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-plus-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-plus-fill.svg diff --git a/static/bootstrap-icons/envelope-plus.svg b/static/bootstrap-icons-1.13.1/envelope-plus.svg similarity index 100% rename from static/bootstrap-icons/envelope-plus.svg rename to static/bootstrap-icons-1.13.1/envelope-plus.svg diff --git a/static/bootstrap-icons/envelope-slash-fill.svg b/static/bootstrap-icons-1.13.1/envelope-slash-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-slash-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-slash-fill.svg diff --git a/static/bootstrap-icons/envelope-slash.svg b/static/bootstrap-icons-1.13.1/envelope-slash.svg similarity index 100% rename from static/bootstrap-icons/envelope-slash.svg rename to static/bootstrap-icons-1.13.1/envelope-slash.svg diff --git a/static/bootstrap-icons/envelope-x-fill.svg b/static/bootstrap-icons-1.13.1/envelope-x-fill.svg similarity index 100% rename from static/bootstrap-icons/envelope-x-fill.svg rename to static/bootstrap-icons-1.13.1/envelope-x-fill.svg diff --git a/static/bootstrap-icons/envelope-x.svg b/static/bootstrap-icons-1.13.1/envelope-x.svg similarity index 100% rename from static/bootstrap-icons/envelope-x.svg rename to static/bootstrap-icons-1.13.1/envelope-x.svg diff --git a/static/bootstrap-icons/envelope.svg b/static/bootstrap-icons-1.13.1/envelope.svg similarity index 100% rename from static/bootstrap-icons/envelope.svg rename to static/bootstrap-icons-1.13.1/envelope.svg diff --git a/static/bootstrap-icons/eraser-fill.svg b/static/bootstrap-icons-1.13.1/eraser-fill.svg similarity index 100% rename from static/bootstrap-icons/eraser-fill.svg rename to static/bootstrap-icons-1.13.1/eraser-fill.svg diff --git a/static/bootstrap-icons/eraser.svg b/static/bootstrap-icons-1.13.1/eraser.svg similarity index 100% rename from static/bootstrap-icons/eraser.svg rename to static/bootstrap-icons-1.13.1/eraser.svg diff --git a/static/bootstrap-icons/escape.svg b/static/bootstrap-icons-1.13.1/escape.svg similarity index 100% rename from static/bootstrap-icons/escape.svg rename to static/bootstrap-icons-1.13.1/escape.svg diff --git a/static/bootstrap-icons/ethernet.svg b/static/bootstrap-icons-1.13.1/ethernet.svg similarity index 100% rename from static/bootstrap-icons/ethernet.svg rename to static/bootstrap-icons-1.13.1/ethernet.svg diff --git a/static/bootstrap-icons/ev-front-fill.svg b/static/bootstrap-icons-1.13.1/ev-front-fill.svg similarity index 100% rename from static/bootstrap-icons/ev-front-fill.svg rename to static/bootstrap-icons-1.13.1/ev-front-fill.svg diff --git a/static/bootstrap-icons/ev-front.svg b/static/bootstrap-icons-1.13.1/ev-front.svg similarity index 100% rename from static/bootstrap-icons/ev-front.svg rename to static/bootstrap-icons-1.13.1/ev-front.svg diff --git a/static/bootstrap-icons/ev-station-fill.svg b/static/bootstrap-icons-1.13.1/ev-station-fill.svg similarity index 100% rename from static/bootstrap-icons/ev-station-fill.svg rename to static/bootstrap-icons-1.13.1/ev-station-fill.svg diff --git a/static/bootstrap-icons/ev-station.svg b/static/bootstrap-icons-1.13.1/ev-station.svg similarity index 100% rename from static/bootstrap-icons/ev-station.svg rename to static/bootstrap-icons-1.13.1/ev-station.svg diff --git a/static/bootstrap-icons/exclamation-circle-fill.svg b/static/bootstrap-icons-1.13.1/exclamation-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/exclamation-circle-fill.svg rename to static/bootstrap-icons-1.13.1/exclamation-circle-fill.svg diff --git a/static/bootstrap-icons/exclamation-circle.svg b/static/bootstrap-icons-1.13.1/exclamation-circle.svg similarity index 100% rename from static/bootstrap-icons/exclamation-circle.svg rename to static/bootstrap-icons-1.13.1/exclamation-circle.svg diff --git a/static/bootstrap-icons/exclamation-diamond-fill.svg b/static/bootstrap-icons-1.13.1/exclamation-diamond-fill.svg similarity index 100% rename from static/bootstrap-icons/exclamation-diamond-fill.svg rename to static/bootstrap-icons-1.13.1/exclamation-diamond-fill.svg diff --git a/static/bootstrap-icons/exclamation-diamond.svg b/static/bootstrap-icons-1.13.1/exclamation-diamond.svg similarity index 100% rename from static/bootstrap-icons/exclamation-diamond.svg rename to static/bootstrap-icons-1.13.1/exclamation-diamond.svg diff --git a/static/bootstrap-icons/exclamation-lg.svg b/static/bootstrap-icons-1.13.1/exclamation-lg.svg similarity index 100% rename from static/bootstrap-icons/exclamation-lg.svg rename to static/bootstrap-icons-1.13.1/exclamation-lg.svg diff --git a/static/bootstrap-icons/exclamation-octagon-fill.svg b/static/bootstrap-icons-1.13.1/exclamation-octagon-fill.svg similarity index 100% rename from static/bootstrap-icons/exclamation-octagon-fill.svg rename to static/bootstrap-icons-1.13.1/exclamation-octagon-fill.svg diff --git a/static/bootstrap-icons/exclamation-octagon.svg b/static/bootstrap-icons-1.13.1/exclamation-octagon.svg similarity index 100% rename from static/bootstrap-icons/exclamation-octagon.svg rename to static/bootstrap-icons-1.13.1/exclamation-octagon.svg diff --git a/static/bootstrap-icons/exclamation-square-fill.svg b/static/bootstrap-icons-1.13.1/exclamation-square-fill.svg similarity index 100% rename from static/bootstrap-icons/exclamation-square-fill.svg rename to static/bootstrap-icons-1.13.1/exclamation-square-fill.svg diff --git a/static/bootstrap-icons/exclamation-square.svg b/static/bootstrap-icons-1.13.1/exclamation-square.svg similarity index 100% rename from static/bootstrap-icons/exclamation-square.svg rename to static/bootstrap-icons-1.13.1/exclamation-square.svg diff --git a/static/bootstrap-icons/exclamation-triangle-fill.svg b/static/bootstrap-icons-1.13.1/exclamation-triangle-fill.svg similarity index 100% rename from static/bootstrap-icons/exclamation-triangle-fill.svg rename to static/bootstrap-icons-1.13.1/exclamation-triangle-fill.svg diff --git a/static/bootstrap-icons/exclamation-triangle.svg b/static/bootstrap-icons-1.13.1/exclamation-triangle.svg similarity index 100% rename from static/bootstrap-icons/exclamation-triangle.svg rename to static/bootstrap-icons-1.13.1/exclamation-triangle.svg diff --git a/static/bootstrap-icons/exclamation.svg b/static/bootstrap-icons-1.13.1/exclamation.svg similarity index 100% rename from static/bootstrap-icons/exclamation.svg rename to static/bootstrap-icons-1.13.1/exclamation.svg diff --git a/static/bootstrap-icons/exclude.svg b/static/bootstrap-icons-1.13.1/exclude.svg similarity index 100% rename from static/bootstrap-icons/exclude.svg rename to static/bootstrap-icons-1.13.1/exclude.svg diff --git a/static/bootstrap-icons/explicit-fill.svg b/static/bootstrap-icons-1.13.1/explicit-fill.svg similarity index 100% rename from static/bootstrap-icons/explicit-fill.svg rename to static/bootstrap-icons-1.13.1/explicit-fill.svg diff --git a/static/bootstrap-icons/explicit.svg b/static/bootstrap-icons-1.13.1/explicit.svg similarity index 100% rename from static/bootstrap-icons/explicit.svg rename to static/bootstrap-icons-1.13.1/explicit.svg diff --git a/static/bootstrap-icons/exposure.svg b/static/bootstrap-icons-1.13.1/exposure.svg similarity index 100% rename from static/bootstrap-icons/exposure.svg rename to static/bootstrap-icons-1.13.1/exposure.svg diff --git a/static/bootstrap-icons/eye-fill.svg b/static/bootstrap-icons-1.13.1/eye-fill.svg similarity index 100% rename from static/bootstrap-icons/eye-fill.svg rename to static/bootstrap-icons-1.13.1/eye-fill.svg diff --git a/static/bootstrap-icons/eye-slash-fill.svg b/static/bootstrap-icons-1.13.1/eye-slash-fill.svg similarity index 100% rename from static/bootstrap-icons/eye-slash-fill.svg rename to static/bootstrap-icons-1.13.1/eye-slash-fill.svg diff --git a/static/bootstrap-icons/eye-slash.svg b/static/bootstrap-icons-1.13.1/eye-slash.svg similarity index 100% rename from static/bootstrap-icons/eye-slash.svg rename to static/bootstrap-icons-1.13.1/eye-slash.svg diff --git a/static/bootstrap-icons/eye.svg b/static/bootstrap-icons-1.13.1/eye.svg similarity index 100% rename from static/bootstrap-icons/eye.svg rename to static/bootstrap-icons-1.13.1/eye.svg diff --git a/static/bootstrap-icons/eyedropper.svg b/static/bootstrap-icons-1.13.1/eyedropper.svg similarity index 100% rename from static/bootstrap-icons/eyedropper.svg rename to static/bootstrap-icons-1.13.1/eyedropper.svg diff --git a/static/bootstrap-icons/eyeglasses.svg b/static/bootstrap-icons-1.13.1/eyeglasses.svg similarity index 100% rename from static/bootstrap-icons/eyeglasses.svg rename to static/bootstrap-icons-1.13.1/eyeglasses.svg diff --git a/static/bootstrap-icons/facebook.svg b/static/bootstrap-icons-1.13.1/facebook.svg similarity index 100% rename from static/bootstrap-icons/facebook.svg rename to static/bootstrap-icons-1.13.1/facebook.svg diff --git a/static/bootstrap-icons/fan.svg b/static/bootstrap-icons-1.13.1/fan.svg similarity index 100% rename from static/bootstrap-icons/fan.svg rename to static/bootstrap-icons-1.13.1/fan.svg diff --git a/static/bootstrap-icons/fast-forward-btn-fill.svg b/static/bootstrap-icons-1.13.1/fast-forward-btn-fill.svg similarity index 100% rename from static/bootstrap-icons/fast-forward-btn-fill.svg rename to static/bootstrap-icons-1.13.1/fast-forward-btn-fill.svg diff --git a/static/bootstrap-icons/fast-forward-btn.svg b/static/bootstrap-icons-1.13.1/fast-forward-btn.svg similarity index 100% rename from static/bootstrap-icons/fast-forward-btn.svg rename to static/bootstrap-icons-1.13.1/fast-forward-btn.svg diff --git a/static/bootstrap-icons/fast-forward-circle-fill.svg b/static/bootstrap-icons-1.13.1/fast-forward-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/fast-forward-circle-fill.svg rename to static/bootstrap-icons-1.13.1/fast-forward-circle-fill.svg diff --git a/static/bootstrap-icons/fast-forward-circle.svg b/static/bootstrap-icons-1.13.1/fast-forward-circle.svg similarity index 100% rename from static/bootstrap-icons/fast-forward-circle.svg rename to static/bootstrap-icons-1.13.1/fast-forward-circle.svg diff --git a/static/bootstrap-icons/fast-forward-fill.svg b/static/bootstrap-icons-1.13.1/fast-forward-fill.svg similarity index 100% rename from static/bootstrap-icons/fast-forward-fill.svg rename to static/bootstrap-icons-1.13.1/fast-forward-fill.svg diff --git a/static/bootstrap-icons/fast-forward.svg b/static/bootstrap-icons-1.13.1/fast-forward.svg similarity index 100% rename from static/bootstrap-icons/fast-forward.svg rename to static/bootstrap-icons-1.13.1/fast-forward.svg diff --git a/static/bootstrap-icons/feather.svg b/static/bootstrap-icons-1.13.1/feather.svg similarity index 100% rename from static/bootstrap-icons/feather.svg rename to static/bootstrap-icons-1.13.1/feather.svg diff --git a/static/bootstrap-icons/feather2.svg b/static/bootstrap-icons-1.13.1/feather2.svg similarity index 100% rename from static/bootstrap-icons/feather2.svg rename to static/bootstrap-icons-1.13.1/feather2.svg diff --git a/static/bootstrap-icons/file-arrow-down-fill.svg b/static/bootstrap-icons-1.13.1/file-arrow-down-fill.svg similarity index 100% rename from static/bootstrap-icons/file-arrow-down-fill.svg rename to static/bootstrap-icons-1.13.1/file-arrow-down-fill.svg diff --git a/static/bootstrap-icons/file-arrow-down.svg b/static/bootstrap-icons-1.13.1/file-arrow-down.svg similarity index 100% rename from static/bootstrap-icons/file-arrow-down.svg rename to static/bootstrap-icons-1.13.1/file-arrow-down.svg diff --git a/static/bootstrap-icons/file-arrow-up-fill.svg b/static/bootstrap-icons-1.13.1/file-arrow-up-fill.svg similarity index 100% rename from static/bootstrap-icons/file-arrow-up-fill.svg rename to static/bootstrap-icons-1.13.1/file-arrow-up-fill.svg diff --git a/static/bootstrap-icons/file-arrow-up.svg b/static/bootstrap-icons-1.13.1/file-arrow-up.svg similarity index 100% rename from static/bootstrap-icons/file-arrow-up.svg rename to static/bootstrap-icons-1.13.1/file-arrow-up.svg diff --git a/static/bootstrap-icons/file-bar-graph-fill.svg b/static/bootstrap-icons-1.13.1/file-bar-graph-fill.svg similarity index 100% rename from static/bootstrap-icons/file-bar-graph-fill.svg rename to static/bootstrap-icons-1.13.1/file-bar-graph-fill.svg diff --git a/static/bootstrap-icons/file-bar-graph.svg b/static/bootstrap-icons-1.13.1/file-bar-graph.svg similarity index 100% rename from static/bootstrap-icons/file-bar-graph.svg rename to static/bootstrap-icons-1.13.1/file-bar-graph.svg diff --git a/static/bootstrap-icons/file-binary-fill.svg b/static/bootstrap-icons-1.13.1/file-binary-fill.svg similarity index 100% rename from static/bootstrap-icons/file-binary-fill.svg rename to static/bootstrap-icons-1.13.1/file-binary-fill.svg diff --git a/static/bootstrap-icons/file-binary.svg b/static/bootstrap-icons-1.13.1/file-binary.svg similarity index 100% rename from static/bootstrap-icons/file-binary.svg rename to static/bootstrap-icons-1.13.1/file-binary.svg diff --git a/static/bootstrap-icons/file-break-fill.svg b/static/bootstrap-icons-1.13.1/file-break-fill.svg similarity index 100% rename from static/bootstrap-icons/file-break-fill.svg rename to static/bootstrap-icons-1.13.1/file-break-fill.svg diff --git a/static/bootstrap-icons/file-break.svg b/static/bootstrap-icons-1.13.1/file-break.svg similarity index 100% rename from static/bootstrap-icons/file-break.svg rename to static/bootstrap-icons-1.13.1/file-break.svg diff --git a/static/bootstrap-icons/file-check-fill.svg b/static/bootstrap-icons-1.13.1/file-check-fill.svg similarity index 100% rename from static/bootstrap-icons/file-check-fill.svg rename to static/bootstrap-icons-1.13.1/file-check-fill.svg diff --git a/static/bootstrap-icons/file-check.svg b/static/bootstrap-icons-1.13.1/file-check.svg similarity index 100% rename from static/bootstrap-icons/file-check.svg rename to static/bootstrap-icons-1.13.1/file-check.svg diff --git a/static/bootstrap-icons/file-code-fill.svg b/static/bootstrap-icons-1.13.1/file-code-fill.svg similarity index 100% rename from static/bootstrap-icons/file-code-fill.svg rename to static/bootstrap-icons-1.13.1/file-code-fill.svg diff --git a/static/bootstrap-icons/file-code.svg b/static/bootstrap-icons-1.13.1/file-code.svg similarity index 100% rename from static/bootstrap-icons/file-code.svg rename to static/bootstrap-icons-1.13.1/file-code.svg diff --git a/static/bootstrap-icons/file-diff-fill.svg b/static/bootstrap-icons-1.13.1/file-diff-fill.svg similarity index 100% rename from static/bootstrap-icons/file-diff-fill.svg rename to static/bootstrap-icons-1.13.1/file-diff-fill.svg diff --git a/static/bootstrap-icons/file-diff.svg b/static/bootstrap-icons-1.13.1/file-diff.svg similarity index 100% rename from static/bootstrap-icons/file-diff.svg rename to static/bootstrap-icons-1.13.1/file-diff.svg diff --git a/static/bootstrap-icons/file-earmark-arrow-down-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-arrow-down-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-arrow-down-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-arrow-down-fill.svg diff --git a/static/bootstrap-icons/file-earmark-arrow-down.svg b/static/bootstrap-icons-1.13.1/file-earmark-arrow-down.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-arrow-down.svg rename to static/bootstrap-icons-1.13.1/file-earmark-arrow-down.svg diff --git a/static/bootstrap-icons/file-earmark-arrow-up-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-arrow-up-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-arrow-up-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-arrow-up-fill.svg diff --git a/static/bootstrap-icons/file-earmark-arrow-up.svg b/static/bootstrap-icons-1.13.1/file-earmark-arrow-up.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-arrow-up.svg rename to static/bootstrap-icons-1.13.1/file-earmark-arrow-up.svg diff --git a/static/bootstrap-icons/file-earmark-bar-graph-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-bar-graph-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-bar-graph-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-bar-graph-fill.svg diff --git a/static/bootstrap-icons/file-earmark-bar-graph.svg b/static/bootstrap-icons-1.13.1/file-earmark-bar-graph.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-bar-graph.svg rename to static/bootstrap-icons-1.13.1/file-earmark-bar-graph.svg diff --git a/static/bootstrap-icons/file-earmark-binary-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-binary-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-binary-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-binary-fill.svg diff --git a/static/bootstrap-icons/file-earmark-binary.svg b/static/bootstrap-icons-1.13.1/file-earmark-binary.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-binary.svg rename to static/bootstrap-icons-1.13.1/file-earmark-binary.svg diff --git a/static/bootstrap-icons/file-earmark-break-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-break-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-break-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-break-fill.svg diff --git a/static/bootstrap-icons/file-earmark-break.svg b/static/bootstrap-icons-1.13.1/file-earmark-break.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-break.svg rename to static/bootstrap-icons-1.13.1/file-earmark-break.svg diff --git a/static/bootstrap-icons/file-earmark-check-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-check-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-check-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-check-fill.svg diff --git a/static/bootstrap-icons/file-earmark-check.svg b/static/bootstrap-icons-1.13.1/file-earmark-check.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-check.svg rename to static/bootstrap-icons-1.13.1/file-earmark-check.svg diff --git a/static/bootstrap-icons/file-earmark-code-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-code-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-code-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-code-fill.svg diff --git a/static/bootstrap-icons/file-earmark-code.svg b/static/bootstrap-icons-1.13.1/file-earmark-code.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-code.svg rename to static/bootstrap-icons-1.13.1/file-earmark-code.svg diff --git a/static/bootstrap-icons/file-earmark-diff-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-diff-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-diff-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-diff-fill.svg diff --git a/static/bootstrap-icons/file-earmark-diff.svg b/static/bootstrap-icons-1.13.1/file-earmark-diff.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-diff.svg rename to static/bootstrap-icons-1.13.1/file-earmark-diff.svg diff --git a/static/bootstrap-icons/file-earmark-easel-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-easel-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-easel-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-easel-fill.svg diff --git a/static/bootstrap-icons/file-earmark-easel.svg b/static/bootstrap-icons-1.13.1/file-earmark-easel.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-easel.svg rename to static/bootstrap-icons-1.13.1/file-earmark-easel.svg diff --git a/static/bootstrap-icons/file-earmark-excel-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-excel-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-excel-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-excel-fill.svg diff --git a/static/bootstrap-icons/file-earmark-excel.svg b/static/bootstrap-icons-1.13.1/file-earmark-excel.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-excel.svg rename to static/bootstrap-icons-1.13.1/file-earmark-excel.svg diff --git a/static/bootstrap-icons/file-earmark-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-fill.svg diff --git a/static/bootstrap-icons/file-earmark-font-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-font-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-font-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-font-fill.svg diff --git a/static/bootstrap-icons/file-earmark-font.svg b/static/bootstrap-icons-1.13.1/file-earmark-font.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-font.svg rename to static/bootstrap-icons-1.13.1/file-earmark-font.svg diff --git a/static/bootstrap-icons/file-earmark-image-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-image-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-image-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-image-fill.svg diff --git a/static/bootstrap-icons/file-earmark-image.svg b/static/bootstrap-icons-1.13.1/file-earmark-image.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-image.svg rename to static/bootstrap-icons-1.13.1/file-earmark-image.svg diff --git a/static/bootstrap-icons/file-earmark-lock-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-lock-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-lock-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-lock-fill.svg diff --git a/static/bootstrap-icons/file-earmark-lock.svg b/static/bootstrap-icons-1.13.1/file-earmark-lock.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-lock.svg rename to static/bootstrap-icons-1.13.1/file-earmark-lock.svg diff --git a/static/bootstrap-icons/file-earmark-lock2-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-lock2-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-lock2-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-lock2-fill.svg diff --git a/static/bootstrap-icons/file-earmark-lock2.svg b/static/bootstrap-icons-1.13.1/file-earmark-lock2.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-lock2.svg rename to static/bootstrap-icons-1.13.1/file-earmark-lock2.svg diff --git a/static/bootstrap-icons/file-earmark-medical-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-medical-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-medical-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-medical-fill.svg diff --git a/static/bootstrap-icons/file-earmark-medical.svg b/static/bootstrap-icons-1.13.1/file-earmark-medical.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-medical.svg rename to static/bootstrap-icons-1.13.1/file-earmark-medical.svg diff --git a/static/bootstrap-icons/file-earmark-minus-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-minus-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-minus-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-minus-fill.svg diff --git a/static/bootstrap-icons/file-earmark-minus.svg b/static/bootstrap-icons-1.13.1/file-earmark-minus.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-minus.svg rename to static/bootstrap-icons-1.13.1/file-earmark-minus.svg diff --git a/static/bootstrap-icons/file-earmark-music-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-music-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-music-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-music-fill.svg diff --git a/static/bootstrap-icons/file-earmark-music.svg b/static/bootstrap-icons-1.13.1/file-earmark-music.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-music.svg rename to static/bootstrap-icons-1.13.1/file-earmark-music.svg diff --git a/static/bootstrap-icons/file-earmark-pdf-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-pdf-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-pdf-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-pdf-fill.svg diff --git a/static/bootstrap-icons/file-earmark-pdf.svg b/static/bootstrap-icons-1.13.1/file-earmark-pdf.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-pdf.svg rename to static/bootstrap-icons-1.13.1/file-earmark-pdf.svg diff --git a/static/bootstrap-icons/file-earmark-person-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-person-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-person-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-person-fill.svg diff --git a/static/bootstrap-icons/file-earmark-person.svg b/static/bootstrap-icons-1.13.1/file-earmark-person.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-person.svg rename to static/bootstrap-icons-1.13.1/file-earmark-person.svg diff --git a/static/bootstrap-icons/file-earmark-play-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-play-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-play-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-play-fill.svg diff --git a/static/bootstrap-icons/file-earmark-play.svg b/static/bootstrap-icons-1.13.1/file-earmark-play.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-play.svg rename to static/bootstrap-icons-1.13.1/file-earmark-play.svg diff --git a/static/bootstrap-icons/file-earmark-plus-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-plus-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-plus-fill.svg diff --git a/static/bootstrap-icons/file-earmark-plus.svg b/static/bootstrap-icons-1.13.1/file-earmark-plus.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-plus.svg rename to static/bootstrap-icons-1.13.1/file-earmark-plus.svg diff --git a/static/bootstrap-icons/file-earmark-post-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-post-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-post-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-post-fill.svg diff --git a/static/bootstrap-icons/file-earmark-post.svg b/static/bootstrap-icons-1.13.1/file-earmark-post.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-post.svg rename to static/bootstrap-icons-1.13.1/file-earmark-post.svg diff --git a/static/bootstrap-icons/file-earmark-ppt-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-ppt-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-ppt-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-ppt-fill.svg diff --git a/static/bootstrap-icons/file-earmark-ppt.svg b/static/bootstrap-icons-1.13.1/file-earmark-ppt.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-ppt.svg rename to static/bootstrap-icons-1.13.1/file-earmark-ppt.svg diff --git a/static/bootstrap-icons/file-earmark-richtext-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-richtext-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-richtext-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-richtext-fill.svg diff --git a/static/bootstrap-icons/file-earmark-richtext.svg b/static/bootstrap-icons-1.13.1/file-earmark-richtext.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-richtext.svg rename to static/bootstrap-icons-1.13.1/file-earmark-richtext.svg diff --git a/static/bootstrap-icons/file-earmark-ruled-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-ruled-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-ruled-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-ruled-fill.svg diff --git a/static/bootstrap-icons/file-earmark-ruled.svg b/static/bootstrap-icons-1.13.1/file-earmark-ruled.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-ruled.svg rename to static/bootstrap-icons-1.13.1/file-earmark-ruled.svg diff --git a/static/bootstrap-icons/file-earmark-slides-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-slides-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-slides-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-slides-fill.svg diff --git a/static/bootstrap-icons/file-earmark-slides.svg b/static/bootstrap-icons-1.13.1/file-earmark-slides.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-slides.svg rename to static/bootstrap-icons-1.13.1/file-earmark-slides.svg diff --git a/static/bootstrap-icons/file-earmark-spreadsheet-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-spreadsheet-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-spreadsheet-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-spreadsheet-fill.svg diff --git a/static/bootstrap-icons/file-earmark-spreadsheet.svg b/static/bootstrap-icons-1.13.1/file-earmark-spreadsheet.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-spreadsheet.svg rename to static/bootstrap-icons-1.13.1/file-earmark-spreadsheet.svg diff --git a/static/bootstrap-icons/file-earmark-text-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-text-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-text-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-text-fill.svg diff --git a/static/bootstrap-icons/file-earmark-text.svg b/static/bootstrap-icons-1.13.1/file-earmark-text.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-text.svg rename to static/bootstrap-icons-1.13.1/file-earmark-text.svg diff --git a/static/bootstrap-icons/file-earmark-word-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-word-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-word-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-word-fill.svg diff --git a/static/bootstrap-icons/file-earmark-word.svg b/static/bootstrap-icons-1.13.1/file-earmark-word.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-word.svg rename to static/bootstrap-icons-1.13.1/file-earmark-word.svg diff --git a/static/bootstrap-icons/file-earmark-x-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-x-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-x-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-x-fill.svg diff --git a/static/bootstrap-icons/file-earmark-x.svg b/static/bootstrap-icons-1.13.1/file-earmark-x.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-x.svg rename to static/bootstrap-icons-1.13.1/file-earmark-x.svg diff --git a/static/bootstrap-icons/file-earmark-zip-fill.svg b/static/bootstrap-icons-1.13.1/file-earmark-zip-fill.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-zip-fill.svg rename to static/bootstrap-icons-1.13.1/file-earmark-zip-fill.svg diff --git a/static/bootstrap-icons/file-earmark-zip.svg b/static/bootstrap-icons-1.13.1/file-earmark-zip.svg similarity index 100% rename from static/bootstrap-icons/file-earmark-zip.svg rename to static/bootstrap-icons-1.13.1/file-earmark-zip.svg diff --git a/static/bootstrap-icons/file-earmark.svg b/static/bootstrap-icons-1.13.1/file-earmark.svg similarity index 100% rename from static/bootstrap-icons/file-earmark.svg rename to static/bootstrap-icons-1.13.1/file-earmark.svg diff --git a/static/bootstrap-icons/file-easel-fill.svg b/static/bootstrap-icons-1.13.1/file-easel-fill.svg similarity index 100% rename from static/bootstrap-icons/file-easel-fill.svg rename to static/bootstrap-icons-1.13.1/file-easel-fill.svg diff --git a/static/bootstrap-icons/file-easel.svg b/static/bootstrap-icons-1.13.1/file-easel.svg similarity index 100% rename from static/bootstrap-icons/file-easel.svg rename to static/bootstrap-icons-1.13.1/file-easel.svg diff --git a/static/bootstrap-icons/file-excel-fill.svg b/static/bootstrap-icons-1.13.1/file-excel-fill.svg similarity index 100% rename from static/bootstrap-icons/file-excel-fill.svg rename to static/bootstrap-icons-1.13.1/file-excel-fill.svg diff --git a/static/bootstrap-icons/file-excel.svg b/static/bootstrap-icons-1.13.1/file-excel.svg similarity index 100% rename from static/bootstrap-icons/file-excel.svg rename to static/bootstrap-icons-1.13.1/file-excel.svg diff --git a/static/bootstrap-icons/file-fill.svg b/static/bootstrap-icons-1.13.1/file-fill.svg similarity index 100% rename from static/bootstrap-icons/file-fill.svg rename to static/bootstrap-icons-1.13.1/file-fill.svg diff --git a/static/bootstrap-icons/file-font-fill.svg b/static/bootstrap-icons-1.13.1/file-font-fill.svg similarity index 100% rename from static/bootstrap-icons/file-font-fill.svg rename to static/bootstrap-icons-1.13.1/file-font-fill.svg diff --git a/static/bootstrap-icons/file-font.svg b/static/bootstrap-icons-1.13.1/file-font.svg similarity index 100% rename from static/bootstrap-icons/file-font.svg rename to static/bootstrap-icons-1.13.1/file-font.svg diff --git a/static/bootstrap-icons/file-image-fill.svg b/static/bootstrap-icons-1.13.1/file-image-fill.svg similarity index 100% rename from static/bootstrap-icons/file-image-fill.svg rename to static/bootstrap-icons-1.13.1/file-image-fill.svg diff --git a/static/bootstrap-icons/file-image.svg b/static/bootstrap-icons-1.13.1/file-image.svg similarity index 100% rename from static/bootstrap-icons/file-image.svg rename to static/bootstrap-icons-1.13.1/file-image.svg diff --git a/static/bootstrap-icons/file-lock-fill.svg b/static/bootstrap-icons-1.13.1/file-lock-fill.svg similarity index 100% rename from static/bootstrap-icons/file-lock-fill.svg rename to static/bootstrap-icons-1.13.1/file-lock-fill.svg diff --git a/static/bootstrap-icons/file-lock.svg b/static/bootstrap-icons-1.13.1/file-lock.svg similarity index 100% rename from static/bootstrap-icons/file-lock.svg rename to static/bootstrap-icons-1.13.1/file-lock.svg diff --git a/static/bootstrap-icons/file-lock2-fill.svg b/static/bootstrap-icons-1.13.1/file-lock2-fill.svg similarity index 100% rename from static/bootstrap-icons/file-lock2-fill.svg rename to static/bootstrap-icons-1.13.1/file-lock2-fill.svg diff --git a/static/bootstrap-icons/file-lock2.svg b/static/bootstrap-icons-1.13.1/file-lock2.svg similarity index 100% rename from static/bootstrap-icons/file-lock2.svg rename to static/bootstrap-icons-1.13.1/file-lock2.svg diff --git a/static/bootstrap-icons/file-medical-fill.svg b/static/bootstrap-icons-1.13.1/file-medical-fill.svg similarity index 100% rename from static/bootstrap-icons/file-medical-fill.svg rename to static/bootstrap-icons-1.13.1/file-medical-fill.svg diff --git a/static/bootstrap-icons/file-medical.svg b/static/bootstrap-icons-1.13.1/file-medical.svg similarity index 100% rename from static/bootstrap-icons/file-medical.svg rename to static/bootstrap-icons-1.13.1/file-medical.svg diff --git a/static/bootstrap-icons/file-minus-fill.svg b/static/bootstrap-icons-1.13.1/file-minus-fill.svg similarity index 100% rename from static/bootstrap-icons/file-minus-fill.svg rename to static/bootstrap-icons-1.13.1/file-minus-fill.svg diff --git a/static/bootstrap-icons/file-minus.svg b/static/bootstrap-icons-1.13.1/file-minus.svg similarity index 100% rename from static/bootstrap-icons/file-minus.svg rename to static/bootstrap-icons-1.13.1/file-minus.svg diff --git a/static/bootstrap-icons/file-music-fill.svg b/static/bootstrap-icons-1.13.1/file-music-fill.svg similarity index 100% rename from static/bootstrap-icons/file-music-fill.svg rename to static/bootstrap-icons-1.13.1/file-music-fill.svg diff --git a/static/bootstrap-icons/file-music.svg b/static/bootstrap-icons-1.13.1/file-music.svg similarity index 100% rename from static/bootstrap-icons/file-music.svg rename to static/bootstrap-icons-1.13.1/file-music.svg diff --git a/static/bootstrap-icons/file-pdf-fill.svg b/static/bootstrap-icons-1.13.1/file-pdf-fill.svg similarity index 100% rename from static/bootstrap-icons/file-pdf-fill.svg rename to static/bootstrap-icons-1.13.1/file-pdf-fill.svg diff --git a/static/bootstrap-icons/file-pdf.svg b/static/bootstrap-icons-1.13.1/file-pdf.svg similarity index 100% rename from static/bootstrap-icons/file-pdf.svg rename to static/bootstrap-icons-1.13.1/file-pdf.svg diff --git a/static/bootstrap-icons/file-person-fill.svg b/static/bootstrap-icons-1.13.1/file-person-fill.svg similarity index 100% rename from static/bootstrap-icons/file-person-fill.svg rename to static/bootstrap-icons-1.13.1/file-person-fill.svg diff --git a/static/bootstrap-icons/file-person.svg b/static/bootstrap-icons-1.13.1/file-person.svg similarity index 100% rename from static/bootstrap-icons/file-person.svg rename to static/bootstrap-icons-1.13.1/file-person.svg diff --git a/static/bootstrap-icons/file-play-fill.svg b/static/bootstrap-icons-1.13.1/file-play-fill.svg similarity index 100% rename from static/bootstrap-icons/file-play-fill.svg rename to static/bootstrap-icons-1.13.1/file-play-fill.svg diff --git a/static/bootstrap-icons/file-play.svg b/static/bootstrap-icons-1.13.1/file-play.svg similarity index 100% rename from static/bootstrap-icons/file-play.svg rename to static/bootstrap-icons-1.13.1/file-play.svg diff --git a/static/bootstrap-icons/file-plus-fill.svg b/static/bootstrap-icons-1.13.1/file-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/file-plus-fill.svg rename to static/bootstrap-icons-1.13.1/file-plus-fill.svg diff --git a/static/bootstrap-icons/file-plus.svg b/static/bootstrap-icons-1.13.1/file-plus.svg similarity index 100% rename from static/bootstrap-icons/file-plus.svg rename to static/bootstrap-icons-1.13.1/file-plus.svg diff --git a/static/bootstrap-icons/file-post-fill.svg b/static/bootstrap-icons-1.13.1/file-post-fill.svg similarity index 100% rename from static/bootstrap-icons/file-post-fill.svg rename to static/bootstrap-icons-1.13.1/file-post-fill.svg diff --git a/static/bootstrap-icons/file-post.svg b/static/bootstrap-icons-1.13.1/file-post.svg similarity index 100% rename from static/bootstrap-icons/file-post.svg rename to static/bootstrap-icons-1.13.1/file-post.svg diff --git a/static/bootstrap-icons/file-ppt-fill.svg b/static/bootstrap-icons-1.13.1/file-ppt-fill.svg similarity index 100% rename from static/bootstrap-icons/file-ppt-fill.svg rename to static/bootstrap-icons-1.13.1/file-ppt-fill.svg diff --git a/static/bootstrap-icons/file-ppt.svg b/static/bootstrap-icons-1.13.1/file-ppt.svg similarity index 100% rename from static/bootstrap-icons/file-ppt.svg rename to static/bootstrap-icons-1.13.1/file-ppt.svg diff --git a/static/bootstrap-icons/file-richtext-fill.svg b/static/bootstrap-icons-1.13.1/file-richtext-fill.svg similarity index 100% rename from static/bootstrap-icons/file-richtext-fill.svg rename to static/bootstrap-icons-1.13.1/file-richtext-fill.svg diff --git a/static/bootstrap-icons/file-richtext.svg b/static/bootstrap-icons-1.13.1/file-richtext.svg similarity index 100% rename from static/bootstrap-icons/file-richtext.svg rename to static/bootstrap-icons-1.13.1/file-richtext.svg diff --git a/static/bootstrap-icons/file-ruled-fill.svg b/static/bootstrap-icons-1.13.1/file-ruled-fill.svg similarity index 100% rename from static/bootstrap-icons/file-ruled-fill.svg rename to static/bootstrap-icons-1.13.1/file-ruled-fill.svg diff --git a/static/bootstrap-icons/file-ruled.svg b/static/bootstrap-icons-1.13.1/file-ruled.svg similarity index 100% rename from static/bootstrap-icons/file-ruled.svg rename to static/bootstrap-icons-1.13.1/file-ruled.svg diff --git a/static/bootstrap-icons/file-slides-fill.svg b/static/bootstrap-icons-1.13.1/file-slides-fill.svg similarity index 100% rename from static/bootstrap-icons/file-slides-fill.svg rename to static/bootstrap-icons-1.13.1/file-slides-fill.svg diff --git a/static/bootstrap-icons/file-slides.svg b/static/bootstrap-icons-1.13.1/file-slides.svg similarity index 100% rename from static/bootstrap-icons/file-slides.svg rename to static/bootstrap-icons-1.13.1/file-slides.svg diff --git a/static/bootstrap-icons/file-spreadsheet-fill.svg b/static/bootstrap-icons-1.13.1/file-spreadsheet-fill.svg similarity index 100% rename from static/bootstrap-icons/file-spreadsheet-fill.svg rename to static/bootstrap-icons-1.13.1/file-spreadsheet-fill.svg diff --git a/static/bootstrap-icons/file-spreadsheet.svg b/static/bootstrap-icons-1.13.1/file-spreadsheet.svg similarity index 100% rename from static/bootstrap-icons/file-spreadsheet.svg rename to static/bootstrap-icons-1.13.1/file-spreadsheet.svg diff --git a/static/bootstrap-icons/file-text-fill.svg b/static/bootstrap-icons-1.13.1/file-text-fill.svg similarity index 100% rename from static/bootstrap-icons/file-text-fill.svg rename to static/bootstrap-icons-1.13.1/file-text-fill.svg diff --git a/static/bootstrap-icons/file-text.svg b/static/bootstrap-icons-1.13.1/file-text.svg similarity index 100% rename from static/bootstrap-icons/file-text.svg rename to static/bootstrap-icons-1.13.1/file-text.svg diff --git a/static/bootstrap-icons/file-word-fill.svg b/static/bootstrap-icons-1.13.1/file-word-fill.svg similarity index 100% rename from static/bootstrap-icons/file-word-fill.svg rename to static/bootstrap-icons-1.13.1/file-word-fill.svg diff --git a/static/bootstrap-icons/file-word.svg b/static/bootstrap-icons-1.13.1/file-word.svg similarity index 100% rename from static/bootstrap-icons/file-word.svg rename to static/bootstrap-icons-1.13.1/file-word.svg diff --git a/static/bootstrap-icons/file-x-fill.svg b/static/bootstrap-icons-1.13.1/file-x-fill.svg similarity index 100% rename from static/bootstrap-icons/file-x-fill.svg rename to static/bootstrap-icons-1.13.1/file-x-fill.svg diff --git a/static/bootstrap-icons/file-x.svg b/static/bootstrap-icons-1.13.1/file-x.svg similarity index 100% rename from static/bootstrap-icons/file-x.svg rename to static/bootstrap-icons-1.13.1/file-x.svg diff --git a/static/bootstrap-icons/file-zip-fill.svg b/static/bootstrap-icons-1.13.1/file-zip-fill.svg similarity index 100% rename from static/bootstrap-icons/file-zip-fill.svg rename to static/bootstrap-icons-1.13.1/file-zip-fill.svg diff --git a/static/bootstrap-icons/file-zip.svg b/static/bootstrap-icons-1.13.1/file-zip.svg similarity index 100% rename from static/bootstrap-icons/file-zip.svg rename to static/bootstrap-icons-1.13.1/file-zip.svg diff --git a/static/bootstrap-icons/file.svg b/static/bootstrap-icons-1.13.1/file.svg similarity index 100% rename from static/bootstrap-icons/file.svg rename to static/bootstrap-icons-1.13.1/file.svg diff --git a/static/bootstrap-icons/files-alt.svg b/static/bootstrap-icons-1.13.1/files-alt.svg similarity index 100% rename from static/bootstrap-icons/files-alt.svg rename to static/bootstrap-icons-1.13.1/files-alt.svg diff --git a/static/bootstrap-icons/files.svg b/static/bootstrap-icons-1.13.1/files.svg similarity index 100% rename from static/bootstrap-icons/files.svg rename to static/bootstrap-icons-1.13.1/files.svg diff --git a/static/bootstrap-icons/filetype-aac.svg b/static/bootstrap-icons-1.13.1/filetype-aac.svg similarity index 100% rename from static/bootstrap-icons/filetype-aac.svg rename to static/bootstrap-icons-1.13.1/filetype-aac.svg diff --git a/static/bootstrap-icons/filetype-ai.svg b/static/bootstrap-icons-1.13.1/filetype-ai.svg similarity index 100% rename from static/bootstrap-icons/filetype-ai.svg rename to static/bootstrap-icons-1.13.1/filetype-ai.svg diff --git a/static/bootstrap-icons/filetype-bmp.svg b/static/bootstrap-icons-1.13.1/filetype-bmp.svg similarity index 100% rename from static/bootstrap-icons/filetype-bmp.svg rename to static/bootstrap-icons-1.13.1/filetype-bmp.svg diff --git a/static/bootstrap-icons/filetype-cs.svg b/static/bootstrap-icons-1.13.1/filetype-cs.svg similarity index 100% rename from static/bootstrap-icons/filetype-cs.svg rename to static/bootstrap-icons-1.13.1/filetype-cs.svg diff --git a/static/bootstrap-icons/filetype-css.svg b/static/bootstrap-icons-1.13.1/filetype-css.svg similarity index 100% rename from static/bootstrap-icons/filetype-css.svg rename to static/bootstrap-icons-1.13.1/filetype-css.svg diff --git a/static/bootstrap-icons/filetype-csv.svg b/static/bootstrap-icons-1.13.1/filetype-csv.svg similarity index 100% rename from static/bootstrap-icons/filetype-csv.svg rename to static/bootstrap-icons-1.13.1/filetype-csv.svg diff --git a/static/bootstrap-icons/filetype-doc.svg b/static/bootstrap-icons-1.13.1/filetype-doc.svg similarity index 100% rename from static/bootstrap-icons/filetype-doc.svg rename to static/bootstrap-icons-1.13.1/filetype-doc.svg diff --git a/static/bootstrap-icons/filetype-docx.svg b/static/bootstrap-icons-1.13.1/filetype-docx.svg similarity index 100% rename from static/bootstrap-icons/filetype-docx.svg rename to static/bootstrap-icons-1.13.1/filetype-docx.svg diff --git a/static/bootstrap-icons/filetype-exe.svg b/static/bootstrap-icons-1.13.1/filetype-exe.svg similarity index 100% rename from static/bootstrap-icons/filetype-exe.svg rename to static/bootstrap-icons-1.13.1/filetype-exe.svg diff --git a/static/bootstrap-icons/filetype-gif.svg b/static/bootstrap-icons-1.13.1/filetype-gif.svg similarity index 100% rename from static/bootstrap-icons/filetype-gif.svg rename to static/bootstrap-icons-1.13.1/filetype-gif.svg diff --git a/static/bootstrap-icons/filetype-heic.svg b/static/bootstrap-icons-1.13.1/filetype-heic.svg similarity index 100% rename from static/bootstrap-icons/filetype-heic.svg rename to static/bootstrap-icons-1.13.1/filetype-heic.svg diff --git a/static/bootstrap-icons/filetype-html.svg b/static/bootstrap-icons-1.13.1/filetype-html.svg similarity index 100% rename from static/bootstrap-icons/filetype-html.svg rename to static/bootstrap-icons-1.13.1/filetype-html.svg diff --git a/static/bootstrap-icons/filetype-java.svg b/static/bootstrap-icons-1.13.1/filetype-java.svg similarity index 100% rename from static/bootstrap-icons/filetype-java.svg rename to static/bootstrap-icons-1.13.1/filetype-java.svg diff --git a/static/bootstrap-icons/filetype-jpg.svg b/static/bootstrap-icons-1.13.1/filetype-jpg.svg similarity index 100% rename from static/bootstrap-icons/filetype-jpg.svg rename to static/bootstrap-icons-1.13.1/filetype-jpg.svg diff --git a/static/bootstrap-icons/filetype-js.svg b/static/bootstrap-icons-1.13.1/filetype-js.svg similarity index 100% rename from static/bootstrap-icons/filetype-js.svg rename to static/bootstrap-icons-1.13.1/filetype-js.svg diff --git a/static/bootstrap-icons/filetype-json.svg b/static/bootstrap-icons-1.13.1/filetype-json.svg similarity index 100% rename from static/bootstrap-icons/filetype-json.svg rename to static/bootstrap-icons-1.13.1/filetype-json.svg diff --git a/static/bootstrap-icons/filetype-jsx.svg b/static/bootstrap-icons-1.13.1/filetype-jsx.svg similarity index 100% rename from static/bootstrap-icons/filetype-jsx.svg rename to static/bootstrap-icons-1.13.1/filetype-jsx.svg diff --git a/static/bootstrap-icons/filetype-key.svg b/static/bootstrap-icons-1.13.1/filetype-key.svg similarity index 100% rename from static/bootstrap-icons/filetype-key.svg rename to static/bootstrap-icons-1.13.1/filetype-key.svg diff --git a/static/bootstrap-icons/filetype-m4p.svg b/static/bootstrap-icons-1.13.1/filetype-m4p.svg similarity index 100% rename from static/bootstrap-icons/filetype-m4p.svg rename to static/bootstrap-icons-1.13.1/filetype-m4p.svg diff --git a/static/bootstrap-icons/filetype-md.svg b/static/bootstrap-icons-1.13.1/filetype-md.svg similarity index 100% rename from static/bootstrap-icons/filetype-md.svg rename to static/bootstrap-icons-1.13.1/filetype-md.svg diff --git a/static/bootstrap-icons/filetype-mdx.svg b/static/bootstrap-icons-1.13.1/filetype-mdx.svg similarity index 100% rename from static/bootstrap-icons/filetype-mdx.svg rename to static/bootstrap-icons-1.13.1/filetype-mdx.svg diff --git a/static/bootstrap-icons/filetype-mov.svg b/static/bootstrap-icons-1.13.1/filetype-mov.svg similarity index 100% rename from static/bootstrap-icons/filetype-mov.svg rename to static/bootstrap-icons-1.13.1/filetype-mov.svg diff --git a/static/bootstrap-icons/filetype-mp3.svg b/static/bootstrap-icons-1.13.1/filetype-mp3.svg similarity index 100% rename from static/bootstrap-icons/filetype-mp3.svg rename to static/bootstrap-icons-1.13.1/filetype-mp3.svg diff --git a/static/bootstrap-icons/filetype-mp4.svg b/static/bootstrap-icons-1.13.1/filetype-mp4.svg similarity index 100% rename from static/bootstrap-icons/filetype-mp4.svg rename to static/bootstrap-icons-1.13.1/filetype-mp4.svg diff --git a/static/bootstrap-icons/filetype-otf.svg b/static/bootstrap-icons-1.13.1/filetype-otf.svg similarity index 100% rename from static/bootstrap-icons/filetype-otf.svg rename to static/bootstrap-icons-1.13.1/filetype-otf.svg diff --git a/static/bootstrap-icons/filetype-pdf.svg b/static/bootstrap-icons-1.13.1/filetype-pdf.svg similarity index 100% rename from static/bootstrap-icons/filetype-pdf.svg rename to static/bootstrap-icons-1.13.1/filetype-pdf.svg diff --git a/static/bootstrap-icons/filetype-php.svg b/static/bootstrap-icons-1.13.1/filetype-php.svg similarity index 100% rename from static/bootstrap-icons/filetype-php.svg rename to static/bootstrap-icons-1.13.1/filetype-php.svg diff --git a/static/bootstrap-icons/filetype-png.svg b/static/bootstrap-icons-1.13.1/filetype-png.svg similarity index 100% rename from static/bootstrap-icons/filetype-png.svg rename to static/bootstrap-icons-1.13.1/filetype-png.svg diff --git a/static/bootstrap-icons/filetype-ppt.svg b/static/bootstrap-icons-1.13.1/filetype-ppt.svg similarity index 100% rename from static/bootstrap-icons/filetype-ppt.svg rename to static/bootstrap-icons-1.13.1/filetype-ppt.svg diff --git a/static/bootstrap-icons/filetype-pptx.svg b/static/bootstrap-icons-1.13.1/filetype-pptx.svg similarity index 100% rename from static/bootstrap-icons/filetype-pptx.svg rename to static/bootstrap-icons-1.13.1/filetype-pptx.svg diff --git a/static/bootstrap-icons/filetype-psd.svg b/static/bootstrap-icons-1.13.1/filetype-psd.svg similarity index 100% rename from static/bootstrap-icons/filetype-psd.svg rename to static/bootstrap-icons-1.13.1/filetype-psd.svg diff --git a/static/bootstrap-icons/filetype-py.svg b/static/bootstrap-icons-1.13.1/filetype-py.svg similarity index 100% rename from static/bootstrap-icons/filetype-py.svg rename to static/bootstrap-icons-1.13.1/filetype-py.svg diff --git a/static/bootstrap-icons/filetype-raw.svg b/static/bootstrap-icons-1.13.1/filetype-raw.svg similarity index 100% rename from static/bootstrap-icons/filetype-raw.svg rename to static/bootstrap-icons-1.13.1/filetype-raw.svg diff --git a/static/bootstrap-icons/filetype-rb.svg b/static/bootstrap-icons-1.13.1/filetype-rb.svg similarity index 100% rename from static/bootstrap-icons/filetype-rb.svg rename to static/bootstrap-icons-1.13.1/filetype-rb.svg diff --git a/static/bootstrap-icons/filetype-sass.svg b/static/bootstrap-icons-1.13.1/filetype-sass.svg similarity index 100% rename from static/bootstrap-icons/filetype-sass.svg rename to static/bootstrap-icons-1.13.1/filetype-sass.svg diff --git a/static/bootstrap-icons/filetype-scss.svg b/static/bootstrap-icons-1.13.1/filetype-scss.svg similarity index 100% rename from static/bootstrap-icons/filetype-scss.svg rename to static/bootstrap-icons-1.13.1/filetype-scss.svg diff --git a/static/bootstrap-icons/filetype-sh.svg b/static/bootstrap-icons-1.13.1/filetype-sh.svg similarity index 100% rename from static/bootstrap-icons/filetype-sh.svg rename to static/bootstrap-icons-1.13.1/filetype-sh.svg diff --git a/static/bootstrap-icons/filetype-sql.svg b/static/bootstrap-icons-1.13.1/filetype-sql.svg similarity index 100% rename from static/bootstrap-icons/filetype-sql.svg rename to static/bootstrap-icons-1.13.1/filetype-sql.svg diff --git a/static/bootstrap-icons/filetype-svg.svg b/static/bootstrap-icons-1.13.1/filetype-svg.svg similarity index 100% rename from static/bootstrap-icons/filetype-svg.svg rename to static/bootstrap-icons-1.13.1/filetype-svg.svg diff --git a/static/bootstrap-icons/filetype-tiff.svg b/static/bootstrap-icons-1.13.1/filetype-tiff.svg similarity index 100% rename from static/bootstrap-icons/filetype-tiff.svg rename to static/bootstrap-icons-1.13.1/filetype-tiff.svg diff --git a/static/bootstrap-icons/filetype-tsx.svg b/static/bootstrap-icons-1.13.1/filetype-tsx.svg similarity index 100% rename from static/bootstrap-icons/filetype-tsx.svg rename to static/bootstrap-icons-1.13.1/filetype-tsx.svg diff --git a/static/bootstrap-icons/filetype-ttf.svg b/static/bootstrap-icons-1.13.1/filetype-ttf.svg similarity index 100% rename from static/bootstrap-icons/filetype-ttf.svg rename to static/bootstrap-icons-1.13.1/filetype-ttf.svg diff --git a/static/bootstrap-icons/filetype-txt.svg b/static/bootstrap-icons-1.13.1/filetype-txt.svg similarity index 100% rename from static/bootstrap-icons/filetype-txt.svg rename to static/bootstrap-icons-1.13.1/filetype-txt.svg diff --git a/static/bootstrap-icons/filetype-wav.svg b/static/bootstrap-icons-1.13.1/filetype-wav.svg similarity index 100% rename from static/bootstrap-icons/filetype-wav.svg rename to static/bootstrap-icons-1.13.1/filetype-wav.svg diff --git a/static/bootstrap-icons/filetype-woff.svg b/static/bootstrap-icons-1.13.1/filetype-woff.svg similarity index 100% rename from static/bootstrap-icons/filetype-woff.svg rename to static/bootstrap-icons-1.13.1/filetype-woff.svg diff --git a/static/bootstrap-icons/filetype-xls.svg b/static/bootstrap-icons-1.13.1/filetype-xls.svg similarity index 100% rename from static/bootstrap-icons/filetype-xls.svg rename to static/bootstrap-icons-1.13.1/filetype-xls.svg diff --git a/static/bootstrap-icons/filetype-xlsx.svg b/static/bootstrap-icons-1.13.1/filetype-xlsx.svg similarity index 100% rename from static/bootstrap-icons/filetype-xlsx.svg rename to static/bootstrap-icons-1.13.1/filetype-xlsx.svg diff --git a/static/bootstrap-icons/filetype-xml.svg b/static/bootstrap-icons-1.13.1/filetype-xml.svg similarity index 100% rename from static/bootstrap-icons/filetype-xml.svg rename to static/bootstrap-icons-1.13.1/filetype-xml.svg diff --git a/static/bootstrap-icons/filetype-yml.svg b/static/bootstrap-icons-1.13.1/filetype-yml.svg similarity index 100% rename from static/bootstrap-icons/filetype-yml.svg rename to static/bootstrap-icons-1.13.1/filetype-yml.svg diff --git a/static/bootstrap-icons/film.svg b/static/bootstrap-icons-1.13.1/film.svg similarity index 100% rename from static/bootstrap-icons/film.svg rename to static/bootstrap-icons-1.13.1/film.svg diff --git a/static/bootstrap-icons/filter-circle-fill.svg b/static/bootstrap-icons-1.13.1/filter-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/filter-circle-fill.svg rename to static/bootstrap-icons-1.13.1/filter-circle-fill.svg diff --git a/static/bootstrap-icons/filter-circle.svg b/static/bootstrap-icons-1.13.1/filter-circle.svg similarity index 100% rename from static/bootstrap-icons/filter-circle.svg rename to static/bootstrap-icons-1.13.1/filter-circle.svg diff --git a/static/bootstrap-icons/filter-left.svg b/static/bootstrap-icons-1.13.1/filter-left.svg similarity index 100% rename from static/bootstrap-icons/filter-left.svg rename to static/bootstrap-icons-1.13.1/filter-left.svg diff --git a/static/bootstrap-icons/filter-right.svg b/static/bootstrap-icons-1.13.1/filter-right.svg similarity index 100% rename from static/bootstrap-icons/filter-right.svg rename to static/bootstrap-icons-1.13.1/filter-right.svg diff --git a/static/bootstrap-icons/filter-square-fill.svg b/static/bootstrap-icons-1.13.1/filter-square-fill.svg similarity index 100% rename from static/bootstrap-icons/filter-square-fill.svg rename to static/bootstrap-icons-1.13.1/filter-square-fill.svg diff --git a/static/bootstrap-icons/filter-square.svg b/static/bootstrap-icons-1.13.1/filter-square.svg similarity index 100% rename from static/bootstrap-icons/filter-square.svg rename to static/bootstrap-icons-1.13.1/filter-square.svg diff --git a/static/bootstrap-icons/filter.svg b/static/bootstrap-icons-1.13.1/filter.svg similarity index 100% rename from static/bootstrap-icons/filter.svg rename to static/bootstrap-icons-1.13.1/filter.svg diff --git a/static/bootstrap-icons/fingerprint.svg b/static/bootstrap-icons-1.13.1/fingerprint.svg similarity index 100% rename from static/bootstrap-icons/fingerprint.svg rename to static/bootstrap-icons-1.13.1/fingerprint.svg diff --git a/static/bootstrap-icons/fire.svg b/static/bootstrap-icons-1.13.1/fire.svg similarity index 100% rename from static/bootstrap-icons/fire.svg rename to static/bootstrap-icons-1.13.1/fire.svg diff --git a/static/bootstrap-icons/flag-fill.svg b/static/bootstrap-icons-1.13.1/flag-fill.svg similarity index 100% rename from static/bootstrap-icons/flag-fill.svg rename to static/bootstrap-icons-1.13.1/flag-fill.svg diff --git a/static/bootstrap-icons/flag.svg b/static/bootstrap-icons-1.13.1/flag.svg similarity index 100% rename from static/bootstrap-icons/flag.svg rename to static/bootstrap-icons-1.13.1/flag.svg diff --git a/static/bootstrap-icons/flask-fill.svg b/static/bootstrap-icons-1.13.1/flask-fill.svg similarity index 100% rename from static/bootstrap-icons/flask-fill.svg rename to static/bootstrap-icons-1.13.1/flask-fill.svg diff --git a/static/bootstrap-icons/flask-florence-fill.svg b/static/bootstrap-icons-1.13.1/flask-florence-fill.svg similarity index 100% rename from static/bootstrap-icons/flask-florence-fill.svg rename to static/bootstrap-icons-1.13.1/flask-florence-fill.svg diff --git a/static/bootstrap-icons/flask-florence.svg b/static/bootstrap-icons-1.13.1/flask-florence.svg similarity index 100% rename from static/bootstrap-icons/flask-florence.svg rename to static/bootstrap-icons-1.13.1/flask-florence.svg diff --git a/static/bootstrap-icons/flask.svg b/static/bootstrap-icons-1.13.1/flask.svg similarity index 100% rename from static/bootstrap-icons/flask.svg rename to static/bootstrap-icons-1.13.1/flask.svg diff --git a/static/bootstrap-icons/floppy-fill.svg b/static/bootstrap-icons-1.13.1/floppy-fill.svg similarity index 100% rename from static/bootstrap-icons/floppy-fill.svg rename to static/bootstrap-icons-1.13.1/floppy-fill.svg diff --git a/static/bootstrap-icons/floppy.svg b/static/bootstrap-icons-1.13.1/floppy.svg similarity index 100% rename from static/bootstrap-icons/floppy.svg rename to static/bootstrap-icons-1.13.1/floppy.svg diff --git a/static/bootstrap-icons/floppy2-fill.svg b/static/bootstrap-icons-1.13.1/floppy2-fill.svg similarity index 100% rename from static/bootstrap-icons/floppy2-fill.svg rename to static/bootstrap-icons-1.13.1/floppy2-fill.svg diff --git a/static/bootstrap-icons/floppy2.svg b/static/bootstrap-icons-1.13.1/floppy2.svg similarity index 100% rename from static/bootstrap-icons/floppy2.svg rename to static/bootstrap-icons-1.13.1/floppy2.svg diff --git a/static/bootstrap-icons/flower1.svg b/static/bootstrap-icons-1.13.1/flower1.svg similarity index 100% rename from static/bootstrap-icons/flower1.svg rename to static/bootstrap-icons-1.13.1/flower1.svg diff --git a/static/bootstrap-icons/flower2.svg b/static/bootstrap-icons-1.13.1/flower2.svg similarity index 100% rename from static/bootstrap-icons/flower2.svg rename to static/bootstrap-icons-1.13.1/flower2.svg diff --git a/static/bootstrap-icons/flower3.svg b/static/bootstrap-icons-1.13.1/flower3.svg similarity index 100% rename from static/bootstrap-icons/flower3.svg rename to static/bootstrap-icons-1.13.1/flower3.svg diff --git a/static/bootstrap-icons/folder-check.svg b/static/bootstrap-icons-1.13.1/folder-check.svg similarity index 100% rename from static/bootstrap-icons/folder-check.svg rename to static/bootstrap-icons-1.13.1/folder-check.svg diff --git a/static/bootstrap-icons/folder-fill.svg b/static/bootstrap-icons-1.13.1/folder-fill.svg similarity index 100% rename from static/bootstrap-icons/folder-fill.svg rename to static/bootstrap-icons-1.13.1/folder-fill.svg diff --git a/static/bootstrap-icons/folder-minus.svg b/static/bootstrap-icons-1.13.1/folder-minus.svg similarity index 100% rename from static/bootstrap-icons/folder-minus.svg rename to static/bootstrap-icons-1.13.1/folder-minus.svg diff --git a/static/bootstrap-icons/folder-plus.svg b/static/bootstrap-icons-1.13.1/folder-plus.svg similarity index 100% rename from static/bootstrap-icons/folder-plus.svg rename to static/bootstrap-icons-1.13.1/folder-plus.svg diff --git a/static/bootstrap-icons/folder-symlink-fill.svg b/static/bootstrap-icons-1.13.1/folder-symlink-fill.svg similarity index 100% rename from static/bootstrap-icons/folder-symlink-fill.svg rename to static/bootstrap-icons-1.13.1/folder-symlink-fill.svg diff --git a/static/bootstrap-icons/folder-symlink.svg b/static/bootstrap-icons-1.13.1/folder-symlink.svg similarity index 100% rename from static/bootstrap-icons/folder-symlink.svg rename to static/bootstrap-icons-1.13.1/folder-symlink.svg diff --git a/static/bootstrap-icons/folder-x.svg b/static/bootstrap-icons-1.13.1/folder-x.svg similarity index 100% rename from static/bootstrap-icons/folder-x.svg rename to static/bootstrap-icons-1.13.1/folder-x.svg diff --git a/static/bootstrap-icons/folder.svg b/static/bootstrap-icons-1.13.1/folder.svg similarity index 100% rename from static/bootstrap-icons/folder.svg rename to static/bootstrap-icons-1.13.1/folder.svg diff --git a/static/bootstrap-icons/folder2-open.svg b/static/bootstrap-icons-1.13.1/folder2-open.svg similarity index 100% rename from static/bootstrap-icons/folder2-open.svg rename to static/bootstrap-icons-1.13.1/folder2-open.svg diff --git a/static/bootstrap-icons/folder2.svg b/static/bootstrap-icons-1.13.1/folder2.svg similarity index 100% rename from static/bootstrap-icons/folder2.svg rename to static/bootstrap-icons-1.13.1/folder2.svg diff --git a/static/bootstrap-icons/fonts.svg b/static/bootstrap-icons-1.13.1/fonts.svg similarity index 100% rename from static/bootstrap-icons/fonts.svg rename to static/bootstrap-icons-1.13.1/fonts.svg diff --git a/static/bootstrap-icons/fonts/bootstrap-icons.woff b/static/bootstrap-icons-1.13.1/fonts/bootstrap-icons.woff similarity index 100% rename from static/bootstrap-icons/fonts/bootstrap-icons.woff rename to static/bootstrap-icons-1.13.1/fonts/bootstrap-icons.woff diff --git a/static/bootstrap-icons/fonts/bootstrap-icons.woff2 b/static/bootstrap-icons-1.13.1/fonts/bootstrap-icons.woff2 similarity index 100% rename from static/bootstrap-icons/fonts/bootstrap-icons.woff2 rename to static/bootstrap-icons-1.13.1/fonts/bootstrap-icons.woff2 diff --git a/static/bootstrap-icons/fork-knife.svg b/static/bootstrap-icons-1.13.1/fork-knife.svg similarity index 100% rename from static/bootstrap-icons/fork-knife.svg rename to static/bootstrap-icons-1.13.1/fork-knife.svg diff --git a/static/bootstrap-icons/forward-fill.svg b/static/bootstrap-icons-1.13.1/forward-fill.svg similarity index 100% rename from static/bootstrap-icons/forward-fill.svg rename to static/bootstrap-icons-1.13.1/forward-fill.svg diff --git a/static/bootstrap-icons/forward.svg b/static/bootstrap-icons-1.13.1/forward.svg similarity index 100% rename from static/bootstrap-icons/forward.svg rename to static/bootstrap-icons-1.13.1/forward.svg diff --git a/static/bootstrap-icons/front.svg b/static/bootstrap-icons-1.13.1/front.svg similarity index 100% rename from static/bootstrap-icons/front.svg rename to static/bootstrap-icons-1.13.1/front.svg diff --git a/static/bootstrap-icons/fuel-pump-diesel-fill.svg b/static/bootstrap-icons-1.13.1/fuel-pump-diesel-fill.svg similarity index 100% rename from static/bootstrap-icons/fuel-pump-diesel-fill.svg rename to static/bootstrap-icons-1.13.1/fuel-pump-diesel-fill.svg diff --git a/static/bootstrap-icons/fuel-pump-diesel.svg b/static/bootstrap-icons-1.13.1/fuel-pump-diesel.svg similarity index 100% rename from static/bootstrap-icons/fuel-pump-diesel.svg rename to static/bootstrap-icons-1.13.1/fuel-pump-diesel.svg diff --git a/static/bootstrap-icons/fuel-pump-fill.svg b/static/bootstrap-icons-1.13.1/fuel-pump-fill.svg similarity index 100% rename from static/bootstrap-icons/fuel-pump-fill.svg rename to static/bootstrap-icons-1.13.1/fuel-pump-fill.svg diff --git a/static/bootstrap-icons/fuel-pump.svg b/static/bootstrap-icons-1.13.1/fuel-pump.svg similarity index 100% rename from static/bootstrap-icons/fuel-pump.svg rename to static/bootstrap-icons-1.13.1/fuel-pump.svg diff --git a/static/bootstrap-icons/fullscreen-exit.svg b/static/bootstrap-icons-1.13.1/fullscreen-exit.svg similarity index 100% rename from static/bootstrap-icons/fullscreen-exit.svg rename to static/bootstrap-icons-1.13.1/fullscreen-exit.svg diff --git a/static/bootstrap-icons/fullscreen.svg b/static/bootstrap-icons-1.13.1/fullscreen.svg similarity index 100% rename from static/bootstrap-icons/fullscreen.svg rename to static/bootstrap-icons-1.13.1/fullscreen.svg diff --git a/static/bootstrap-icons/funnel-fill.svg b/static/bootstrap-icons-1.13.1/funnel-fill.svg similarity index 100% rename from static/bootstrap-icons/funnel-fill.svg rename to static/bootstrap-icons-1.13.1/funnel-fill.svg diff --git a/static/bootstrap-icons/funnel.svg b/static/bootstrap-icons-1.13.1/funnel.svg similarity index 100% rename from static/bootstrap-icons/funnel.svg rename to static/bootstrap-icons-1.13.1/funnel.svg diff --git a/static/bootstrap-icons/gear-fill.svg b/static/bootstrap-icons-1.13.1/gear-fill.svg similarity index 100% rename from static/bootstrap-icons/gear-fill.svg rename to static/bootstrap-icons-1.13.1/gear-fill.svg diff --git a/static/bootstrap-icons/gear-wide-connected.svg b/static/bootstrap-icons-1.13.1/gear-wide-connected.svg similarity index 100% rename from static/bootstrap-icons/gear-wide-connected.svg rename to static/bootstrap-icons-1.13.1/gear-wide-connected.svg diff --git a/static/bootstrap-icons/gear-wide.svg b/static/bootstrap-icons-1.13.1/gear-wide.svg similarity index 100% rename from static/bootstrap-icons/gear-wide.svg rename to static/bootstrap-icons-1.13.1/gear-wide.svg diff --git a/static/bootstrap-icons/gear.svg b/static/bootstrap-icons-1.13.1/gear.svg similarity index 100% rename from static/bootstrap-icons/gear.svg rename to static/bootstrap-icons-1.13.1/gear.svg diff --git a/static/bootstrap-icons/gem.svg b/static/bootstrap-icons-1.13.1/gem.svg similarity index 100% rename from static/bootstrap-icons/gem.svg rename to static/bootstrap-icons-1.13.1/gem.svg diff --git a/static/bootstrap-icons/gender-ambiguous.svg b/static/bootstrap-icons-1.13.1/gender-ambiguous.svg similarity index 100% rename from static/bootstrap-icons/gender-ambiguous.svg rename to static/bootstrap-icons-1.13.1/gender-ambiguous.svg diff --git a/static/bootstrap-icons/gender-female.svg b/static/bootstrap-icons-1.13.1/gender-female.svg similarity index 100% rename from static/bootstrap-icons/gender-female.svg rename to static/bootstrap-icons-1.13.1/gender-female.svg diff --git a/static/bootstrap-icons/gender-male.svg b/static/bootstrap-icons-1.13.1/gender-male.svg similarity index 100% rename from static/bootstrap-icons/gender-male.svg rename to static/bootstrap-icons-1.13.1/gender-male.svg diff --git a/static/bootstrap-icons/gender-neuter.svg b/static/bootstrap-icons-1.13.1/gender-neuter.svg similarity index 100% rename from static/bootstrap-icons/gender-neuter.svg rename to static/bootstrap-icons-1.13.1/gender-neuter.svg diff --git a/static/bootstrap-icons/gender-trans.svg b/static/bootstrap-icons-1.13.1/gender-trans.svg similarity index 100% rename from static/bootstrap-icons/gender-trans.svg rename to static/bootstrap-icons-1.13.1/gender-trans.svg diff --git a/static/bootstrap-icons/geo-alt-fill.svg b/static/bootstrap-icons-1.13.1/geo-alt-fill.svg similarity index 100% rename from static/bootstrap-icons/geo-alt-fill.svg rename to static/bootstrap-icons-1.13.1/geo-alt-fill.svg diff --git a/static/bootstrap-icons/geo-alt.svg b/static/bootstrap-icons-1.13.1/geo-alt.svg similarity index 100% rename from static/bootstrap-icons/geo-alt.svg rename to static/bootstrap-icons-1.13.1/geo-alt.svg diff --git a/static/bootstrap-icons/geo-fill.svg b/static/bootstrap-icons-1.13.1/geo-fill.svg similarity index 100% rename from static/bootstrap-icons/geo-fill.svg rename to static/bootstrap-icons-1.13.1/geo-fill.svg diff --git a/static/bootstrap-icons/geo.svg b/static/bootstrap-icons-1.13.1/geo.svg similarity index 100% rename from static/bootstrap-icons/geo.svg rename to static/bootstrap-icons-1.13.1/geo.svg diff --git a/static/bootstrap-icons/gift-fill.svg b/static/bootstrap-icons-1.13.1/gift-fill.svg similarity index 100% rename from static/bootstrap-icons/gift-fill.svg rename to static/bootstrap-icons-1.13.1/gift-fill.svg diff --git a/static/bootstrap-icons/gift.svg b/static/bootstrap-icons-1.13.1/gift.svg similarity index 100% rename from static/bootstrap-icons/gift.svg rename to static/bootstrap-icons-1.13.1/gift.svg diff --git a/static/bootstrap-icons/git.svg b/static/bootstrap-icons-1.13.1/git.svg similarity index 100% rename from static/bootstrap-icons/git.svg rename to static/bootstrap-icons-1.13.1/git.svg diff --git a/static/bootstrap-icons/github.svg b/static/bootstrap-icons-1.13.1/github.svg similarity index 100% rename from static/bootstrap-icons/github.svg rename to static/bootstrap-icons-1.13.1/github.svg diff --git a/static/bootstrap-icons/gitlab.svg b/static/bootstrap-icons-1.13.1/gitlab.svg similarity index 100% rename from static/bootstrap-icons/gitlab.svg rename to static/bootstrap-icons-1.13.1/gitlab.svg diff --git a/static/bootstrap-icons/globe-americas-fill.svg b/static/bootstrap-icons-1.13.1/globe-americas-fill.svg similarity index 100% rename from static/bootstrap-icons/globe-americas-fill.svg rename to static/bootstrap-icons-1.13.1/globe-americas-fill.svg diff --git a/static/bootstrap-icons/globe-americas.svg b/static/bootstrap-icons-1.13.1/globe-americas.svg similarity index 100% rename from static/bootstrap-icons/globe-americas.svg rename to static/bootstrap-icons-1.13.1/globe-americas.svg diff --git a/static/bootstrap-icons/globe-asia-australia-fill.svg b/static/bootstrap-icons-1.13.1/globe-asia-australia-fill.svg similarity index 100% rename from static/bootstrap-icons/globe-asia-australia-fill.svg rename to static/bootstrap-icons-1.13.1/globe-asia-australia-fill.svg diff --git a/static/bootstrap-icons/globe-asia-australia.svg b/static/bootstrap-icons-1.13.1/globe-asia-australia.svg similarity index 100% rename from static/bootstrap-icons/globe-asia-australia.svg rename to static/bootstrap-icons-1.13.1/globe-asia-australia.svg diff --git a/static/bootstrap-icons/globe-central-south-asia-fill.svg b/static/bootstrap-icons-1.13.1/globe-central-south-asia-fill.svg similarity index 100% rename from static/bootstrap-icons/globe-central-south-asia-fill.svg rename to static/bootstrap-icons-1.13.1/globe-central-south-asia-fill.svg diff --git a/static/bootstrap-icons/globe-central-south-asia.svg b/static/bootstrap-icons-1.13.1/globe-central-south-asia.svg similarity index 100% rename from static/bootstrap-icons/globe-central-south-asia.svg rename to static/bootstrap-icons-1.13.1/globe-central-south-asia.svg diff --git a/static/bootstrap-icons/globe-europe-africa-fill.svg b/static/bootstrap-icons-1.13.1/globe-europe-africa-fill.svg similarity index 100% rename from static/bootstrap-icons/globe-europe-africa-fill.svg rename to static/bootstrap-icons-1.13.1/globe-europe-africa-fill.svg diff --git a/static/bootstrap-icons/globe-europe-africa.svg b/static/bootstrap-icons-1.13.1/globe-europe-africa.svg similarity index 100% rename from static/bootstrap-icons/globe-europe-africa.svg rename to static/bootstrap-icons-1.13.1/globe-europe-africa.svg diff --git a/static/bootstrap-icons/globe.svg b/static/bootstrap-icons-1.13.1/globe.svg similarity index 100% rename from static/bootstrap-icons/globe.svg rename to static/bootstrap-icons-1.13.1/globe.svg diff --git a/static/bootstrap-icons/globe2.svg b/static/bootstrap-icons-1.13.1/globe2.svg similarity index 100% rename from static/bootstrap-icons/globe2.svg rename to static/bootstrap-icons-1.13.1/globe2.svg diff --git a/static/bootstrap-icons/google-play.svg b/static/bootstrap-icons-1.13.1/google-play.svg similarity index 100% rename from static/bootstrap-icons/google-play.svg rename to static/bootstrap-icons-1.13.1/google-play.svg diff --git a/static/bootstrap-icons/google.svg b/static/bootstrap-icons-1.13.1/google.svg similarity index 100% rename from static/bootstrap-icons/google.svg rename to static/bootstrap-icons-1.13.1/google.svg diff --git a/static/bootstrap-icons/gpu-card.svg b/static/bootstrap-icons-1.13.1/gpu-card.svg similarity index 100% rename from static/bootstrap-icons/gpu-card.svg rename to static/bootstrap-icons-1.13.1/gpu-card.svg diff --git a/static/bootstrap-icons/graph-down-arrow.svg b/static/bootstrap-icons-1.13.1/graph-down-arrow.svg similarity index 100% rename from static/bootstrap-icons/graph-down-arrow.svg rename to static/bootstrap-icons-1.13.1/graph-down-arrow.svg diff --git a/static/bootstrap-icons/graph-down.svg b/static/bootstrap-icons-1.13.1/graph-down.svg similarity index 100% rename from static/bootstrap-icons/graph-down.svg rename to static/bootstrap-icons-1.13.1/graph-down.svg diff --git a/static/bootstrap-icons/graph-up-arrow.svg b/static/bootstrap-icons-1.13.1/graph-up-arrow.svg similarity index 100% rename from static/bootstrap-icons/graph-up-arrow.svg rename to static/bootstrap-icons-1.13.1/graph-up-arrow.svg diff --git a/static/bootstrap-icons/graph-up.svg b/static/bootstrap-icons-1.13.1/graph-up.svg similarity index 100% rename from static/bootstrap-icons/graph-up.svg rename to static/bootstrap-icons-1.13.1/graph-up.svg diff --git a/static/bootstrap-icons/grid-1x2-fill.svg b/static/bootstrap-icons-1.13.1/grid-1x2-fill.svg similarity index 100% rename from static/bootstrap-icons/grid-1x2-fill.svg rename to static/bootstrap-icons-1.13.1/grid-1x2-fill.svg diff --git a/static/bootstrap-icons/grid-1x2.svg b/static/bootstrap-icons-1.13.1/grid-1x2.svg similarity index 100% rename from static/bootstrap-icons/grid-1x2.svg rename to static/bootstrap-icons-1.13.1/grid-1x2.svg diff --git a/static/bootstrap-icons/grid-3x2-gap-fill.svg b/static/bootstrap-icons-1.13.1/grid-3x2-gap-fill.svg similarity index 100% rename from static/bootstrap-icons/grid-3x2-gap-fill.svg rename to static/bootstrap-icons-1.13.1/grid-3x2-gap-fill.svg diff --git a/static/bootstrap-icons/grid-3x2-gap.svg b/static/bootstrap-icons-1.13.1/grid-3x2-gap.svg similarity index 100% rename from static/bootstrap-icons/grid-3x2-gap.svg rename to static/bootstrap-icons-1.13.1/grid-3x2-gap.svg diff --git a/static/bootstrap-icons/grid-3x2.svg b/static/bootstrap-icons-1.13.1/grid-3x2.svg similarity index 100% rename from static/bootstrap-icons/grid-3x2.svg rename to static/bootstrap-icons-1.13.1/grid-3x2.svg diff --git a/static/bootstrap-icons/grid-3x3-gap-fill.svg b/static/bootstrap-icons-1.13.1/grid-3x3-gap-fill.svg similarity index 100% rename from static/bootstrap-icons/grid-3x3-gap-fill.svg rename to static/bootstrap-icons-1.13.1/grid-3x3-gap-fill.svg diff --git a/static/bootstrap-icons/grid-3x3-gap.svg b/static/bootstrap-icons-1.13.1/grid-3x3-gap.svg similarity index 100% rename from static/bootstrap-icons/grid-3x3-gap.svg rename to static/bootstrap-icons-1.13.1/grid-3x3-gap.svg diff --git a/static/bootstrap-icons/grid-3x3.svg b/static/bootstrap-icons-1.13.1/grid-3x3.svg similarity index 100% rename from static/bootstrap-icons/grid-3x3.svg rename to static/bootstrap-icons-1.13.1/grid-3x3.svg diff --git a/static/bootstrap-icons/grid-fill.svg b/static/bootstrap-icons-1.13.1/grid-fill.svg similarity index 100% rename from static/bootstrap-icons/grid-fill.svg rename to static/bootstrap-icons-1.13.1/grid-fill.svg diff --git a/static/bootstrap-icons/grid.svg b/static/bootstrap-icons-1.13.1/grid.svg similarity index 100% rename from static/bootstrap-icons/grid.svg rename to static/bootstrap-icons-1.13.1/grid.svg diff --git a/static/bootstrap-icons/grip-horizontal.svg b/static/bootstrap-icons-1.13.1/grip-horizontal.svg similarity index 100% rename from static/bootstrap-icons/grip-horizontal.svg rename to static/bootstrap-icons-1.13.1/grip-horizontal.svg diff --git a/static/bootstrap-icons/grip-vertical.svg b/static/bootstrap-icons-1.13.1/grip-vertical.svg similarity index 100% rename from static/bootstrap-icons/grip-vertical.svg rename to static/bootstrap-icons-1.13.1/grip-vertical.svg diff --git a/static/bootstrap-icons/h-circle-fill.svg b/static/bootstrap-icons-1.13.1/h-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/h-circle-fill.svg rename to static/bootstrap-icons-1.13.1/h-circle-fill.svg diff --git a/static/bootstrap-icons/h-circle.svg b/static/bootstrap-icons-1.13.1/h-circle.svg similarity index 100% rename from static/bootstrap-icons/h-circle.svg rename to static/bootstrap-icons-1.13.1/h-circle.svg diff --git a/static/bootstrap-icons/h-square-fill.svg b/static/bootstrap-icons-1.13.1/h-square-fill.svg similarity index 100% rename from static/bootstrap-icons/h-square-fill.svg rename to static/bootstrap-icons-1.13.1/h-square-fill.svg diff --git a/static/bootstrap-icons/h-square.svg b/static/bootstrap-icons-1.13.1/h-square.svg similarity index 100% rename from static/bootstrap-icons/h-square.svg rename to static/bootstrap-icons-1.13.1/h-square.svg diff --git a/static/bootstrap-icons/hammer.svg b/static/bootstrap-icons-1.13.1/hammer.svg similarity index 100% rename from static/bootstrap-icons/hammer.svg rename to static/bootstrap-icons-1.13.1/hammer.svg diff --git a/static/bootstrap-icons/hand-index-fill.svg b/static/bootstrap-icons-1.13.1/hand-index-fill.svg similarity index 100% rename from static/bootstrap-icons/hand-index-fill.svg rename to static/bootstrap-icons-1.13.1/hand-index-fill.svg diff --git a/static/bootstrap-icons/hand-index-thumb-fill.svg b/static/bootstrap-icons-1.13.1/hand-index-thumb-fill.svg similarity index 100% rename from static/bootstrap-icons/hand-index-thumb-fill.svg rename to static/bootstrap-icons-1.13.1/hand-index-thumb-fill.svg diff --git a/static/bootstrap-icons/hand-index-thumb.svg b/static/bootstrap-icons-1.13.1/hand-index-thumb.svg similarity index 100% rename from static/bootstrap-icons/hand-index-thumb.svg rename to static/bootstrap-icons-1.13.1/hand-index-thumb.svg diff --git a/static/bootstrap-icons/hand-index.svg b/static/bootstrap-icons-1.13.1/hand-index.svg similarity index 100% rename from static/bootstrap-icons/hand-index.svg rename to static/bootstrap-icons-1.13.1/hand-index.svg diff --git a/static/bootstrap-icons/hand-thumbs-down-fill.svg b/static/bootstrap-icons-1.13.1/hand-thumbs-down-fill.svg similarity index 100% rename from static/bootstrap-icons/hand-thumbs-down-fill.svg rename to static/bootstrap-icons-1.13.1/hand-thumbs-down-fill.svg diff --git a/static/bootstrap-icons/hand-thumbs-down.svg b/static/bootstrap-icons-1.13.1/hand-thumbs-down.svg similarity index 100% rename from static/bootstrap-icons/hand-thumbs-down.svg rename to static/bootstrap-icons-1.13.1/hand-thumbs-down.svg diff --git a/static/bootstrap-icons/hand-thumbs-up-fill.svg b/static/bootstrap-icons-1.13.1/hand-thumbs-up-fill.svg similarity index 100% rename from static/bootstrap-icons/hand-thumbs-up-fill.svg rename to static/bootstrap-icons-1.13.1/hand-thumbs-up-fill.svg diff --git a/static/bootstrap-icons/hand-thumbs-up.svg b/static/bootstrap-icons-1.13.1/hand-thumbs-up.svg similarity index 100% rename from static/bootstrap-icons/hand-thumbs-up.svg rename to static/bootstrap-icons-1.13.1/hand-thumbs-up.svg diff --git a/static/bootstrap-icons/handbag-fill.svg b/static/bootstrap-icons-1.13.1/handbag-fill.svg similarity index 100% rename from static/bootstrap-icons/handbag-fill.svg rename to static/bootstrap-icons-1.13.1/handbag-fill.svg diff --git a/static/bootstrap-icons/handbag.svg b/static/bootstrap-icons-1.13.1/handbag.svg similarity index 100% rename from static/bootstrap-icons/handbag.svg rename to static/bootstrap-icons-1.13.1/handbag.svg diff --git a/static/bootstrap-icons/hash.svg b/static/bootstrap-icons-1.13.1/hash.svg similarity index 100% rename from static/bootstrap-icons/hash.svg rename to static/bootstrap-icons-1.13.1/hash.svg diff --git a/static/bootstrap-icons/hdd-fill.svg b/static/bootstrap-icons-1.13.1/hdd-fill.svg similarity index 100% rename from static/bootstrap-icons/hdd-fill.svg rename to static/bootstrap-icons-1.13.1/hdd-fill.svg diff --git a/static/bootstrap-icons/hdd-network-fill.svg b/static/bootstrap-icons-1.13.1/hdd-network-fill.svg similarity index 100% rename from static/bootstrap-icons/hdd-network-fill.svg rename to static/bootstrap-icons-1.13.1/hdd-network-fill.svg diff --git a/static/bootstrap-icons/hdd-network.svg b/static/bootstrap-icons-1.13.1/hdd-network.svg similarity index 100% rename from static/bootstrap-icons/hdd-network.svg rename to static/bootstrap-icons-1.13.1/hdd-network.svg diff --git a/static/bootstrap-icons/hdd-rack-fill.svg b/static/bootstrap-icons-1.13.1/hdd-rack-fill.svg similarity index 100% rename from static/bootstrap-icons/hdd-rack-fill.svg rename to static/bootstrap-icons-1.13.1/hdd-rack-fill.svg diff --git a/static/bootstrap-icons/hdd-rack.svg b/static/bootstrap-icons-1.13.1/hdd-rack.svg similarity index 100% rename from static/bootstrap-icons/hdd-rack.svg rename to static/bootstrap-icons-1.13.1/hdd-rack.svg diff --git a/static/bootstrap-icons/hdd-stack-fill.svg b/static/bootstrap-icons-1.13.1/hdd-stack-fill.svg similarity index 100% rename from static/bootstrap-icons/hdd-stack-fill.svg rename to static/bootstrap-icons-1.13.1/hdd-stack-fill.svg diff --git a/static/bootstrap-icons/hdd-stack.svg b/static/bootstrap-icons-1.13.1/hdd-stack.svg similarity index 100% rename from static/bootstrap-icons/hdd-stack.svg rename to static/bootstrap-icons-1.13.1/hdd-stack.svg diff --git a/static/bootstrap-icons/hdd.svg b/static/bootstrap-icons-1.13.1/hdd.svg similarity index 100% rename from static/bootstrap-icons/hdd.svg rename to static/bootstrap-icons-1.13.1/hdd.svg diff --git a/static/bootstrap-icons/hdmi-fill.svg b/static/bootstrap-icons-1.13.1/hdmi-fill.svg similarity index 100% rename from static/bootstrap-icons/hdmi-fill.svg rename to static/bootstrap-icons-1.13.1/hdmi-fill.svg diff --git a/static/bootstrap-icons/hdmi.svg b/static/bootstrap-icons-1.13.1/hdmi.svg similarity index 100% rename from static/bootstrap-icons/hdmi.svg rename to static/bootstrap-icons-1.13.1/hdmi.svg diff --git a/static/bootstrap-icons/headphones.svg b/static/bootstrap-icons-1.13.1/headphones.svg similarity index 100% rename from static/bootstrap-icons/headphones.svg rename to static/bootstrap-icons-1.13.1/headphones.svg diff --git a/static/bootstrap-icons/headset-vr.svg b/static/bootstrap-icons-1.13.1/headset-vr.svg similarity index 100% rename from static/bootstrap-icons/headset-vr.svg rename to static/bootstrap-icons-1.13.1/headset-vr.svg diff --git a/static/bootstrap-icons/headset.svg b/static/bootstrap-icons-1.13.1/headset.svg similarity index 100% rename from static/bootstrap-icons/headset.svg rename to static/bootstrap-icons-1.13.1/headset.svg diff --git a/static/bootstrap-icons/heart-arrow.svg b/static/bootstrap-icons-1.13.1/heart-arrow.svg similarity index 100% rename from static/bootstrap-icons/heart-arrow.svg rename to static/bootstrap-icons-1.13.1/heart-arrow.svg diff --git a/static/bootstrap-icons/heart-fill.svg b/static/bootstrap-icons-1.13.1/heart-fill.svg similarity index 100% rename from static/bootstrap-icons/heart-fill.svg rename to static/bootstrap-icons-1.13.1/heart-fill.svg diff --git a/static/bootstrap-icons/heart-half.svg b/static/bootstrap-icons-1.13.1/heart-half.svg similarity index 100% rename from static/bootstrap-icons/heart-half.svg rename to static/bootstrap-icons-1.13.1/heart-half.svg diff --git a/static/bootstrap-icons/heart-pulse-fill.svg b/static/bootstrap-icons-1.13.1/heart-pulse-fill.svg similarity index 100% rename from static/bootstrap-icons/heart-pulse-fill.svg rename to static/bootstrap-icons-1.13.1/heart-pulse-fill.svg diff --git a/static/bootstrap-icons/heart-pulse.svg b/static/bootstrap-icons-1.13.1/heart-pulse.svg similarity index 100% rename from static/bootstrap-icons/heart-pulse.svg rename to static/bootstrap-icons-1.13.1/heart-pulse.svg diff --git a/static/bootstrap-icons/heart.svg b/static/bootstrap-icons-1.13.1/heart.svg similarity index 100% rename from static/bootstrap-icons/heart.svg rename to static/bootstrap-icons-1.13.1/heart.svg diff --git a/static/bootstrap-icons/heartbreak-fill.svg b/static/bootstrap-icons-1.13.1/heartbreak-fill.svg similarity index 100% rename from static/bootstrap-icons/heartbreak-fill.svg rename to static/bootstrap-icons-1.13.1/heartbreak-fill.svg diff --git a/static/bootstrap-icons/heartbreak.svg b/static/bootstrap-icons-1.13.1/heartbreak.svg similarity index 100% rename from static/bootstrap-icons/heartbreak.svg rename to static/bootstrap-icons-1.13.1/heartbreak.svg diff --git a/static/bootstrap-icons/hearts.svg b/static/bootstrap-icons-1.13.1/hearts.svg similarity index 100% rename from static/bootstrap-icons/hearts.svg rename to static/bootstrap-icons-1.13.1/hearts.svg diff --git a/static/bootstrap-icons/heptagon-fill.svg b/static/bootstrap-icons-1.13.1/heptagon-fill.svg similarity index 100% rename from static/bootstrap-icons/heptagon-fill.svg rename to static/bootstrap-icons-1.13.1/heptagon-fill.svg diff --git a/static/bootstrap-icons/heptagon-half.svg b/static/bootstrap-icons-1.13.1/heptagon-half.svg similarity index 100% rename from static/bootstrap-icons/heptagon-half.svg rename to static/bootstrap-icons-1.13.1/heptagon-half.svg diff --git a/static/bootstrap-icons/heptagon.svg b/static/bootstrap-icons-1.13.1/heptagon.svg similarity index 100% rename from static/bootstrap-icons/heptagon.svg rename to static/bootstrap-icons-1.13.1/heptagon.svg diff --git a/static/bootstrap-icons/hexagon-fill.svg b/static/bootstrap-icons-1.13.1/hexagon-fill.svg similarity index 100% rename from static/bootstrap-icons/hexagon-fill.svg rename to static/bootstrap-icons-1.13.1/hexagon-fill.svg diff --git a/static/bootstrap-icons/hexagon-half.svg b/static/bootstrap-icons-1.13.1/hexagon-half.svg similarity index 100% rename from static/bootstrap-icons/hexagon-half.svg rename to static/bootstrap-icons-1.13.1/hexagon-half.svg diff --git a/static/bootstrap-icons/hexagon.svg b/static/bootstrap-icons-1.13.1/hexagon.svg similarity index 100% rename from static/bootstrap-icons/hexagon.svg rename to static/bootstrap-icons-1.13.1/hexagon.svg diff --git a/static/bootstrap-icons/highlighter.svg b/static/bootstrap-icons-1.13.1/highlighter.svg similarity index 100% rename from static/bootstrap-icons/highlighter.svg rename to static/bootstrap-icons-1.13.1/highlighter.svg diff --git a/static/bootstrap-icons/highlights.svg b/static/bootstrap-icons-1.13.1/highlights.svg similarity index 100% rename from static/bootstrap-icons/highlights.svg rename to static/bootstrap-icons-1.13.1/highlights.svg diff --git a/static/bootstrap-icons/hospital-fill.svg b/static/bootstrap-icons-1.13.1/hospital-fill.svg similarity index 100% rename from static/bootstrap-icons/hospital-fill.svg rename to static/bootstrap-icons-1.13.1/hospital-fill.svg diff --git a/static/bootstrap-icons/hospital.svg b/static/bootstrap-icons-1.13.1/hospital.svg similarity index 100% rename from static/bootstrap-icons/hospital.svg rename to static/bootstrap-icons-1.13.1/hospital.svg diff --git a/static/bootstrap-icons/hourglass-bottom.svg b/static/bootstrap-icons-1.13.1/hourglass-bottom.svg similarity index 100% rename from static/bootstrap-icons/hourglass-bottom.svg rename to static/bootstrap-icons-1.13.1/hourglass-bottom.svg diff --git a/static/bootstrap-icons/hourglass-split.svg b/static/bootstrap-icons-1.13.1/hourglass-split.svg similarity index 100% rename from static/bootstrap-icons/hourglass-split.svg rename to static/bootstrap-icons-1.13.1/hourglass-split.svg diff --git a/static/bootstrap-icons/hourglass-top.svg b/static/bootstrap-icons-1.13.1/hourglass-top.svg similarity index 100% rename from static/bootstrap-icons/hourglass-top.svg rename to static/bootstrap-icons-1.13.1/hourglass-top.svg diff --git a/static/bootstrap-icons/hourglass.svg b/static/bootstrap-icons-1.13.1/hourglass.svg similarity index 100% rename from static/bootstrap-icons/hourglass.svg rename to static/bootstrap-icons-1.13.1/hourglass.svg diff --git a/static/bootstrap-icons/house-add-fill.svg b/static/bootstrap-icons-1.13.1/house-add-fill.svg similarity index 100% rename from static/bootstrap-icons/house-add-fill.svg rename to static/bootstrap-icons-1.13.1/house-add-fill.svg diff --git a/static/bootstrap-icons/house-add.svg b/static/bootstrap-icons-1.13.1/house-add.svg similarity index 100% rename from static/bootstrap-icons/house-add.svg rename to static/bootstrap-icons-1.13.1/house-add.svg diff --git a/static/bootstrap-icons/house-check-fill.svg b/static/bootstrap-icons-1.13.1/house-check-fill.svg similarity index 100% rename from static/bootstrap-icons/house-check-fill.svg rename to static/bootstrap-icons-1.13.1/house-check-fill.svg diff --git a/static/bootstrap-icons/house-check.svg b/static/bootstrap-icons-1.13.1/house-check.svg similarity index 100% rename from static/bootstrap-icons/house-check.svg rename to static/bootstrap-icons-1.13.1/house-check.svg diff --git a/static/bootstrap-icons/house-dash-fill.svg b/static/bootstrap-icons-1.13.1/house-dash-fill.svg similarity index 100% rename from static/bootstrap-icons/house-dash-fill.svg rename to static/bootstrap-icons-1.13.1/house-dash-fill.svg diff --git a/static/bootstrap-icons/house-dash.svg b/static/bootstrap-icons-1.13.1/house-dash.svg similarity index 100% rename from static/bootstrap-icons/house-dash.svg rename to static/bootstrap-icons-1.13.1/house-dash.svg diff --git a/static/bootstrap-icons/house-door-fill.svg b/static/bootstrap-icons-1.13.1/house-door-fill.svg similarity index 100% rename from static/bootstrap-icons/house-door-fill.svg rename to static/bootstrap-icons-1.13.1/house-door-fill.svg diff --git a/static/bootstrap-icons/house-door.svg b/static/bootstrap-icons-1.13.1/house-door.svg similarity index 100% rename from static/bootstrap-icons/house-door.svg rename to static/bootstrap-icons-1.13.1/house-door.svg diff --git a/static/bootstrap-icons/house-down-fill.svg b/static/bootstrap-icons-1.13.1/house-down-fill.svg similarity index 100% rename from static/bootstrap-icons/house-down-fill.svg rename to static/bootstrap-icons-1.13.1/house-down-fill.svg diff --git a/static/bootstrap-icons/house-down.svg b/static/bootstrap-icons-1.13.1/house-down.svg similarity index 100% rename from static/bootstrap-icons/house-down.svg rename to static/bootstrap-icons-1.13.1/house-down.svg diff --git a/static/bootstrap-icons/house-exclamation-fill.svg b/static/bootstrap-icons-1.13.1/house-exclamation-fill.svg similarity index 100% rename from static/bootstrap-icons/house-exclamation-fill.svg rename to static/bootstrap-icons-1.13.1/house-exclamation-fill.svg diff --git a/static/bootstrap-icons/house-exclamation.svg b/static/bootstrap-icons-1.13.1/house-exclamation.svg similarity index 100% rename from static/bootstrap-icons/house-exclamation.svg rename to static/bootstrap-icons-1.13.1/house-exclamation.svg diff --git a/static/bootstrap-icons/house-fill.svg b/static/bootstrap-icons-1.13.1/house-fill.svg similarity index 100% rename from static/bootstrap-icons/house-fill.svg rename to static/bootstrap-icons-1.13.1/house-fill.svg diff --git a/static/bootstrap-icons/house-gear-fill.svg b/static/bootstrap-icons-1.13.1/house-gear-fill.svg similarity index 100% rename from static/bootstrap-icons/house-gear-fill.svg rename to static/bootstrap-icons-1.13.1/house-gear-fill.svg diff --git a/static/bootstrap-icons/house-gear.svg b/static/bootstrap-icons-1.13.1/house-gear.svg similarity index 100% rename from static/bootstrap-icons/house-gear.svg rename to static/bootstrap-icons-1.13.1/house-gear.svg diff --git a/static/bootstrap-icons/house-heart-fill.svg b/static/bootstrap-icons-1.13.1/house-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/house-heart-fill.svg rename to static/bootstrap-icons-1.13.1/house-heart-fill.svg diff --git a/static/bootstrap-icons/house-heart.svg b/static/bootstrap-icons-1.13.1/house-heart.svg similarity index 100% rename from static/bootstrap-icons/house-heart.svg rename to static/bootstrap-icons-1.13.1/house-heart.svg diff --git a/static/bootstrap-icons/house-lock-fill.svg b/static/bootstrap-icons-1.13.1/house-lock-fill.svg similarity index 100% rename from static/bootstrap-icons/house-lock-fill.svg rename to static/bootstrap-icons-1.13.1/house-lock-fill.svg diff --git a/static/bootstrap-icons/house-lock.svg b/static/bootstrap-icons-1.13.1/house-lock.svg similarity index 100% rename from static/bootstrap-icons/house-lock.svg rename to static/bootstrap-icons-1.13.1/house-lock.svg diff --git a/static/bootstrap-icons/house-slash-fill.svg b/static/bootstrap-icons-1.13.1/house-slash-fill.svg similarity index 100% rename from static/bootstrap-icons/house-slash-fill.svg rename to static/bootstrap-icons-1.13.1/house-slash-fill.svg diff --git a/static/bootstrap-icons/house-slash.svg b/static/bootstrap-icons-1.13.1/house-slash.svg similarity index 100% rename from static/bootstrap-icons/house-slash.svg rename to static/bootstrap-icons-1.13.1/house-slash.svg diff --git a/static/bootstrap-icons/house-up-fill.svg b/static/bootstrap-icons-1.13.1/house-up-fill.svg similarity index 100% rename from static/bootstrap-icons/house-up-fill.svg rename to static/bootstrap-icons-1.13.1/house-up-fill.svg diff --git a/static/bootstrap-icons/house-up.svg b/static/bootstrap-icons-1.13.1/house-up.svg similarity index 100% rename from static/bootstrap-icons/house-up.svg rename to static/bootstrap-icons-1.13.1/house-up.svg diff --git a/static/bootstrap-icons/house-x-fill.svg b/static/bootstrap-icons-1.13.1/house-x-fill.svg similarity index 100% rename from static/bootstrap-icons/house-x-fill.svg rename to static/bootstrap-icons-1.13.1/house-x-fill.svg diff --git a/static/bootstrap-icons/house-x.svg b/static/bootstrap-icons-1.13.1/house-x.svg similarity index 100% rename from static/bootstrap-icons/house-x.svg rename to static/bootstrap-icons-1.13.1/house-x.svg diff --git a/static/bootstrap-icons/house.svg b/static/bootstrap-icons-1.13.1/house.svg similarity index 100% rename from static/bootstrap-icons/house.svg rename to static/bootstrap-icons-1.13.1/house.svg diff --git a/static/bootstrap-icons/houses-fill.svg b/static/bootstrap-icons-1.13.1/houses-fill.svg similarity index 100% rename from static/bootstrap-icons/houses-fill.svg rename to static/bootstrap-icons-1.13.1/houses-fill.svg diff --git a/static/bootstrap-icons/houses.svg b/static/bootstrap-icons-1.13.1/houses.svg similarity index 100% rename from static/bootstrap-icons/houses.svg rename to static/bootstrap-icons-1.13.1/houses.svg diff --git a/static/bootstrap-icons/hr.svg b/static/bootstrap-icons-1.13.1/hr.svg similarity index 100% rename from static/bootstrap-icons/hr.svg rename to static/bootstrap-icons-1.13.1/hr.svg diff --git a/static/bootstrap-icons/hurricane.svg b/static/bootstrap-icons-1.13.1/hurricane.svg similarity index 100% rename from static/bootstrap-icons/hurricane.svg rename to static/bootstrap-icons-1.13.1/hurricane.svg diff --git a/static/bootstrap-icons/hypnotize.svg b/static/bootstrap-icons-1.13.1/hypnotize.svg similarity index 100% rename from static/bootstrap-icons/hypnotize.svg rename to static/bootstrap-icons-1.13.1/hypnotize.svg diff --git a/static/bootstrap-icons/image-alt.svg b/static/bootstrap-icons-1.13.1/image-alt.svg similarity index 100% rename from static/bootstrap-icons/image-alt.svg rename to static/bootstrap-icons-1.13.1/image-alt.svg diff --git a/static/bootstrap-icons/image-fill.svg b/static/bootstrap-icons-1.13.1/image-fill.svg similarity index 100% rename from static/bootstrap-icons/image-fill.svg rename to static/bootstrap-icons-1.13.1/image-fill.svg diff --git a/static/bootstrap-icons/image.svg b/static/bootstrap-icons-1.13.1/image.svg similarity index 100% rename from static/bootstrap-icons/image.svg rename to static/bootstrap-icons-1.13.1/image.svg diff --git a/static/bootstrap-icons/images.svg b/static/bootstrap-icons-1.13.1/images.svg similarity index 100% rename from static/bootstrap-icons/images.svg rename to static/bootstrap-icons-1.13.1/images.svg diff --git a/static/bootstrap-icons/inbox-fill.svg b/static/bootstrap-icons-1.13.1/inbox-fill.svg similarity index 100% rename from static/bootstrap-icons/inbox-fill.svg rename to static/bootstrap-icons-1.13.1/inbox-fill.svg diff --git a/static/bootstrap-icons/inbox.svg b/static/bootstrap-icons-1.13.1/inbox.svg similarity index 100% rename from static/bootstrap-icons/inbox.svg rename to static/bootstrap-icons-1.13.1/inbox.svg diff --git a/static/bootstrap-icons/inboxes-fill.svg b/static/bootstrap-icons-1.13.1/inboxes-fill.svg similarity index 100% rename from static/bootstrap-icons/inboxes-fill.svg rename to static/bootstrap-icons-1.13.1/inboxes-fill.svg diff --git a/static/bootstrap-icons/inboxes.svg b/static/bootstrap-icons-1.13.1/inboxes.svg similarity index 100% rename from static/bootstrap-icons/inboxes.svg rename to static/bootstrap-icons-1.13.1/inboxes.svg diff --git a/static/bootstrap-icons/incognito.svg b/static/bootstrap-icons-1.13.1/incognito.svg similarity index 100% rename from static/bootstrap-icons/incognito.svg rename to static/bootstrap-icons-1.13.1/incognito.svg diff --git a/static/bootstrap-icons/indent.svg b/static/bootstrap-icons-1.13.1/indent.svg similarity index 100% rename from static/bootstrap-icons/indent.svg rename to static/bootstrap-icons-1.13.1/indent.svg diff --git a/static/bootstrap-icons/infinity.svg b/static/bootstrap-icons-1.13.1/infinity.svg similarity index 100% rename from static/bootstrap-icons/infinity.svg rename to static/bootstrap-icons-1.13.1/infinity.svg diff --git a/static/bootstrap-icons/info-circle-fill.svg b/static/bootstrap-icons-1.13.1/info-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/info-circle-fill.svg rename to static/bootstrap-icons-1.13.1/info-circle-fill.svg diff --git a/static/bootstrap-icons/info-circle.svg b/static/bootstrap-icons-1.13.1/info-circle.svg similarity index 100% rename from static/bootstrap-icons/info-circle.svg rename to static/bootstrap-icons-1.13.1/info-circle.svg diff --git a/static/bootstrap-icons/info-lg.svg b/static/bootstrap-icons-1.13.1/info-lg.svg similarity index 100% rename from static/bootstrap-icons/info-lg.svg rename to static/bootstrap-icons-1.13.1/info-lg.svg diff --git a/static/bootstrap-icons/info-square-fill.svg b/static/bootstrap-icons-1.13.1/info-square-fill.svg similarity index 100% rename from static/bootstrap-icons/info-square-fill.svg rename to static/bootstrap-icons-1.13.1/info-square-fill.svg diff --git a/static/bootstrap-icons/info-square.svg b/static/bootstrap-icons-1.13.1/info-square.svg similarity index 100% rename from static/bootstrap-icons/info-square.svg rename to static/bootstrap-icons-1.13.1/info-square.svg diff --git a/static/bootstrap-icons/info.svg b/static/bootstrap-icons-1.13.1/info.svg similarity index 100% rename from static/bootstrap-icons/info.svg rename to static/bootstrap-icons-1.13.1/info.svg diff --git a/static/bootstrap-icons/input-cursor-text.svg b/static/bootstrap-icons-1.13.1/input-cursor-text.svg similarity index 100% rename from static/bootstrap-icons/input-cursor-text.svg rename to static/bootstrap-icons-1.13.1/input-cursor-text.svg diff --git a/static/bootstrap-icons/input-cursor.svg b/static/bootstrap-icons-1.13.1/input-cursor.svg similarity index 100% rename from static/bootstrap-icons/input-cursor.svg rename to static/bootstrap-icons-1.13.1/input-cursor.svg diff --git a/static/bootstrap-icons/instagram.svg b/static/bootstrap-icons-1.13.1/instagram.svg similarity index 100% rename from static/bootstrap-icons/instagram.svg rename to static/bootstrap-icons-1.13.1/instagram.svg diff --git a/static/bootstrap-icons/intersect.svg b/static/bootstrap-icons-1.13.1/intersect.svg similarity index 100% rename from static/bootstrap-icons/intersect.svg rename to static/bootstrap-icons-1.13.1/intersect.svg diff --git a/static/bootstrap-icons/javascript.svg b/static/bootstrap-icons-1.13.1/javascript.svg similarity index 100% rename from static/bootstrap-icons/javascript.svg rename to static/bootstrap-icons-1.13.1/javascript.svg diff --git a/static/bootstrap-icons/journal-album.svg b/static/bootstrap-icons-1.13.1/journal-album.svg similarity index 100% rename from static/bootstrap-icons/journal-album.svg rename to static/bootstrap-icons-1.13.1/journal-album.svg diff --git a/static/bootstrap-icons/journal-arrow-down.svg b/static/bootstrap-icons-1.13.1/journal-arrow-down.svg similarity index 100% rename from static/bootstrap-icons/journal-arrow-down.svg rename to static/bootstrap-icons-1.13.1/journal-arrow-down.svg diff --git a/static/bootstrap-icons/journal-arrow-up.svg b/static/bootstrap-icons-1.13.1/journal-arrow-up.svg similarity index 100% rename from static/bootstrap-icons/journal-arrow-up.svg rename to static/bootstrap-icons-1.13.1/journal-arrow-up.svg diff --git a/static/bootstrap-icons/journal-bookmark-fill.svg b/static/bootstrap-icons-1.13.1/journal-bookmark-fill.svg similarity index 100% rename from static/bootstrap-icons/journal-bookmark-fill.svg rename to static/bootstrap-icons-1.13.1/journal-bookmark-fill.svg diff --git a/static/bootstrap-icons/journal-bookmark.svg b/static/bootstrap-icons-1.13.1/journal-bookmark.svg similarity index 100% rename from static/bootstrap-icons/journal-bookmark.svg rename to static/bootstrap-icons-1.13.1/journal-bookmark.svg diff --git a/static/bootstrap-icons/journal-check.svg b/static/bootstrap-icons-1.13.1/journal-check.svg similarity index 100% rename from static/bootstrap-icons/journal-check.svg rename to static/bootstrap-icons-1.13.1/journal-check.svg diff --git a/static/bootstrap-icons/journal-code.svg b/static/bootstrap-icons-1.13.1/journal-code.svg similarity index 100% rename from static/bootstrap-icons/journal-code.svg rename to static/bootstrap-icons-1.13.1/journal-code.svg diff --git a/static/bootstrap-icons/journal-medical.svg b/static/bootstrap-icons-1.13.1/journal-medical.svg similarity index 100% rename from static/bootstrap-icons/journal-medical.svg rename to static/bootstrap-icons-1.13.1/journal-medical.svg diff --git a/static/bootstrap-icons/journal-minus.svg b/static/bootstrap-icons-1.13.1/journal-minus.svg similarity index 100% rename from static/bootstrap-icons/journal-minus.svg rename to static/bootstrap-icons-1.13.1/journal-minus.svg diff --git a/static/bootstrap-icons/journal-plus.svg b/static/bootstrap-icons-1.13.1/journal-plus.svg similarity index 100% rename from static/bootstrap-icons/journal-plus.svg rename to static/bootstrap-icons-1.13.1/journal-plus.svg diff --git a/static/bootstrap-icons/journal-richtext.svg b/static/bootstrap-icons-1.13.1/journal-richtext.svg similarity index 100% rename from static/bootstrap-icons/journal-richtext.svg rename to static/bootstrap-icons-1.13.1/journal-richtext.svg diff --git a/static/bootstrap-icons/journal-text.svg b/static/bootstrap-icons-1.13.1/journal-text.svg similarity index 100% rename from static/bootstrap-icons/journal-text.svg rename to static/bootstrap-icons-1.13.1/journal-text.svg diff --git a/static/bootstrap-icons/journal-x.svg b/static/bootstrap-icons-1.13.1/journal-x.svg similarity index 100% rename from static/bootstrap-icons/journal-x.svg rename to static/bootstrap-icons-1.13.1/journal-x.svg diff --git a/static/bootstrap-icons/journal.svg b/static/bootstrap-icons-1.13.1/journal.svg similarity index 100% rename from static/bootstrap-icons/journal.svg rename to static/bootstrap-icons-1.13.1/journal.svg diff --git a/static/bootstrap-icons/journals.svg b/static/bootstrap-icons-1.13.1/journals.svg similarity index 100% rename from static/bootstrap-icons/journals.svg rename to static/bootstrap-icons-1.13.1/journals.svg diff --git a/static/bootstrap-icons/joystick.svg b/static/bootstrap-icons-1.13.1/joystick.svg similarity index 100% rename from static/bootstrap-icons/joystick.svg rename to static/bootstrap-icons-1.13.1/joystick.svg diff --git a/static/bootstrap-icons/justify-left.svg b/static/bootstrap-icons-1.13.1/justify-left.svg similarity index 100% rename from static/bootstrap-icons/justify-left.svg rename to static/bootstrap-icons-1.13.1/justify-left.svg diff --git a/static/bootstrap-icons/justify-right.svg b/static/bootstrap-icons-1.13.1/justify-right.svg similarity index 100% rename from static/bootstrap-icons/justify-right.svg rename to static/bootstrap-icons-1.13.1/justify-right.svg diff --git a/static/bootstrap-icons/justify.svg b/static/bootstrap-icons-1.13.1/justify.svg similarity index 100% rename from static/bootstrap-icons/justify.svg rename to static/bootstrap-icons-1.13.1/justify.svg diff --git a/static/bootstrap-icons/kanban-fill.svg b/static/bootstrap-icons-1.13.1/kanban-fill.svg similarity index 100% rename from static/bootstrap-icons/kanban-fill.svg rename to static/bootstrap-icons-1.13.1/kanban-fill.svg diff --git a/static/bootstrap-icons/kanban.svg b/static/bootstrap-icons-1.13.1/kanban.svg similarity index 100% rename from static/bootstrap-icons/kanban.svg rename to static/bootstrap-icons-1.13.1/kanban.svg diff --git a/static/bootstrap-icons/key-fill.svg b/static/bootstrap-icons-1.13.1/key-fill.svg similarity index 100% rename from static/bootstrap-icons/key-fill.svg rename to static/bootstrap-icons-1.13.1/key-fill.svg diff --git a/static/bootstrap-icons/key.svg b/static/bootstrap-icons-1.13.1/key.svg similarity index 100% rename from static/bootstrap-icons/key.svg rename to static/bootstrap-icons-1.13.1/key.svg diff --git a/static/bootstrap-icons/keyboard-fill.svg b/static/bootstrap-icons-1.13.1/keyboard-fill.svg similarity index 100% rename from static/bootstrap-icons/keyboard-fill.svg rename to static/bootstrap-icons-1.13.1/keyboard-fill.svg diff --git a/static/bootstrap-icons/keyboard.svg b/static/bootstrap-icons-1.13.1/keyboard.svg similarity index 100% rename from static/bootstrap-icons/keyboard.svg rename to static/bootstrap-icons-1.13.1/keyboard.svg diff --git a/static/bootstrap-icons/ladder.svg b/static/bootstrap-icons-1.13.1/ladder.svg similarity index 100% rename from static/bootstrap-icons/ladder.svg rename to static/bootstrap-icons-1.13.1/ladder.svg diff --git a/static/bootstrap-icons/lamp-fill.svg b/static/bootstrap-icons-1.13.1/lamp-fill.svg similarity index 100% rename from static/bootstrap-icons/lamp-fill.svg rename to static/bootstrap-icons-1.13.1/lamp-fill.svg diff --git a/static/bootstrap-icons/lamp.svg b/static/bootstrap-icons-1.13.1/lamp.svg similarity index 100% rename from static/bootstrap-icons/lamp.svg rename to static/bootstrap-icons-1.13.1/lamp.svg diff --git a/static/bootstrap-icons/laptop-fill.svg b/static/bootstrap-icons-1.13.1/laptop-fill.svg similarity index 100% rename from static/bootstrap-icons/laptop-fill.svg rename to static/bootstrap-icons-1.13.1/laptop-fill.svg diff --git a/static/bootstrap-icons/laptop.svg b/static/bootstrap-icons-1.13.1/laptop.svg similarity index 100% rename from static/bootstrap-icons/laptop.svg rename to static/bootstrap-icons-1.13.1/laptop.svg diff --git a/static/bootstrap-icons/layer-backward.svg b/static/bootstrap-icons-1.13.1/layer-backward.svg similarity index 100% rename from static/bootstrap-icons/layer-backward.svg rename to static/bootstrap-icons-1.13.1/layer-backward.svg diff --git a/static/bootstrap-icons/layer-forward.svg b/static/bootstrap-icons-1.13.1/layer-forward.svg similarity index 100% rename from static/bootstrap-icons/layer-forward.svg rename to static/bootstrap-icons-1.13.1/layer-forward.svg diff --git a/static/bootstrap-icons/layers-fill.svg b/static/bootstrap-icons-1.13.1/layers-fill.svg similarity index 100% rename from static/bootstrap-icons/layers-fill.svg rename to static/bootstrap-icons-1.13.1/layers-fill.svg diff --git a/static/bootstrap-icons/layers-half.svg b/static/bootstrap-icons-1.13.1/layers-half.svg similarity index 100% rename from static/bootstrap-icons/layers-half.svg rename to static/bootstrap-icons-1.13.1/layers-half.svg diff --git a/static/bootstrap-icons/layers.svg b/static/bootstrap-icons-1.13.1/layers.svg similarity index 100% rename from static/bootstrap-icons/layers.svg rename to static/bootstrap-icons-1.13.1/layers.svg diff --git a/static/bootstrap-icons/layout-sidebar-inset-reverse.svg b/static/bootstrap-icons-1.13.1/layout-sidebar-inset-reverse.svg similarity index 100% rename from static/bootstrap-icons/layout-sidebar-inset-reverse.svg rename to static/bootstrap-icons-1.13.1/layout-sidebar-inset-reverse.svg diff --git a/static/bootstrap-icons/layout-sidebar-inset.svg b/static/bootstrap-icons-1.13.1/layout-sidebar-inset.svg similarity index 100% rename from static/bootstrap-icons/layout-sidebar-inset.svg rename to static/bootstrap-icons-1.13.1/layout-sidebar-inset.svg diff --git a/static/bootstrap-icons/layout-sidebar-reverse.svg b/static/bootstrap-icons-1.13.1/layout-sidebar-reverse.svg similarity index 100% rename from static/bootstrap-icons/layout-sidebar-reverse.svg rename to static/bootstrap-icons-1.13.1/layout-sidebar-reverse.svg diff --git a/static/bootstrap-icons/layout-sidebar.svg b/static/bootstrap-icons-1.13.1/layout-sidebar.svg similarity index 100% rename from static/bootstrap-icons/layout-sidebar.svg rename to static/bootstrap-icons-1.13.1/layout-sidebar.svg diff --git a/static/bootstrap-icons/layout-split.svg b/static/bootstrap-icons-1.13.1/layout-split.svg similarity index 100% rename from static/bootstrap-icons/layout-split.svg rename to static/bootstrap-icons-1.13.1/layout-split.svg diff --git a/static/bootstrap-icons/layout-text-sidebar-reverse.svg b/static/bootstrap-icons-1.13.1/layout-text-sidebar-reverse.svg similarity index 100% rename from static/bootstrap-icons/layout-text-sidebar-reverse.svg rename to static/bootstrap-icons-1.13.1/layout-text-sidebar-reverse.svg diff --git a/static/bootstrap-icons/layout-text-sidebar.svg b/static/bootstrap-icons-1.13.1/layout-text-sidebar.svg similarity index 100% rename from static/bootstrap-icons/layout-text-sidebar.svg rename to static/bootstrap-icons-1.13.1/layout-text-sidebar.svg diff --git a/static/bootstrap-icons/layout-text-window-reverse.svg b/static/bootstrap-icons-1.13.1/layout-text-window-reverse.svg similarity index 100% rename from static/bootstrap-icons/layout-text-window-reverse.svg rename to static/bootstrap-icons-1.13.1/layout-text-window-reverse.svg diff --git a/static/bootstrap-icons/layout-text-window.svg b/static/bootstrap-icons-1.13.1/layout-text-window.svg similarity index 100% rename from static/bootstrap-icons/layout-text-window.svg rename to static/bootstrap-icons-1.13.1/layout-text-window.svg diff --git a/static/bootstrap-icons/layout-three-columns.svg b/static/bootstrap-icons-1.13.1/layout-three-columns.svg similarity index 100% rename from static/bootstrap-icons/layout-three-columns.svg rename to static/bootstrap-icons-1.13.1/layout-three-columns.svg diff --git a/static/bootstrap-icons/layout-wtf.svg b/static/bootstrap-icons-1.13.1/layout-wtf.svg similarity index 100% rename from static/bootstrap-icons/layout-wtf.svg rename to static/bootstrap-icons-1.13.1/layout-wtf.svg diff --git a/static/bootstrap-icons/leaf-fill.svg b/static/bootstrap-icons-1.13.1/leaf-fill.svg similarity index 100% rename from static/bootstrap-icons/leaf-fill.svg rename to static/bootstrap-icons-1.13.1/leaf-fill.svg diff --git a/static/bootstrap-icons/leaf.svg b/static/bootstrap-icons-1.13.1/leaf.svg similarity index 100% rename from static/bootstrap-icons/leaf.svg rename to static/bootstrap-icons-1.13.1/leaf.svg diff --git a/static/bootstrap-icons/life-preserver.svg b/static/bootstrap-icons-1.13.1/life-preserver.svg similarity index 100% rename from static/bootstrap-icons/life-preserver.svg rename to static/bootstrap-icons-1.13.1/life-preserver.svg diff --git a/static/bootstrap-icons/lightbulb-fill.svg b/static/bootstrap-icons-1.13.1/lightbulb-fill.svg similarity index 100% rename from static/bootstrap-icons/lightbulb-fill.svg rename to static/bootstrap-icons-1.13.1/lightbulb-fill.svg diff --git a/static/bootstrap-icons/lightbulb-off-fill.svg b/static/bootstrap-icons-1.13.1/lightbulb-off-fill.svg similarity index 100% rename from static/bootstrap-icons/lightbulb-off-fill.svg rename to static/bootstrap-icons-1.13.1/lightbulb-off-fill.svg diff --git a/static/bootstrap-icons/lightbulb-off.svg b/static/bootstrap-icons-1.13.1/lightbulb-off.svg similarity index 100% rename from static/bootstrap-icons/lightbulb-off.svg rename to static/bootstrap-icons-1.13.1/lightbulb-off.svg diff --git a/static/bootstrap-icons/lightbulb.svg b/static/bootstrap-icons-1.13.1/lightbulb.svg similarity index 100% rename from static/bootstrap-icons/lightbulb.svg rename to static/bootstrap-icons-1.13.1/lightbulb.svg diff --git a/static/bootstrap-icons/lightning-charge-fill.svg b/static/bootstrap-icons-1.13.1/lightning-charge-fill.svg similarity index 100% rename from static/bootstrap-icons/lightning-charge-fill.svg rename to static/bootstrap-icons-1.13.1/lightning-charge-fill.svg diff --git a/static/bootstrap-icons/lightning-charge.svg b/static/bootstrap-icons-1.13.1/lightning-charge.svg similarity index 100% rename from static/bootstrap-icons/lightning-charge.svg rename to static/bootstrap-icons-1.13.1/lightning-charge.svg diff --git a/static/bootstrap-icons/lightning-fill.svg b/static/bootstrap-icons-1.13.1/lightning-fill.svg similarity index 100% rename from static/bootstrap-icons/lightning-fill.svg rename to static/bootstrap-icons-1.13.1/lightning-fill.svg diff --git a/static/bootstrap-icons/lightning.svg b/static/bootstrap-icons-1.13.1/lightning.svg similarity index 100% rename from static/bootstrap-icons/lightning.svg rename to static/bootstrap-icons-1.13.1/lightning.svg diff --git a/static/bootstrap-icons/line.svg b/static/bootstrap-icons-1.13.1/line.svg similarity index 100% rename from static/bootstrap-icons/line.svg rename to static/bootstrap-icons-1.13.1/line.svg diff --git a/static/bootstrap-icons/link-45deg.svg b/static/bootstrap-icons-1.13.1/link-45deg.svg similarity index 100% rename from static/bootstrap-icons/link-45deg.svg rename to static/bootstrap-icons-1.13.1/link-45deg.svg diff --git a/static/bootstrap-icons/link.svg b/static/bootstrap-icons-1.13.1/link.svg similarity index 100% rename from static/bootstrap-icons/link.svg rename to static/bootstrap-icons-1.13.1/link.svg diff --git a/static/bootstrap-icons/linkedin.svg b/static/bootstrap-icons-1.13.1/linkedin.svg similarity index 100% rename from static/bootstrap-icons/linkedin.svg rename to static/bootstrap-icons-1.13.1/linkedin.svg diff --git a/static/bootstrap-icons/list-check.svg b/static/bootstrap-icons-1.13.1/list-check.svg similarity index 100% rename from static/bootstrap-icons/list-check.svg rename to static/bootstrap-icons-1.13.1/list-check.svg diff --git a/static/bootstrap-icons/list-columns-reverse.svg b/static/bootstrap-icons-1.13.1/list-columns-reverse.svg similarity index 100% rename from static/bootstrap-icons/list-columns-reverse.svg rename to static/bootstrap-icons-1.13.1/list-columns-reverse.svg diff --git a/static/bootstrap-icons/list-columns.svg b/static/bootstrap-icons-1.13.1/list-columns.svg similarity index 100% rename from static/bootstrap-icons/list-columns.svg rename to static/bootstrap-icons-1.13.1/list-columns.svg diff --git a/static/bootstrap-icons/list-nested.svg b/static/bootstrap-icons-1.13.1/list-nested.svg similarity index 100% rename from static/bootstrap-icons/list-nested.svg rename to static/bootstrap-icons-1.13.1/list-nested.svg diff --git a/static/bootstrap-icons/list-ol.svg b/static/bootstrap-icons-1.13.1/list-ol.svg similarity index 100% rename from static/bootstrap-icons/list-ol.svg rename to static/bootstrap-icons-1.13.1/list-ol.svg diff --git a/static/bootstrap-icons/list-stars.svg b/static/bootstrap-icons-1.13.1/list-stars.svg similarity index 100% rename from static/bootstrap-icons/list-stars.svg rename to static/bootstrap-icons-1.13.1/list-stars.svg diff --git a/static/bootstrap-icons/list-task.svg b/static/bootstrap-icons-1.13.1/list-task.svg similarity index 100% rename from static/bootstrap-icons/list-task.svg rename to static/bootstrap-icons-1.13.1/list-task.svg diff --git a/static/bootstrap-icons/list-ul.svg b/static/bootstrap-icons-1.13.1/list-ul.svg similarity index 100% rename from static/bootstrap-icons/list-ul.svg rename to static/bootstrap-icons-1.13.1/list-ul.svg diff --git a/static/bootstrap-icons/list.svg b/static/bootstrap-icons-1.13.1/list.svg similarity index 100% rename from static/bootstrap-icons/list.svg rename to static/bootstrap-icons-1.13.1/list.svg diff --git a/static/bootstrap-icons/lock-fill.svg b/static/bootstrap-icons-1.13.1/lock-fill.svg similarity index 100% rename from static/bootstrap-icons/lock-fill.svg rename to static/bootstrap-icons-1.13.1/lock-fill.svg diff --git a/static/bootstrap-icons/lock.svg b/static/bootstrap-icons-1.13.1/lock.svg similarity index 100% rename from static/bootstrap-icons/lock.svg rename to static/bootstrap-icons-1.13.1/lock.svg diff --git a/static/bootstrap-icons/luggage-fill.svg b/static/bootstrap-icons-1.13.1/luggage-fill.svg similarity index 100% rename from static/bootstrap-icons/luggage-fill.svg rename to static/bootstrap-icons-1.13.1/luggage-fill.svg diff --git a/static/bootstrap-icons/luggage.svg b/static/bootstrap-icons-1.13.1/luggage.svg similarity index 100% rename from static/bootstrap-icons/luggage.svg rename to static/bootstrap-icons-1.13.1/luggage.svg diff --git a/static/bootstrap-icons/lungs-fill.svg b/static/bootstrap-icons-1.13.1/lungs-fill.svg similarity index 100% rename from static/bootstrap-icons/lungs-fill.svg rename to static/bootstrap-icons-1.13.1/lungs-fill.svg diff --git a/static/bootstrap-icons/lungs.svg b/static/bootstrap-icons-1.13.1/lungs.svg similarity index 100% rename from static/bootstrap-icons/lungs.svg rename to static/bootstrap-icons-1.13.1/lungs.svg diff --git a/static/bootstrap-icons/magic.svg b/static/bootstrap-icons-1.13.1/magic.svg similarity index 100% rename from static/bootstrap-icons/magic.svg rename to static/bootstrap-icons-1.13.1/magic.svg diff --git a/static/bootstrap-icons/magnet-fill.svg b/static/bootstrap-icons-1.13.1/magnet-fill.svg similarity index 100% rename from static/bootstrap-icons/magnet-fill.svg rename to static/bootstrap-icons-1.13.1/magnet-fill.svg diff --git a/static/bootstrap-icons/magnet.svg b/static/bootstrap-icons-1.13.1/magnet.svg similarity index 100% rename from static/bootstrap-icons/magnet.svg rename to static/bootstrap-icons-1.13.1/magnet.svg diff --git a/static/bootstrap-icons/mailbox-flag.svg b/static/bootstrap-icons-1.13.1/mailbox-flag.svg similarity index 100% rename from static/bootstrap-icons/mailbox-flag.svg rename to static/bootstrap-icons-1.13.1/mailbox-flag.svg diff --git a/static/bootstrap-icons/mailbox.svg b/static/bootstrap-icons-1.13.1/mailbox.svg similarity index 100% rename from static/bootstrap-icons/mailbox.svg rename to static/bootstrap-icons-1.13.1/mailbox.svg diff --git a/static/bootstrap-icons/mailbox2-flag.svg b/static/bootstrap-icons-1.13.1/mailbox2-flag.svg similarity index 100% rename from static/bootstrap-icons/mailbox2-flag.svg rename to static/bootstrap-icons-1.13.1/mailbox2-flag.svg diff --git a/static/bootstrap-icons/mailbox2.svg b/static/bootstrap-icons-1.13.1/mailbox2.svg similarity index 100% rename from static/bootstrap-icons/mailbox2.svg rename to static/bootstrap-icons-1.13.1/mailbox2.svg diff --git a/static/bootstrap-icons/map-fill.svg b/static/bootstrap-icons-1.13.1/map-fill.svg similarity index 100% rename from static/bootstrap-icons/map-fill.svg rename to static/bootstrap-icons-1.13.1/map-fill.svg diff --git a/static/bootstrap-icons/map.svg b/static/bootstrap-icons-1.13.1/map.svg similarity index 100% rename from static/bootstrap-icons/map.svg rename to static/bootstrap-icons-1.13.1/map.svg diff --git a/static/bootstrap-icons/markdown-fill.svg b/static/bootstrap-icons-1.13.1/markdown-fill.svg similarity index 100% rename from static/bootstrap-icons/markdown-fill.svg rename to static/bootstrap-icons-1.13.1/markdown-fill.svg diff --git a/static/bootstrap-icons/markdown.svg b/static/bootstrap-icons-1.13.1/markdown.svg similarity index 100% rename from static/bootstrap-icons/markdown.svg rename to static/bootstrap-icons-1.13.1/markdown.svg diff --git a/static/bootstrap-icons/marker-tip.svg b/static/bootstrap-icons-1.13.1/marker-tip.svg similarity index 100% rename from static/bootstrap-icons/marker-tip.svg rename to static/bootstrap-icons-1.13.1/marker-tip.svg diff --git a/static/bootstrap-icons/mask.svg b/static/bootstrap-icons-1.13.1/mask.svg similarity index 100% rename from static/bootstrap-icons/mask.svg rename to static/bootstrap-icons-1.13.1/mask.svg diff --git a/static/bootstrap-icons/mastodon.svg b/static/bootstrap-icons-1.13.1/mastodon.svg similarity index 100% rename from static/bootstrap-icons/mastodon.svg rename to static/bootstrap-icons-1.13.1/mastodon.svg diff --git a/static/bootstrap-icons/measuring-cup-fill.svg b/static/bootstrap-icons-1.13.1/measuring-cup-fill.svg similarity index 100% rename from static/bootstrap-icons/measuring-cup-fill.svg rename to static/bootstrap-icons-1.13.1/measuring-cup-fill.svg diff --git a/static/bootstrap-icons/measuring-cup.svg b/static/bootstrap-icons-1.13.1/measuring-cup.svg similarity index 100% rename from static/bootstrap-icons/measuring-cup.svg rename to static/bootstrap-icons-1.13.1/measuring-cup.svg diff --git a/static/bootstrap-icons/medium.svg b/static/bootstrap-icons-1.13.1/medium.svg similarity index 100% rename from static/bootstrap-icons/medium.svg rename to static/bootstrap-icons-1.13.1/medium.svg diff --git a/static/bootstrap-icons/megaphone-fill.svg b/static/bootstrap-icons-1.13.1/megaphone-fill.svg similarity index 100% rename from static/bootstrap-icons/megaphone-fill.svg rename to static/bootstrap-icons-1.13.1/megaphone-fill.svg diff --git a/static/bootstrap-icons/megaphone.svg b/static/bootstrap-icons-1.13.1/megaphone.svg similarity index 100% rename from static/bootstrap-icons/megaphone.svg rename to static/bootstrap-icons-1.13.1/megaphone.svg diff --git a/static/bootstrap-icons/memory.svg b/static/bootstrap-icons-1.13.1/memory.svg similarity index 100% rename from static/bootstrap-icons/memory.svg rename to static/bootstrap-icons-1.13.1/memory.svg diff --git a/static/bootstrap-icons/menu-app-fill.svg b/static/bootstrap-icons-1.13.1/menu-app-fill.svg similarity index 100% rename from static/bootstrap-icons/menu-app-fill.svg rename to static/bootstrap-icons-1.13.1/menu-app-fill.svg diff --git a/static/bootstrap-icons/menu-app.svg b/static/bootstrap-icons-1.13.1/menu-app.svg similarity index 100% rename from static/bootstrap-icons/menu-app.svg rename to static/bootstrap-icons-1.13.1/menu-app.svg diff --git a/static/bootstrap-icons/menu-button-fill.svg b/static/bootstrap-icons-1.13.1/menu-button-fill.svg similarity index 100% rename from static/bootstrap-icons/menu-button-fill.svg rename to static/bootstrap-icons-1.13.1/menu-button-fill.svg diff --git a/static/bootstrap-icons/menu-button-wide-fill.svg b/static/bootstrap-icons-1.13.1/menu-button-wide-fill.svg similarity index 100% rename from static/bootstrap-icons/menu-button-wide-fill.svg rename to static/bootstrap-icons-1.13.1/menu-button-wide-fill.svg diff --git a/static/bootstrap-icons/menu-button-wide.svg b/static/bootstrap-icons-1.13.1/menu-button-wide.svg similarity index 100% rename from static/bootstrap-icons/menu-button-wide.svg rename to static/bootstrap-icons-1.13.1/menu-button-wide.svg diff --git a/static/bootstrap-icons/menu-button.svg b/static/bootstrap-icons-1.13.1/menu-button.svg similarity index 100% rename from static/bootstrap-icons/menu-button.svg rename to static/bootstrap-icons-1.13.1/menu-button.svg diff --git a/static/bootstrap-icons/menu-down.svg b/static/bootstrap-icons-1.13.1/menu-down.svg similarity index 100% rename from static/bootstrap-icons/menu-down.svg rename to static/bootstrap-icons-1.13.1/menu-down.svg diff --git a/static/bootstrap-icons/menu-up.svg b/static/bootstrap-icons-1.13.1/menu-up.svg similarity index 100% rename from static/bootstrap-icons/menu-up.svg rename to static/bootstrap-icons-1.13.1/menu-up.svg diff --git a/static/bootstrap-icons/messenger.svg b/static/bootstrap-icons-1.13.1/messenger.svg similarity index 100% rename from static/bootstrap-icons/messenger.svg rename to static/bootstrap-icons-1.13.1/messenger.svg diff --git a/static/bootstrap-icons/meta.svg b/static/bootstrap-icons-1.13.1/meta.svg similarity index 100% rename from static/bootstrap-icons/meta.svg rename to static/bootstrap-icons-1.13.1/meta.svg diff --git a/static/bootstrap-icons/mic-fill.svg b/static/bootstrap-icons-1.13.1/mic-fill.svg similarity index 100% rename from static/bootstrap-icons/mic-fill.svg rename to static/bootstrap-icons-1.13.1/mic-fill.svg diff --git a/static/bootstrap-icons/mic-mute-fill.svg b/static/bootstrap-icons-1.13.1/mic-mute-fill.svg similarity index 100% rename from static/bootstrap-icons/mic-mute-fill.svg rename to static/bootstrap-icons-1.13.1/mic-mute-fill.svg diff --git a/static/bootstrap-icons/mic-mute.svg b/static/bootstrap-icons-1.13.1/mic-mute.svg similarity index 100% rename from static/bootstrap-icons/mic-mute.svg rename to static/bootstrap-icons-1.13.1/mic-mute.svg diff --git a/static/bootstrap-icons/mic.svg b/static/bootstrap-icons-1.13.1/mic.svg similarity index 100% rename from static/bootstrap-icons/mic.svg rename to static/bootstrap-icons-1.13.1/mic.svg diff --git a/static/bootstrap-icons/microsoft-teams.svg b/static/bootstrap-icons-1.13.1/microsoft-teams.svg similarity index 100% rename from static/bootstrap-icons/microsoft-teams.svg rename to static/bootstrap-icons-1.13.1/microsoft-teams.svg diff --git a/static/bootstrap-icons/microsoft.svg b/static/bootstrap-icons-1.13.1/microsoft.svg similarity index 100% rename from static/bootstrap-icons/microsoft.svg rename to static/bootstrap-icons-1.13.1/microsoft.svg diff --git a/static/bootstrap-icons/minecart-loaded.svg b/static/bootstrap-icons-1.13.1/minecart-loaded.svg similarity index 100% rename from static/bootstrap-icons/minecart-loaded.svg rename to static/bootstrap-icons-1.13.1/minecart-loaded.svg diff --git a/static/bootstrap-icons/minecart.svg b/static/bootstrap-icons-1.13.1/minecart.svg similarity index 100% rename from static/bootstrap-icons/minecart.svg rename to static/bootstrap-icons-1.13.1/minecart.svg diff --git a/static/bootstrap-icons/modem-fill.svg b/static/bootstrap-icons-1.13.1/modem-fill.svg similarity index 100% rename from static/bootstrap-icons/modem-fill.svg rename to static/bootstrap-icons-1.13.1/modem-fill.svg diff --git a/static/bootstrap-icons/modem.svg b/static/bootstrap-icons-1.13.1/modem.svg similarity index 100% rename from static/bootstrap-icons/modem.svg rename to static/bootstrap-icons-1.13.1/modem.svg diff --git a/static/bootstrap-icons/moisture.svg b/static/bootstrap-icons-1.13.1/moisture.svg similarity index 100% rename from static/bootstrap-icons/moisture.svg rename to static/bootstrap-icons-1.13.1/moisture.svg diff --git a/static/bootstrap-icons/moon-fill.svg b/static/bootstrap-icons-1.13.1/moon-fill.svg similarity index 100% rename from static/bootstrap-icons/moon-fill.svg rename to static/bootstrap-icons-1.13.1/moon-fill.svg diff --git a/static/bootstrap-icons/moon-stars-fill.svg b/static/bootstrap-icons-1.13.1/moon-stars-fill.svg similarity index 100% rename from static/bootstrap-icons/moon-stars-fill.svg rename to static/bootstrap-icons-1.13.1/moon-stars-fill.svg diff --git a/static/bootstrap-icons/moon-stars.svg b/static/bootstrap-icons-1.13.1/moon-stars.svg similarity index 100% rename from static/bootstrap-icons/moon-stars.svg rename to static/bootstrap-icons-1.13.1/moon-stars.svg diff --git a/static/bootstrap-icons/moon.svg b/static/bootstrap-icons-1.13.1/moon.svg similarity index 100% rename from static/bootstrap-icons/moon.svg rename to static/bootstrap-icons-1.13.1/moon.svg diff --git a/static/bootstrap-icons/mortarboard-fill.svg b/static/bootstrap-icons-1.13.1/mortarboard-fill.svg similarity index 100% rename from static/bootstrap-icons/mortarboard-fill.svg rename to static/bootstrap-icons-1.13.1/mortarboard-fill.svg diff --git a/static/bootstrap-icons/mortarboard.svg b/static/bootstrap-icons-1.13.1/mortarboard.svg similarity index 100% rename from static/bootstrap-icons/mortarboard.svg rename to static/bootstrap-icons-1.13.1/mortarboard.svg diff --git a/static/bootstrap-icons/motherboard-fill.svg b/static/bootstrap-icons-1.13.1/motherboard-fill.svg similarity index 100% rename from static/bootstrap-icons/motherboard-fill.svg rename to static/bootstrap-icons-1.13.1/motherboard-fill.svg diff --git a/static/bootstrap-icons/motherboard.svg b/static/bootstrap-icons-1.13.1/motherboard.svg similarity index 100% rename from static/bootstrap-icons/motherboard.svg rename to static/bootstrap-icons-1.13.1/motherboard.svg diff --git a/static/bootstrap-icons/mouse-fill.svg b/static/bootstrap-icons-1.13.1/mouse-fill.svg similarity index 100% rename from static/bootstrap-icons/mouse-fill.svg rename to static/bootstrap-icons-1.13.1/mouse-fill.svg diff --git a/static/bootstrap-icons/mouse.svg b/static/bootstrap-icons-1.13.1/mouse.svg similarity index 100% rename from static/bootstrap-icons/mouse.svg rename to static/bootstrap-icons-1.13.1/mouse.svg diff --git a/static/bootstrap-icons/mouse2-fill.svg b/static/bootstrap-icons-1.13.1/mouse2-fill.svg similarity index 100% rename from static/bootstrap-icons/mouse2-fill.svg rename to static/bootstrap-icons-1.13.1/mouse2-fill.svg diff --git a/static/bootstrap-icons/mouse2.svg b/static/bootstrap-icons-1.13.1/mouse2.svg similarity index 100% rename from static/bootstrap-icons/mouse2.svg rename to static/bootstrap-icons-1.13.1/mouse2.svg diff --git a/static/bootstrap-icons/mouse3-fill.svg b/static/bootstrap-icons-1.13.1/mouse3-fill.svg similarity index 100% rename from static/bootstrap-icons/mouse3-fill.svg rename to static/bootstrap-icons-1.13.1/mouse3-fill.svg diff --git a/static/bootstrap-icons/mouse3.svg b/static/bootstrap-icons-1.13.1/mouse3.svg similarity index 100% rename from static/bootstrap-icons/mouse3.svg rename to static/bootstrap-icons-1.13.1/mouse3.svg diff --git a/static/bootstrap-icons/music-note-beamed.svg b/static/bootstrap-icons-1.13.1/music-note-beamed.svg similarity index 100% rename from static/bootstrap-icons/music-note-beamed.svg rename to static/bootstrap-icons-1.13.1/music-note-beamed.svg diff --git a/static/bootstrap-icons/music-note-list.svg b/static/bootstrap-icons-1.13.1/music-note-list.svg similarity index 100% rename from static/bootstrap-icons/music-note-list.svg rename to static/bootstrap-icons-1.13.1/music-note-list.svg diff --git a/static/bootstrap-icons/music-note.svg b/static/bootstrap-icons-1.13.1/music-note.svg similarity index 100% rename from static/bootstrap-icons/music-note.svg rename to static/bootstrap-icons-1.13.1/music-note.svg diff --git a/static/bootstrap-icons/music-player-fill.svg b/static/bootstrap-icons-1.13.1/music-player-fill.svg similarity index 100% rename from static/bootstrap-icons/music-player-fill.svg rename to static/bootstrap-icons-1.13.1/music-player-fill.svg diff --git a/static/bootstrap-icons/music-player.svg b/static/bootstrap-icons-1.13.1/music-player.svg similarity index 100% rename from static/bootstrap-icons/music-player.svg rename to static/bootstrap-icons-1.13.1/music-player.svg diff --git a/static/bootstrap-icons/newspaper.svg b/static/bootstrap-icons-1.13.1/newspaper.svg similarity index 100% rename from static/bootstrap-icons/newspaper.svg rename to static/bootstrap-icons-1.13.1/newspaper.svg diff --git a/static/bootstrap-icons/nintendo-switch.svg b/static/bootstrap-icons-1.13.1/nintendo-switch.svg similarity index 100% rename from static/bootstrap-icons/nintendo-switch.svg rename to static/bootstrap-icons-1.13.1/nintendo-switch.svg diff --git a/static/bootstrap-icons/node-minus-fill.svg b/static/bootstrap-icons-1.13.1/node-minus-fill.svg similarity index 100% rename from static/bootstrap-icons/node-minus-fill.svg rename to static/bootstrap-icons-1.13.1/node-minus-fill.svg diff --git a/static/bootstrap-icons/node-minus.svg b/static/bootstrap-icons-1.13.1/node-minus.svg similarity index 100% rename from static/bootstrap-icons/node-minus.svg rename to static/bootstrap-icons-1.13.1/node-minus.svg diff --git a/static/bootstrap-icons/node-plus-fill.svg b/static/bootstrap-icons-1.13.1/node-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/node-plus-fill.svg rename to static/bootstrap-icons-1.13.1/node-plus-fill.svg diff --git a/static/bootstrap-icons/node-plus.svg b/static/bootstrap-icons-1.13.1/node-plus.svg similarity index 100% rename from static/bootstrap-icons/node-plus.svg rename to static/bootstrap-icons-1.13.1/node-plus.svg diff --git a/static/bootstrap-icons/noise-reduction.svg b/static/bootstrap-icons-1.13.1/noise-reduction.svg similarity index 100% rename from static/bootstrap-icons/noise-reduction.svg rename to static/bootstrap-icons-1.13.1/noise-reduction.svg diff --git a/static/bootstrap-icons/nut-fill.svg b/static/bootstrap-icons-1.13.1/nut-fill.svg similarity index 100% rename from static/bootstrap-icons/nut-fill.svg rename to static/bootstrap-icons-1.13.1/nut-fill.svg diff --git a/static/bootstrap-icons/nut.svg b/static/bootstrap-icons-1.13.1/nut.svg similarity index 100% rename from static/bootstrap-icons/nut.svg rename to static/bootstrap-icons-1.13.1/nut.svg diff --git a/static/bootstrap-icons/nvidia.svg b/static/bootstrap-icons-1.13.1/nvidia.svg similarity index 100% rename from static/bootstrap-icons/nvidia.svg rename to static/bootstrap-icons-1.13.1/nvidia.svg diff --git a/static/bootstrap-icons/nvme-fill.svg b/static/bootstrap-icons-1.13.1/nvme-fill.svg similarity index 100% rename from static/bootstrap-icons/nvme-fill.svg rename to static/bootstrap-icons-1.13.1/nvme-fill.svg diff --git a/static/bootstrap-icons/nvme.svg b/static/bootstrap-icons-1.13.1/nvme.svg similarity index 100% rename from static/bootstrap-icons/nvme.svg rename to static/bootstrap-icons-1.13.1/nvme.svg diff --git a/static/bootstrap-icons/octagon-fill.svg b/static/bootstrap-icons-1.13.1/octagon-fill.svg similarity index 100% rename from static/bootstrap-icons/octagon-fill.svg rename to static/bootstrap-icons-1.13.1/octagon-fill.svg diff --git a/static/bootstrap-icons/octagon-half.svg b/static/bootstrap-icons-1.13.1/octagon-half.svg similarity index 100% rename from static/bootstrap-icons/octagon-half.svg rename to static/bootstrap-icons-1.13.1/octagon-half.svg diff --git a/static/bootstrap-icons/octagon.svg b/static/bootstrap-icons-1.13.1/octagon.svg similarity index 100% rename from static/bootstrap-icons/octagon.svg rename to static/bootstrap-icons-1.13.1/octagon.svg diff --git a/static/bootstrap-icons/openai.svg b/static/bootstrap-icons-1.13.1/openai.svg similarity index 100% rename from static/bootstrap-icons/openai.svg rename to static/bootstrap-icons-1.13.1/openai.svg diff --git a/static/bootstrap-icons/opencollective.svg b/static/bootstrap-icons-1.13.1/opencollective.svg similarity index 100% rename from static/bootstrap-icons/opencollective.svg rename to static/bootstrap-icons-1.13.1/opencollective.svg diff --git a/static/bootstrap-icons/optical-audio-fill.svg b/static/bootstrap-icons-1.13.1/optical-audio-fill.svg similarity index 100% rename from static/bootstrap-icons/optical-audio-fill.svg rename to static/bootstrap-icons-1.13.1/optical-audio-fill.svg diff --git a/static/bootstrap-icons/optical-audio.svg b/static/bootstrap-icons-1.13.1/optical-audio.svg similarity index 100% rename from static/bootstrap-icons/optical-audio.svg rename to static/bootstrap-icons-1.13.1/optical-audio.svg diff --git a/static/bootstrap-icons/option.svg b/static/bootstrap-icons-1.13.1/option.svg similarity index 100% rename from static/bootstrap-icons/option.svg rename to static/bootstrap-icons-1.13.1/option.svg diff --git a/static/bootstrap-icons/outlet.svg b/static/bootstrap-icons-1.13.1/outlet.svg similarity index 100% rename from static/bootstrap-icons/outlet.svg rename to static/bootstrap-icons-1.13.1/outlet.svg diff --git a/static/bootstrap-icons/p-circle-fill.svg b/static/bootstrap-icons-1.13.1/p-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/p-circle-fill.svg rename to static/bootstrap-icons-1.13.1/p-circle-fill.svg diff --git a/static/bootstrap-icons/p-circle.svg b/static/bootstrap-icons-1.13.1/p-circle.svg similarity index 100% rename from static/bootstrap-icons/p-circle.svg rename to static/bootstrap-icons-1.13.1/p-circle.svg diff --git a/static/bootstrap-icons/p-square-fill.svg b/static/bootstrap-icons-1.13.1/p-square-fill.svg similarity index 100% rename from static/bootstrap-icons/p-square-fill.svg rename to static/bootstrap-icons-1.13.1/p-square-fill.svg diff --git a/static/bootstrap-icons/p-square.svg b/static/bootstrap-icons-1.13.1/p-square.svg similarity index 100% rename from static/bootstrap-icons/p-square.svg rename to static/bootstrap-icons-1.13.1/p-square.svg diff --git a/static/bootstrap-icons/paint-bucket.svg b/static/bootstrap-icons-1.13.1/paint-bucket.svg similarity index 100% rename from static/bootstrap-icons/paint-bucket.svg rename to static/bootstrap-icons-1.13.1/paint-bucket.svg diff --git a/static/bootstrap-icons/palette-fill.svg b/static/bootstrap-icons-1.13.1/palette-fill.svg similarity index 100% rename from static/bootstrap-icons/palette-fill.svg rename to static/bootstrap-icons-1.13.1/palette-fill.svg diff --git a/static/bootstrap-icons/palette.svg b/static/bootstrap-icons-1.13.1/palette.svg similarity index 100% rename from static/bootstrap-icons/palette.svg rename to static/bootstrap-icons-1.13.1/palette.svg diff --git a/static/bootstrap-icons/palette2.svg b/static/bootstrap-icons-1.13.1/palette2.svg similarity index 100% rename from static/bootstrap-icons/palette2.svg rename to static/bootstrap-icons-1.13.1/palette2.svg diff --git a/static/bootstrap-icons/paperclip.svg b/static/bootstrap-icons-1.13.1/paperclip.svg similarity index 100% rename from static/bootstrap-icons/paperclip.svg rename to static/bootstrap-icons-1.13.1/paperclip.svg diff --git a/static/bootstrap-icons/paragraph.svg b/static/bootstrap-icons-1.13.1/paragraph.svg similarity index 100% rename from static/bootstrap-icons/paragraph.svg rename to static/bootstrap-icons-1.13.1/paragraph.svg diff --git a/static/bootstrap-icons/pass-fill.svg b/static/bootstrap-icons-1.13.1/pass-fill.svg similarity index 100% rename from static/bootstrap-icons/pass-fill.svg rename to static/bootstrap-icons-1.13.1/pass-fill.svg diff --git a/static/bootstrap-icons/pass.svg b/static/bootstrap-icons-1.13.1/pass.svg similarity index 100% rename from static/bootstrap-icons/pass.svg rename to static/bootstrap-icons-1.13.1/pass.svg diff --git a/static/bootstrap-icons/passport-fill.svg b/static/bootstrap-icons-1.13.1/passport-fill.svg similarity index 100% rename from static/bootstrap-icons/passport-fill.svg rename to static/bootstrap-icons-1.13.1/passport-fill.svg diff --git a/static/bootstrap-icons/passport.svg b/static/bootstrap-icons-1.13.1/passport.svg similarity index 100% rename from static/bootstrap-icons/passport.svg rename to static/bootstrap-icons-1.13.1/passport.svg diff --git a/static/bootstrap-icons/patch-check-fill.svg b/static/bootstrap-icons-1.13.1/patch-check-fill.svg similarity index 100% rename from static/bootstrap-icons/patch-check-fill.svg rename to static/bootstrap-icons-1.13.1/patch-check-fill.svg diff --git a/static/bootstrap-icons/patch-check.svg b/static/bootstrap-icons-1.13.1/patch-check.svg similarity index 100% rename from static/bootstrap-icons/patch-check.svg rename to static/bootstrap-icons-1.13.1/patch-check.svg diff --git a/static/bootstrap-icons/patch-exclamation-fill.svg b/static/bootstrap-icons-1.13.1/patch-exclamation-fill.svg similarity index 100% rename from static/bootstrap-icons/patch-exclamation-fill.svg rename to static/bootstrap-icons-1.13.1/patch-exclamation-fill.svg diff --git a/static/bootstrap-icons/patch-exclamation.svg b/static/bootstrap-icons-1.13.1/patch-exclamation.svg similarity index 100% rename from static/bootstrap-icons/patch-exclamation.svg rename to static/bootstrap-icons-1.13.1/patch-exclamation.svg diff --git a/static/bootstrap-icons/patch-minus-fill.svg b/static/bootstrap-icons-1.13.1/patch-minus-fill.svg similarity index 100% rename from static/bootstrap-icons/patch-minus-fill.svg rename to static/bootstrap-icons-1.13.1/patch-minus-fill.svg diff --git a/static/bootstrap-icons/patch-minus.svg b/static/bootstrap-icons-1.13.1/patch-minus.svg similarity index 100% rename from static/bootstrap-icons/patch-minus.svg rename to static/bootstrap-icons-1.13.1/patch-minus.svg diff --git a/static/bootstrap-icons/patch-plus-fill.svg b/static/bootstrap-icons-1.13.1/patch-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/patch-plus-fill.svg rename to static/bootstrap-icons-1.13.1/patch-plus-fill.svg diff --git a/static/bootstrap-icons/patch-plus.svg b/static/bootstrap-icons-1.13.1/patch-plus.svg similarity index 100% rename from static/bootstrap-icons/patch-plus.svg rename to static/bootstrap-icons-1.13.1/patch-plus.svg diff --git a/static/bootstrap-icons/patch-question-fill.svg b/static/bootstrap-icons-1.13.1/patch-question-fill.svg similarity index 100% rename from static/bootstrap-icons/patch-question-fill.svg rename to static/bootstrap-icons-1.13.1/patch-question-fill.svg diff --git a/static/bootstrap-icons/patch-question.svg b/static/bootstrap-icons-1.13.1/patch-question.svg similarity index 100% rename from static/bootstrap-icons/patch-question.svg rename to static/bootstrap-icons-1.13.1/patch-question.svg diff --git a/static/bootstrap-icons/pause-btn-fill.svg b/static/bootstrap-icons-1.13.1/pause-btn-fill.svg similarity index 100% rename from static/bootstrap-icons/pause-btn-fill.svg rename to static/bootstrap-icons-1.13.1/pause-btn-fill.svg diff --git a/static/bootstrap-icons/pause-btn.svg b/static/bootstrap-icons-1.13.1/pause-btn.svg similarity index 100% rename from static/bootstrap-icons/pause-btn.svg rename to static/bootstrap-icons-1.13.1/pause-btn.svg diff --git a/static/bootstrap-icons/pause-circle-fill.svg b/static/bootstrap-icons-1.13.1/pause-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/pause-circle-fill.svg rename to static/bootstrap-icons-1.13.1/pause-circle-fill.svg diff --git a/static/bootstrap-icons/pause-circle.svg b/static/bootstrap-icons-1.13.1/pause-circle.svg similarity index 100% rename from static/bootstrap-icons/pause-circle.svg rename to static/bootstrap-icons-1.13.1/pause-circle.svg diff --git a/static/bootstrap-icons/pause-fill.svg b/static/bootstrap-icons-1.13.1/pause-fill.svg similarity index 100% rename from static/bootstrap-icons/pause-fill.svg rename to static/bootstrap-icons-1.13.1/pause-fill.svg diff --git a/static/bootstrap-icons/pause.svg b/static/bootstrap-icons-1.13.1/pause.svg similarity index 100% rename from static/bootstrap-icons/pause.svg rename to static/bootstrap-icons-1.13.1/pause.svg diff --git a/static/bootstrap-icons/paypal.svg b/static/bootstrap-icons-1.13.1/paypal.svg similarity index 100% rename from static/bootstrap-icons/paypal.svg rename to static/bootstrap-icons-1.13.1/paypal.svg diff --git a/static/bootstrap-icons/pc-display-horizontal.svg b/static/bootstrap-icons-1.13.1/pc-display-horizontal.svg similarity index 100% rename from static/bootstrap-icons/pc-display-horizontal.svg rename to static/bootstrap-icons-1.13.1/pc-display-horizontal.svg diff --git a/static/bootstrap-icons/pc-display.svg b/static/bootstrap-icons-1.13.1/pc-display.svg similarity index 100% rename from static/bootstrap-icons/pc-display.svg rename to static/bootstrap-icons-1.13.1/pc-display.svg diff --git a/static/bootstrap-icons/pc-horizontal.svg b/static/bootstrap-icons-1.13.1/pc-horizontal.svg similarity index 100% rename from static/bootstrap-icons/pc-horizontal.svg rename to static/bootstrap-icons-1.13.1/pc-horizontal.svg diff --git a/static/bootstrap-icons/pc.svg b/static/bootstrap-icons-1.13.1/pc.svg similarity index 100% rename from static/bootstrap-icons/pc.svg rename to static/bootstrap-icons-1.13.1/pc.svg diff --git a/static/bootstrap-icons/pci-card-network.svg b/static/bootstrap-icons-1.13.1/pci-card-network.svg similarity index 100% rename from static/bootstrap-icons/pci-card-network.svg rename to static/bootstrap-icons-1.13.1/pci-card-network.svg diff --git a/static/bootstrap-icons/pci-card-sound.svg b/static/bootstrap-icons-1.13.1/pci-card-sound.svg similarity index 100% rename from static/bootstrap-icons/pci-card-sound.svg rename to static/bootstrap-icons-1.13.1/pci-card-sound.svg diff --git a/static/bootstrap-icons/pci-card.svg b/static/bootstrap-icons-1.13.1/pci-card.svg similarity index 100% rename from static/bootstrap-icons/pci-card.svg rename to static/bootstrap-icons-1.13.1/pci-card.svg diff --git a/static/bootstrap-icons/peace-fill.svg b/static/bootstrap-icons-1.13.1/peace-fill.svg similarity index 100% rename from static/bootstrap-icons/peace-fill.svg rename to static/bootstrap-icons-1.13.1/peace-fill.svg diff --git a/static/bootstrap-icons/peace.svg b/static/bootstrap-icons-1.13.1/peace.svg similarity index 100% rename from static/bootstrap-icons/peace.svg rename to static/bootstrap-icons-1.13.1/peace.svg diff --git a/static/bootstrap-icons/pen-fill.svg b/static/bootstrap-icons-1.13.1/pen-fill.svg similarity index 100% rename from static/bootstrap-icons/pen-fill.svg rename to static/bootstrap-icons-1.13.1/pen-fill.svg diff --git a/static/bootstrap-icons/pen.svg b/static/bootstrap-icons-1.13.1/pen.svg similarity index 100% rename from static/bootstrap-icons/pen.svg rename to static/bootstrap-icons-1.13.1/pen.svg diff --git a/static/bootstrap-icons/pencil-fill.svg b/static/bootstrap-icons-1.13.1/pencil-fill.svg similarity index 100% rename from static/bootstrap-icons/pencil-fill.svg rename to static/bootstrap-icons-1.13.1/pencil-fill.svg diff --git a/static/bootstrap-icons/pencil-square.svg b/static/bootstrap-icons-1.13.1/pencil-square.svg similarity index 100% rename from static/bootstrap-icons/pencil-square.svg rename to static/bootstrap-icons-1.13.1/pencil-square.svg diff --git a/static/bootstrap-icons/pencil.svg b/static/bootstrap-icons-1.13.1/pencil.svg similarity index 100% rename from static/bootstrap-icons/pencil.svg rename to static/bootstrap-icons-1.13.1/pencil.svg diff --git a/static/bootstrap-icons/pentagon-fill.svg b/static/bootstrap-icons-1.13.1/pentagon-fill.svg similarity index 100% rename from static/bootstrap-icons/pentagon-fill.svg rename to static/bootstrap-icons-1.13.1/pentagon-fill.svg diff --git a/static/bootstrap-icons/pentagon-half.svg b/static/bootstrap-icons-1.13.1/pentagon-half.svg similarity index 100% rename from static/bootstrap-icons/pentagon-half.svg rename to static/bootstrap-icons-1.13.1/pentagon-half.svg diff --git a/static/bootstrap-icons/pentagon.svg b/static/bootstrap-icons-1.13.1/pentagon.svg similarity index 100% rename from static/bootstrap-icons/pentagon.svg rename to static/bootstrap-icons-1.13.1/pentagon.svg diff --git a/static/bootstrap-icons/people-fill.svg b/static/bootstrap-icons-1.13.1/people-fill.svg similarity index 100% rename from static/bootstrap-icons/people-fill.svg rename to static/bootstrap-icons-1.13.1/people-fill.svg diff --git a/static/bootstrap-icons/people.svg b/static/bootstrap-icons-1.13.1/people.svg similarity index 100% rename from static/bootstrap-icons/people.svg rename to static/bootstrap-icons-1.13.1/people.svg diff --git a/static/bootstrap-icons/percent.svg b/static/bootstrap-icons-1.13.1/percent.svg similarity index 100% rename from static/bootstrap-icons/percent.svg rename to static/bootstrap-icons-1.13.1/percent.svg diff --git a/static/bootstrap-icons/perplexity.svg b/static/bootstrap-icons-1.13.1/perplexity.svg similarity index 100% rename from static/bootstrap-icons/perplexity.svg rename to static/bootstrap-icons-1.13.1/perplexity.svg diff --git a/static/bootstrap-icons/person-add.svg b/static/bootstrap-icons-1.13.1/person-add.svg similarity index 100% rename from static/bootstrap-icons/person-add.svg rename to static/bootstrap-icons-1.13.1/person-add.svg diff --git a/static/bootstrap-icons/person-arms-up.svg b/static/bootstrap-icons-1.13.1/person-arms-up.svg similarity index 100% rename from static/bootstrap-icons/person-arms-up.svg rename to static/bootstrap-icons-1.13.1/person-arms-up.svg diff --git a/static/bootstrap-icons/person-badge-fill.svg b/static/bootstrap-icons-1.13.1/person-badge-fill.svg similarity index 100% rename from static/bootstrap-icons/person-badge-fill.svg rename to static/bootstrap-icons-1.13.1/person-badge-fill.svg diff --git a/static/bootstrap-icons/person-badge.svg b/static/bootstrap-icons-1.13.1/person-badge.svg similarity index 100% rename from static/bootstrap-icons/person-badge.svg rename to static/bootstrap-icons-1.13.1/person-badge.svg diff --git a/static/bootstrap-icons/person-bounding-box.svg b/static/bootstrap-icons-1.13.1/person-bounding-box.svg similarity index 100% rename from static/bootstrap-icons/person-bounding-box.svg rename to static/bootstrap-icons-1.13.1/person-bounding-box.svg diff --git a/static/bootstrap-icons/person-check-fill.svg b/static/bootstrap-icons-1.13.1/person-check-fill.svg similarity index 100% rename from static/bootstrap-icons/person-check-fill.svg rename to static/bootstrap-icons-1.13.1/person-check-fill.svg diff --git a/static/bootstrap-icons/person-check.svg b/static/bootstrap-icons-1.13.1/person-check.svg similarity index 100% rename from static/bootstrap-icons/person-check.svg rename to static/bootstrap-icons-1.13.1/person-check.svg diff --git a/static/bootstrap-icons/person-circle.svg b/static/bootstrap-icons-1.13.1/person-circle.svg similarity index 100% rename from static/bootstrap-icons/person-circle.svg rename to static/bootstrap-icons-1.13.1/person-circle.svg diff --git a/static/bootstrap-icons/person-dash-fill.svg b/static/bootstrap-icons-1.13.1/person-dash-fill.svg similarity index 100% rename from static/bootstrap-icons/person-dash-fill.svg rename to static/bootstrap-icons-1.13.1/person-dash-fill.svg diff --git a/static/bootstrap-icons/person-dash.svg b/static/bootstrap-icons-1.13.1/person-dash.svg similarity index 100% rename from static/bootstrap-icons/person-dash.svg rename to static/bootstrap-icons-1.13.1/person-dash.svg diff --git a/static/bootstrap-icons/person-down.svg b/static/bootstrap-icons-1.13.1/person-down.svg similarity index 100% rename from static/bootstrap-icons/person-down.svg rename to static/bootstrap-icons-1.13.1/person-down.svg diff --git a/static/bootstrap-icons/person-exclamation.svg b/static/bootstrap-icons-1.13.1/person-exclamation.svg similarity index 100% rename from static/bootstrap-icons/person-exclamation.svg rename to static/bootstrap-icons-1.13.1/person-exclamation.svg diff --git a/static/bootstrap-icons/person-fill-add.svg b/static/bootstrap-icons-1.13.1/person-fill-add.svg similarity index 100% rename from static/bootstrap-icons/person-fill-add.svg rename to static/bootstrap-icons-1.13.1/person-fill-add.svg diff --git a/static/bootstrap-icons/person-fill-check.svg b/static/bootstrap-icons-1.13.1/person-fill-check.svg similarity index 100% rename from static/bootstrap-icons/person-fill-check.svg rename to static/bootstrap-icons-1.13.1/person-fill-check.svg diff --git a/static/bootstrap-icons/person-fill-dash.svg b/static/bootstrap-icons-1.13.1/person-fill-dash.svg similarity index 100% rename from static/bootstrap-icons/person-fill-dash.svg rename to static/bootstrap-icons-1.13.1/person-fill-dash.svg diff --git a/static/bootstrap-icons/person-fill-down.svg b/static/bootstrap-icons-1.13.1/person-fill-down.svg similarity index 100% rename from static/bootstrap-icons/person-fill-down.svg rename to static/bootstrap-icons-1.13.1/person-fill-down.svg diff --git a/static/bootstrap-icons/person-fill-exclamation.svg b/static/bootstrap-icons-1.13.1/person-fill-exclamation.svg similarity index 100% rename from static/bootstrap-icons/person-fill-exclamation.svg rename to static/bootstrap-icons-1.13.1/person-fill-exclamation.svg diff --git a/static/bootstrap-icons/person-fill-gear.svg b/static/bootstrap-icons-1.13.1/person-fill-gear.svg similarity index 100% rename from static/bootstrap-icons/person-fill-gear.svg rename to static/bootstrap-icons-1.13.1/person-fill-gear.svg diff --git a/static/bootstrap-icons/person-fill-lock.svg b/static/bootstrap-icons-1.13.1/person-fill-lock.svg similarity index 100% rename from static/bootstrap-icons/person-fill-lock.svg rename to static/bootstrap-icons-1.13.1/person-fill-lock.svg diff --git a/static/bootstrap-icons/person-fill-slash.svg b/static/bootstrap-icons-1.13.1/person-fill-slash.svg similarity index 100% rename from static/bootstrap-icons/person-fill-slash.svg rename to static/bootstrap-icons-1.13.1/person-fill-slash.svg diff --git a/static/bootstrap-icons/person-fill-up.svg b/static/bootstrap-icons-1.13.1/person-fill-up.svg similarity index 100% rename from static/bootstrap-icons/person-fill-up.svg rename to static/bootstrap-icons-1.13.1/person-fill-up.svg diff --git a/static/bootstrap-icons/person-fill-x.svg b/static/bootstrap-icons-1.13.1/person-fill-x.svg similarity index 100% rename from static/bootstrap-icons/person-fill-x.svg rename to static/bootstrap-icons-1.13.1/person-fill-x.svg diff --git a/static/bootstrap-icons/person-fill.svg b/static/bootstrap-icons-1.13.1/person-fill.svg similarity index 100% rename from static/bootstrap-icons/person-fill.svg rename to static/bootstrap-icons-1.13.1/person-fill.svg diff --git a/static/bootstrap-icons/person-gear.svg b/static/bootstrap-icons-1.13.1/person-gear.svg similarity index 100% rename from static/bootstrap-icons/person-gear.svg rename to static/bootstrap-icons-1.13.1/person-gear.svg diff --git a/static/bootstrap-icons/person-heart.svg b/static/bootstrap-icons-1.13.1/person-heart.svg similarity index 100% rename from static/bootstrap-icons/person-heart.svg rename to static/bootstrap-icons-1.13.1/person-heart.svg diff --git a/static/bootstrap-icons/person-hearts.svg b/static/bootstrap-icons-1.13.1/person-hearts.svg similarity index 100% rename from static/bootstrap-icons/person-hearts.svg rename to static/bootstrap-icons-1.13.1/person-hearts.svg diff --git a/static/bootstrap-icons/person-lines-fill.svg b/static/bootstrap-icons-1.13.1/person-lines-fill.svg similarity index 100% rename from static/bootstrap-icons/person-lines-fill.svg rename to static/bootstrap-icons-1.13.1/person-lines-fill.svg diff --git a/static/bootstrap-icons/person-lock.svg b/static/bootstrap-icons-1.13.1/person-lock.svg similarity index 100% rename from static/bootstrap-icons/person-lock.svg rename to static/bootstrap-icons-1.13.1/person-lock.svg diff --git a/static/bootstrap-icons/person-plus-fill.svg b/static/bootstrap-icons-1.13.1/person-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/person-plus-fill.svg rename to static/bootstrap-icons-1.13.1/person-plus-fill.svg diff --git a/static/bootstrap-icons/person-plus.svg b/static/bootstrap-icons-1.13.1/person-plus.svg similarity index 100% rename from static/bootstrap-icons/person-plus.svg rename to static/bootstrap-icons-1.13.1/person-plus.svg diff --git a/static/bootstrap-icons/person-raised-hand.svg b/static/bootstrap-icons-1.13.1/person-raised-hand.svg similarity index 100% rename from static/bootstrap-icons/person-raised-hand.svg rename to static/bootstrap-icons-1.13.1/person-raised-hand.svg diff --git a/static/bootstrap-icons/person-rolodex.svg b/static/bootstrap-icons-1.13.1/person-rolodex.svg similarity index 100% rename from static/bootstrap-icons/person-rolodex.svg rename to static/bootstrap-icons-1.13.1/person-rolodex.svg diff --git a/static/bootstrap-icons/person-slash.svg b/static/bootstrap-icons-1.13.1/person-slash.svg similarity index 100% rename from static/bootstrap-icons/person-slash.svg rename to static/bootstrap-icons-1.13.1/person-slash.svg diff --git a/static/bootstrap-icons/person-square.svg b/static/bootstrap-icons-1.13.1/person-square.svg similarity index 100% rename from static/bootstrap-icons/person-square.svg rename to static/bootstrap-icons-1.13.1/person-square.svg diff --git a/static/bootstrap-icons/person-standing-dress.svg b/static/bootstrap-icons-1.13.1/person-standing-dress.svg similarity index 100% rename from static/bootstrap-icons/person-standing-dress.svg rename to static/bootstrap-icons-1.13.1/person-standing-dress.svg diff --git a/static/bootstrap-icons/person-standing.svg b/static/bootstrap-icons-1.13.1/person-standing.svg similarity index 100% rename from static/bootstrap-icons/person-standing.svg rename to static/bootstrap-icons-1.13.1/person-standing.svg diff --git a/static/bootstrap-icons/person-up.svg b/static/bootstrap-icons-1.13.1/person-up.svg similarity index 100% rename from static/bootstrap-icons/person-up.svg rename to static/bootstrap-icons-1.13.1/person-up.svg diff --git a/static/bootstrap-icons/person-vcard-fill.svg b/static/bootstrap-icons-1.13.1/person-vcard-fill.svg similarity index 100% rename from static/bootstrap-icons/person-vcard-fill.svg rename to static/bootstrap-icons-1.13.1/person-vcard-fill.svg diff --git a/static/bootstrap-icons/person-vcard.svg b/static/bootstrap-icons-1.13.1/person-vcard.svg similarity index 100% rename from static/bootstrap-icons/person-vcard.svg rename to static/bootstrap-icons-1.13.1/person-vcard.svg diff --git a/static/bootstrap-icons/person-video.svg b/static/bootstrap-icons-1.13.1/person-video.svg similarity index 100% rename from static/bootstrap-icons/person-video.svg rename to static/bootstrap-icons-1.13.1/person-video.svg diff --git a/static/bootstrap-icons/person-video2.svg b/static/bootstrap-icons-1.13.1/person-video2.svg similarity index 100% rename from static/bootstrap-icons/person-video2.svg rename to static/bootstrap-icons-1.13.1/person-video2.svg diff --git a/static/bootstrap-icons/person-video3.svg b/static/bootstrap-icons-1.13.1/person-video3.svg similarity index 100% rename from static/bootstrap-icons/person-video3.svg rename to static/bootstrap-icons-1.13.1/person-video3.svg diff --git a/static/bootstrap-icons/person-walking.svg b/static/bootstrap-icons-1.13.1/person-walking.svg similarity index 100% rename from static/bootstrap-icons/person-walking.svg rename to static/bootstrap-icons-1.13.1/person-walking.svg diff --git a/static/bootstrap-icons/person-wheelchair.svg b/static/bootstrap-icons-1.13.1/person-wheelchair.svg similarity index 100% rename from static/bootstrap-icons/person-wheelchair.svg rename to static/bootstrap-icons-1.13.1/person-wheelchair.svg diff --git a/static/bootstrap-icons/person-workspace.svg b/static/bootstrap-icons-1.13.1/person-workspace.svg similarity index 100% rename from static/bootstrap-icons/person-workspace.svg rename to static/bootstrap-icons-1.13.1/person-workspace.svg diff --git a/static/bootstrap-icons/person-x-fill.svg b/static/bootstrap-icons-1.13.1/person-x-fill.svg similarity index 100% rename from static/bootstrap-icons/person-x-fill.svg rename to static/bootstrap-icons-1.13.1/person-x-fill.svg diff --git a/static/bootstrap-icons/person-x.svg b/static/bootstrap-icons-1.13.1/person-x.svg similarity index 100% rename from static/bootstrap-icons/person-x.svg rename to static/bootstrap-icons-1.13.1/person-x.svg diff --git a/static/bootstrap-icons/person.svg b/static/bootstrap-icons-1.13.1/person.svg similarity index 100% rename from static/bootstrap-icons/person.svg rename to static/bootstrap-icons-1.13.1/person.svg diff --git a/static/bootstrap-icons/phone-fill.svg b/static/bootstrap-icons-1.13.1/phone-fill.svg similarity index 100% rename from static/bootstrap-icons/phone-fill.svg rename to static/bootstrap-icons-1.13.1/phone-fill.svg diff --git a/static/bootstrap-icons/phone-flip.svg b/static/bootstrap-icons-1.13.1/phone-flip.svg similarity index 100% rename from static/bootstrap-icons/phone-flip.svg rename to static/bootstrap-icons-1.13.1/phone-flip.svg diff --git a/static/bootstrap-icons/phone-landscape-fill.svg b/static/bootstrap-icons-1.13.1/phone-landscape-fill.svg similarity index 100% rename from static/bootstrap-icons/phone-landscape-fill.svg rename to static/bootstrap-icons-1.13.1/phone-landscape-fill.svg diff --git a/static/bootstrap-icons/phone-landscape.svg b/static/bootstrap-icons-1.13.1/phone-landscape.svg similarity index 100% rename from static/bootstrap-icons/phone-landscape.svg rename to static/bootstrap-icons-1.13.1/phone-landscape.svg diff --git a/static/bootstrap-icons/phone-vibrate-fill.svg b/static/bootstrap-icons-1.13.1/phone-vibrate-fill.svg similarity index 100% rename from static/bootstrap-icons/phone-vibrate-fill.svg rename to static/bootstrap-icons-1.13.1/phone-vibrate-fill.svg diff --git a/static/bootstrap-icons/phone-vibrate.svg b/static/bootstrap-icons-1.13.1/phone-vibrate.svg similarity index 100% rename from static/bootstrap-icons/phone-vibrate.svg rename to static/bootstrap-icons-1.13.1/phone-vibrate.svg diff --git a/static/bootstrap-icons/phone.svg b/static/bootstrap-icons-1.13.1/phone.svg similarity index 100% rename from static/bootstrap-icons/phone.svg rename to static/bootstrap-icons-1.13.1/phone.svg diff --git a/static/bootstrap-icons/pie-chart-fill.svg b/static/bootstrap-icons-1.13.1/pie-chart-fill.svg similarity index 100% rename from static/bootstrap-icons/pie-chart-fill.svg rename to static/bootstrap-icons-1.13.1/pie-chart-fill.svg diff --git a/static/bootstrap-icons/pie-chart.svg b/static/bootstrap-icons-1.13.1/pie-chart.svg similarity index 100% rename from static/bootstrap-icons/pie-chart.svg rename to static/bootstrap-icons-1.13.1/pie-chart.svg diff --git a/static/bootstrap-icons/piggy-bank-fill.svg b/static/bootstrap-icons-1.13.1/piggy-bank-fill.svg similarity index 100% rename from static/bootstrap-icons/piggy-bank-fill.svg rename to static/bootstrap-icons-1.13.1/piggy-bank-fill.svg diff --git a/static/bootstrap-icons/piggy-bank.svg b/static/bootstrap-icons-1.13.1/piggy-bank.svg similarity index 100% rename from static/bootstrap-icons/piggy-bank.svg rename to static/bootstrap-icons-1.13.1/piggy-bank.svg diff --git a/static/bootstrap-icons/pin-angle-fill.svg b/static/bootstrap-icons-1.13.1/pin-angle-fill.svg similarity index 100% rename from static/bootstrap-icons/pin-angle-fill.svg rename to static/bootstrap-icons-1.13.1/pin-angle-fill.svg diff --git a/static/bootstrap-icons/pin-angle.svg b/static/bootstrap-icons-1.13.1/pin-angle.svg similarity index 100% rename from static/bootstrap-icons/pin-angle.svg rename to static/bootstrap-icons-1.13.1/pin-angle.svg diff --git a/static/bootstrap-icons/pin-fill.svg b/static/bootstrap-icons-1.13.1/pin-fill.svg similarity index 100% rename from static/bootstrap-icons/pin-fill.svg rename to static/bootstrap-icons-1.13.1/pin-fill.svg diff --git a/static/bootstrap-icons/pin-map-fill.svg b/static/bootstrap-icons-1.13.1/pin-map-fill.svg similarity index 100% rename from static/bootstrap-icons/pin-map-fill.svg rename to static/bootstrap-icons-1.13.1/pin-map-fill.svg diff --git a/static/bootstrap-icons/pin-map.svg b/static/bootstrap-icons-1.13.1/pin-map.svg similarity index 100% rename from static/bootstrap-icons/pin-map.svg rename to static/bootstrap-icons-1.13.1/pin-map.svg diff --git a/static/bootstrap-icons/pin.svg b/static/bootstrap-icons-1.13.1/pin.svg similarity index 100% rename from static/bootstrap-icons/pin.svg rename to static/bootstrap-icons-1.13.1/pin.svg diff --git a/static/bootstrap-icons/pinterest.svg b/static/bootstrap-icons-1.13.1/pinterest.svg similarity index 100% rename from static/bootstrap-icons/pinterest.svg rename to static/bootstrap-icons-1.13.1/pinterest.svg diff --git a/static/bootstrap-icons/pip-fill.svg b/static/bootstrap-icons-1.13.1/pip-fill.svg similarity index 100% rename from static/bootstrap-icons/pip-fill.svg rename to static/bootstrap-icons-1.13.1/pip-fill.svg diff --git a/static/bootstrap-icons/pip.svg b/static/bootstrap-icons-1.13.1/pip.svg similarity index 100% rename from static/bootstrap-icons/pip.svg rename to static/bootstrap-icons-1.13.1/pip.svg diff --git a/static/bootstrap-icons/play-btn-fill.svg b/static/bootstrap-icons-1.13.1/play-btn-fill.svg similarity index 100% rename from static/bootstrap-icons/play-btn-fill.svg rename to static/bootstrap-icons-1.13.1/play-btn-fill.svg diff --git a/static/bootstrap-icons/play-btn.svg b/static/bootstrap-icons-1.13.1/play-btn.svg similarity index 100% rename from static/bootstrap-icons/play-btn.svg rename to static/bootstrap-icons-1.13.1/play-btn.svg diff --git a/static/bootstrap-icons/play-circle-fill.svg b/static/bootstrap-icons-1.13.1/play-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/play-circle-fill.svg rename to static/bootstrap-icons-1.13.1/play-circle-fill.svg diff --git a/static/bootstrap-icons/play-circle.svg b/static/bootstrap-icons-1.13.1/play-circle.svg similarity index 100% rename from static/bootstrap-icons/play-circle.svg rename to static/bootstrap-icons-1.13.1/play-circle.svg diff --git a/static/bootstrap-icons/play-fill.svg b/static/bootstrap-icons-1.13.1/play-fill.svg similarity index 100% rename from static/bootstrap-icons/play-fill.svg rename to static/bootstrap-icons-1.13.1/play-fill.svg diff --git a/static/bootstrap-icons/play.svg b/static/bootstrap-icons-1.13.1/play.svg similarity index 100% rename from static/bootstrap-icons/play.svg rename to static/bootstrap-icons-1.13.1/play.svg diff --git a/static/bootstrap-icons/playstation.svg b/static/bootstrap-icons-1.13.1/playstation.svg similarity index 100% rename from static/bootstrap-icons/playstation.svg rename to static/bootstrap-icons-1.13.1/playstation.svg diff --git a/static/bootstrap-icons/plug-fill.svg b/static/bootstrap-icons-1.13.1/plug-fill.svg similarity index 100% rename from static/bootstrap-icons/plug-fill.svg rename to static/bootstrap-icons-1.13.1/plug-fill.svg diff --git a/static/bootstrap-icons/plug.svg b/static/bootstrap-icons-1.13.1/plug.svg similarity index 100% rename from static/bootstrap-icons/plug.svg rename to static/bootstrap-icons-1.13.1/plug.svg diff --git a/static/bootstrap-icons/plugin.svg b/static/bootstrap-icons-1.13.1/plugin.svg similarity index 100% rename from static/bootstrap-icons/plugin.svg rename to static/bootstrap-icons-1.13.1/plugin.svg diff --git a/static/bootstrap-icons/plus-circle-dotted.svg b/static/bootstrap-icons-1.13.1/plus-circle-dotted.svg similarity index 100% rename from static/bootstrap-icons/plus-circle-dotted.svg rename to static/bootstrap-icons-1.13.1/plus-circle-dotted.svg diff --git a/static/bootstrap-icons/plus-circle-fill.svg b/static/bootstrap-icons-1.13.1/plus-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/plus-circle-fill.svg rename to static/bootstrap-icons-1.13.1/plus-circle-fill.svg diff --git a/static/bootstrap-icons/plus-circle.svg b/static/bootstrap-icons-1.13.1/plus-circle.svg similarity index 100% rename from static/bootstrap-icons/plus-circle.svg rename to static/bootstrap-icons-1.13.1/plus-circle.svg diff --git a/static/bootstrap-icons/plus-lg.svg b/static/bootstrap-icons-1.13.1/plus-lg.svg similarity index 100% rename from static/bootstrap-icons/plus-lg.svg rename to static/bootstrap-icons-1.13.1/plus-lg.svg diff --git a/static/bootstrap-icons/plus-slash-minus.svg b/static/bootstrap-icons-1.13.1/plus-slash-minus.svg similarity index 100% rename from static/bootstrap-icons/plus-slash-minus.svg rename to static/bootstrap-icons-1.13.1/plus-slash-minus.svg diff --git a/static/bootstrap-icons/plus-square-dotted.svg b/static/bootstrap-icons-1.13.1/plus-square-dotted.svg similarity index 100% rename from static/bootstrap-icons/plus-square-dotted.svg rename to static/bootstrap-icons-1.13.1/plus-square-dotted.svg diff --git a/static/bootstrap-icons/plus-square-fill.svg b/static/bootstrap-icons-1.13.1/plus-square-fill.svg similarity index 100% rename from static/bootstrap-icons/plus-square-fill.svg rename to static/bootstrap-icons-1.13.1/plus-square-fill.svg diff --git a/static/bootstrap-icons/plus-square.svg b/static/bootstrap-icons-1.13.1/plus-square.svg similarity index 100% rename from static/bootstrap-icons/plus-square.svg rename to static/bootstrap-icons-1.13.1/plus-square.svg diff --git a/static/bootstrap-icons/plus.svg b/static/bootstrap-icons-1.13.1/plus.svg similarity index 100% rename from static/bootstrap-icons/plus.svg rename to static/bootstrap-icons-1.13.1/plus.svg diff --git a/static/bootstrap-icons/postage-fill.svg b/static/bootstrap-icons-1.13.1/postage-fill.svg similarity index 100% rename from static/bootstrap-icons/postage-fill.svg rename to static/bootstrap-icons-1.13.1/postage-fill.svg diff --git a/static/bootstrap-icons/postage-heart-fill.svg b/static/bootstrap-icons-1.13.1/postage-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/postage-heart-fill.svg rename to static/bootstrap-icons-1.13.1/postage-heart-fill.svg diff --git a/static/bootstrap-icons/postage-heart.svg b/static/bootstrap-icons-1.13.1/postage-heart.svg similarity index 100% rename from static/bootstrap-icons/postage-heart.svg rename to static/bootstrap-icons-1.13.1/postage-heart.svg diff --git a/static/bootstrap-icons/postage.svg b/static/bootstrap-icons-1.13.1/postage.svg similarity index 100% rename from static/bootstrap-icons/postage.svg rename to static/bootstrap-icons-1.13.1/postage.svg diff --git a/static/bootstrap-icons/postcard-fill.svg b/static/bootstrap-icons-1.13.1/postcard-fill.svg similarity index 100% rename from static/bootstrap-icons/postcard-fill.svg rename to static/bootstrap-icons-1.13.1/postcard-fill.svg diff --git a/static/bootstrap-icons/postcard-heart-fill.svg b/static/bootstrap-icons-1.13.1/postcard-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/postcard-heart-fill.svg rename to static/bootstrap-icons-1.13.1/postcard-heart-fill.svg diff --git a/static/bootstrap-icons/postcard-heart.svg b/static/bootstrap-icons-1.13.1/postcard-heart.svg similarity index 100% rename from static/bootstrap-icons/postcard-heart.svg rename to static/bootstrap-icons-1.13.1/postcard-heart.svg diff --git a/static/bootstrap-icons/postcard.svg b/static/bootstrap-icons-1.13.1/postcard.svg similarity index 100% rename from static/bootstrap-icons/postcard.svg rename to static/bootstrap-icons-1.13.1/postcard.svg diff --git a/static/bootstrap-icons/power.svg b/static/bootstrap-icons-1.13.1/power.svg similarity index 100% rename from static/bootstrap-icons/power.svg rename to static/bootstrap-icons-1.13.1/power.svg diff --git a/static/bootstrap-icons/prescription.svg b/static/bootstrap-icons-1.13.1/prescription.svg similarity index 100% rename from static/bootstrap-icons/prescription.svg rename to static/bootstrap-icons-1.13.1/prescription.svg diff --git a/static/bootstrap-icons/prescription2.svg b/static/bootstrap-icons-1.13.1/prescription2.svg similarity index 100% rename from static/bootstrap-icons/prescription2.svg rename to static/bootstrap-icons-1.13.1/prescription2.svg diff --git a/static/bootstrap-icons/printer-fill.svg b/static/bootstrap-icons-1.13.1/printer-fill.svg similarity index 100% rename from static/bootstrap-icons/printer-fill.svg rename to static/bootstrap-icons-1.13.1/printer-fill.svg diff --git a/static/bootstrap-icons/printer.svg b/static/bootstrap-icons-1.13.1/printer.svg similarity index 100% rename from static/bootstrap-icons/printer.svg rename to static/bootstrap-icons-1.13.1/printer.svg diff --git a/static/bootstrap-icons/projector-fill.svg b/static/bootstrap-icons-1.13.1/projector-fill.svg similarity index 100% rename from static/bootstrap-icons/projector-fill.svg rename to static/bootstrap-icons-1.13.1/projector-fill.svg diff --git a/static/bootstrap-icons/projector.svg b/static/bootstrap-icons-1.13.1/projector.svg similarity index 100% rename from static/bootstrap-icons/projector.svg rename to static/bootstrap-icons-1.13.1/projector.svg diff --git a/static/bootstrap-icons/puzzle-fill.svg b/static/bootstrap-icons-1.13.1/puzzle-fill.svg similarity index 100% rename from static/bootstrap-icons/puzzle-fill.svg rename to static/bootstrap-icons-1.13.1/puzzle-fill.svg diff --git a/static/bootstrap-icons/puzzle.svg b/static/bootstrap-icons-1.13.1/puzzle.svg similarity index 100% rename from static/bootstrap-icons/puzzle.svg rename to static/bootstrap-icons-1.13.1/puzzle.svg diff --git a/static/bootstrap-icons/qr-code-scan.svg b/static/bootstrap-icons-1.13.1/qr-code-scan.svg similarity index 100% rename from static/bootstrap-icons/qr-code-scan.svg rename to static/bootstrap-icons-1.13.1/qr-code-scan.svg diff --git a/static/bootstrap-icons/qr-code.svg b/static/bootstrap-icons-1.13.1/qr-code.svg similarity index 100% rename from static/bootstrap-icons/qr-code.svg rename to static/bootstrap-icons-1.13.1/qr-code.svg diff --git a/static/bootstrap-icons/question-circle-fill.svg b/static/bootstrap-icons-1.13.1/question-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/question-circle-fill.svg rename to static/bootstrap-icons-1.13.1/question-circle-fill.svg diff --git a/static/bootstrap-icons/question-circle.svg b/static/bootstrap-icons-1.13.1/question-circle.svg similarity index 100% rename from static/bootstrap-icons/question-circle.svg rename to static/bootstrap-icons-1.13.1/question-circle.svg diff --git a/static/bootstrap-icons/question-diamond-fill.svg b/static/bootstrap-icons-1.13.1/question-diamond-fill.svg similarity index 100% rename from static/bootstrap-icons/question-diamond-fill.svg rename to static/bootstrap-icons-1.13.1/question-diamond-fill.svg diff --git a/static/bootstrap-icons/question-diamond.svg b/static/bootstrap-icons-1.13.1/question-diamond.svg similarity index 100% rename from static/bootstrap-icons/question-diamond.svg rename to static/bootstrap-icons-1.13.1/question-diamond.svg diff --git a/static/bootstrap-icons/question-lg.svg b/static/bootstrap-icons-1.13.1/question-lg.svg similarity index 100% rename from static/bootstrap-icons/question-lg.svg rename to static/bootstrap-icons-1.13.1/question-lg.svg diff --git a/static/bootstrap-icons/question-octagon-fill.svg b/static/bootstrap-icons-1.13.1/question-octagon-fill.svg similarity index 100% rename from static/bootstrap-icons/question-octagon-fill.svg rename to static/bootstrap-icons-1.13.1/question-octagon-fill.svg diff --git a/static/bootstrap-icons/question-octagon.svg b/static/bootstrap-icons-1.13.1/question-octagon.svg similarity index 100% rename from static/bootstrap-icons/question-octagon.svg rename to static/bootstrap-icons-1.13.1/question-octagon.svg diff --git a/static/bootstrap-icons/question-square-fill.svg b/static/bootstrap-icons-1.13.1/question-square-fill.svg similarity index 100% rename from static/bootstrap-icons/question-square-fill.svg rename to static/bootstrap-icons-1.13.1/question-square-fill.svg diff --git a/static/bootstrap-icons/question-square.svg b/static/bootstrap-icons-1.13.1/question-square.svg similarity index 100% rename from static/bootstrap-icons/question-square.svg rename to static/bootstrap-icons-1.13.1/question-square.svg diff --git a/static/bootstrap-icons/question.svg b/static/bootstrap-icons-1.13.1/question.svg similarity index 100% rename from static/bootstrap-icons/question.svg rename to static/bootstrap-icons-1.13.1/question.svg diff --git a/static/bootstrap-icons/quora.svg b/static/bootstrap-icons-1.13.1/quora.svg similarity index 100% rename from static/bootstrap-icons/quora.svg rename to static/bootstrap-icons-1.13.1/quora.svg diff --git a/static/bootstrap-icons/quote.svg b/static/bootstrap-icons-1.13.1/quote.svg similarity index 100% rename from static/bootstrap-icons/quote.svg rename to static/bootstrap-icons-1.13.1/quote.svg diff --git a/static/bootstrap-icons/r-circle-fill.svg b/static/bootstrap-icons-1.13.1/r-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/r-circle-fill.svg rename to static/bootstrap-icons-1.13.1/r-circle-fill.svg diff --git a/static/bootstrap-icons/r-circle.svg b/static/bootstrap-icons-1.13.1/r-circle.svg similarity index 100% rename from static/bootstrap-icons/r-circle.svg rename to static/bootstrap-icons-1.13.1/r-circle.svg diff --git a/static/bootstrap-icons/r-square-fill.svg b/static/bootstrap-icons-1.13.1/r-square-fill.svg similarity index 100% rename from static/bootstrap-icons/r-square-fill.svg rename to static/bootstrap-icons-1.13.1/r-square-fill.svg diff --git a/static/bootstrap-icons/r-square.svg b/static/bootstrap-icons-1.13.1/r-square.svg similarity index 100% rename from static/bootstrap-icons/r-square.svg rename to static/bootstrap-icons-1.13.1/r-square.svg diff --git a/static/bootstrap-icons/radar.svg b/static/bootstrap-icons-1.13.1/radar.svg similarity index 100% rename from static/bootstrap-icons/radar.svg rename to static/bootstrap-icons-1.13.1/radar.svg diff --git a/static/bootstrap-icons/radioactive.svg b/static/bootstrap-icons-1.13.1/radioactive.svg similarity index 100% rename from static/bootstrap-icons/radioactive.svg rename to static/bootstrap-icons-1.13.1/radioactive.svg diff --git a/static/bootstrap-icons/rainbow.svg b/static/bootstrap-icons-1.13.1/rainbow.svg similarity index 100% rename from static/bootstrap-icons/rainbow.svg rename to static/bootstrap-icons-1.13.1/rainbow.svg diff --git a/static/bootstrap-icons/receipt-cutoff.svg b/static/bootstrap-icons-1.13.1/receipt-cutoff.svg similarity index 100% rename from static/bootstrap-icons/receipt-cutoff.svg rename to static/bootstrap-icons-1.13.1/receipt-cutoff.svg diff --git a/static/bootstrap-icons/receipt.svg b/static/bootstrap-icons-1.13.1/receipt.svg similarity index 100% rename from static/bootstrap-icons/receipt.svg rename to static/bootstrap-icons-1.13.1/receipt.svg diff --git a/static/bootstrap-icons/reception-0.svg b/static/bootstrap-icons-1.13.1/reception-0.svg similarity index 100% rename from static/bootstrap-icons/reception-0.svg rename to static/bootstrap-icons-1.13.1/reception-0.svg diff --git a/static/bootstrap-icons/reception-1.svg b/static/bootstrap-icons-1.13.1/reception-1.svg similarity index 100% rename from static/bootstrap-icons/reception-1.svg rename to static/bootstrap-icons-1.13.1/reception-1.svg diff --git a/static/bootstrap-icons/reception-2.svg b/static/bootstrap-icons-1.13.1/reception-2.svg similarity index 100% rename from static/bootstrap-icons/reception-2.svg rename to static/bootstrap-icons-1.13.1/reception-2.svg diff --git a/static/bootstrap-icons/reception-3.svg b/static/bootstrap-icons-1.13.1/reception-3.svg similarity index 100% rename from static/bootstrap-icons/reception-3.svg rename to static/bootstrap-icons-1.13.1/reception-3.svg diff --git a/static/bootstrap-icons/reception-4.svg b/static/bootstrap-icons-1.13.1/reception-4.svg similarity index 100% rename from static/bootstrap-icons/reception-4.svg rename to static/bootstrap-icons-1.13.1/reception-4.svg diff --git a/static/bootstrap-icons/record-btn-fill.svg b/static/bootstrap-icons-1.13.1/record-btn-fill.svg similarity index 100% rename from static/bootstrap-icons/record-btn-fill.svg rename to static/bootstrap-icons-1.13.1/record-btn-fill.svg diff --git a/static/bootstrap-icons/record-btn.svg b/static/bootstrap-icons-1.13.1/record-btn.svg similarity index 100% rename from static/bootstrap-icons/record-btn.svg rename to static/bootstrap-icons-1.13.1/record-btn.svg diff --git a/static/bootstrap-icons/record-circle-fill.svg b/static/bootstrap-icons-1.13.1/record-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/record-circle-fill.svg rename to static/bootstrap-icons-1.13.1/record-circle-fill.svg diff --git a/static/bootstrap-icons/record-circle.svg b/static/bootstrap-icons-1.13.1/record-circle.svg similarity index 100% rename from static/bootstrap-icons/record-circle.svg rename to static/bootstrap-icons-1.13.1/record-circle.svg diff --git a/static/bootstrap-icons/record-fill.svg b/static/bootstrap-icons-1.13.1/record-fill.svg similarity index 100% rename from static/bootstrap-icons/record-fill.svg rename to static/bootstrap-icons-1.13.1/record-fill.svg diff --git a/static/bootstrap-icons/record.svg b/static/bootstrap-icons-1.13.1/record.svg similarity index 100% rename from static/bootstrap-icons/record.svg rename to static/bootstrap-icons-1.13.1/record.svg diff --git a/static/bootstrap-icons/record2-fill.svg b/static/bootstrap-icons-1.13.1/record2-fill.svg similarity index 100% rename from static/bootstrap-icons/record2-fill.svg rename to static/bootstrap-icons-1.13.1/record2-fill.svg diff --git a/static/bootstrap-icons/record2.svg b/static/bootstrap-icons-1.13.1/record2.svg similarity index 100% rename from static/bootstrap-icons/record2.svg rename to static/bootstrap-icons-1.13.1/record2.svg diff --git a/static/bootstrap-icons/recycle.svg b/static/bootstrap-icons-1.13.1/recycle.svg similarity index 100% rename from static/bootstrap-icons/recycle.svg rename to static/bootstrap-icons-1.13.1/recycle.svg diff --git a/static/bootstrap-icons/reddit.svg b/static/bootstrap-icons-1.13.1/reddit.svg similarity index 100% rename from static/bootstrap-icons/reddit.svg rename to static/bootstrap-icons-1.13.1/reddit.svg diff --git a/static/bootstrap-icons/regex.svg b/static/bootstrap-icons-1.13.1/regex.svg similarity index 100% rename from static/bootstrap-icons/regex.svg rename to static/bootstrap-icons-1.13.1/regex.svg diff --git a/static/bootstrap-icons/repeat-1.svg b/static/bootstrap-icons-1.13.1/repeat-1.svg similarity index 100% rename from static/bootstrap-icons/repeat-1.svg rename to static/bootstrap-icons-1.13.1/repeat-1.svg diff --git a/static/bootstrap-icons/repeat.svg b/static/bootstrap-icons-1.13.1/repeat.svg similarity index 100% rename from static/bootstrap-icons/repeat.svg rename to static/bootstrap-icons-1.13.1/repeat.svg diff --git a/static/bootstrap-icons/reply-all-fill.svg b/static/bootstrap-icons-1.13.1/reply-all-fill.svg similarity index 100% rename from static/bootstrap-icons/reply-all-fill.svg rename to static/bootstrap-icons-1.13.1/reply-all-fill.svg diff --git a/static/bootstrap-icons/reply-all.svg b/static/bootstrap-icons-1.13.1/reply-all.svg similarity index 100% rename from static/bootstrap-icons/reply-all.svg rename to static/bootstrap-icons-1.13.1/reply-all.svg diff --git a/static/bootstrap-icons/reply-fill.svg b/static/bootstrap-icons-1.13.1/reply-fill.svg similarity index 100% rename from static/bootstrap-icons/reply-fill.svg rename to static/bootstrap-icons-1.13.1/reply-fill.svg diff --git a/static/bootstrap-icons/reply.svg b/static/bootstrap-icons-1.13.1/reply.svg similarity index 100% rename from static/bootstrap-icons/reply.svg rename to static/bootstrap-icons-1.13.1/reply.svg diff --git a/static/bootstrap-icons/rewind-btn-fill.svg b/static/bootstrap-icons-1.13.1/rewind-btn-fill.svg similarity index 100% rename from static/bootstrap-icons/rewind-btn-fill.svg rename to static/bootstrap-icons-1.13.1/rewind-btn-fill.svg diff --git a/static/bootstrap-icons/rewind-btn.svg b/static/bootstrap-icons-1.13.1/rewind-btn.svg similarity index 100% rename from static/bootstrap-icons/rewind-btn.svg rename to static/bootstrap-icons-1.13.1/rewind-btn.svg diff --git a/static/bootstrap-icons/rewind-circle-fill.svg b/static/bootstrap-icons-1.13.1/rewind-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/rewind-circle-fill.svg rename to static/bootstrap-icons-1.13.1/rewind-circle-fill.svg diff --git a/static/bootstrap-icons/rewind-circle.svg b/static/bootstrap-icons-1.13.1/rewind-circle.svg similarity index 100% rename from static/bootstrap-icons/rewind-circle.svg rename to static/bootstrap-icons-1.13.1/rewind-circle.svg diff --git a/static/bootstrap-icons/rewind-fill.svg b/static/bootstrap-icons-1.13.1/rewind-fill.svg similarity index 100% rename from static/bootstrap-icons/rewind-fill.svg rename to static/bootstrap-icons-1.13.1/rewind-fill.svg diff --git a/static/bootstrap-icons/rewind.svg b/static/bootstrap-icons-1.13.1/rewind.svg similarity index 100% rename from static/bootstrap-icons/rewind.svg rename to static/bootstrap-icons-1.13.1/rewind.svg diff --git a/static/bootstrap-icons/robot.svg b/static/bootstrap-icons-1.13.1/robot.svg similarity index 100% rename from static/bootstrap-icons/robot.svg rename to static/bootstrap-icons-1.13.1/robot.svg diff --git a/static/bootstrap-icons/rocket-fill.svg b/static/bootstrap-icons-1.13.1/rocket-fill.svg similarity index 100% rename from static/bootstrap-icons/rocket-fill.svg rename to static/bootstrap-icons-1.13.1/rocket-fill.svg diff --git a/static/bootstrap-icons/rocket-takeoff-fill.svg b/static/bootstrap-icons-1.13.1/rocket-takeoff-fill.svg similarity index 100% rename from static/bootstrap-icons/rocket-takeoff-fill.svg rename to static/bootstrap-icons-1.13.1/rocket-takeoff-fill.svg diff --git a/static/bootstrap-icons/rocket-takeoff.svg b/static/bootstrap-icons-1.13.1/rocket-takeoff.svg similarity index 100% rename from static/bootstrap-icons/rocket-takeoff.svg rename to static/bootstrap-icons-1.13.1/rocket-takeoff.svg diff --git a/static/bootstrap-icons/rocket.svg b/static/bootstrap-icons-1.13.1/rocket.svg similarity index 100% rename from static/bootstrap-icons/rocket.svg rename to static/bootstrap-icons-1.13.1/rocket.svg diff --git a/static/bootstrap-icons/router-fill.svg b/static/bootstrap-icons-1.13.1/router-fill.svg similarity index 100% rename from static/bootstrap-icons/router-fill.svg rename to static/bootstrap-icons-1.13.1/router-fill.svg diff --git a/static/bootstrap-icons/router.svg b/static/bootstrap-icons-1.13.1/router.svg similarity index 100% rename from static/bootstrap-icons/router.svg rename to static/bootstrap-icons-1.13.1/router.svg diff --git a/static/bootstrap-icons/rss-fill.svg b/static/bootstrap-icons-1.13.1/rss-fill.svg similarity index 100% rename from static/bootstrap-icons/rss-fill.svg rename to static/bootstrap-icons-1.13.1/rss-fill.svg diff --git a/static/bootstrap-icons/rss.svg b/static/bootstrap-icons-1.13.1/rss.svg similarity index 100% rename from static/bootstrap-icons/rss.svg rename to static/bootstrap-icons-1.13.1/rss.svg diff --git a/static/bootstrap-icons/rulers.svg b/static/bootstrap-icons-1.13.1/rulers.svg similarity index 100% rename from static/bootstrap-icons/rulers.svg rename to static/bootstrap-icons-1.13.1/rulers.svg diff --git a/static/bootstrap-icons/safe-fill.svg b/static/bootstrap-icons-1.13.1/safe-fill.svg similarity index 100% rename from static/bootstrap-icons/safe-fill.svg rename to static/bootstrap-icons-1.13.1/safe-fill.svg diff --git a/static/bootstrap-icons/safe.svg b/static/bootstrap-icons-1.13.1/safe.svg similarity index 100% rename from static/bootstrap-icons/safe.svg rename to static/bootstrap-icons-1.13.1/safe.svg diff --git a/static/bootstrap-icons/safe2-fill.svg b/static/bootstrap-icons-1.13.1/safe2-fill.svg similarity index 100% rename from static/bootstrap-icons/safe2-fill.svg rename to static/bootstrap-icons-1.13.1/safe2-fill.svg diff --git a/static/bootstrap-icons/safe2.svg b/static/bootstrap-icons-1.13.1/safe2.svg similarity index 100% rename from static/bootstrap-icons/safe2.svg rename to static/bootstrap-icons-1.13.1/safe2.svg diff --git a/static/bootstrap-icons/save-fill.svg b/static/bootstrap-icons-1.13.1/save-fill.svg similarity index 100% rename from static/bootstrap-icons/save-fill.svg rename to static/bootstrap-icons-1.13.1/save-fill.svg diff --git a/static/bootstrap-icons/save.svg b/static/bootstrap-icons-1.13.1/save.svg similarity index 100% rename from static/bootstrap-icons/save.svg rename to static/bootstrap-icons-1.13.1/save.svg diff --git a/static/bootstrap-icons/save2-fill.svg b/static/bootstrap-icons-1.13.1/save2-fill.svg similarity index 100% rename from static/bootstrap-icons/save2-fill.svg rename to static/bootstrap-icons-1.13.1/save2-fill.svg diff --git a/static/bootstrap-icons/save2.svg b/static/bootstrap-icons-1.13.1/save2.svg similarity index 100% rename from static/bootstrap-icons/save2.svg rename to static/bootstrap-icons-1.13.1/save2.svg diff --git a/static/bootstrap-icons/scissors.svg b/static/bootstrap-icons-1.13.1/scissors.svg similarity index 100% rename from static/bootstrap-icons/scissors.svg rename to static/bootstrap-icons-1.13.1/scissors.svg diff --git a/static/bootstrap-icons/scooter.svg b/static/bootstrap-icons-1.13.1/scooter.svg similarity index 100% rename from static/bootstrap-icons/scooter.svg rename to static/bootstrap-icons-1.13.1/scooter.svg diff --git a/static/bootstrap-icons/screwdriver.svg b/static/bootstrap-icons-1.13.1/screwdriver.svg similarity index 100% rename from static/bootstrap-icons/screwdriver.svg rename to static/bootstrap-icons-1.13.1/screwdriver.svg diff --git a/static/bootstrap-icons/sd-card-fill.svg b/static/bootstrap-icons-1.13.1/sd-card-fill.svg similarity index 100% rename from static/bootstrap-icons/sd-card-fill.svg rename to static/bootstrap-icons-1.13.1/sd-card-fill.svg diff --git a/static/bootstrap-icons/sd-card.svg b/static/bootstrap-icons-1.13.1/sd-card.svg similarity index 100% rename from static/bootstrap-icons/sd-card.svg rename to static/bootstrap-icons-1.13.1/sd-card.svg diff --git a/static/bootstrap-icons/search-heart-fill.svg b/static/bootstrap-icons-1.13.1/search-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/search-heart-fill.svg rename to static/bootstrap-icons-1.13.1/search-heart-fill.svg diff --git a/static/bootstrap-icons/search-heart.svg b/static/bootstrap-icons-1.13.1/search-heart.svg similarity index 100% rename from static/bootstrap-icons/search-heart.svg rename to static/bootstrap-icons-1.13.1/search-heart.svg diff --git a/static/bootstrap-icons/search.svg b/static/bootstrap-icons-1.13.1/search.svg similarity index 100% rename from static/bootstrap-icons/search.svg rename to static/bootstrap-icons-1.13.1/search.svg diff --git a/static/bootstrap-icons/segmented-nav.svg b/static/bootstrap-icons-1.13.1/segmented-nav.svg similarity index 100% rename from static/bootstrap-icons/segmented-nav.svg rename to static/bootstrap-icons-1.13.1/segmented-nav.svg diff --git a/static/bootstrap-icons/send-arrow-down-fill.svg b/static/bootstrap-icons-1.13.1/send-arrow-down-fill.svg similarity index 100% rename from static/bootstrap-icons/send-arrow-down-fill.svg rename to static/bootstrap-icons-1.13.1/send-arrow-down-fill.svg diff --git a/static/bootstrap-icons/send-arrow-down.svg b/static/bootstrap-icons-1.13.1/send-arrow-down.svg similarity index 100% rename from static/bootstrap-icons/send-arrow-down.svg rename to static/bootstrap-icons-1.13.1/send-arrow-down.svg diff --git a/static/bootstrap-icons/send-arrow-up-fill.svg b/static/bootstrap-icons-1.13.1/send-arrow-up-fill.svg similarity index 100% rename from static/bootstrap-icons/send-arrow-up-fill.svg rename to static/bootstrap-icons-1.13.1/send-arrow-up-fill.svg diff --git a/static/bootstrap-icons/send-arrow-up.svg b/static/bootstrap-icons-1.13.1/send-arrow-up.svg similarity index 100% rename from static/bootstrap-icons/send-arrow-up.svg rename to static/bootstrap-icons-1.13.1/send-arrow-up.svg diff --git a/static/bootstrap-icons/send-check-fill.svg b/static/bootstrap-icons-1.13.1/send-check-fill.svg similarity index 100% rename from static/bootstrap-icons/send-check-fill.svg rename to static/bootstrap-icons-1.13.1/send-check-fill.svg diff --git a/static/bootstrap-icons/send-check.svg b/static/bootstrap-icons-1.13.1/send-check.svg similarity index 100% rename from static/bootstrap-icons/send-check.svg rename to static/bootstrap-icons-1.13.1/send-check.svg diff --git a/static/bootstrap-icons/send-dash-fill.svg b/static/bootstrap-icons-1.13.1/send-dash-fill.svg similarity index 100% rename from static/bootstrap-icons/send-dash-fill.svg rename to static/bootstrap-icons-1.13.1/send-dash-fill.svg diff --git a/static/bootstrap-icons/send-dash.svg b/static/bootstrap-icons-1.13.1/send-dash.svg similarity index 100% rename from static/bootstrap-icons/send-dash.svg rename to static/bootstrap-icons-1.13.1/send-dash.svg diff --git a/static/bootstrap-icons/send-exclamation-fill.svg b/static/bootstrap-icons-1.13.1/send-exclamation-fill.svg similarity index 100% rename from static/bootstrap-icons/send-exclamation-fill.svg rename to static/bootstrap-icons-1.13.1/send-exclamation-fill.svg diff --git a/static/bootstrap-icons/send-exclamation.svg b/static/bootstrap-icons-1.13.1/send-exclamation.svg similarity index 100% rename from static/bootstrap-icons/send-exclamation.svg rename to static/bootstrap-icons-1.13.1/send-exclamation.svg diff --git a/static/bootstrap-icons/send-fill.svg b/static/bootstrap-icons-1.13.1/send-fill.svg similarity index 100% rename from static/bootstrap-icons/send-fill.svg rename to static/bootstrap-icons-1.13.1/send-fill.svg diff --git a/static/bootstrap-icons/send-plus-fill.svg b/static/bootstrap-icons-1.13.1/send-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/send-plus-fill.svg rename to static/bootstrap-icons-1.13.1/send-plus-fill.svg diff --git a/static/bootstrap-icons/send-plus.svg b/static/bootstrap-icons-1.13.1/send-plus.svg similarity index 100% rename from static/bootstrap-icons/send-plus.svg rename to static/bootstrap-icons-1.13.1/send-plus.svg diff --git a/static/bootstrap-icons/send-slash-fill.svg b/static/bootstrap-icons-1.13.1/send-slash-fill.svg similarity index 100% rename from static/bootstrap-icons/send-slash-fill.svg rename to static/bootstrap-icons-1.13.1/send-slash-fill.svg diff --git a/static/bootstrap-icons/send-slash.svg b/static/bootstrap-icons-1.13.1/send-slash.svg similarity index 100% rename from static/bootstrap-icons/send-slash.svg rename to static/bootstrap-icons-1.13.1/send-slash.svg diff --git a/static/bootstrap-icons/send-x-fill.svg b/static/bootstrap-icons-1.13.1/send-x-fill.svg similarity index 100% rename from static/bootstrap-icons/send-x-fill.svg rename to static/bootstrap-icons-1.13.1/send-x-fill.svg diff --git a/static/bootstrap-icons/send-x.svg b/static/bootstrap-icons-1.13.1/send-x.svg similarity index 100% rename from static/bootstrap-icons/send-x.svg rename to static/bootstrap-icons-1.13.1/send-x.svg diff --git a/static/bootstrap-icons/send.svg b/static/bootstrap-icons-1.13.1/send.svg similarity index 100% rename from static/bootstrap-icons/send.svg rename to static/bootstrap-icons-1.13.1/send.svg diff --git a/static/bootstrap-icons/server.svg b/static/bootstrap-icons-1.13.1/server.svg similarity index 100% rename from static/bootstrap-icons/server.svg rename to static/bootstrap-icons-1.13.1/server.svg diff --git a/static/bootstrap-icons/shadows.svg b/static/bootstrap-icons-1.13.1/shadows.svg similarity index 100% rename from static/bootstrap-icons/shadows.svg rename to static/bootstrap-icons-1.13.1/shadows.svg diff --git a/static/bootstrap-icons/share-fill.svg b/static/bootstrap-icons-1.13.1/share-fill.svg similarity index 100% rename from static/bootstrap-icons/share-fill.svg rename to static/bootstrap-icons-1.13.1/share-fill.svg diff --git a/static/bootstrap-icons/share.svg b/static/bootstrap-icons-1.13.1/share.svg similarity index 100% rename from static/bootstrap-icons/share.svg rename to static/bootstrap-icons-1.13.1/share.svg diff --git a/static/bootstrap-icons/shield-check.svg b/static/bootstrap-icons-1.13.1/shield-check.svg similarity index 100% rename from static/bootstrap-icons/shield-check.svg rename to static/bootstrap-icons-1.13.1/shield-check.svg diff --git a/static/bootstrap-icons/shield-exclamation.svg b/static/bootstrap-icons-1.13.1/shield-exclamation.svg similarity index 100% rename from static/bootstrap-icons/shield-exclamation.svg rename to static/bootstrap-icons-1.13.1/shield-exclamation.svg diff --git a/static/bootstrap-icons/shield-fill-check.svg b/static/bootstrap-icons-1.13.1/shield-fill-check.svg similarity index 100% rename from static/bootstrap-icons/shield-fill-check.svg rename to static/bootstrap-icons-1.13.1/shield-fill-check.svg diff --git a/static/bootstrap-icons/shield-fill-exclamation.svg b/static/bootstrap-icons-1.13.1/shield-fill-exclamation.svg similarity index 100% rename from static/bootstrap-icons/shield-fill-exclamation.svg rename to static/bootstrap-icons-1.13.1/shield-fill-exclamation.svg diff --git a/static/bootstrap-icons/shield-fill-minus.svg b/static/bootstrap-icons-1.13.1/shield-fill-minus.svg similarity index 100% rename from static/bootstrap-icons/shield-fill-minus.svg rename to static/bootstrap-icons-1.13.1/shield-fill-minus.svg diff --git a/static/bootstrap-icons/shield-fill-plus.svg b/static/bootstrap-icons-1.13.1/shield-fill-plus.svg similarity index 100% rename from static/bootstrap-icons/shield-fill-plus.svg rename to static/bootstrap-icons-1.13.1/shield-fill-plus.svg diff --git a/static/bootstrap-icons/shield-fill-x.svg b/static/bootstrap-icons-1.13.1/shield-fill-x.svg similarity index 100% rename from static/bootstrap-icons/shield-fill-x.svg rename to static/bootstrap-icons-1.13.1/shield-fill-x.svg diff --git a/static/bootstrap-icons/shield-fill.svg b/static/bootstrap-icons-1.13.1/shield-fill.svg similarity index 100% rename from static/bootstrap-icons/shield-fill.svg rename to static/bootstrap-icons-1.13.1/shield-fill.svg diff --git a/static/bootstrap-icons/shield-lock-fill.svg b/static/bootstrap-icons-1.13.1/shield-lock-fill.svg similarity index 100% rename from static/bootstrap-icons/shield-lock-fill.svg rename to static/bootstrap-icons-1.13.1/shield-lock-fill.svg diff --git a/static/bootstrap-icons/shield-lock.svg b/static/bootstrap-icons-1.13.1/shield-lock.svg similarity index 100% rename from static/bootstrap-icons/shield-lock.svg rename to static/bootstrap-icons-1.13.1/shield-lock.svg diff --git a/static/bootstrap-icons/shield-minus.svg b/static/bootstrap-icons-1.13.1/shield-minus.svg similarity index 100% rename from static/bootstrap-icons/shield-minus.svg rename to static/bootstrap-icons-1.13.1/shield-minus.svg diff --git a/static/bootstrap-icons/shield-plus.svg b/static/bootstrap-icons-1.13.1/shield-plus.svg similarity index 100% rename from static/bootstrap-icons/shield-plus.svg rename to static/bootstrap-icons-1.13.1/shield-plus.svg diff --git a/static/bootstrap-icons/shield-shaded.svg b/static/bootstrap-icons-1.13.1/shield-shaded.svg similarity index 100% rename from static/bootstrap-icons/shield-shaded.svg rename to static/bootstrap-icons-1.13.1/shield-shaded.svg diff --git a/static/bootstrap-icons/shield-slash-fill.svg b/static/bootstrap-icons-1.13.1/shield-slash-fill.svg similarity index 100% rename from static/bootstrap-icons/shield-slash-fill.svg rename to static/bootstrap-icons-1.13.1/shield-slash-fill.svg diff --git a/static/bootstrap-icons/shield-slash.svg b/static/bootstrap-icons-1.13.1/shield-slash.svg similarity index 100% rename from static/bootstrap-icons/shield-slash.svg rename to static/bootstrap-icons-1.13.1/shield-slash.svg diff --git a/static/bootstrap-icons/shield-x.svg b/static/bootstrap-icons-1.13.1/shield-x.svg similarity index 100% rename from static/bootstrap-icons/shield-x.svg rename to static/bootstrap-icons-1.13.1/shield-x.svg diff --git a/static/bootstrap-icons/shield.svg b/static/bootstrap-icons-1.13.1/shield.svg similarity index 100% rename from static/bootstrap-icons/shield.svg rename to static/bootstrap-icons-1.13.1/shield.svg diff --git a/static/bootstrap-icons/shift-fill.svg b/static/bootstrap-icons-1.13.1/shift-fill.svg similarity index 100% rename from static/bootstrap-icons/shift-fill.svg rename to static/bootstrap-icons-1.13.1/shift-fill.svg diff --git a/static/bootstrap-icons/shift.svg b/static/bootstrap-icons-1.13.1/shift.svg similarity index 100% rename from static/bootstrap-icons/shift.svg rename to static/bootstrap-icons-1.13.1/shift.svg diff --git a/static/bootstrap-icons/shop-window.svg b/static/bootstrap-icons-1.13.1/shop-window.svg similarity index 100% rename from static/bootstrap-icons/shop-window.svg rename to static/bootstrap-icons-1.13.1/shop-window.svg diff --git a/static/bootstrap-icons/shop.svg b/static/bootstrap-icons-1.13.1/shop.svg similarity index 100% rename from static/bootstrap-icons/shop.svg rename to static/bootstrap-icons-1.13.1/shop.svg diff --git a/static/bootstrap-icons/shuffle.svg b/static/bootstrap-icons-1.13.1/shuffle.svg similarity index 100% rename from static/bootstrap-icons/shuffle.svg rename to static/bootstrap-icons-1.13.1/shuffle.svg diff --git a/static/bootstrap-icons/sign-dead-end-fill.svg b/static/bootstrap-icons-1.13.1/sign-dead-end-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-dead-end-fill.svg rename to static/bootstrap-icons-1.13.1/sign-dead-end-fill.svg diff --git a/static/bootstrap-icons/sign-dead-end.svg b/static/bootstrap-icons-1.13.1/sign-dead-end.svg similarity index 100% rename from static/bootstrap-icons/sign-dead-end.svg rename to static/bootstrap-icons-1.13.1/sign-dead-end.svg diff --git a/static/bootstrap-icons/sign-do-not-enter-fill.svg b/static/bootstrap-icons-1.13.1/sign-do-not-enter-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-do-not-enter-fill.svg rename to static/bootstrap-icons-1.13.1/sign-do-not-enter-fill.svg diff --git a/static/bootstrap-icons/sign-do-not-enter.svg b/static/bootstrap-icons-1.13.1/sign-do-not-enter.svg similarity index 100% rename from static/bootstrap-icons/sign-do-not-enter.svg rename to static/bootstrap-icons-1.13.1/sign-do-not-enter.svg diff --git a/static/bootstrap-icons/sign-intersection-fill.svg b/static/bootstrap-icons-1.13.1/sign-intersection-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-intersection-fill.svg rename to static/bootstrap-icons-1.13.1/sign-intersection-fill.svg diff --git a/static/bootstrap-icons/sign-intersection-side-fill.svg b/static/bootstrap-icons-1.13.1/sign-intersection-side-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-intersection-side-fill.svg rename to static/bootstrap-icons-1.13.1/sign-intersection-side-fill.svg diff --git a/static/bootstrap-icons/sign-intersection-side.svg b/static/bootstrap-icons-1.13.1/sign-intersection-side.svg similarity index 100% rename from static/bootstrap-icons/sign-intersection-side.svg rename to static/bootstrap-icons-1.13.1/sign-intersection-side.svg diff --git a/static/bootstrap-icons/sign-intersection-t-fill.svg b/static/bootstrap-icons-1.13.1/sign-intersection-t-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-intersection-t-fill.svg rename to static/bootstrap-icons-1.13.1/sign-intersection-t-fill.svg diff --git a/static/bootstrap-icons/sign-intersection-t.svg b/static/bootstrap-icons-1.13.1/sign-intersection-t.svg similarity index 100% rename from static/bootstrap-icons/sign-intersection-t.svg rename to static/bootstrap-icons-1.13.1/sign-intersection-t.svg diff --git a/static/bootstrap-icons/sign-intersection-y-fill.svg b/static/bootstrap-icons-1.13.1/sign-intersection-y-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-intersection-y-fill.svg rename to static/bootstrap-icons-1.13.1/sign-intersection-y-fill.svg diff --git a/static/bootstrap-icons/sign-intersection-y.svg b/static/bootstrap-icons-1.13.1/sign-intersection-y.svg similarity index 100% rename from static/bootstrap-icons/sign-intersection-y.svg rename to static/bootstrap-icons-1.13.1/sign-intersection-y.svg diff --git a/static/bootstrap-icons/sign-intersection.svg b/static/bootstrap-icons-1.13.1/sign-intersection.svg similarity index 100% rename from static/bootstrap-icons/sign-intersection.svg rename to static/bootstrap-icons-1.13.1/sign-intersection.svg diff --git a/static/bootstrap-icons/sign-merge-left-fill.svg b/static/bootstrap-icons-1.13.1/sign-merge-left-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-merge-left-fill.svg rename to static/bootstrap-icons-1.13.1/sign-merge-left-fill.svg diff --git a/static/bootstrap-icons/sign-merge-left.svg b/static/bootstrap-icons-1.13.1/sign-merge-left.svg similarity index 100% rename from static/bootstrap-icons/sign-merge-left.svg rename to static/bootstrap-icons-1.13.1/sign-merge-left.svg diff --git a/static/bootstrap-icons/sign-merge-right-fill.svg b/static/bootstrap-icons-1.13.1/sign-merge-right-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-merge-right-fill.svg rename to static/bootstrap-icons-1.13.1/sign-merge-right-fill.svg diff --git a/static/bootstrap-icons/sign-merge-right.svg b/static/bootstrap-icons-1.13.1/sign-merge-right.svg similarity index 100% rename from static/bootstrap-icons/sign-merge-right.svg rename to static/bootstrap-icons-1.13.1/sign-merge-right.svg diff --git a/static/bootstrap-icons/sign-no-left-turn-fill.svg b/static/bootstrap-icons-1.13.1/sign-no-left-turn-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-no-left-turn-fill.svg rename to static/bootstrap-icons-1.13.1/sign-no-left-turn-fill.svg diff --git a/static/bootstrap-icons/sign-no-left-turn.svg b/static/bootstrap-icons-1.13.1/sign-no-left-turn.svg similarity index 100% rename from static/bootstrap-icons/sign-no-left-turn.svg rename to static/bootstrap-icons-1.13.1/sign-no-left-turn.svg diff --git a/static/bootstrap-icons/sign-no-parking-fill.svg b/static/bootstrap-icons-1.13.1/sign-no-parking-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-no-parking-fill.svg rename to static/bootstrap-icons-1.13.1/sign-no-parking-fill.svg diff --git a/static/bootstrap-icons/sign-no-parking.svg b/static/bootstrap-icons-1.13.1/sign-no-parking.svg similarity index 100% rename from static/bootstrap-icons/sign-no-parking.svg rename to static/bootstrap-icons-1.13.1/sign-no-parking.svg diff --git a/static/bootstrap-icons/sign-no-right-turn-fill.svg b/static/bootstrap-icons-1.13.1/sign-no-right-turn-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-no-right-turn-fill.svg rename to static/bootstrap-icons-1.13.1/sign-no-right-turn-fill.svg diff --git a/static/bootstrap-icons/sign-no-right-turn.svg b/static/bootstrap-icons-1.13.1/sign-no-right-turn.svg similarity index 100% rename from static/bootstrap-icons/sign-no-right-turn.svg rename to static/bootstrap-icons-1.13.1/sign-no-right-turn.svg diff --git a/static/bootstrap-icons/sign-railroad-fill.svg b/static/bootstrap-icons-1.13.1/sign-railroad-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-railroad-fill.svg rename to static/bootstrap-icons-1.13.1/sign-railroad-fill.svg diff --git a/static/bootstrap-icons/sign-railroad.svg b/static/bootstrap-icons-1.13.1/sign-railroad.svg similarity index 100% rename from static/bootstrap-icons/sign-railroad.svg rename to static/bootstrap-icons-1.13.1/sign-railroad.svg diff --git a/static/bootstrap-icons/sign-stop-fill.svg b/static/bootstrap-icons-1.13.1/sign-stop-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-stop-fill.svg rename to static/bootstrap-icons-1.13.1/sign-stop-fill.svg diff --git a/static/bootstrap-icons/sign-stop-lights-fill.svg b/static/bootstrap-icons-1.13.1/sign-stop-lights-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-stop-lights-fill.svg rename to static/bootstrap-icons-1.13.1/sign-stop-lights-fill.svg diff --git a/static/bootstrap-icons/sign-stop-lights.svg b/static/bootstrap-icons-1.13.1/sign-stop-lights.svg similarity index 100% rename from static/bootstrap-icons/sign-stop-lights.svg rename to static/bootstrap-icons-1.13.1/sign-stop-lights.svg diff --git a/static/bootstrap-icons/sign-stop.svg b/static/bootstrap-icons-1.13.1/sign-stop.svg similarity index 100% rename from static/bootstrap-icons/sign-stop.svg rename to static/bootstrap-icons-1.13.1/sign-stop.svg diff --git a/static/bootstrap-icons/sign-turn-left-fill.svg b/static/bootstrap-icons-1.13.1/sign-turn-left-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-turn-left-fill.svg rename to static/bootstrap-icons-1.13.1/sign-turn-left-fill.svg diff --git a/static/bootstrap-icons/sign-turn-left.svg b/static/bootstrap-icons-1.13.1/sign-turn-left.svg similarity index 100% rename from static/bootstrap-icons/sign-turn-left.svg rename to static/bootstrap-icons-1.13.1/sign-turn-left.svg diff --git a/static/bootstrap-icons/sign-turn-right-fill.svg b/static/bootstrap-icons-1.13.1/sign-turn-right-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-turn-right-fill.svg rename to static/bootstrap-icons-1.13.1/sign-turn-right-fill.svg diff --git a/static/bootstrap-icons/sign-turn-right.svg b/static/bootstrap-icons-1.13.1/sign-turn-right.svg similarity index 100% rename from static/bootstrap-icons/sign-turn-right.svg rename to static/bootstrap-icons-1.13.1/sign-turn-right.svg diff --git a/static/bootstrap-icons/sign-turn-slight-left-fill.svg b/static/bootstrap-icons-1.13.1/sign-turn-slight-left-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-turn-slight-left-fill.svg rename to static/bootstrap-icons-1.13.1/sign-turn-slight-left-fill.svg diff --git a/static/bootstrap-icons/sign-turn-slight-left.svg b/static/bootstrap-icons-1.13.1/sign-turn-slight-left.svg similarity index 100% rename from static/bootstrap-icons/sign-turn-slight-left.svg rename to static/bootstrap-icons-1.13.1/sign-turn-slight-left.svg diff --git a/static/bootstrap-icons/sign-turn-slight-right-fill.svg b/static/bootstrap-icons-1.13.1/sign-turn-slight-right-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-turn-slight-right-fill.svg rename to static/bootstrap-icons-1.13.1/sign-turn-slight-right-fill.svg diff --git a/static/bootstrap-icons/sign-turn-slight-right.svg b/static/bootstrap-icons-1.13.1/sign-turn-slight-right.svg similarity index 100% rename from static/bootstrap-icons/sign-turn-slight-right.svg rename to static/bootstrap-icons-1.13.1/sign-turn-slight-right.svg diff --git a/static/bootstrap-icons/sign-yield-fill.svg b/static/bootstrap-icons-1.13.1/sign-yield-fill.svg similarity index 100% rename from static/bootstrap-icons/sign-yield-fill.svg rename to static/bootstrap-icons-1.13.1/sign-yield-fill.svg diff --git a/static/bootstrap-icons/sign-yield.svg b/static/bootstrap-icons-1.13.1/sign-yield.svg similarity index 100% rename from static/bootstrap-icons/sign-yield.svg rename to static/bootstrap-icons-1.13.1/sign-yield.svg diff --git a/static/bootstrap-icons/signal.svg b/static/bootstrap-icons-1.13.1/signal.svg similarity index 100% rename from static/bootstrap-icons/signal.svg rename to static/bootstrap-icons-1.13.1/signal.svg diff --git a/static/bootstrap-icons/signpost-2-fill.svg b/static/bootstrap-icons-1.13.1/signpost-2-fill.svg similarity index 100% rename from static/bootstrap-icons/signpost-2-fill.svg rename to static/bootstrap-icons-1.13.1/signpost-2-fill.svg diff --git a/static/bootstrap-icons/signpost-2.svg b/static/bootstrap-icons-1.13.1/signpost-2.svg similarity index 100% rename from static/bootstrap-icons/signpost-2.svg rename to static/bootstrap-icons-1.13.1/signpost-2.svg diff --git a/static/bootstrap-icons/signpost-fill.svg b/static/bootstrap-icons-1.13.1/signpost-fill.svg similarity index 100% rename from static/bootstrap-icons/signpost-fill.svg rename to static/bootstrap-icons-1.13.1/signpost-fill.svg diff --git a/static/bootstrap-icons/signpost-split-fill.svg b/static/bootstrap-icons-1.13.1/signpost-split-fill.svg similarity index 100% rename from static/bootstrap-icons/signpost-split-fill.svg rename to static/bootstrap-icons-1.13.1/signpost-split-fill.svg diff --git a/static/bootstrap-icons/signpost-split.svg b/static/bootstrap-icons-1.13.1/signpost-split.svg similarity index 100% rename from static/bootstrap-icons/signpost-split.svg rename to static/bootstrap-icons-1.13.1/signpost-split.svg diff --git a/static/bootstrap-icons/signpost.svg b/static/bootstrap-icons-1.13.1/signpost.svg similarity index 100% rename from static/bootstrap-icons/signpost.svg rename to static/bootstrap-icons-1.13.1/signpost.svg diff --git a/static/bootstrap-icons/sim-fill.svg b/static/bootstrap-icons-1.13.1/sim-fill.svg similarity index 100% rename from static/bootstrap-icons/sim-fill.svg rename to static/bootstrap-icons-1.13.1/sim-fill.svg diff --git a/static/bootstrap-icons/sim-slash-fill.svg b/static/bootstrap-icons-1.13.1/sim-slash-fill.svg similarity index 100% rename from static/bootstrap-icons/sim-slash-fill.svg rename to static/bootstrap-icons-1.13.1/sim-slash-fill.svg diff --git a/static/bootstrap-icons/sim-slash.svg b/static/bootstrap-icons-1.13.1/sim-slash.svg similarity index 100% rename from static/bootstrap-icons/sim-slash.svg rename to static/bootstrap-icons-1.13.1/sim-slash.svg diff --git a/static/bootstrap-icons/sim.svg b/static/bootstrap-icons-1.13.1/sim.svg similarity index 100% rename from static/bootstrap-icons/sim.svg rename to static/bootstrap-icons-1.13.1/sim.svg diff --git a/static/bootstrap-icons/sina-weibo.svg b/static/bootstrap-icons-1.13.1/sina-weibo.svg similarity index 100% rename from static/bootstrap-icons/sina-weibo.svg rename to static/bootstrap-icons-1.13.1/sina-weibo.svg diff --git a/static/bootstrap-icons/skip-backward-btn-fill.svg b/static/bootstrap-icons-1.13.1/skip-backward-btn-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-backward-btn-fill.svg rename to static/bootstrap-icons-1.13.1/skip-backward-btn-fill.svg diff --git a/static/bootstrap-icons/skip-backward-btn.svg b/static/bootstrap-icons-1.13.1/skip-backward-btn.svg similarity index 100% rename from static/bootstrap-icons/skip-backward-btn.svg rename to static/bootstrap-icons-1.13.1/skip-backward-btn.svg diff --git a/static/bootstrap-icons/skip-backward-circle-fill.svg b/static/bootstrap-icons-1.13.1/skip-backward-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-backward-circle-fill.svg rename to static/bootstrap-icons-1.13.1/skip-backward-circle-fill.svg diff --git a/static/bootstrap-icons/skip-backward-circle.svg b/static/bootstrap-icons-1.13.1/skip-backward-circle.svg similarity index 100% rename from static/bootstrap-icons/skip-backward-circle.svg rename to static/bootstrap-icons-1.13.1/skip-backward-circle.svg diff --git a/static/bootstrap-icons/skip-backward-fill.svg b/static/bootstrap-icons-1.13.1/skip-backward-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-backward-fill.svg rename to static/bootstrap-icons-1.13.1/skip-backward-fill.svg diff --git a/static/bootstrap-icons/skip-backward.svg b/static/bootstrap-icons-1.13.1/skip-backward.svg similarity index 100% rename from static/bootstrap-icons/skip-backward.svg rename to static/bootstrap-icons-1.13.1/skip-backward.svg diff --git a/static/bootstrap-icons/skip-end-btn-fill.svg b/static/bootstrap-icons-1.13.1/skip-end-btn-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-end-btn-fill.svg rename to static/bootstrap-icons-1.13.1/skip-end-btn-fill.svg diff --git a/static/bootstrap-icons/skip-end-btn.svg b/static/bootstrap-icons-1.13.1/skip-end-btn.svg similarity index 100% rename from static/bootstrap-icons/skip-end-btn.svg rename to static/bootstrap-icons-1.13.1/skip-end-btn.svg diff --git a/static/bootstrap-icons/skip-end-circle-fill.svg b/static/bootstrap-icons-1.13.1/skip-end-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-end-circle-fill.svg rename to static/bootstrap-icons-1.13.1/skip-end-circle-fill.svg diff --git a/static/bootstrap-icons/skip-end-circle.svg b/static/bootstrap-icons-1.13.1/skip-end-circle.svg similarity index 100% rename from static/bootstrap-icons/skip-end-circle.svg rename to static/bootstrap-icons-1.13.1/skip-end-circle.svg diff --git a/static/bootstrap-icons/skip-end-fill.svg b/static/bootstrap-icons-1.13.1/skip-end-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-end-fill.svg rename to static/bootstrap-icons-1.13.1/skip-end-fill.svg diff --git a/static/bootstrap-icons/skip-end.svg b/static/bootstrap-icons-1.13.1/skip-end.svg similarity index 100% rename from static/bootstrap-icons/skip-end.svg rename to static/bootstrap-icons-1.13.1/skip-end.svg diff --git a/static/bootstrap-icons/skip-forward-btn-fill.svg b/static/bootstrap-icons-1.13.1/skip-forward-btn-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-forward-btn-fill.svg rename to static/bootstrap-icons-1.13.1/skip-forward-btn-fill.svg diff --git a/static/bootstrap-icons/skip-forward-btn.svg b/static/bootstrap-icons-1.13.1/skip-forward-btn.svg similarity index 100% rename from static/bootstrap-icons/skip-forward-btn.svg rename to static/bootstrap-icons-1.13.1/skip-forward-btn.svg diff --git a/static/bootstrap-icons/skip-forward-circle-fill.svg b/static/bootstrap-icons-1.13.1/skip-forward-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-forward-circle-fill.svg rename to static/bootstrap-icons-1.13.1/skip-forward-circle-fill.svg diff --git a/static/bootstrap-icons/skip-forward-circle.svg b/static/bootstrap-icons-1.13.1/skip-forward-circle.svg similarity index 100% rename from static/bootstrap-icons/skip-forward-circle.svg rename to static/bootstrap-icons-1.13.1/skip-forward-circle.svg diff --git a/static/bootstrap-icons/skip-forward-fill.svg b/static/bootstrap-icons-1.13.1/skip-forward-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-forward-fill.svg rename to static/bootstrap-icons-1.13.1/skip-forward-fill.svg diff --git a/static/bootstrap-icons/skip-forward.svg b/static/bootstrap-icons-1.13.1/skip-forward.svg similarity index 100% rename from static/bootstrap-icons/skip-forward.svg rename to static/bootstrap-icons-1.13.1/skip-forward.svg diff --git a/static/bootstrap-icons/skip-start-btn-fill.svg b/static/bootstrap-icons-1.13.1/skip-start-btn-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-start-btn-fill.svg rename to static/bootstrap-icons-1.13.1/skip-start-btn-fill.svg diff --git a/static/bootstrap-icons/skip-start-btn.svg b/static/bootstrap-icons-1.13.1/skip-start-btn.svg similarity index 100% rename from static/bootstrap-icons/skip-start-btn.svg rename to static/bootstrap-icons-1.13.1/skip-start-btn.svg diff --git a/static/bootstrap-icons/skip-start-circle-fill.svg b/static/bootstrap-icons-1.13.1/skip-start-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-start-circle-fill.svg rename to static/bootstrap-icons-1.13.1/skip-start-circle-fill.svg diff --git a/static/bootstrap-icons/skip-start-circle.svg b/static/bootstrap-icons-1.13.1/skip-start-circle.svg similarity index 100% rename from static/bootstrap-icons/skip-start-circle.svg rename to static/bootstrap-icons-1.13.1/skip-start-circle.svg diff --git a/static/bootstrap-icons/skip-start-fill.svg b/static/bootstrap-icons-1.13.1/skip-start-fill.svg similarity index 100% rename from static/bootstrap-icons/skip-start-fill.svg rename to static/bootstrap-icons-1.13.1/skip-start-fill.svg diff --git a/static/bootstrap-icons/skip-start.svg b/static/bootstrap-icons-1.13.1/skip-start.svg similarity index 100% rename from static/bootstrap-icons/skip-start.svg rename to static/bootstrap-icons-1.13.1/skip-start.svg diff --git a/static/bootstrap-icons/skype.svg b/static/bootstrap-icons-1.13.1/skype.svg similarity index 100% rename from static/bootstrap-icons/skype.svg rename to static/bootstrap-icons-1.13.1/skype.svg diff --git a/static/bootstrap-icons/slack.svg b/static/bootstrap-icons-1.13.1/slack.svg similarity index 100% rename from static/bootstrap-icons/slack.svg rename to static/bootstrap-icons-1.13.1/slack.svg diff --git a/static/bootstrap-icons/slash-circle-fill.svg b/static/bootstrap-icons-1.13.1/slash-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/slash-circle-fill.svg rename to static/bootstrap-icons-1.13.1/slash-circle-fill.svg diff --git a/static/bootstrap-icons/slash-circle.svg b/static/bootstrap-icons-1.13.1/slash-circle.svg similarity index 100% rename from static/bootstrap-icons/slash-circle.svg rename to static/bootstrap-icons-1.13.1/slash-circle.svg diff --git a/static/bootstrap-icons/slash-lg.svg b/static/bootstrap-icons-1.13.1/slash-lg.svg similarity index 100% rename from static/bootstrap-icons/slash-lg.svg rename to static/bootstrap-icons-1.13.1/slash-lg.svg diff --git a/static/bootstrap-icons/slash-square-fill.svg b/static/bootstrap-icons-1.13.1/slash-square-fill.svg similarity index 100% rename from static/bootstrap-icons/slash-square-fill.svg rename to static/bootstrap-icons-1.13.1/slash-square-fill.svg diff --git a/static/bootstrap-icons/slash-square.svg b/static/bootstrap-icons-1.13.1/slash-square.svg similarity index 100% rename from static/bootstrap-icons/slash-square.svg rename to static/bootstrap-icons-1.13.1/slash-square.svg diff --git a/static/bootstrap-icons/slash.svg b/static/bootstrap-icons-1.13.1/slash.svg similarity index 100% rename from static/bootstrap-icons/slash.svg rename to static/bootstrap-icons-1.13.1/slash.svg diff --git a/static/bootstrap-icons/sliders.svg b/static/bootstrap-icons-1.13.1/sliders.svg similarity index 100% rename from static/bootstrap-icons/sliders.svg rename to static/bootstrap-icons-1.13.1/sliders.svg diff --git a/static/bootstrap-icons/sliders2-vertical.svg b/static/bootstrap-icons-1.13.1/sliders2-vertical.svg similarity index 100% rename from static/bootstrap-icons/sliders2-vertical.svg rename to static/bootstrap-icons-1.13.1/sliders2-vertical.svg diff --git a/static/bootstrap-icons/sliders2.svg b/static/bootstrap-icons-1.13.1/sliders2.svg similarity index 100% rename from static/bootstrap-icons/sliders2.svg rename to static/bootstrap-icons-1.13.1/sliders2.svg diff --git a/static/bootstrap-icons/smartwatch.svg b/static/bootstrap-icons-1.13.1/smartwatch.svg similarity index 100% rename from static/bootstrap-icons/smartwatch.svg rename to static/bootstrap-icons-1.13.1/smartwatch.svg diff --git a/static/bootstrap-icons/snapchat.svg b/static/bootstrap-icons-1.13.1/snapchat.svg similarity index 100% rename from static/bootstrap-icons/snapchat.svg rename to static/bootstrap-icons-1.13.1/snapchat.svg diff --git a/static/bootstrap-icons/snow.svg b/static/bootstrap-icons-1.13.1/snow.svg similarity index 100% rename from static/bootstrap-icons/snow.svg rename to static/bootstrap-icons-1.13.1/snow.svg diff --git a/static/bootstrap-icons/snow2.svg b/static/bootstrap-icons-1.13.1/snow2.svg similarity index 100% rename from static/bootstrap-icons/snow2.svg rename to static/bootstrap-icons-1.13.1/snow2.svg diff --git a/static/bootstrap-icons/snow3.svg b/static/bootstrap-icons-1.13.1/snow3.svg similarity index 100% rename from static/bootstrap-icons/snow3.svg rename to static/bootstrap-icons-1.13.1/snow3.svg diff --git a/static/bootstrap-icons/sort-alpha-down-alt.svg b/static/bootstrap-icons-1.13.1/sort-alpha-down-alt.svg similarity index 100% rename from static/bootstrap-icons/sort-alpha-down-alt.svg rename to static/bootstrap-icons-1.13.1/sort-alpha-down-alt.svg diff --git a/static/bootstrap-icons/sort-alpha-down.svg b/static/bootstrap-icons-1.13.1/sort-alpha-down.svg similarity index 100% rename from static/bootstrap-icons/sort-alpha-down.svg rename to static/bootstrap-icons-1.13.1/sort-alpha-down.svg diff --git a/static/bootstrap-icons/sort-alpha-up-alt.svg b/static/bootstrap-icons-1.13.1/sort-alpha-up-alt.svg similarity index 100% rename from static/bootstrap-icons/sort-alpha-up-alt.svg rename to static/bootstrap-icons-1.13.1/sort-alpha-up-alt.svg diff --git a/static/bootstrap-icons/sort-alpha-up.svg b/static/bootstrap-icons-1.13.1/sort-alpha-up.svg similarity index 100% rename from static/bootstrap-icons/sort-alpha-up.svg rename to static/bootstrap-icons-1.13.1/sort-alpha-up.svg diff --git a/static/bootstrap-icons/sort-down-alt.svg b/static/bootstrap-icons-1.13.1/sort-down-alt.svg similarity index 100% rename from static/bootstrap-icons/sort-down-alt.svg rename to static/bootstrap-icons-1.13.1/sort-down-alt.svg diff --git a/static/bootstrap-icons/sort-down.svg b/static/bootstrap-icons-1.13.1/sort-down.svg similarity index 100% rename from static/bootstrap-icons/sort-down.svg rename to static/bootstrap-icons-1.13.1/sort-down.svg diff --git a/static/bootstrap-icons/sort-numeric-down-alt.svg b/static/bootstrap-icons-1.13.1/sort-numeric-down-alt.svg similarity index 100% rename from static/bootstrap-icons/sort-numeric-down-alt.svg rename to static/bootstrap-icons-1.13.1/sort-numeric-down-alt.svg diff --git a/static/bootstrap-icons/sort-numeric-down.svg b/static/bootstrap-icons-1.13.1/sort-numeric-down.svg similarity index 100% rename from static/bootstrap-icons/sort-numeric-down.svg rename to static/bootstrap-icons-1.13.1/sort-numeric-down.svg diff --git a/static/bootstrap-icons/sort-numeric-up-alt.svg b/static/bootstrap-icons-1.13.1/sort-numeric-up-alt.svg similarity index 100% rename from static/bootstrap-icons/sort-numeric-up-alt.svg rename to static/bootstrap-icons-1.13.1/sort-numeric-up-alt.svg diff --git a/static/bootstrap-icons/sort-numeric-up.svg b/static/bootstrap-icons-1.13.1/sort-numeric-up.svg similarity index 100% rename from static/bootstrap-icons/sort-numeric-up.svg rename to static/bootstrap-icons-1.13.1/sort-numeric-up.svg diff --git a/static/bootstrap-icons/sort-up-alt.svg b/static/bootstrap-icons-1.13.1/sort-up-alt.svg similarity index 100% rename from static/bootstrap-icons/sort-up-alt.svg rename to static/bootstrap-icons-1.13.1/sort-up-alt.svg diff --git a/static/bootstrap-icons/sort-up.svg b/static/bootstrap-icons-1.13.1/sort-up.svg similarity index 100% rename from static/bootstrap-icons/sort-up.svg rename to static/bootstrap-icons-1.13.1/sort-up.svg diff --git a/static/bootstrap-icons/soundwave.svg b/static/bootstrap-icons-1.13.1/soundwave.svg similarity index 100% rename from static/bootstrap-icons/soundwave.svg rename to static/bootstrap-icons-1.13.1/soundwave.svg diff --git a/static/bootstrap-icons/sourceforge.svg b/static/bootstrap-icons-1.13.1/sourceforge.svg similarity index 100% rename from static/bootstrap-icons/sourceforge.svg rename to static/bootstrap-icons-1.13.1/sourceforge.svg diff --git a/static/bootstrap-icons/speaker-fill.svg b/static/bootstrap-icons-1.13.1/speaker-fill.svg similarity index 100% rename from static/bootstrap-icons/speaker-fill.svg rename to static/bootstrap-icons-1.13.1/speaker-fill.svg diff --git a/static/bootstrap-icons/speaker.svg b/static/bootstrap-icons-1.13.1/speaker.svg similarity index 100% rename from static/bootstrap-icons/speaker.svg rename to static/bootstrap-icons-1.13.1/speaker.svg diff --git a/static/bootstrap-icons/speedometer.svg b/static/bootstrap-icons-1.13.1/speedometer.svg similarity index 100% rename from static/bootstrap-icons/speedometer.svg rename to static/bootstrap-icons-1.13.1/speedometer.svg diff --git a/static/bootstrap-icons/speedometer2.svg b/static/bootstrap-icons-1.13.1/speedometer2.svg similarity index 100% rename from static/bootstrap-icons/speedometer2.svg rename to static/bootstrap-icons-1.13.1/speedometer2.svg diff --git a/static/bootstrap-icons/spellcheck.svg b/static/bootstrap-icons-1.13.1/spellcheck.svg similarity index 100% rename from static/bootstrap-icons/spellcheck.svg rename to static/bootstrap-icons-1.13.1/spellcheck.svg diff --git a/static/bootstrap-icons/spotify.svg b/static/bootstrap-icons-1.13.1/spotify.svg similarity index 100% rename from static/bootstrap-icons/spotify.svg rename to static/bootstrap-icons-1.13.1/spotify.svg diff --git a/static/bootstrap-icons/square-fill.svg b/static/bootstrap-icons-1.13.1/square-fill.svg similarity index 100% rename from static/bootstrap-icons/square-fill.svg rename to static/bootstrap-icons-1.13.1/square-fill.svg diff --git a/static/bootstrap-icons/square-half.svg b/static/bootstrap-icons-1.13.1/square-half.svg similarity index 100% rename from static/bootstrap-icons/square-half.svg rename to static/bootstrap-icons-1.13.1/square-half.svg diff --git a/static/bootstrap-icons/square.svg b/static/bootstrap-icons-1.13.1/square.svg similarity index 100% rename from static/bootstrap-icons/square.svg rename to static/bootstrap-icons-1.13.1/square.svg diff --git a/static/bootstrap-icons/stack-overflow.svg b/static/bootstrap-icons-1.13.1/stack-overflow.svg similarity index 100% rename from static/bootstrap-icons/stack-overflow.svg rename to static/bootstrap-icons-1.13.1/stack-overflow.svg diff --git a/static/bootstrap-icons/stack.svg b/static/bootstrap-icons-1.13.1/stack.svg similarity index 100% rename from static/bootstrap-icons/stack.svg rename to static/bootstrap-icons-1.13.1/stack.svg diff --git a/static/bootstrap-icons/star-fill.svg b/static/bootstrap-icons-1.13.1/star-fill.svg similarity index 100% rename from static/bootstrap-icons/star-fill.svg rename to static/bootstrap-icons-1.13.1/star-fill.svg diff --git a/static/bootstrap-icons/star-half.svg b/static/bootstrap-icons-1.13.1/star-half.svg similarity index 100% rename from static/bootstrap-icons/star-half.svg rename to static/bootstrap-icons-1.13.1/star-half.svg diff --git a/static/bootstrap-icons/star.svg b/static/bootstrap-icons-1.13.1/star.svg similarity index 100% rename from static/bootstrap-icons/star.svg rename to static/bootstrap-icons-1.13.1/star.svg diff --git a/static/bootstrap-icons/stars.svg b/static/bootstrap-icons-1.13.1/stars.svg similarity index 100% rename from static/bootstrap-icons/stars.svg rename to static/bootstrap-icons-1.13.1/stars.svg diff --git a/static/bootstrap-icons/steam.svg b/static/bootstrap-icons-1.13.1/steam.svg similarity index 100% rename from static/bootstrap-icons/steam.svg rename to static/bootstrap-icons-1.13.1/steam.svg diff --git a/static/bootstrap-icons/stickies-fill.svg b/static/bootstrap-icons-1.13.1/stickies-fill.svg similarity index 100% rename from static/bootstrap-icons/stickies-fill.svg rename to static/bootstrap-icons-1.13.1/stickies-fill.svg diff --git a/static/bootstrap-icons/stickies.svg b/static/bootstrap-icons-1.13.1/stickies.svg similarity index 100% rename from static/bootstrap-icons/stickies.svg rename to static/bootstrap-icons-1.13.1/stickies.svg diff --git a/static/bootstrap-icons/sticky-fill.svg b/static/bootstrap-icons-1.13.1/sticky-fill.svg similarity index 100% rename from static/bootstrap-icons/sticky-fill.svg rename to static/bootstrap-icons-1.13.1/sticky-fill.svg diff --git a/static/bootstrap-icons/sticky.svg b/static/bootstrap-icons-1.13.1/sticky.svg similarity index 100% rename from static/bootstrap-icons/sticky.svg rename to static/bootstrap-icons-1.13.1/sticky.svg diff --git a/static/bootstrap-icons/stop-btn-fill.svg b/static/bootstrap-icons-1.13.1/stop-btn-fill.svg similarity index 100% rename from static/bootstrap-icons/stop-btn-fill.svg rename to static/bootstrap-icons-1.13.1/stop-btn-fill.svg diff --git a/static/bootstrap-icons/stop-btn.svg b/static/bootstrap-icons-1.13.1/stop-btn.svg similarity index 100% rename from static/bootstrap-icons/stop-btn.svg rename to static/bootstrap-icons-1.13.1/stop-btn.svg diff --git a/static/bootstrap-icons/stop-circle-fill.svg b/static/bootstrap-icons-1.13.1/stop-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/stop-circle-fill.svg rename to static/bootstrap-icons-1.13.1/stop-circle-fill.svg diff --git a/static/bootstrap-icons/stop-circle.svg b/static/bootstrap-icons-1.13.1/stop-circle.svg similarity index 100% rename from static/bootstrap-icons/stop-circle.svg rename to static/bootstrap-icons-1.13.1/stop-circle.svg diff --git a/static/bootstrap-icons/stop-fill.svg b/static/bootstrap-icons-1.13.1/stop-fill.svg similarity index 100% rename from static/bootstrap-icons/stop-fill.svg rename to static/bootstrap-icons-1.13.1/stop-fill.svg diff --git a/static/bootstrap-icons/stop.svg b/static/bootstrap-icons-1.13.1/stop.svg similarity index 100% rename from static/bootstrap-icons/stop.svg rename to static/bootstrap-icons-1.13.1/stop.svg diff --git a/static/bootstrap-icons/stoplights-fill.svg b/static/bootstrap-icons-1.13.1/stoplights-fill.svg similarity index 100% rename from static/bootstrap-icons/stoplights-fill.svg rename to static/bootstrap-icons-1.13.1/stoplights-fill.svg diff --git a/static/bootstrap-icons/stoplights.svg b/static/bootstrap-icons-1.13.1/stoplights.svg similarity index 100% rename from static/bootstrap-icons/stoplights.svg rename to static/bootstrap-icons-1.13.1/stoplights.svg diff --git a/static/bootstrap-icons/stopwatch-fill.svg b/static/bootstrap-icons-1.13.1/stopwatch-fill.svg similarity index 100% rename from static/bootstrap-icons/stopwatch-fill.svg rename to static/bootstrap-icons-1.13.1/stopwatch-fill.svg diff --git a/static/bootstrap-icons/stopwatch.svg b/static/bootstrap-icons-1.13.1/stopwatch.svg similarity index 100% rename from static/bootstrap-icons/stopwatch.svg rename to static/bootstrap-icons-1.13.1/stopwatch.svg diff --git a/static/bootstrap-icons/strava.svg b/static/bootstrap-icons-1.13.1/strava.svg similarity index 100% rename from static/bootstrap-icons/strava.svg rename to static/bootstrap-icons-1.13.1/strava.svg diff --git a/static/bootstrap-icons/stripe.svg b/static/bootstrap-icons-1.13.1/stripe.svg similarity index 100% rename from static/bootstrap-icons/stripe.svg rename to static/bootstrap-icons-1.13.1/stripe.svg diff --git a/static/bootstrap-icons/subscript.svg b/static/bootstrap-icons-1.13.1/subscript.svg similarity index 100% rename from static/bootstrap-icons/subscript.svg rename to static/bootstrap-icons-1.13.1/subscript.svg diff --git a/static/bootstrap-icons/substack.svg b/static/bootstrap-icons-1.13.1/substack.svg similarity index 100% rename from static/bootstrap-icons/substack.svg rename to static/bootstrap-icons-1.13.1/substack.svg diff --git a/static/bootstrap-icons/subtract.svg b/static/bootstrap-icons-1.13.1/subtract.svg similarity index 100% rename from static/bootstrap-icons/subtract.svg rename to static/bootstrap-icons-1.13.1/subtract.svg diff --git a/static/bootstrap-icons/suit-club-fill.svg b/static/bootstrap-icons-1.13.1/suit-club-fill.svg similarity index 100% rename from static/bootstrap-icons/suit-club-fill.svg rename to static/bootstrap-icons-1.13.1/suit-club-fill.svg diff --git a/static/bootstrap-icons/suit-club.svg b/static/bootstrap-icons-1.13.1/suit-club.svg similarity index 100% rename from static/bootstrap-icons/suit-club.svg rename to static/bootstrap-icons-1.13.1/suit-club.svg diff --git a/static/bootstrap-icons/suit-diamond-fill.svg b/static/bootstrap-icons-1.13.1/suit-diamond-fill.svg similarity index 100% rename from static/bootstrap-icons/suit-diamond-fill.svg rename to static/bootstrap-icons-1.13.1/suit-diamond-fill.svg diff --git a/static/bootstrap-icons/suit-diamond.svg b/static/bootstrap-icons-1.13.1/suit-diamond.svg similarity index 100% rename from static/bootstrap-icons/suit-diamond.svg rename to static/bootstrap-icons-1.13.1/suit-diamond.svg diff --git a/static/bootstrap-icons/suit-heart-fill.svg b/static/bootstrap-icons-1.13.1/suit-heart-fill.svg similarity index 100% rename from static/bootstrap-icons/suit-heart-fill.svg rename to static/bootstrap-icons-1.13.1/suit-heart-fill.svg diff --git a/static/bootstrap-icons/suit-heart.svg b/static/bootstrap-icons-1.13.1/suit-heart.svg similarity index 100% rename from static/bootstrap-icons/suit-heart.svg rename to static/bootstrap-icons-1.13.1/suit-heart.svg diff --git a/static/bootstrap-icons/suit-spade-fill.svg b/static/bootstrap-icons-1.13.1/suit-spade-fill.svg similarity index 100% rename from static/bootstrap-icons/suit-spade-fill.svg rename to static/bootstrap-icons-1.13.1/suit-spade-fill.svg diff --git a/static/bootstrap-icons/suit-spade.svg b/static/bootstrap-icons-1.13.1/suit-spade.svg similarity index 100% rename from static/bootstrap-icons/suit-spade.svg rename to static/bootstrap-icons-1.13.1/suit-spade.svg diff --git a/static/bootstrap-icons/suitcase-fill.svg b/static/bootstrap-icons-1.13.1/suitcase-fill.svg similarity index 100% rename from static/bootstrap-icons/suitcase-fill.svg rename to static/bootstrap-icons-1.13.1/suitcase-fill.svg diff --git a/static/bootstrap-icons/suitcase-lg-fill.svg b/static/bootstrap-icons-1.13.1/suitcase-lg-fill.svg similarity index 100% rename from static/bootstrap-icons/suitcase-lg-fill.svg rename to static/bootstrap-icons-1.13.1/suitcase-lg-fill.svg diff --git a/static/bootstrap-icons/suitcase-lg.svg b/static/bootstrap-icons-1.13.1/suitcase-lg.svg similarity index 100% rename from static/bootstrap-icons/suitcase-lg.svg rename to static/bootstrap-icons-1.13.1/suitcase-lg.svg diff --git a/static/bootstrap-icons/suitcase.svg b/static/bootstrap-icons-1.13.1/suitcase.svg similarity index 100% rename from static/bootstrap-icons/suitcase.svg rename to static/bootstrap-icons-1.13.1/suitcase.svg diff --git a/static/bootstrap-icons/suitcase2-fill.svg b/static/bootstrap-icons-1.13.1/suitcase2-fill.svg similarity index 100% rename from static/bootstrap-icons/suitcase2-fill.svg rename to static/bootstrap-icons-1.13.1/suitcase2-fill.svg diff --git a/static/bootstrap-icons/suitcase2.svg b/static/bootstrap-icons-1.13.1/suitcase2.svg similarity index 100% rename from static/bootstrap-icons/suitcase2.svg rename to static/bootstrap-icons-1.13.1/suitcase2.svg diff --git a/static/bootstrap-icons/sun-fill.svg b/static/bootstrap-icons-1.13.1/sun-fill.svg similarity index 100% rename from static/bootstrap-icons/sun-fill.svg rename to static/bootstrap-icons-1.13.1/sun-fill.svg diff --git a/static/bootstrap-icons/sun.svg b/static/bootstrap-icons-1.13.1/sun.svg similarity index 100% rename from static/bootstrap-icons/sun.svg rename to static/bootstrap-icons-1.13.1/sun.svg diff --git a/static/bootstrap-icons/sunglasses.svg b/static/bootstrap-icons-1.13.1/sunglasses.svg similarity index 100% rename from static/bootstrap-icons/sunglasses.svg rename to static/bootstrap-icons-1.13.1/sunglasses.svg diff --git a/static/bootstrap-icons/sunrise-fill.svg b/static/bootstrap-icons-1.13.1/sunrise-fill.svg similarity index 100% rename from static/bootstrap-icons/sunrise-fill.svg rename to static/bootstrap-icons-1.13.1/sunrise-fill.svg diff --git a/static/bootstrap-icons/sunrise.svg b/static/bootstrap-icons-1.13.1/sunrise.svg similarity index 100% rename from static/bootstrap-icons/sunrise.svg rename to static/bootstrap-icons-1.13.1/sunrise.svg diff --git a/static/bootstrap-icons/sunset-fill.svg b/static/bootstrap-icons-1.13.1/sunset-fill.svg similarity index 100% rename from static/bootstrap-icons/sunset-fill.svg rename to static/bootstrap-icons-1.13.1/sunset-fill.svg diff --git a/static/bootstrap-icons/sunset.svg b/static/bootstrap-icons-1.13.1/sunset.svg similarity index 100% rename from static/bootstrap-icons/sunset.svg rename to static/bootstrap-icons-1.13.1/sunset.svg diff --git a/static/bootstrap-icons/superscript.svg b/static/bootstrap-icons-1.13.1/superscript.svg similarity index 100% rename from static/bootstrap-icons/superscript.svg rename to static/bootstrap-icons-1.13.1/superscript.svg diff --git a/static/bootstrap-icons/symmetry-horizontal.svg b/static/bootstrap-icons-1.13.1/symmetry-horizontal.svg similarity index 100% rename from static/bootstrap-icons/symmetry-horizontal.svg rename to static/bootstrap-icons-1.13.1/symmetry-horizontal.svg diff --git a/static/bootstrap-icons/symmetry-vertical.svg b/static/bootstrap-icons-1.13.1/symmetry-vertical.svg similarity index 100% rename from static/bootstrap-icons/symmetry-vertical.svg rename to static/bootstrap-icons-1.13.1/symmetry-vertical.svg diff --git a/static/bootstrap-icons/table.svg b/static/bootstrap-icons-1.13.1/table.svg similarity index 100% rename from static/bootstrap-icons/table.svg rename to static/bootstrap-icons-1.13.1/table.svg diff --git a/static/bootstrap-icons/tablet-fill.svg b/static/bootstrap-icons-1.13.1/tablet-fill.svg similarity index 100% rename from static/bootstrap-icons/tablet-fill.svg rename to static/bootstrap-icons-1.13.1/tablet-fill.svg diff --git a/static/bootstrap-icons/tablet-landscape-fill.svg b/static/bootstrap-icons-1.13.1/tablet-landscape-fill.svg similarity index 100% rename from static/bootstrap-icons/tablet-landscape-fill.svg rename to static/bootstrap-icons-1.13.1/tablet-landscape-fill.svg diff --git a/static/bootstrap-icons/tablet-landscape.svg b/static/bootstrap-icons-1.13.1/tablet-landscape.svg similarity index 100% rename from static/bootstrap-icons/tablet-landscape.svg rename to static/bootstrap-icons-1.13.1/tablet-landscape.svg diff --git a/static/bootstrap-icons/tablet.svg b/static/bootstrap-icons-1.13.1/tablet.svg similarity index 100% rename from static/bootstrap-icons/tablet.svg rename to static/bootstrap-icons-1.13.1/tablet.svg diff --git a/static/bootstrap-icons/tag-fill.svg b/static/bootstrap-icons-1.13.1/tag-fill.svg similarity index 100% rename from static/bootstrap-icons/tag-fill.svg rename to static/bootstrap-icons-1.13.1/tag-fill.svg diff --git a/static/bootstrap-icons/tag.svg b/static/bootstrap-icons-1.13.1/tag.svg similarity index 100% rename from static/bootstrap-icons/tag.svg rename to static/bootstrap-icons-1.13.1/tag.svg diff --git a/static/bootstrap-icons/tags-fill.svg b/static/bootstrap-icons-1.13.1/tags-fill.svg similarity index 100% rename from static/bootstrap-icons/tags-fill.svg rename to static/bootstrap-icons-1.13.1/tags-fill.svg diff --git a/static/bootstrap-icons/tags.svg b/static/bootstrap-icons-1.13.1/tags.svg similarity index 100% rename from static/bootstrap-icons/tags.svg rename to static/bootstrap-icons-1.13.1/tags.svg diff --git a/static/bootstrap-icons/taxi-front-fill.svg b/static/bootstrap-icons-1.13.1/taxi-front-fill.svg similarity index 100% rename from static/bootstrap-icons/taxi-front-fill.svg rename to static/bootstrap-icons-1.13.1/taxi-front-fill.svg diff --git a/static/bootstrap-icons/taxi-front.svg b/static/bootstrap-icons-1.13.1/taxi-front.svg similarity index 100% rename from static/bootstrap-icons/taxi-front.svg rename to static/bootstrap-icons-1.13.1/taxi-front.svg diff --git a/static/bootstrap-icons/telegram.svg b/static/bootstrap-icons-1.13.1/telegram.svg similarity index 100% rename from static/bootstrap-icons/telegram.svg rename to static/bootstrap-icons-1.13.1/telegram.svg diff --git a/static/bootstrap-icons/telephone-fill.svg b/static/bootstrap-icons-1.13.1/telephone-fill.svg similarity index 100% rename from static/bootstrap-icons/telephone-fill.svg rename to static/bootstrap-icons-1.13.1/telephone-fill.svg diff --git a/static/bootstrap-icons/telephone-forward-fill.svg b/static/bootstrap-icons-1.13.1/telephone-forward-fill.svg similarity index 100% rename from static/bootstrap-icons/telephone-forward-fill.svg rename to static/bootstrap-icons-1.13.1/telephone-forward-fill.svg diff --git a/static/bootstrap-icons/telephone-forward.svg b/static/bootstrap-icons-1.13.1/telephone-forward.svg similarity index 100% rename from static/bootstrap-icons/telephone-forward.svg rename to static/bootstrap-icons-1.13.1/telephone-forward.svg diff --git a/static/bootstrap-icons/telephone-inbound-fill.svg b/static/bootstrap-icons-1.13.1/telephone-inbound-fill.svg similarity index 100% rename from static/bootstrap-icons/telephone-inbound-fill.svg rename to static/bootstrap-icons-1.13.1/telephone-inbound-fill.svg diff --git a/static/bootstrap-icons/telephone-inbound.svg b/static/bootstrap-icons-1.13.1/telephone-inbound.svg similarity index 100% rename from static/bootstrap-icons/telephone-inbound.svg rename to static/bootstrap-icons-1.13.1/telephone-inbound.svg diff --git a/static/bootstrap-icons/telephone-minus-fill.svg b/static/bootstrap-icons-1.13.1/telephone-minus-fill.svg similarity index 100% rename from static/bootstrap-icons/telephone-minus-fill.svg rename to static/bootstrap-icons-1.13.1/telephone-minus-fill.svg diff --git a/static/bootstrap-icons/telephone-minus.svg b/static/bootstrap-icons-1.13.1/telephone-minus.svg similarity index 100% rename from static/bootstrap-icons/telephone-minus.svg rename to static/bootstrap-icons-1.13.1/telephone-minus.svg diff --git a/static/bootstrap-icons/telephone-outbound-fill.svg b/static/bootstrap-icons-1.13.1/telephone-outbound-fill.svg similarity index 100% rename from static/bootstrap-icons/telephone-outbound-fill.svg rename to static/bootstrap-icons-1.13.1/telephone-outbound-fill.svg diff --git a/static/bootstrap-icons/telephone-outbound.svg b/static/bootstrap-icons-1.13.1/telephone-outbound.svg similarity index 100% rename from static/bootstrap-icons/telephone-outbound.svg rename to static/bootstrap-icons-1.13.1/telephone-outbound.svg diff --git a/static/bootstrap-icons/telephone-plus-fill.svg b/static/bootstrap-icons-1.13.1/telephone-plus-fill.svg similarity index 100% rename from static/bootstrap-icons/telephone-plus-fill.svg rename to static/bootstrap-icons-1.13.1/telephone-plus-fill.svg diff --git a/static/bootstrap-icons/telephone-plus.svg b/static/bootstrap-icons-1.13.1/telephone-plus.svg similarity index 100% rename from static/bootstrap-icons/telephone-plus.svg rename to static/bootstrap-icons-1.13.1/telephone-plus.svg diff --git a/static/bootstrap-icons/telephone-x-fill.svg b/static/bootstrap-icons-1.13.1/telephone-x-fill.svg similarity index 100% rename from static/bootstrap-icons/telephone-x-fill.svg rename to static/bootstrap-icons-1.13.1/telephone-x-fill.svg diff --git a/static/bootstrap-icons/telephone-x.svg b/static/bootstrap-icons-1.13.1/telephone-x.svg similarity index 100% rename from static/bootstrap-icons/telephone-x.svg rename to static/bootstrap-icons-1.13.1/telephone-x.svg diff --git a/static/bootstrap-icons/telephone.svg b/static/bootstrap-icons-1.13.1/telephone.svg similarity index 100% rename from static/bootstrap-icons/telephone.svg rename to static/bootstrap-icons-1.13.1/telephone.svg diff --git a/static/bootstrap-icons/tencent-qq.svg b/static/bootstrap-icons-1.13.1/tencent-qq.svg similarity index 100% rename from static/bootstrap-icons/tencent-qq.svg rename to static/bootstrap-icons-1.13.1/tencent-qq.svg diff --git a/static/bootstrap-icons/terminal-dash.svg b/static/bootstrap-icons-1.13.1/terminal-dash.svg similarity index 100% rename from static/bootstrap-icons/terminal-dash.svg rename to static/bootstrap-icons-1.13.1/terminal-dash.svg diff --git a/static/bootstrap-icons/terminal-fill.svg b/static/bootstrap-icons-1.13.1/terminal-fill.svg similarity index 100% rename from static/bootstrap-icons/terminal-fill.svg rename to static/bootstrap-icons-1.13.1/terminal-fill.svg diff --git a/static/bootstrap-icons/terminal-plus.svg b/static/bootstrap-icons-1.13.1/terminal-plus.svg similarity index 100% rename from static/bootstrap-icons/terminal-plus.svg rename to static/bootstrap-icons-1.13.1/terminal-plus.svg diff --git a/static/bootstrap-icons/terminal-split.svg b/static/bootstrap-icons-1.13.1/terminal-split.svg similarity index 100% rename from static/bootstrap-icons/terminal-split.svg rename to static/bootstrap-icons-1.13.1/terminal-split.svg diff --git a/static/bootstrap-icons/terminal-x.svg b/static/bootstrap-icons-1.13.1/terminal-x.svg similarity index 100% rename from static/bootstrap-icons/terminal-x.svg rename to static/bootstrap-icons-1.13.1/terminal-x.svg diff --git a/static/bootstrap-icons/terminal.svg b/static/bootstrap-icons-1.13.1/terminal.svg similarity index 100% rename from static/bootstrap-icons/terminal.svg rename to static/bootstrap-icons-1.13.1/terminal.svg diff --git a/static/bootstrap-icons/text-center.svg b/static/bootstrap-icons-1.13.1/text-center.svg similarity index 100% rename from static/bootstrap-icons/text-center.svg rename to static/bootstrap-icons-1.13.1/text-center.svg diff --git a/static/bootstrap-icons/text-indent-left.svg b/static/bootstrap-icons-1.13.1/text-indent-left.svg similarity index 100% rename from static/bootstrap-icons/text-indent-left.svg rename to static/bootstrap-icons-1.13.1/text-indent-left.svg diff --git a/static/bootstrap-icons/text-indent-right.svg b/static/bootstrap-icons-1.13.1/text-indent-right.svg similarity index 100% rename from static/bootstrap-icons/text-indent-right.svg rename to static/bootstrap-icons-1.13.1/text-indent-right.svg diff --git a/static/bootstrap-icons/text-left.svg b/static/bootstrap-icons-1.13.1/text-left.svg similarity index 100% rename from static/bootstrap-icons/text-left.svg rename to static/bootstrap-icons-1.13.1/text-left.svg diff --git a/static/bootstrap-icons/text-paragraph.svg b/static/bootstrap-icons-1.13.1/text-paragraph.svg similarity index 100% rename from static/bootstrap-icons/text-paragraph.svg rename to static/bootstrap-icons-1.13.1/text-paragraph.svg diff --git a/static/bootstrap-icons/text-right.svg b/static/bootstrap-icons-1.13.1/text-right.svg similarity index 100% rename from static/bootstrap-icons/text-right.svg rename to static/bootstrap-icons-1.13.1/text-right.svg diff --git a/static/bootstrap-icons/text-wrap.svg b/static/bootstrap-icons-1.13.1/text-wrap.svg similarity index 100% rename from static/bootstrap-icons/text-wrap.svg rename to static/bootstrap-icons-1.13.1/text-wrap.svg diff --git a/static/bootstrap-icons/textarea-resize.svg b/static/bootstrap-icons-1.13.1/textarea-resize.svg similarity index 100% rename from static/bootstrap-icons/textarea-resize.svg rename to static/bootstrap-icons-1.13.1/textarea-resize.svg diff --git a/static/bootstrap-icons/textarea-t.svg b/static/bootstrap-icons-1.13.1/textarea-t.svg similarity index 100% rename from static/bootstrap-icons/textarea-t.svg rename to static/bootstrap-icons-1.13.1/textarea-t.svg diff --git a/static/bootstrap-icons/textarea.svg b/static/bootstrap-icons-1.13.1/textarea.svg similarity index 100% rename from static/bootstrap-icons/textarea.svg rename to static/bootstrap-icons-1.13.1/textarea.svg diff --git a/static/bootstrap-icons/thermometer-half.svg b/static/bootstrap-icons-1.13.1/thermometer-half.svg similarity index 100% rename from static/bootstrap-icons/thermometer-half.svg rename to static/bootstrap-icons-1.13.1/thermometer-half.svg diff --git a/static/bootstrap-icons/thermometer-high.svg b/static/bootstrap-icons-1.13.1/thermometer-high.svg similarity index 100% rename from static/bootstrap-icons/thermometer-high.svg rename to static/bootstrap-icons-1.13.1/thermometer-high.svg diff --git a/static/bootstrap-icons/thermometer-low.svg b/static/bootstrap-icons-1.13.1/thermometer-low.svg similarity index 100% rename from static/bootstrap-icons/thermometer-low.svg rename to static/bootstrap-icons-1.13.1/thermometer-low.svg diff --git a/static/bootstrap-icons/thermometer-snow.svg b/static/bootstrap-icons-1.13.1/thermometer-snow.svg similarity index 100% rename from static/bootstrap-icons/thermometer-snow.svg rename to static/bootstrap-icons-1.13.1/thermometer-snow.svg diff --git a/static/bootstrap-icons/thermometer-sun.svg b/static/bootstrap-icons-1.13.1/thermometer-sun.svg similarity index 100% rename from static/bootstrap-icons/thermometer-sun.svg rename to static/bootstrap-icons-1.13.1/thermometer-sun.svg diff --git a/static/bootstrap-icons/thermometer.svg b/static/bootstrap-icons-1.13.1/thermometer.svg similarity index 100% rename from static/bootstrap-icons/thermometer.svg rename to static/bootstrap-icons-1.13.1/thermometer.svg diff --git a/static/bootstrap-icons/threads-fill.svg b/static/bootstrap-icons-1.13.1/threads-fill.svg similarity index 100% rename from static/bootstrap-icons/threads-fill.svg rename to static/bootstrap-icons-1.13.1/threads-fill.svg diff --git a/static/bootstrap-icons/threads.svg b/static/bootstrap-icons-1.13.1/threads.svg similarity index 100% rename from static/bootstrap-icons/threads.svg rename to static/bootstrap-icons-1.13.1/threads.svg diff --git a/static/bootstrap-icons/three-dots-vertical.svg b/static/bootstrap-icons-1.13.1/three-dots-vertical.svg similarity index 100% rename from static/bootstrap-icons/three-dots-vertical.svg rename to static/bootstrap-icons-1.13.1/three-dots-vertical.svg diff --git a/static/bootstrap-icons/three-dots.svg b/static/bootstrap-icons-1.13.1/three-dots.svg similarity index 100% rename from static/bootstrap-icons/three-dots.svg rename to static/bootstrap-icons-1.13.1/three-dots.svg diff --git a/static/bootstrap-icons/thunderbolt-fill.svg b/static/bootstrap-icons-1.13.1/thunderbolt-fill.svg similarity index 100% rename from static/bootstrap-icons/thunderbolt-fill.svg rename to static/bootstrap-icons-1.13.1/thunderbolt-fill.svg diff --git a/static/bootstrap-icons/thunderbolt.svg b/static/bootstrap-icons-1.13.1/thunderbolt.svg similarity index 100% rename from static/bootstrap-icons/thunderbolt.svg rename to static/bootstrap-icons-1.13.1/thunderbolt.svg diff --git a/static/bootstrap-icons/ticket-detailed-fill.svg b/static/bootstrap-icons-1.13.1/ticket-detailed-fill.svg similarity index 100% rename from static/bootstrap-icons/ticket-detailed-fill.svg rename to static/bootstrap-icons-1.13.1/ticket-detailed-fill.svg diff --git a/static/bootstrap-icons/ticket-detailed.svg b/static/bootstrap-icons-1.13.1/ticket-detailed.svg similarity index 100% rename from static/bootstrap-icons/ticket-detailed.svg rename to static/bootstrap-icons-1.13.1/ticket-detailed.svg diff --git a/static/bootstrap-icons/ticket-fill.svg b/static/bootstrap-icons-1.13.1/ticket-fill.svg similarity index 100% rename from static/bootstrap-icons/ticket-fill.svg rename to static/bootstrap-icons-1.13.1/ticket-fill.svg diff --git a/static/bootstrap-icons/ticket-perforated-fill.svg b/static/bootstrap-icons-1.13.1/ticket-perforated-fill.svg similarity index 100% rename from static/bootstrap-icons/ticket-perforated-fill.svg rename to static/bootstrap-icons-1.13.1/ticket-perforated-fill.svg diff --git a/static/bootstrap-icons/ticket-perforated.svg b/static/bootstrap-icons-1.13.1/ticket-perforated.svg similarity index 100% rename from static/bootstrap-icons/ticket-perforated.svg rename to static/bootstrap-icons-1.13.1/ticket-perforated.svg diff --git a/static/bootstrap-icons/ticket.svg b/static/bootstrap-icons-1.13.1/ticket.svg similarity index 100% rename from static/bootstrap-icons/ticket.svg rename to static/bootstrap-icons-1.13.1/ticket.svg diff --git a/static/bootstrap-icons/tiktok.svg b/static/bootstrap-icons-1.13.1/tiktok.svg similarity index 100% rename from static/bootstrap-icons/tiktok.svg rename to static/bootstrap-icons-1.13.1/tiktok.svg diff --git a/static/bootstrap-icons/toggle-off.svg b/static/bootstrap-icons-1.13.1/toggle-off.svg similarity index 100% rename from static/bootstrap-icons/toggle-off.svg rename to static/bootstrap-icons-1.13.1/toggle-off.svg diff --git a/static/bootstrap-icons/toggle-on.svg b/static/bootstrap-icons-1.13.1/toggle-on.svg similarity index 100% rename from static/bootstrap-icons/toggle-on.svg rename to static/bootstrap-icons-1.13.1/toggle-on.svg diff --git a/static/bootstrap-icons/toggle2-off.svg b/static/bootstrap-icons-1.13.1/toggle2-off.svg similarity index 100% rename from static/bootstrap-icons/toggle2-off.svg rename to static/bootstrap-icons-1.13.1/toggle2-off.svg diff --git a/static/bootstrap-icons/toggle2-on.svg b/static/bootstrap-icons-1.13.1/toggle2-on.svg similarity index 100% rename from static/bootstrap-icons/toggle2-on.svg rename to static/bootstrap-icons-1.13.1/toggle2-on.svg diff --git a/static/bootstrap-icons/toggles.svg b/static/bootstrap-icons-1.13.1/toggles.svg similarity index 100% rename from static/bootstrap-icons/toggles.svg rename to static/bootstrap-icons-1.13.1/toggles.svg diff --git a/static/bootstrap-icons/toggles2.svg b/static/bootstrap-icons-1.13.1/toggles2.svg similarity index 100% rename from static/bootstrap-icons/toggles2.svg rename to static/bootstrap-icons-1.13.1/toggles2.svg diff --git a/static/bootstrap-icons/tools.svg b/static/bootstrap-icons-1.13.1/tools.svg similarity index 100% rename from static/bootstrap-icons/tools.svg rename to static/bootstrap-icons-1.13.1/tools.svg diff --git a/static/bootstrap-icons/tornado.svg b/static/bootstrap-icons-1.13.1/tornado.svg similarity index 100% rename from static/bootstrap-icons/tornado.svg rename to static/bootstrap-icons-1.13.1/tornado.svg diff --git a/static/bootstrap-icons/train-freight-front-fill.svg b/static/bootstrap-icons-1.13.1/train-freight-front-fill.svg similarity index 100% rename from static/bootstrap-icons/train-freight-front-fill.svg rename to static/bootstrap-icons-1.13.1/train-freight-front-fill.svg diff --git a/static/bootstrap-icons/train-freight-front.svg b/static/bootstrap-icons-1.13.1/train-freight-front.svg similarity index 100% rename from static/bootstrap-icons/train-freight-front.svg rename to static/bootstrap-icons-1.13.1/train-freight-front.svg diff --git a/static/bootstrap-icons/train-front-fill.svg b/static/bootstrap-icons-1.13.1/train-front-fill.svg similarity index 100% rename from static/bootstrap-icons/train-front-fill.svg rename to static/bootstrap-icons-1.13.1/train-front-fill.svg diff --git a/static/bootstrap-icons/train-front.svg b/static/bootstrap-icons-1.13.1/train-front.svg similarity index 100% rename from static/bootstrap-icons/train-front.svg rename to static/bootstrap-icons-1.13.1/train-front.svg diff --git a/static/bootstrap-icons/train-lightrail-front-fill.svg b/static/bootstrap-icons-1.13.1/train-lightrail-front-fill.svg similarity index 100% rename from static/bootstrap-icons/train-lightrail-front-fill.svg rename to static/bootstrap-icons-1.13.1/train-lightrail-front-fill.svg diff --git a/static/bootstrap-icons/train-lightrail-front.svg b/static/bootstrap-icons-1.13.1/train-lightrail-front.svg similarity index 100% rename from static/bootstrap-icons/train-lightrail-front.svg rename to static/bootstrap-icons-1.13.1/train-lightrail-front.svg diff --git a/static/bootstrap-icons/translate.svg b/static/bootstrap-icons-1.13.1/translate.svg similarity index 100% rename from static/bootstrap-icons/translate.svg rename to static/bootstrap-icons-1.13.1/translate.svg diff --git a/static/bootstrap-icons/transparency.svg b/static/bootstrap-icons-1.13.1/transparency.svg similarity index 100% rename from static/bootstrap-icons/transparency.svg rename to static/bootstrap-icons-1.13.1/transparency.svg diff --git a/static/bootstrap-icons/trash-fill.svg b/static/bootstrap-icons-1.13.1/trash-fill.svg similarity index 100% rename from static/bootstrap-icons/trash-fill.svg rename to static/bootstrap-icons-1.13.1/trash-fill.svg diff --git a/static/bootstrap-icons/trash.svg b/static/bootstrap-icons-1.13.1/trash.svg similarity index 100% rename from static/bootstrap-icons/trash.svg rename to static/bootstrap-icons-1.13.1/trash.svg diff --git a/static/bootstrap-icons/trash2-fill.svg b/static/bootstrap-icons-1.13.1/trash2-fill.svg similarity index 100% rename from static/bootstrap-icons/trash2-fill.svg rename to static/bootstrap-icons-1.13.1/trash2-fill.svg diff --git a/static/bootstrap-icons/trash2.svg b/static/bootstrap-icons-1.13.1/trash2.svg similarity index 100% rename from static/bootstrap-icons/trash2.svg rename to static/bootstrap-icons-1.13.1/trash2.svg diff --git a/static/bootstrap-icons/trash3-fill.svg b/static/bootstrap-icons-1.13.1/trash3-fill.svg similarity index 100% rename from static/bootstrap-icons/trash3-fill.svg rename to static/bootstrap-icons-1.13.1/trash3-fill.svg diff --git a/static/bootstrap-icons/trash3.svg b/static/bootstrap-icons-1.13.1/trash3.svg similarity index 100% rename from static/bootstrap-icons/trash3.svg rename to static/bootstrap-icons-1.13.1/trash3.svg diff --git a/static/bootstrap-icons/tree-fill.svg b/static/bootstrap-icons-1.13.1/tree-fill.svg similarity index 100% rename from static/bootstrap-icons/tree-fill.svg rename to static/bootstrap-icons-1.13.1/tree-fill.svg diff --git a/static/bootstrap-icons/tree.svg b/static/bootstrap-icons-1.13.1/tree.svg similarity index 100% rename from static/bootstrap-icons/tree.svg rename to static/bootstrap-icons-1.13.1/tree.svg diff --git a/static/bootstrap-icons/trello.svg b/static/bootstrap-icons-1.13.1/trello.svg similarity index 100% rename from static/bootstrap-icons/trello.svg rename to static/bootstrap-icons-1.13.1/trello.svg diff --git a/static/bootstrap-icons/triangle-fill.svg b/static/bootstrap-icons-1.13.1/triangle-fill.svg similarity index 100% rename from static/bootstrap-icons/triangle-fill.svg rename to static/bootstrap-icons-1.13.1/triangle-fill.svg diff --git a/static/bootstrap-icons/triangle-half.svg b/static/bootstrap-icons-1.13.1/triangle-half.svg similarity index 100% rename from static/bootstrap-icons/triangle-half.svg rename to static/bootstrap-icons-1.13.1/triangle-half.svg diff --git a/static/bootstrap-icons/triangle.svg b/static/bootstrap-icons-1.13.1/triangle.svg similarity index 100% rename from static/bootstrap-icons/triangle.svg rename to static/bootstrap-icons-1.13.1/triangle.svg diff --git a/static/bootstrap-icons/trophy-fill.svg b/static/bootstrap-icons-1.13.1/trophy-fill.svg similarity index 100% rename from static/bootstrap-icons/trophy-fill.svg rename to static/bootstrap-icons-1.13.1/trophy-fill.svg diff --git a/static/bootstrap-icons/trophy.svg b/static/bootstrap-icons-1.13.1/trophy.svg similarity index 100% rename from static/bootstrap-icons/trophy.svg rename to static/bootstrap-icons-1.13.1/trophy.svg diff --git a/static/bootstrap-icons/tropical-storm.svg b/static/bootstrap-icons-1.13.1/tropical-storm.svg similarity index 100% rename from static/bootstrap-icons/tropical-storm.svg rename to static/bootstrap-icons-1.13.1/tropical-storm.svg diff --git a/static/bootstrap-icons/truck-flatbed.svg b/static/bootstrap-icons-1.13.1/truck-flatbed.svg similarity index 100% rename from static/bootstrap-icons/truck-flatbed.svg rename to static/bootstrap-icons-1.13.1/truck-flatbed.svg diff --git a/static/bootstrap-icons/truck-front-fill.svg b/static/bootstrap-icons-1.13.1/truck-front-fill.svg similarity index 100% rename from static/bootstrap-icons/truck-front-fill.svg rename to static/bootstrap-icons-1.13.1/truck-front-fill.svg diff --git a/static/bootstrap-icons/truck-front.svg b/static/bootstrap-icons-1.13.1/truck-front.svg similarity index 100% rename from static/bootstrap-icons/truck-front.svg rename to static/bootstrap-icons-1.13.1/truck-front.svg diff --git a/static/bootstrap-icons/truck.svg b/static/bootstrap-icons-1.13.1/truck.svg similarity index 100% rename from static/bootstrap-icons/truck.svg rename to static/bootstrap-icons-1.13.1/truck.svg diff --git a/static/bootstrap-icons/tsunami.svg b/static/bootstrap-icons-1.13.1/tsunami.svg similarity index 100% rename from static/bootstrap-icons/tsunami.svg rename to static/bootstrap-icons-1.13.1/tsunami.svg diff --git a/static/bootstrap-icons/tux.svg b/static/bootstrap-icons-1.13.1/tux.svg similarity index 100% rename from static/bootstrap-icons/tux.svg rename to static/bootstrap-icons-1.13.1/tux.svg diff --git a/static/bootstrap-icons/tv-fill.svg b/static/bootstrap-icons-1.13.1/tv-fill.svg similarity index 100% rename from static/bootstrap-icons/tv-fill.svg rename to static/bootstrap-icons-1.13.1/tv-fill.svg diff --git a/static/bootstrap-icons/tv.svg b/static/bootstrap-icons-1.13.1/tv.svg similarity index 100% rename from static/bootstrap-icons/tv.svg rename to static/bootstrap-icons-1.13.1/tv.svg diff --git a/static/bootstrap-icons/twitch.svg b/static/bootstrap-icons-1.13.1/twitch.svg similarity index 100% rename from static/bootstrap-icons/twitch.svg rename to static/bootstrap-icons-1.13.1/twitch.svg diff --git a/static/bootstrap-icons/twitter-x.svg b/static/bootstrap-icons-1.13.1/twitter-x.svg similarity index 100% rename from static/bootstrap-icons/twitter-x.svg rename to static/bootstrap-icons-1.13.1/twitter-x.svg diff --git a/static/bootstrap-icons/twitter.svg b/static/bootstrap-icons-1.13.1/twitter.svg similarity index 100% rename from static/bootstrap-icons/twitter.svg rename to static/bootstrap-icons-1.13.1/twitter.svg diff --git a/static/bootstrap-icons/type-bold.svg b/static/bootstrap-icons-1.13.1/type-bold.svg similarity index 100% rename from static/bootstrap-icons/type-bold.svg rename to static/bootstrap-icons-1.13.1/type-bold.svg diff --git a/static/bootstrap-icons/type-h1.svg b/static/bootstrap-icons-1.13.1/type-h1.svg similarity index 100% rename from static/bootstrap-icons/type-h1.svg rename to static/bootstrap-icons-1.13.1/type-h1.svg diff --git a/static/bootstrap-icons/type-h2.svg b/static/bootstrap-icons-1.13.1/type-h2.svg similarity index 100% rename from static/bootstrap-icons/type-h2.svg rename to static/bootstrap-icons-1.13.1/type-h2.svg diff --git a/static/bootstrap-icons/type-h3.svg b/static/bootstrap-icons-1.13.1/type-h3.svg similarity index 100% rename from static/bootstrap-icons/type-h3.svg rename to static/bootstrap-icons-1.13.1/type-h3.svg diff --git a/static/bootstrap-icons/type-h4.svg b/static/bootstrap-icons-1.13.1/type-h4.svg similarity index 100% rename from static/bootstrap-icons/type-h4.svg rename to static/bootstrap-icons-1.13.1/type-h4.svg diff --git a/static/bootstrap-icons/type-h5.svg b/static/bootstrap-icons-1.13.1/type-h5.svg similarity index 100% rename from static/bootstrap-icons/type-h5.svg rename to static/bootstrap-icons-1.13.1/type-h5.svg diff --git a/static/bootstrap-icons/type-h6.svg b/static/bootstrap-icons-1.13.1/type-h6.svg similarity index 100% rename from static/bootstrap-icons/type-h6.svg rename to static/bootstrap-icons-1.13.1/type-h6.svg diff --git a/static/bootstrap-icons/type-italic.svg b/static/bootstrap-icons-1.13.1/type-italic.svg similarity index 100% rename from static/bootstrap-icons/type-italic.svg rename to static/bootstrap-icons-1.13.1/type-italic.svg diff --git a/static/bootstrap-icons/type-strikethrough.svg b/static/bootstrap-icons-1.13.1/type-strikethrough.svg similarity index 100% rename from static/bootstrap-icons/type-strikethrough.svg rename to static/bootstrap-icons-1.13.1/type-strikethrough.svg diff --git a/static/bootstrap-icons/type-underline.svg b/static/bootstrap-icons-1.13.1/type-underline.svg similarity index 100% rename from static/bootstrap-icons/type-underline.svg rename to static/bootstrap-icons-1.13.1/type-underline.svg diff --git a/static/bootstrap-icons/type.svg b/static/bootstrap-icons-1.13.1/type.svg similarity index 100% rename from static/bootstrap-icons/type.svg rename to static/bootstrap-icons-1.13.1/type.svg diff --git a/static/bootstrap-icons/typescript.svg b/static/bootstrap-icons-1.13.1/typescript.svg similarity index 100% rename from static/bootstrap-icons/typescript.svg rename to static/bootstrap-icons-1.13.1/typescript.svg diff --git a/static/bootstrap-icons/ubuntu.svg b/static/bootstrap-icons-1.13.1/ubuntu.svg similarity index 100% rename from static/bootstrap-icons/ubuntu.svg rename to static/bootstrap-icons-1.13.1/ubuntu.svg diff --git a/static/bootstrap-icons/ui-checks-grid.svg b/static/bootstrap-icons-1.13.1/ui-checks-grid.svg similarity index 100% rename from static/bootstrap-icons/ui-checks-grid.svg rename to static/bootstrap-icons-1.13.1/ui-checks-grid.svg diff --git a/static/bootstrap-icons/ui-checks.svg b/static/bootstrap-icons-1.13.1/ui-checks.svg similarity index 100% rename from static/bootstrap-icons/ui-checks.svg rename to static/bootstrap-icons-1.13.1/ui-checks.svg diff --git a/static/bootstrap-icons/ui-radios-grid.svg b/static/bootstrap-icons-1.13.1/ui-radios-grid.svg similarity index 100% rename from static/bootstrap-icons/ui-radios-grid.svg rename to static/bootstrap-icons-1.13.1/ui-radios-grid.svg diff --git a/static/bootstrap-icons/ui-radios.svg b/static/bootstrap-icons-1.13.1/ui-radios.svg similarity index 100% rename from static/bootstrap-icons/ui-radios.svg rename to static/bootstrap-icons-1.13.1/ui-radios.svg diff --git a/static/bootstrap-icons/umbrella-fill.svg b/static/bootstrap-icons-1.13.1/umbrella-fill.svg similarity index 100% rename from static/bootstrap-icons/umbrella-fill.svg rename to static/bootstrap-icons-1.13.1/umbrella-fill.svg diff --git a/static/bootstrap-icons/umbrella.svg b/static/bootstrap-icons-1.13.1/umbrella.svg similarity index 100% rename from static/bootstrap-icons/umbrella.svg rename to static/bootstrap-icons-1.13.1/umbrella.svg diff --git a/static/bootstrap-icons/unindent.svg b/static/bootstrap-icons-1.13.1/unindent.svg similarity index 100% rename from static/bootstrap-icons/unindent.svg rename to static/bootstrap-icons-1.13.1/unindent.svg diff --git a/static/bootstrap-icons/union.svg b/static/bootstrap-icons-1.13.1/union.svg similarity index 100% rename from static/bootstrap-icons/union.svg rename to static/bootstrap-icons-1.13.1/union.svg diff --git a/static/bootstrap-icons/unity.svg b/static/bootstrap-icons-1.13.1/unity.svg similarity index 100% rename from static/bootstrap-icons/unity.svg rename to static/bootstrap-icons-1.13.1/unity.svg diff --git a/static/bootstrap-icons/universal-access-circle.svg b/static/bootstrap-icons-1.13.1/universal-access-circle.svg similarity index 100% rename from static/bootstrap-icons/universal-access-circle.svg rename to static/bootstrap-icons-1.13.1/universal-access-circle.svg diff --git a/static/bootstrap-icons/universal-access.svg b/static/bootstrap-icons-1.13.1/universal-access.svg similarity index 100% rename from static/bootstrap-icons/universal-access.svg rename to static/bootstrap-icons-1.13.1/universal-access.svg diff --git a/static/bootstrap-icons/unlock-fill.svg b/static/bootstrap-icons-1.13.1/unlock-fill.svg similarity index 100% rename from static/bootstrap-icons/unlock-fill.svg rename to static/bootstrap-icons-1.13.1/unlock-fill.svg diff --git a/static/bootstrap-icons/unlock.svg b/static/bootstrap-icons-1.13.1/unlock.svg similarity index 100% rename from static/bootstrap-icons/unlock.svg rename to static/bootstrap-icons-1.13.1/unlock.svg diff --git a/static/bootstrap-icons/unlock2-fill.svg b/static/bootstrap-icons-1.13.1/unlock2-fill.svg similarity index 100% rename from static/bootstrap-icons/unlock2-fill.svg rename to static/bootstrap-icons-1.13.1/unlock2-fill.svg diff --git a/static/bootstrap-icons/unlock2.svg b/static/bootstrap-icons-1.13.1/unlock2.svg similarity index 100% rename from static/bootstrap-icons/unlock2.svg rename to static/bootstrap-icons-1.13.1/unlock2.svg diff --git a/static/bootstrap-icons/upc-scan.svg b/static/bootstrap-icons-1.13.1/upc-scan.svg similarity index 100% rename from static/bootstrap-icons/upc-scan.svg rename to static/bootstrap-icons-1.13.1/upc-scan.svg diff --git a/static/bootstrap-icons/upc.svg b/static/bootstrap-icons-1.13.1/upc.svg similarity index 100% rename from static/bootstrap-icons/upc.svg rename to static/bootstrap-icons-1.13.1/upc.svg diff --git a/static/bootstrap-icons/upload.svg b/static/bootstrap-icons-1.13.1/upload.svg similarity index 100% rename from static/bootstrap-icons/upload.svg rename to static/bootstrap-icons-1.13.1/upload.svg diff --git a/static/bootstrap-icons/usb-c-fill.svg b/static/bootstrap-icons-1.13.1/usb-c-fill.svg similarity index 100% rename from static/bootstrap-icons/usb-c-fill.svg rename to static/bootstrap-icons-1.13.1/usb-c-fill.svg diff --git a/static/bootstrap-icons/usb-c.svg b/static/bootstrap-icons-1.13.1/usb-c.svg similarity index 100% rename from static/bootstrap-icons/usb-c.svg rename to static/bootstrap-icons-1.13.1/usb-c.svg diff --git a/static/bootstrap-icons/usb-drive-fill.svg b/static/bootstrap-icons-1.13.1/usb-drive-fill.svg similarity index 100% rename from static/bootstrap-icons/usb-drive-fill.svg rename to static/bootstrap-icons-1.13.1/usb-drive-fill.svg diff --git a/static/bootstrap-icons/usb-drive.svg b/static/bootstrap-icons-1.13.1/usb-drive.svg similarity index 100% rename from static/bootstrap-icons/usb-drive.svg rename to static/bootstrap-icons-1.13.1/usb-drive.svg diff --git a/static/bootstrap-icons/usb-fill.svg b/static/bootstrap-icons-1.13.1/usb-fill.svg similarity index 100% rename from static/bootstrap-icons/usb-fill.svg rename to static/bootstrap-icons-1.13.1/usb-fill.svg diff --git a/static/bootstrap-icons/usb-micro-fill.svg b/static/bootstrap-icons-1.13.1/usb-micro-fill.svg similarity index 100% rename from static/bootstrap-icons/usb-micro-fill.svg rename to static/bootstrap-icons-1.13.1/usb-micro-fill.svg diff --git a/static/bootstrap-icons/usb-micro.svg b/static/bootstrap-icons-1.13.1/usb-micro.svg similarity index 100% rename from static/bootstrap-icons/usb-micro.svg rename to static/bootstrap-icons-1.13.1/usb-micro.svg diff --git a/static/bootstrap-icons/usb-mini-fill.svg b/static/bootstrap-icons-1.13.1/usb-mini-fill.svg similarity index 100% rename from static/bootstrap-icons/usb-mini-fill.svg rename to static/bootstrap-icons-1.13.1/usb-mini-fill.svg diff --git a/static/bootstrap-icons/usb-mini.svg b/static/bootstrap-icons-1.13.1/usb-mini.svg similarity index 100% rename from static/bootstrap-icons/usb-mini.svg rename to static/bootstrap-icons-1.13.1/usb-mini.svg diff --git a/static/bootstrap-icons/usb-plug-fill.svg b/static/bootstrap-icons-1.13.1/usb-plug-fill.svg similarity index 100% rename from static/bootstrap-icons/usb-plug-fill.svg rename to static/bootstrap-icons-1.13.1/usb-plug-fill.svg diff --git a/static/bootstrap-icons/usb-plug.svg b/static/bootstrap-icons-1.13.1/usb-plug.svg similarity index 100% rename from static/bootstrap-icons/usb-plug.svg rename to static/bootstrap-icons-1.13.1/usb-plug.svg diff --git a/static/bootstrap-icons/usb-symbol.svg b/static/bootstrap-icons-1.13.1/usb-symbol.svg similarity index 100% rename from static/bootstrap-icons/usb-symbol.svg rename to static/bootstrap-icons-1.13.1/usb-symbol.svg diff --git a/static/bootstrap-icons/usb.svg b/static/bootstrap-icons-1.13.1/usb.svg similarity index 100% rename from static/bootstrap-icons/usb.svg rename to static/bootstrap-icons-1.13.1/usb.svg diff --git a/static/bootstrap-icons/valentine.svg b/static/bootstrap-icons-1.13.1/valentine.svg similarity index 100% rename from static/bootstrap-icons/valentine.svg rename to static/bootstrap-icons-1.13.1/valentine.svg diff --git a/static/bootstrap-icons/valentine2.svg b/static/bootstrap-icons-1.13.1/valentine2.svg similarity index 100% rename from static/bootstrap-icons/valentine2.svg rename to static/bootstrap-icons-1.13.1/valentine2.svg diff --git a/static/bootstrap-icons/vector-pen.svg b/static/bootstrap-icons-1.13.1/vector-pen.svg similarity index 100% rename from static/bootstrap-icons/vector-pen.svg rename to static/bootstrap-icons-1.13.1/vector-pen.svg diff --git a/static/bootstrap-icons/view-list.svg b/static/bootstrap-icons-1.13.1/view-list.svg similarity index 100% rename from static/bootstrap-icons/view-list.svg rename to static/bootstrap-icons-1.13.1/view-list.svg diff --git a/static/bootstrap-icons/view-stacked.svg b/static/bootstrap-icons-1.13.1/view-stacked.svg similarity index 100% rename from static/bootstrap-icons/view-stacked.svg rename to static/bootstrap-icons-1.13.1/view-stacked.svg diff --git a/static/bootstrap-icons/vignette.svg b/static/bootstrap-icons-1.13.1/vignette.svg similarity index 100% rename from static/bootstrap-icons/vignette.svg rename to static/bootstrap-icons-1.13.1/vignette.svg diff --git a/static/bootstrap-icons/vimeo.svg b/static/bootstrap-icons-1.13.1/vimeo.svg similarity index 100% rename from static/bootstrap-icons/vimeo.svg rename to static/bootstrap-icons-1.13.1/vimeo.svg diff --git a/static/bootstrap-icons/vinyl-fill.svg b/static/bootstrap-icons-1.13.1/vinyl-fill.svg similarity index 100% rename from static/bootstrap-icons/vinyl-fill.svg rename to static/bootstrap-icons-1.13.1/vinyl-fill.svg diff --git a/static/bootstrap-icons/vinyl.svg b/static/bootstrap-icons-1.13.1/vinyl.svg similarity index 100% rename from static/bootstrap-icons/vinyl.svg rename to static/bootstrap-icons-1.13.1/vinyl.svg diff --git a/static/bootstrap-icons/virus.svg b/static/bootstrap-icons-1.13.1/virus.svg similarity index 100% rename from static/bootstrap-icons/virus.svg rename to static/bootstrap-icons-1.13.1/virus.svg diff --git a/static/bootstrap-icons/virus2.svg b/static/bootstrap-icons-1.13.1/virus2.svg similarity index 100% rename from static/bootstrap-icons/virus2.svg rename to static/bootstrap-icons-1.13.1/virus2.svg diff --git a/static/bootstrap-icons/voicemail.svg b/static/bootstrap-icons-1.13.1/voicemail.svg similarity index 100% rename from static/bootstrap-icons/voicemail.svg rename to static/bootstrap-icons-1.13.1/voicemail.svg diff --git a/static/bootstrap-icons/volume-down-fill.svg b/static/bootstrap-icons-1.13.1/volume-down-fill.svg similarity index 100% rename from static/bootstrap-icons/volume-down-fill.svg rename to static/bootstrap-icons-1.13.1/volume-down-fill.svg diff --git a/static/bootstrap-icons/volume-down.svg b/static/bootstrap-icons-1.13.1/volume-down.svg similarity index 100% rename from static/bootstrap-icons/volume-down.svg rename to static/bootstrap-icons-1.13.1/volume-down.svg diff --git a/static/bootstrap-icons/volume-mute-fill.svg b/static/bootstrap-icons-1.13.1/volume-mute-fill.svg similarity index 100% rename from static/bootstrap-icons/volume-mute-fill.svg rename to static/bootstrap-icons-1.13.1/volume-mute-fill.svg diff --git a/static/bootstrap-icons/volume-mute.svg b/static/bootstrap-icons-1.13.1/volume-mute.svg similarity index 100% rename from static/bootstrap-icons/volume-mute.svg rename to static/bootstrap-icons-1.13.1/volume-mute.svg diff --git a/static/bootstrap-icons/volume-off-fill.svg b/static/bootstrap-icons-1.13.1/volume-off-fill.svg similarity index 100% rename from static/bootstrap-icons/volume-off-fill.svg rename to static/bootstrap-icons-1.13.1/volume-off-fill.svg diff --git a/static/bootstrap-icons/volume-off.svg b/static/bootstrap-icons-1.13.1/volume-off.svg similarity index 100% rename from static/bootstrap-icons/volume-off.svg rename to static/bootstrap-icons-1.13.1/volume-off.svg diff --git a/static/bootstrap-icons/volume-up-fill.svg b/static/bootstrap-icons-1.13.1/volume-up-fill.svg similarity index 100% rename from static/bootstrap-icons/volume-up-fill.svg rename to static/bootstrap-icons-1.13.1/volume-up-fill.svg diff --git a/static/bootstrap-icons/volume-up.svg b/static/bootstrap-icons-1.13.1/volume-up.svg similarity index 100% rename from static/bootstrap-icons/volume-up.svg rename to static/bootstrap-icons-1.13.1/volume-up.svg diff --git a/static/bootstrap-icons/vr.svg b/static/bootstrap-icons-1.13.1/vr.svg similarity index 100% rename from static/bootstrap-icons/vr.svg rename to static/bootstrap-icons-1.13.1/vr.svg diff --git a/static/bootstrap-icons/wallet-fill.svg b/static/bootstrap-icons-1.13.1/wallet-fill.svg similarity index 100% rename from static/bootstrap-icons/wallet-fill.svg rename to static/bootstrap-icons-1.13.1/wallet-fill.svg diff --git a/static/bootstrap-icons/wallet.svg b/static/bootstrap-icons-1.13.1/wallet.svg similarity index 100% rename from static/bootstrap-icons/wallet.svg rename to static/bootstrap-icons-1.13.1/wallet.svg diff --git a/static/bootstrap-icons/wallet2.svg b/static/bootstrap-icons-1.13.1/wallet2.svg similarity index 100% rename from static/bootstrap-icons/wallet2.svg rename to static/bootstrap-icons-1.13.1/wallet2.svg diff --git a/static/bootstrap-icons/watch.svg b/static/bootstrap-icons-1.13.1/watch.svg similarity index 100% rename from static/bootstrap-icons/watch.svg rename to static/bootstrap-icons-1.13.1/watch.svg diff --git a/static/bootstrap-icons/water.svg b/static/bootstrap-icons-1.13.1/water.svg similarity index 100% rename from static/bootstrap-icons/water.svg rename to static/bootstrap-icons-1.13.1/water.svg diff --git a/static/bootstrap-icons/webcam-fill.svg b/static/bootstrap-icons-1.13.1/webcam-fill.svg similarity index 100% rename from static/bootstrap-icons/webcam-fill.svg rename to static/bootstrap-icons-1.13.1/webcam-fill.svg diff --git a/static/bootstrap-icons/webcam.svg b/static/bootstrap-icons-1.13.1/webcam.svg similarity index 100% rename from static/bootstrap-icons/webcam.svg rename to static/bootstrap-icons-1.13.1/webcam.svg diff --git a/static/bootstrap-icons/wechat.svg b/static/bootstrap-icons-1.13.1/wechat.svg similarity index 100% rename from static/bootstrap-icons/wechat.svg rename to static/bootstrap-icons-1.13.1/wechat.svg diff --git a/static/bootstrap-icons/whatsapp.svg b/static/bootstrap-icons-1.13.1/whatsapp.svg similarity index 100% rename from static/bootstrap-icons/whatsapp.svg rename to static/bootstrap-icons-1.13.1/whatsapp.svg diff --git a/static/bootstrap-icons/wifi-1.svg b/static/bootstrap-icons-1.13.1/wifi-1.svg similarity index 100% rename from static/bootstrap-icons/wifi-1.svg rename to static/bootstrap-icons-1.13.1/wifi-1.svg diff --git a/static/bootstrap-icons/wifi-2.svg b/static/bootstrap-icons-1.13.1/wifi-2.svg similarity index 100% rename from static/bootstrap-icons/wifi-2.svg rename to static/bootstrap-icons-1.13.1/wifi-2.svg diff --git a/static/bootstrap-icons/wifi-off.svg b/static/bootstrap-icons-1.13.1/wifi-off.svg similarity index 100% rename from static/bootstrap-icons/wifi-off.svg rename to static/bootstrap-icons-1.13.1/wifi-off.svg diff --git a/static/bootstrap-icons/wifi.svg b/static/bootstrap-icons-1.13.1/wifi.svg similarity index 100% rename from static/bootstrap-icons/wifi.svg rename to static/bootstrap-icons-1.13.1/wifi.svg diff --git a/static/bootstrap-icons/wikipedia.svg b/static/bootstrap-icons-1.13.1/wikipedia.svg similarity index 100% rename from static/bootstrap-icons/wikipedia.svg rename to static/bootstrap-icons-1.13.1/wikipedia.svg diff --git a/static/bootstrap-icons/wind.svg b/static/bootstrap-icons-1.13.1/wind.svg similarity index 100% rename from static/bootstrap-icons/wind.svg rename to static/bootstrap-icons-1.13.1/wind.svg diff --git a/static/bootstrap-icons/window-dash.svg b/static/bootstrap-icons-1.13.1/window-dash.svg similarity index 100% rename from static/bootstrap-icons/window-dash.svg rename to static/bootstrap-icons-1.13.1/window-dash.svg diff --git a/static/bootstrap-icons/window-desktop.svg b/static/bootstrap-icons-1.13.1/window-desktop.svg similarity index 100% rename from static/bootstrap-icons/window-desktop.svg rename to static/bootstrap-icons-1.13.1/window-desktop.svg diff --git a/static/bootstrap-icons/window-dock.svg b/static/bootstrap-icons-1.13.1/window-dock.svg similarity index 100% rename from static/bootstrap-icons/window-dock.svg rename to static/bootstrap-icons-1.13.1/window-dock.svg diff --git a/static/bootstrap-icons/window-fullscreen.svg b/static/bootstrap-icons-1.13.1/window-fullscreen.svg similarity index 100% rename from static/bootstrap-icons/window-fullscreen.svg rename to static/bootstrap-icons-1.13.1/window-fullscreen.svg diff --git a/static/bootstrap-icons/window-plus.svg b/static/bootstrap-icons-1.13.1/window-plus.svg similarity index 100% rename from static/bootstrap-icons/window-plus.svg rename to static/bootstrap-icons-1.13.1/window-plus.svg diff --git a/static/bootstrap-icons/window-sidebar.svg b/static/bootstrap-icons-1.13.1/window-sidebar.svg similarity index 100% rename from static/bootstrap-icons/window-sidebar.svg rename to static/bootstrap-icons-1.13.1/window-sidebar.svg diff --git a/static/bootstrap-icons/window-split.svg b/static/bootstrap-icons-1.13.1/window-split.svg similarity index 100% rename from static/bootstrap-icons/window-split.svg rename to static/bootstrap-icons-1.13.1/window-split.svg diff --git a/static/bootstrap-icons/window-stack.svg b/static/bootstrap-icons-1.13.1/window-stack.svg similarity index 100% rename from static/bootstrap-icons/window-stack.svg rename to static/bootstrap-icons-1.13.1/window-stack.svg diff --git a/static/bootstrap-icons/window-x.svg b/static/bootstrap-icons-1.13.1/window-x.svg similarity index 100% rename from static/bootstrap-icons/window-x.svg rename to static/bootstrap-icons-1.13.1/window-x.svg diff --git a/static/bootstrap-icons/window.svg b/static/bootstrap-icons-1.13.1/window.svg similarity index 100% rename from static/bootstrap-icons/window.svg rename to static/bootstrap-icons-1.13.1/window.svg diff --git a/static/bootstrap-icons/windows.svg b/static/bootstrap-icons-1.13.1/windows.svg similarity index 100% rename from static/bootstrap-icons/windows.svg rename to static/bootstrap-icons-1.13.1/windows.svg diff --git a/static/bootstrap-icons/wordpress.svg b/static/bootstrap-icons-1.13.1/wordpress.svg similarity index 100% rename from static/bootstrap-icons/wordpress.svg rename to static/bootstrap-icons-1.13.1/wordpress.svg diff --git a/static/bootstrap-icons/wrench-adjustable-circle-fill.svg b/static/bootstrap-icons-1.13.1/wrench-adjustable-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/wrench-adjustable-circle-fill.svg rename to static/bootstrap-icons-1.13.1/wrench-adjustable-circle-fill.svg diff --git a/static/bootstrap-icons/wrench-adjustable-circle.svg b/static/bootstrap-icons-1.13.1/wrench-adjustable-circle.svg similarity index 100% rename from static/bootstrap-icons/wrench-adjustable-circle.svg rename to static/bootstrap-icons-1.13.1/wrench-adjustable-circle.svg diff --git a/static/bootstrap-icons/wrench-adjustable.svg b/static/bootstrap-icons-1.13.1/wrench-adjustable.svg similarity index 100% rename from static/bootstrap-icons/wrench-adjustable.svg rename to static/bootstrap-icons-1.13.1/wrench-adjustable.svg diff --git a/static/bootstrap-icons/wrench.svg b/static/bootstrap-icons-1.13.1/wrench.svg similarity index 100% rename from static/bootstrap-icons/wrench.svg rename to static/bootstrap-icons-1.13.1/wrench.svg diff --git a/static/bootstrap-icons/x-circle-fill.svg b/static/bootstrap-icons-1.13.1/x-circle-fill.svg similarity index 100% rename from static/bootstrap-icons/x-circle-fill.svg rename to static/bootstrap-icons-1.13.1/x-circle-fill.svg diff --git a/static/bootstrap-icons/x-circle.svg b/static/bootstrap-icons-1.13.1/x-circle.svg similarity index 100% rename from static/bootstrap-icons/x-circle.svg rename to static/bootstrap-icons-1.13.1/x-circle.svg diff --git a/static/bootstrap-icons/x-diamond-fill.svg b/static/bootstrap-icons-1.13.1/x-diamond-fill.svg similarity index 100% rename from static/bootstrap-icons/x-diamond-fill.svg rename to static/bootstrap-icons-1.13.1/x-diamond-fill.svg diff --git a/static/bootstrap-icons/x-diamond.svg b/static/bootstrap-icons-1.13.1/x-diamond.svg similarity index 100% rename from static/bootstrap-icons/x-diamond.svg rename to static/bootstrap-icons-1.13.1/x-diamond.svg diff --git a/static/bootstrap-icons/x-lg.svg b/static/bootstrap-icons-1.13.1/x-lg.svg similarity index 100% rename from static/bootstrap-icons/x-lg.svg rename to static/bootstrap-icons-1.13.1/x-lg.svg diff --git a/static/bootstrap-icons/x-octagon-fill.svg b/static/bootstrap-icons-1.13.1/x-octagon-fill.svg similarity index 100% rename from static/bootstrap-icons/x-octagon-fill.svg rename to static/bootstrap-icons-1.13.1/x-octagon-fill.svg diff --git a/static/bootstrap-icons/x-octagon.svg b/static/bootstrap-icons-1.13.1/x-octagon.svg similarity index 100% rename from static/bootstrap-icons/x-octagon.svg rename to static/bootstrap-icons-1.13.1/x-octagon.svg diff --git a/static/bootstrap-icons/x-square-fill.svg b/static/bootstrap-icons-1.13.1/x-square-fill.svg similarity index 100% rename from static/bootstrap-icons/x-square-fill.svg rename to static/bootstrap-icons-1.13.1/x-square-fill.svg diff --git a/static/bootstrap-icons/x-square.svg b/static/bootstrap-icons-1.13.1/x-square.svg similarity index 100% rename from static/bootstrap-icons/x-square.svg rename to static/bootstrap-icons-1.13.1/x-square.svg diff --git a/static/bootstrap-icons/x.svg b/static/bootstrap-icons-1.13.1/x.svg similarity index 100% rename from static/bootstrap-icons/x.svg rename to static/bootstrap-icons-1.13.1/x.svg diff --git a/static/bootstrap-icons/xbox.svg b/static/bootstrap-icons-1.13.1/xbox.svg similarity index 100% rename from static/bootstrap-icons/xbox.svg rename to static/bootstrap-icons-1.13.1/xbox.svg diff --git a/static/bootstrap-icons/yelp.svg b/static/bootstrap-icons-1.13.1/yelp.svg similarity index 100% rename from static/bootstrap-icons/yelp.svg rename to static/bootstrap-icons-1.13.1/yelp.svg diff --git a/static/bootstrap-icons/yin-yang.svg b/static/bootstrap-icons-1.13.1/yin-yang.svg similarity index 100% rename from static/bootstrap-icons/yin-yang.svg rename to static/bootstrap-icons-1.13.1/yin-yang.svg diff --git a/static/bootstrap-icons/youtube.svg b/static/bootstrap-icons-1.13.1/youtube.svg similarity index 100% rename from static/bootstrap-icons/youtube.svg rename to static/bootstrap-icons-1.13.1/youtube.svg diff --git a/static/bootstrap-icons/zoom-in.svg b/static/bootstrap-icons-1.13.1/zoom-in.svg similarity index 100% rename from static/bootstrap-icons/zoom-in.svg rename to static/bootstrap-icons-1.13.1/zoom-in.svg diff --git a/static/bootstrap-icons/zoom-out.svg b/static/bootstrap-icons-1.13.1/zoom-out.svg similarity index 100% rename from static/bootstrap-icons/zoom-out.svg rename to static/bootstrap-icons-1.13.1/zoom-out.svg diff --git a/templates/base.html b/templates/base.html index 9eba1ed..455ea38 100755 --- a/templates/base.html +++ b/templates/base.html @@ -12,10 +12,8 @@ - - - - + + + + + + +

+ + + +
+ + + + +
+ +

+ Nueva unidad +

+ + +
+ + + + +
+ + + +
+ + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + + + +
+ +
+ + + + + +
+ + + + +
+ + + + + + +
+ + + + +
+ {{ rows|length }} + unidad{% if rows|length != 1 %}es{% endif %} +
+ + + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + + + + + + + + +{% endblock %} +``` diff --git a/templates/vehiculos/form.html b/templates/vehiculos/form.html index 8e88846..bc77d28 100755 --- a/templates/vehiculos/form.html +++ b/templates/vehiculos/form.html @@ -25,6 +25,8 @@ {% endblock %} {% block content %} + +
- - Matrícula reservada + + value="{{ (vehiculo['m_reservada'] or '') if vehiculo else request.form.get('m_reservada', '') }}">
@@ -145,19 +147,6 @@ value="{{ (vehiculo['color'] or '') if vehiculo else request.form.get('color', '') }}">
-
- - -
- -
- - -
@@ -166,13 +155,6 @@ value="{{ (vehiculo['combustible'] or '') if vehiculo else request.form.get('combustible', '') }}">
-
- - -
-
-
- -
+ + + + {% if vehiculo %} {% set sit = vehiculo['situacion'] or '' %} {% if sit | upper == 'BAJA' %} @@ -329,12 +329,15 @@ {% endif %} + +
- {# Cancelar #} + {% if origen == 'viat' %} Cancelar {% elif desde or hasta or q_itv %} @@ -346,11 +349,7 @@ {% if vehiculo %} {% endif %} @@ -511,10 +510,175 @@
{% endif %} + + {% if vehiculo %} +{# ── DOCUMENTOS PDF ── #} +
Documentos PDF
+ +{# Listado de documentos existentes #} +{% if documentos %} +
+ + + + + + + + + + {% for doc in documentos %} + + + + + + {% endfor %} + +
NombreFechaAcciones
+
+ + {{ doc['nombre'] }} +
+
{{ doc['fecha'] }} +
+ + + Ver + + + + Descargar + +
+ + + + +
+
+
+
+{% else %} +

+ No hay documentos adjuntos para este vehículo. +

+{% endif %} + +{# Formulario subir nuevo documento #} +
+

+ Añadir documento <5Mb +

+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+ + + + + +
+
+{% endif %} + {# ← cierre de form-card #} + + + + + + ") +Markup('<script>alert(document.cookie);</script>') + +>>> # wrap in Markup to mark text "safe" and prevent escaping +>>> Markup("Hello") +Markup('hello') + +>>> escape(Markup("Hello")) +Markup('hello') + +>>> # Markup is a str subclass +>>> # methods and operators escape their arguments +>>> template = Markup("Hello {name}") +>>> template.format(name='"World"') +Markup('Hello "World"') +``` + +## Donate + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +[please donate today][]. + +[please donate today]: https://palletsprojects.com/donate + +## Contributing + +See our [detailed contributing documentation][contrib] for many ways to +contribute, including reporting issues, requesting features, asking or answering +questions, and making PRs. + +[contrib]: https://palletsprojects.com/contributing/ diff --git a/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/RECORD b/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/RECORD new file mode 100755 index 0000000..9268b8f --- /dev/null +++ b/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/RECORD @@ -0,0 +1,14 @@ +markupsafe-3.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +markupsafe-3.0.3.dist-info/METADATA,sha256=ErTMYaf6KIz3Zn7j8hN4bZYZ21f7M_9vk0r7y1wS7IE,2690 +markupsafe-3.0.3.dist-info/RECORD,, +markupsafe-3.0.3.dist-info/WHEEL,sha256=sunMa2yiYbrNLGeMVDqEA0ayyJbHlex7SCn1TZrEq60,136 +markupsafe-3.0.3.dist-info/licenses/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +markupsafe-3.0.3.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=u1fLcNCx0P8E7LT6z3OXf6ipnSmgm6aefne5y-d7o40,13248 +markupsafe/__pycache__/__init__.cpython-311.pyc,, +markupsafe/__pycache__/_native.cpython-311.pyc,, +markupsafe/_native.py,sha256=hSLs8Jmz5aqayuengJJ3kdT5PwNpBWpKrmQSdipndC8,210 +markupsafe/_speedups.c,sha256=t3tC6oVV7-bmKUqvCO5pVSky-G8ACIXpWMaJwkNtJjg,4327 +markupsafe/_speedups.cpython-311-darwin.so,sha256=4tnfBAviuNyGMhmcSvTMKQKZXOYYBojnwQEkeHnaoqY,50736 +markupsafe/_speedups.pyi,sha256=ENd1bYe7gbBUf2ywyYWOGUpnXOHNJ-cgTNqetlW8h5k,41 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/WHEEL b/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/WHEEL new file mode 100755 index 0000000..cc792be --- /dev/null +++ b/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: false +Tag: cp311-cp311-macosx_11_0_arm64 +Generator: delocate 0.13.0 + diff --git a/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt b/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt new file mode 100755 index 0000000..9d227a0 --- /dev/null +++ b/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/top_level.txt new file mode 100755 index 0000000..75bf729 --- /dev/null +++ b/venv/lib/python3.11/site-packages/markupsafe-3.0.3.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/venv/lib/python3.11/site-packages/markupsafe/__init__.py b/venv/lib/python3.11/site-packages/markupsafe/__init__.py new file mode 100755 index 0000000..4c395d7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/markupsafe/__init__.py @@ -0,0 +1,396 @@ +from __future__ import annotations + +import collections.abc as cabc +import string +import typing as t + +try: + from ._speedups import _escape_inner +except ImportError: + from ._native import _escape_inner + +if t.TYPE_CHECKING: + import typing_extensions as te + + +class _HasHTML(t.Protocol): + def __html__(self, /) -> str: ... + + +class _TPEscape(t.Protocol): + def __call__(self, s: t.Any, /) -> Markup: ... + + +def escape(s: t.Any, /) -> Markup: + """Replace the characters ``&``, ``<``, ``>``, ``'``, and ``"`` in + the string with HTML-safe sequences. Use this if you need to display + text that might contain such characters in HTML. + + If the object has an ``__html__`` method, it is called and the + return value is assumed to already be safe for HTML. + + :param s: An object to be converted to a string and escaped. + :return: A :class:`Markup` string with the escaped text. + """ + # If the object is already a plain string, skip __html__ check and string + # conversion. This is the most common use case. + # Use type(s) instead of s.__class__ because a proxy object may be reporting + # the __class__ of the proxied value. + if type(s) is str: + return Markup(_escape_inner(s)) + + if hasattr(s, "__html__"): + return Markup(s.__html__()) + + return Markup(_escape_inner(str(s))) + + +def escape_silent(s: t.Any | None, /) -> Markup: + """Like :func:`escape` but treats ``None`` as the empty string. + Useful with optional values, as otherwise you get the string + ``'None'`` when the value is ``None``. + + >>> escape(None) + Markup('None') + >>> escape_silent(None) + Markup('') + """ + if s is None: + return Markup() + + return escape(s) + + +def soft_str(s: t.Any, /) -> str: + """Convert an object to a string if it isn't already. This preserves + a :class:`Markup` string rather than converting it back to a basic + string, so it will still be marked as safe and won't be escaped + again. + + >>> value = escape("") + >>> value + Markup('<User 1>') + >>> escape(str(value)) + Markup('&lt;User 1&gt;') + >>> escape(soft_str(value)) + Markup('<User 1>') + """ + if not isinstance(s, str): + return str(s) + + return s + + +class Markup(str): + """A string that is ready to be safely inserted into an HTML or XML + document, either because it was escaped or because it was marked + safe. + + Passing an object to the constructor converts it to text and wraps + it to mark it safe without escaping. To escape the text, use the + :meth:`escape` class method instead. + + >>> Markup("Hello, World!") + Markup('Hello, World!') + >>> Markup(42) + Markup('42') + >>> Markup.escape("Hello, World!") + Markup('Hello <em>World</em>!') + + This implements the ``__html__()`` interface that some frameworks + use. Passing an object that implements ``__html__()`` will wrap the + output of that method, marking it safe. + + >>> class Foo: + ... def __html__(self): + ... return 'foo' + ... + >>> Markup(Foo()) + Markup('foo') + + This is a subclass of :class:`str`. It has the same methods, but + escapes their arguments and returns a ``Markup`` instance. + + >>> Markup("%s") % ("foo & bar",) + Markup('foo & bar') + >>> Markup("Hello ") + "" + Markup('Hello <foo>') + """ + + __slots__ = () + + def __new__( + cls, object: t.Any = "", encoding: str | None = None, errors: str = "strict" + ) -> te.Self: + if hasattr(object, "__html__"): + object = object.__html__() + + if encoding is None: + return super().__new__(cls, object) + + return super().__new__(cls, object, encoding, errors) + + def __html__(self, /) -> te.Self: + return self + + def __add__(self, value: str | _HasHTML, /) -> te.Self: + if isinstance(value, str) or hasattr(value, "__html__"): + return self.__class__(super().__add__(self.escape(value))) + + return NotImplemented + + def __radd__(self, value: str | _HasHTML, /) -> te.Self: + if isinstance(value, str) or hasattr(value, "__html__"): + return self.escape(value).__add__(self) + + return NotImplemented + + def __mul__(self, value: t.SupportsIndex, /) -> te.Self: + return self.__class__(super().__mul__(value)) + + def __rmul__(self, value: t.SupportsIndex, /) -> te.Self: + return self.__class__(super().__mul__(value)) + + def __mod__(self, value: t.Any, /) -> te.Self: + if isinstance(value, tuple): + # a tuple of arguments, each wrapped + value = tuple(_MarkupEscapeHelper(x, self.escape) for x in value) + elif hasattr(type(value), "__getitem__") and not isinstance(value, str): + # a mapping of arguments, wrapped + value = _MarkupEscapeHelper(value, self.escape) + else: + # a single argument, wrapped with the helper and a tuple + value = (_MarkupEscapeHelper(value, self.escape),) + + return self.__class__(super().__mod__(value)) + + def __repr__(self, /) -> str: + return f"{self.__class__.__name__}({super().__repr__()})" + + def join(self, iterable: cabc.Iterable[str | _HasHTML], /) -> te.Self: + return self.__class__(super().join(map(self.escape, iterable))) + + def split( # type: ignore[override] + self, /, sep: str | None = None, maxsplit: t.SupportsIndex = -1 + ) -> list[te.Self]: + return [self.__class__(v) for v in super().split(sep, maxsplit)] + + def rsplit( # type: ignore[override] + self, /, sep: str | None = None, maxsplit: t.SupportsIndex = -1 + ) -> list[te.Self]: + return [self.__class__(v) for v in super().rsplit(sep, maxsplit)] + + def splitlines( # type: ignore[override] + self, /, keepends: bool = False + ) -> list[te.Self]: + return [self.__class__(v) for v in super().splitlines(keepends)] + + def unescape(self, /) -> str: + """Convert escaped markup back into a text string. This replaces + HTML entities with the characters they represent. + + >>> Markup("Main » About").unescape() + 'Main » About' + """ + from html import unescape + + return unescape(str(self)) + + def striptags(self, /) -> str: + """:meth:`unescape` the markup, remove tags, and normalize + whitespace to single spaces. + + >>> Markup("Main »\tAbout").striptags() + 'Main » About' + """ + value = str(self) + + # Look for comments then tags separately. Otherwise, a comment that + # contains a tag would end early, leaving some of the comment behind. + + # keep finding comment start marks + while (start := value.find("", start)) == -1: + break + + value = f"{value[:start]}{value[end + 3 :]}" + + # remove tags using the same method + while (start := value.find("<")) != -1: + if (end := value.find(">", start)) == -1: + break + + value = f"{value[:start]}{value[end + 1 :]}" + + # collapse spaces + value = " ".join(value.split()) + return self.__class__(value).unescape() + + @classmethod + def escape(cls, s: t.Any, /) -> te.Self: + """Escape a string. Calls :func:`escape` and ensures that for + subclasses the correct type is returned. + """ + rv = escape(s) + + if rv.__class__ is not cls: + return cls(rv) + + return rv # type: ignore[return-value] + + def __getitem__(self, key: t.SupportsIndex | slice, /) -> te.Self: + return self.__class__(super().__getitem__(key)) + + def capitalize(self, /) -> te.Self: + return self.__class__(super().capitalize()) + + def title(self, /) -> te.Self: + return self.__class__(super().title()) + + def lower(self, /) -> te.Self: + return self.__class__(super().lower()) + + def upper(self, /) -> te.Self: + return self.__class__(super().upper()) + + def replace(self, old: str, new: str, count: t.SupportsIndex = -1, /) -> te.Self: + return self.__class__(super().replace(old, self.escape(new), count)) + + def ljust(self, width: t.SupportsIndex, fillchar: str = " ", /) -> te.Self: + return self.__class__(super().ljust(width, self.escape(fillchar))) + + def rjust(self, width: t.SupportsIndex, fillchar: str = " ", /) -> te.Self: + return self.__class__(super().rjust(width, self.escape(fillchar))) + + def lstrip(self, chars: str | None = None, /) -> te.Self: + return self.__class__(super().lstrip(chars)) + + def rstrip(self, chars: str | None = None, /) -> te.Self: + return self.__class__(super().rstrip(chars)) + + def center(self, width: t.SupportsIndex, fillchar: str = " ", /) -> te.Self: + return self.__class__(super().center(width, self.escape(fillchar))) + + def strip(self, chars: str | None = None, /) -> te.Self: + return self.__class__(super().strip(chars)) + + def translate( + self, + table: cabc.Mapping[int, str | int | None], # type: ignore[override] + /, + ) -> str: + return self.__class__(super().translate(table)) + + def expandtabs(self, /, tabsize: t.SupportsIndex = 8) -> te.Self: + return self.__class__(super().expandtabs(tabsize)) + + def swapcase(self, /) -> te.Self: + return self.__class__(super().swapcase()) + + def zfill(self, width: t.SupportsIndex, /) -> te.Self: + return self.__class__(super().zfill(width)) + + def casefold(self, /) -> te.Self: + return self.__class__(super().casefold()) + + def removeprefix(self, prefix: str, /) -> te.Self: + return self.__class__(super().removeprefix(prefix)) + + def removesuffix(self, suffix: str) -> te.Self: + return self.__class__(super().removesuffix(suffix)) + + def partition(self, sep: str, /) -> tuple[te.Self, te.Self, te.Self]: + left, sep, right = super().partition(sep) + cls = self.__class__ + return cls(left), cls(sep), cls(right) + + def rpartition(self, sep: str, /) -> tuple[te.Self, te.Self, te.Self]: + left, sep, right = super().rpartition(sep) + cls = self.__class__ + return cls(left), cls(sep), cls(right) + + def format(self, *args: t.Any, **kwargs: t.Any) -> te.Self: + formatter = EscapeFormatter(self.escape) + return self.__class__(formatter.vformat(self, args, kwargs)) + + def format_map( + self, + mapping: cabc.Mapping[str, t.Any], # type: ignore[override] + /, + ) -> te.Self: + formatter = EscapeFormatter(self.escape) + return self.__class__(formatter.vformat(self, (), mapping)) + + def __html_format__(self, format_spec: str, /) -> te.Self: + if format_spec: + raise ValueError("Unsupported format specification for Markup.") + + return self + + +class EscapeFormatter(string.Formatter): + __slots__ = ("escape",) + + def __init__(self, escape: _TPEscape) -> None: + self.escape: _TPEscape = escape + super().__init__() + + def format_field(self, value: t.Any, format_spec: str) -> str: + if hasattr(value, "__html_format__"): + rv = value.__html_format__(format_spec) + elif hasattr(value, "__html__"): + if format_spec: + raise ValueError( + f"Format specifier {format_spec} given, but {type(value)} does not" + " define __html_format__. A class that defines __html__ must define" + " __html_format__ to work with format specifiers." + ) + rv = value.__html__() + else: + # We need to make sure the format spec is str here as + # otherwise the wrong callback methods are invoked. + rv = super().format_field(value, str(format_spec)) + return str(self.escape(rv)) + + +class _MarkupEscapeHelper: + """Helper for :meth:`Markup.__mod__`.""" + + __slots__ = ("obj", "escape") + + def __init__(self, obj: t.Any, escape: _TPEscape) -> None: + self.obj: t.Any = obj + self.escape: _TPEscape = escape + + def __getitem__(self, key: t.Any, /) -> te.Self: + return self.__class__(self.obj[key], self.escape) + + def __str__(self, /) -> str: + return str(self.escape(self.obj)) + + def __repr__(self, /) -> str: + return str(self.escape(repr(self.obj))) + + def __int__(self, /) -> int: + return int(self.obj) + + def __float__(self, /) -> float: + return float(self.obj) + + +def __getattr__(name: str) -> t.Any: + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " MarkupSafe 3.1. Use feature detection, or" + ' `importlib.metadata.version("markupsafe")`, instead.', + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("markupsafe") + + raise AttributeError(name) diff --git a/venv/lib/python3.11/site-packages/markupsafe/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/markupsafe/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..35fe1eb3e59f12a4d8522ecf3424e67244603270 GIT binary patch literal 25782 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/markupsafe/_native.py b/venv/lib/python3.11/site-packages/markupsafe/_native.py new file mode 100755 index 0000000..088b3bc --- /dev/null +++ b/venv/lib/python3.11/site-packages/markupsafe/_native.py @@ -0,0 +1,8 @@ +def _escape_inner(s: str, /) -> str: + return ( + s.replace("&", "&") + .replace(">", ">") + .replace("<", "<") + .replace("'", "'") + .replace('"', """) + ) diff --git a/venv/lib/python3.11/site-packages/markupsafe/_speedups.c b/venv/lib/python3.11/site-packages/markupsafe/_speedups.c new file mode 100755 index 0000000..8a315f2 --- /dev/null +++ b/venv/lib/python3.11/site-packages/markupsafe/_speedups.c @@ -0,0 +1,200 @@ +#include + +#define GET_DELTA(inp, inp_end, delta) \ + while (inp < inp_end) { \ + switch (*inp++) { \ + case '"': \ + case '\'': \ + case '&': \ + delta += 4; \ + break; \ + case '<': \ + case '>': \ + delta += 3; \ + break; \ + } \ + } + +#define DO_ESCAPE(inp, inp_end, outp) \ + { \ + Py_ssize_t ncopy = 0; \ + while (inp < inp_end) { \ + switch (*inp) { \ + case '"': \ + memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \ + outp += ncopy; ncopy = 0; \ + *outp++ = '&'; \ + *outp++ = '#'; \ + *outp++ = '3'; \ + *outp++ = '4'; \ + *outp++ = ';'; \ + break; \ + case '\'': \ + memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \ + outp += ncopy; ncopy = 0; \ + *outp++ = '&'; \ + *outp++ = '#'; \ + *outp++ = '3'; \ + *outp++ = '9'; \ + *outp++ = ';'; \ + break; \ + case '&': \ + memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \ + outp += ncopy; ncopy = 0; \ + *outp++ = '&'; \ + *outp++ = 'a'; \ + *outp++ = 'm'; \ + *outp++ = 'p'; \ + *outp++ = ';'; \ + break; \ + case '<': \ + memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \ + outp += ncopy; ncopy = 0; \ + *outp++ = '&'; \ + *outp++ = 'l'; \ + *outp++ = 't'; \ + *outp++ = ';'; \ + break; \ + case '>': \ + memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \ + outp += ncopy; ncopy = 0; \ + *outp++ = '&'; \ + *outp++ = 'g'; \ + *outp++ = 't'; \ + *outp++ = ';'; \ + break; \ + default: \ + ncopy++; \ + } \ + inp++; \ + } \ + memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \ + } + +static PyObject* +escape_unicode_kind1(PyUnicodeObject *in) +{ + Py_UCS1 *inp = PyUnicode_1BYTE_DATA(in); + Py_UCS1 *inp_end = inp + PyUnicode_GET_LENGTH(in); + Py_UCS1 *outp; + PyObject *out; + Py_ssize_t delta = 0; + + GET_DELTA(inp, inp_end, delta); + if (!delta) { + Py_INCREF(in); + return (PyObject*)in; + } + + out = PyUnicode_New(PyUnicode_GET_LENGTH(in) + delta, + PyUnicode_IS_ASCII(in) ? 127 : 255); + if (!out) + return NULL; + + inp = PyUnicode_1BYTE_DATA(in); + outp = PyUnicode_1BYTE_DATA(out); + DO_ESCAPE(inp, inp_end, outp); + return out; +} + +static PyObject* +escape_unicode_kind2(PyUnicodeObject *in) +{ + Py_UCS2 *inp = PyUnicode_2BYTE_DATA(in); + Py_UCS2 *inp_end = inp + PyUnicode_GET_LENGTH(in); + Py_UCS2 *outp; + PyObject *out; + Py_ssize_t delta = 0; + + GET_DELTA(inp, inp_end, delta); + if (!delta) { + Py_INCREF(in); + return (PyObject*)in; + } + + out = PyUnicode_New(PyUnicode_GET_LENGTH(in) + delta, 65535); + if (!out) + return NULL; + + inp = PyUnicode_2BYTE_DATA(in); + outp = PyUnicode_2BYTE_DATA(out); + DO_ESCAPE(inp, inp_end, outp); + return out; +} + + +static PyObject* +escape_unicode_kind4(PyUnicodeObject *in) +{ + Py_UCS4 *inp = PyUnicode_4BYTE_DATA(in); + Py_UCS4 *inp_end = inp + PyUnicode_GET_LENGTH(in); + Py_UCS4 *outp; + PyObject *out; + Py_ssize_t delta = 0; + + GET_DELTA(inp, inp_end, delta); + if (!delta) { + Py_INCREF(in); + return (PyObject*)in; + } + + out = PyUnicode_New(PyUnicode_GET_LENGTH(in) + delta, 1114111); + if (!out) + return NULL; + + inp = PyUnicode_4BYTE_DATA(in); + outp = PyUnicode_4BYTE_DATA(out); + DO_ESCAPE(inp, inp_end, outp); + return out; +} + +static PyObject* +escape_unicode(PyObject *self, PyObject *s) +{ + if (!PyUnicode_Check(s)) + return NULL; + + // This check is no longer needed in Python 3.12. + if (PyUnicode_READY(s)) + return NULL; + + switch (PyUnicode_KIND(s)) { + case PyUnicode_1BYTE_KIND: + return escape_unicode_kind1((PyUnicodeObject*) s); + case PyUnicode_2BYTE_KIND: + return escape_unicode_kind2((PyUnicodeObject*) s); + case PyUnicode_4BYTE_KIND: + return escape_unicode_kind4((PyUnicodeObject*) s); + } + assert(0); /* shouldn't happen */ + return NULL; +} + +static PyMethodDef module_methods[] = { + {"_escape_inner", (PyCFunction)escape_unicode, METH_O, NULL}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +static PyModuleDef_Slot module_slots[] = { +#ifdef Py_mod_multiple_interpreters // Python 3.12+ + {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED}, +#endif +#ifdef Py_mod_gil // Python 3.13+ + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, +#endif + {0, NULL} /* Sentinel */ +}; + +static struct PyModuleDef module_definition = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "markupsafe._speedups", + .m_size = 0, + .m_methods = module_methods, + .m_slots = module_slots, +}; + +PyMODINIT_FUNC +PyInit__speedups(void) +{ + return PyModuleDef_Init(&module_definition); +} diff --git a/venv/lib/python3.11/site-packages/markupsafe/_speedups.cpython-311-darwin.so b/venv/lib/python3.11/site-packages/markupsafe/_speedups.cpython-311-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..9979d0de814bfcd17b007562cc67dc2a96800071 GIT binary patch literal 50736 zcmeI5dvIKJ701us&0{x@=Fy}H6((B>nQb92+tNlFyDcqgsPqxS*wJxrH`$veHv7o# zhBkt9gW@yp;-%%cn@<^s3*~V?BN*cwc44xl}b~Q&Pn^OIK zJ=f@}Hb<~+_2)4CVeNV`{HbkPM@S2!CDq?P)8ATiJlj@(G$X#2U?4KJ;8cG)X!zP| z`eQpSsb4^s*!GgbFf1VMZ*{M=h8>x5}O_u zZ)myXv=Z$)G)wG%0lY!F(>vI9aUzn7_3! zH{R>2`niVn>(;DpFtSOMFh_YzY1-B1L1#Z!UzdY~eg-j)@0|}>3YjeK1kq*~F-R9A z?=kLwI6?F&$k?+)JK!)I`bJbP#b)LE%t5tsg*mNk#(d|r7Q>;12P8f`9A_O0JFJx|wlR_XVoEkvu8A%A`>LuFqaJ5fEtu~Ai5BwW?e-puu; z?nqSgSFWn`b;HsJQ8@(r*_$vvcNds8ubazdsQP`LC#p6a>+PTP;vwqChf93KMnw~L z`>UrHrTb4^mEj+mpXvWlbqv1$dFSA{4OxTZw`LEHKc~dqX`V61qpND)QC!yy+igQ` zmuLS0TDJ5(I}IJP(QcPQONQ;UhuSXp>~|I@H?1h3&b@YOTH&P5m;#wjoi-aawdJ~( zmR#W(D|L9rMwQaO38nbdpL40{9-<;-^U(OM>u}#2aQ}wE57o7UBlGJK*Y*C>i`MuN zXFOq74II{b zEO5BeGxmj#iz^ww^8#_L@jUsj#`R)`C9d(O3;l>Ic5ZrH4TVNr_nL7z!7B^A8f?7- zCFJb0=519PH95g+A$awHR}OfcwwDh5)m}36a1+?UyN( z?OgZL`^r6Izek)7!rn}$I6m{oLK71uD=>dr+{gp(%QkW^jbaWyie~JEsN%q0oO9|~ zuy$ZgPMi;SZT1=RgP7RB}ZWKh$H;^|)TUFyu`^Kn0Q4v$YXtvE}aEpyvytD#aUw?@YRF4sdL6?DwYL^=A&xw_%mvASd)T)nXKVs)Gg*EgYO zoBEy5Gflk*x;<8x$9WmOeOg|AW?92O=O<-e+!|9}qV9EOpE72b)pw@h`*#-@ zce~Zs>_puGjNu%;z!LjW(fum=KE<=*jB{`w&OzHJI4f`9bGsRNDuz#-yMDT{ew_29 z>uaDRM-F>QUx{tbLA|X3ZO9epQMXsZM!s~t4m$G1=ja*B8Cr+6?81KJdvLDsZ}X|5 zVv3g*Q0?IiihqznXSX0%2NX|jnR$-N%yU$Rb3|ZWhI4crpHo)9OW>FHx$c+qbjO}t zK1XH96aTMbUn?=!I>&8|1v%m~WbJoZeR6)_^GM2=5~~m7<|Xt$fpz=_l4G&@!*j!K z{(rjs{6xt{@Xc2|W2BTF*7XdFo@LQz8TuxSuepQbXX>9Gte!r%bPV_6X9V~ueIGhM zm$3dG^a@iy1APq-LgD8S{!YQq+}E0RM~dx*?MDrn{qrFgq1L9@i*s*#YU`CyQ$MOwTe z4c}b?{AG=w)h^}1C|1djP5eF51Iab{ose~F;b*%XQt*IcJZK>|>{7|hq%`X|(S?8z z5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP z5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP z5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP z5CTF#2nYcoAOwVf5D)@FKnMtd|4#xhnZIj))Rb?U@{B2yRE*!lPFfe2slPj)9N8Z; zv{y`-Y)_R>;73Bayouj!2x<+HE1s-2_hfj?}yPDPJ_JB_d)22@9 zr!aliqi*cJG3e{+&{k`$YD1ts%Iyxl{pLV>OVFpO>$UCNn2$z`PPR5`USBu2mlk+b zzvgcVv1Jq+#<4F|jf6DK*Ax^N!fquS9dI9Q<1sw75|^Xq zdkPfTS6FQBzXH{W-Wb0=rJv^~*V7E0=O=Bb`ux3_P*B+B`N@7>Z+Xgk*|x5?{A1S3 z@#eu_GX5gt9_JzSQjROSC+#IEcD-S9SbEujD~w5d4(t-tQdG|8T-4MyG?9yD=6~is zv+O0_VKetua#zjRys8#y@rE?D%h;fpst*Z;+i&qkHB$ZhhE{!AYdbb!doVEB;jTbH3s-FqhPPGuz2R-xw%%6Fsz$;sR+A>TcV){bchcO| z-r=i?YW`5A-`f(5?5L=zsjRN>hW*zpuD~fmgn^1hH8oW!cbmFdkWvXS^{MjFv77{v zay43#xhp~&wue$mN*Vr`5!&_@Zj#BKf3dg$2SLmJ<^&;JM!wQ z+msEP(V5mc17|sp F{{*BSO}795 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/markupsafe/_speedups.pyi b/venv/lib/python3.11/site-packages/markupsafe/_speedups.pyi new file mode 100755 index 0000000..8c88858 --- /dev/null +++ b/venv/lib/python3.11/site-packages/markupsafe/_speedups.pyi @@ -0,0 +1 @@ +def _escape_inner(s: str, /) -> str: ... diff --git a/venv/lib/python3.11/site-packages/markupsafe/py.typed b/venv/lib/python3.11/site-packages/markupsafe/py.typed new file mode 100755 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/INSTALLER new file mode 100755 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/LICENCE.rst b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/LICENCE.rst new file mode 100755 index 0000000..82213c5 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/LICENCE.rst @@ -0,0 +1,23 @@ +This software is under the MIT Licence +====================================== + +Copyright (c) 2010 openpyxl + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/METADATA b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/METADATA new file mode 100755 index 0000000..bac5c46 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/METADATA @@ -0,0 +1,86 @@ +Metadata-Version: 2.1 +Name: openpyxl +Version: 3.1.5 +Summary: A Python library to read/write Excel 2010 xlsx/xlsm files +Home-page: https://openpyxl.readthedocs.io +Author: See AUTHORS +Author-email: charlie.clark@clark-consulting.eu +License: MIT +Project-URL: Documentation, https://openpyxl.readthedocs.io/en/stable/ +Project-URL: Source, https://foss.heptapod.net/openpyxl/openpyxl +Project-URL: Tracker, https://foss.heptapod.net/openpyxl/openpyxl/-/issues +Classifier: Development Status :: 5 - Production/Stable +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: POSIX +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Requires-Python: >=3.8 +License-File: LICENCE.rst +Requires-Dist: et-xmlfile + +.. image:: https://coveralls.io/repos/bitbucket/openpyxl/openpyxl/badge.svg?branch=default + :target: https://coveralls.io/bitbucket/openpyxl/openpyxl?branch=default + :alt: coverage status + +Introduction +------------ + +openpyxl is a Python library to read/write Excel 2010 xlsx/xlsm/xltx/xltm files. + +It was born from lack of existing library to read/write natively from Python +the Office Open XML format. + +All kudos to the PHPExcel team as openpyxl was initially based on PHPExcel. + + +Security +-------- + +By default openpyxl does not guard against quadratic blowup or billion laughs +xml attacks. To guard against these attacks install defusedxml. + +Mailing List +------------ + +The user list can be found on http://groups.google.com/group/openpyxl-users + + +Sample code:: + + from openpyxl import Workbook + wb = Workbook() + + # grab the active worksheet + ws = wb.active + + # Data can be assigned directly to cells + ws['A1'] = 42 + + # Rows can also be appended + ws.append([1, 2, 3]) + + # Python types will automatically be converted + import datetime + ws['A2'] = datetime.datetime.now() + + # Save the file + wb.save("sample.xlsx") + + +Documentation +------------- + +The documentation is at: https://openpyxl.readthedocs.io + +* installation methods +* code examples +* instructions for contributing + +Release notes: https://openpyxl.readthedocs.io/en/stable/changes.html diff --git a/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/RECORD b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/RECORD new file mode 100755 index 0000000..467d3be --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/RECORD @@ -0,0 +1,387 @@ +openpyxl-3.1.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +openpyxl-3.1.5.dist-info/LICENCE.rst,sha256=DIS7QvXTZ-Xr-fwt3jWxYUHfXuD9wYklCFi8bFVg9p4,1131 +openpyxl-3.1.5.dist-info/METADATA,sha256=I_gMqYMN2JQ12hcQ8m3tqPgeVAkofnRUAhDHJiekrZY,2510 +openpyxl-3.1.5.dist-info/RECORD,, +openpyxl-3.1.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +openpyxl-3.1.5.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110 +openpyxl-3.1.5.dist-info/top_level.txt,sha256=mKJO5QFAsUEDtJ_c97F-IbmVtHYEDymqD7d5X0ULkVs,9 +openpyxl/__init__.py,sha256=s2sXcp8ThXXHswNSh-UuQi5BHsoasuczUyjNNz0Vupc,603 +openpyxl/__pycache__/__init__.cpython-311.pyc,, +openpyxl/__pycache__/_constants.cpython-311.pyc,, +openpyxl/_constants.py,sha256=rhOeQ6wNH6jw73G4I242VtbmyM8fvdNVwOsOjJlJ6TU,306 +openpyxl/cell/__init__.py,sha256=OXNzFFR9dlxUXiuWXyKSVQRJiQhZFel-_RQS3mHNnrQ,122 +openpyxl/cell/__pycache__/__init__.cpython-311.pyc,, +openpyxl/cell/__pycache__/_writer.cpython-311.pyc,, +openpyxl/cell/__pycache__/cell.cpython-311.pyc,, +openpyxl/cell/__pycache__/read_only.cpython-311.pyc,, +openpyxl/cell/__pycache__/rich_text.cpython-311.pyc,, +openpyxl/cell/__pycache__/text.cpython-311.pyc,, +openpyxl/cell/_writer.py,sha256=3I6WLKEJGuFe8rOjxdAVuDT4sZYjcYo57-6velGepdQ,4015 +openpyxl/cell/cell.py,sha256=hVJsMC9kJAxxb_CspJlBrwDt2qzfccO6YDfPHK3BBCQ,8922 +openpyxl/cell/read_only.py,sha256=ApXkofmUK5QISsuTgZvmZKsU8PufSQtqe2xmYWTgLnc,3097 +openpyxl/cell/rich_text.py,sha256=uAZmGB7bYDUnanHI0vJmKbfSF8riuIYS5CwlVU_3_fM,5628 +openpyxl/cell/text.py,sha256=acU6BZQNSmVx4bBXPgFavoxmfoPbVYrm_ztp1bGeOmc,4367 +openpyxl/chart/_3d.py,sha256=Sdm0TNpXHXNoOLUwiOSccv7yFwrel_-rjQhkrDqAAF4,3104 +openpyxl/chart/__init__.py,sha256=ag4YCN1B3JH0lkS7tiiZCohVAA51x_pejGdAMuxaI1Y,564 +openpyxl/chart/__pycache__/_3d.cpython-311.pyc,, +openpyxl/chart/__pycache__/__init__.cpython-311.pyc,, +openpyxl/chart/__pycache__/_chart.cpython-311.pyc,, +openpyxl/chart/__pycache__/area_chart.cpython-311.pyc,, +openpyxl/chart/__pycache__/axis.cpython-311.pyc,, +openpyxl/chart/__pycache__/bar_chart.cpython-311.pyc,, +openpyxl/chart/__pycache__/bubble_chart.cpython-311.pyc,, +openpyxl/chart/__pycache__/chartspace.cpython-311.pyc,, +openpyxl/chart/__pycache__/data_source.cpython-311.pyc,, +openpyxl/chart/__pycache__/descriptors.cpython-311.pyc,, +openpyxl/chart/__pycache__/error_bar.cpython-311.pyc,, +openpyxl/chart/__pycache__/label.cpython-311.pyc,, +openpyxl/chart/__pycache__/layout.cpython-311.pyc,, +openpyxl/chart/__pycache__/legend.cpython-311.pyc,, +openpyxl/chart/__pycache__/line_chart.cpython-311.pyc,, +openpyxl/chart/__pycache__/marker.cpython-311.pyc,, +openpyxl/chart/__pycache__/picture.cpython-311.pyc,, +openpyxl/chart/__pycache__/pie_chart.cpython-311.pyc,, +openpyxl/chart/__pycache__/pivot.cpython-311.pyc,, +openpyxl/chart/__pycache__/plotarea.cpython-311.pyc,, +openpyxl/chart/__pycache__/print_settings.cpython-311.pyc,, +openpyxl/chart/__pycache__/radar_chart.cpython-311.pyc,, +openpyxl/chart/__pycache__/reader.cpython-311.pyc,, +openpyxl/chart/__pycache__/reference.cpython-311.pyc,, +openpyxl/chart/__pycache__/scatter_chart.cpython-311.pyc,, +openpyxl/chart/__pycache__/series.cpython-311.pyc,, +openpyxl/chart/__pycache__/series_factory.cpython-311.pyc,, +openpyxl/chart/__pycache__/shapes.cpython-311.pyc,, +openpyxl/chart/__pycache__/stock_chart.cpython-311.pyc,, +openpyxl/chart/__pycache__/surface_chart.cpython-311.pyc,, +openpyxl/chart/__pycache__/text.cpython-311.pyc,, +openpyxl/chart/__pycache__/title.cpython-311.pyc,, +openpyxl/chart/__pycache__/trendline.cpython-311.pyc,, +openpyxl/chart/__pycache__/updown_bars.cpython-311.pyc,, +openpyxl/chart/_chart.py,sha256=j5xn6mQYmZ4E7y2V1Xvx1jwhX2_O68Mp-8zeXRteS7E,5746 +openpyxl/chart/area_chart.py,sha256=uROD3fdus6yD1TGu87j4z7KtOEH7tI-3Z5NFK73wwgw,2890 +openpyxl/chart/axis.py,sha256=yommy5q2mQWKmmLRouWBpimiBZDBM1K-UKAIwCwKDNc,12580 +openpyxl/chart/bar_chart.py,sha256=_TQHleMT3gSa6B1BkKD_FkLFcv8LRaoiHbpy2yflLO4,4142 +openpyxl/chart/bubble_chart.py,sha256=KL7VZYFyLDpA8MC-IFtRAUIN262xK6MzjU41DrSVgpY,2004 +openpyxl/chart/chartspace.py,sha256=PuPGBsVbpK5JagbB7SWgp4JwdQtTrZzIm8mf3kfGAuY,6069 +openpyxl/chart/data_source.py,sha256=GAuWoCOJ4k7RZNJZkZck0zt_-D5UfDEwqwQ3ND4-s34,5782 +openpyxl/chart/descriptors.py,sha256=uj-qptwKOBeg7U5xBN4QJQ2OwQvFQ7o4n5eMXXIWS7M,736 +openpyxl/chart/error_bar.py,sha256=GS_L7PiyKNnJVHvQqG2hLxEW237igLLCatCNC-xGMxk,1832 +openpyxl/chart/label.py,sha256=IjvI-CZjTY8ydoUzUOihcbxoRWiSpFb_ipD6C2I8Pu4,4133 +openpyxl/chart/layout.py,sha256=QHakp_CIcoNuvjyZMsQ2p_qP44DIQs4aquy7yln94JM,2040 +openpyxl/chart/legend.py,sha256=iPMycOhYDAVYd05OU_QDB-GSavdw_1L9CMuJIETOoGI,2040 +openpyxl/chart/line_chart.py,sha256=6tAyDCzFiuiBFuUDTWhQepH8xVCx2s57lH951cEcwn0,3951 +openpyxl/chart/marker.py,sha256=kfybMkshK3qefOUW7OX-Os0vfl5OCXfg8MytwHC2i-w,2600 +openpyxl/chart/picture.py,sha256=Q4eBNQMKQDHR91RnPc7tM-YZVdcnWncedUlfagj67gk,1156 +openpyxl/chart/pie_chart.py,sha256=UOvkjrBpNd_rT-rvKcpPeVd9dK-ELdMIaHjAUEr6oN8,4793 +openpyxl/chart/pivot.py,sha256=9kVDmnxnR0uQRQ-Wbl6qw8eew9LGhqomaDBaXqQGZY4,1741 +openpyxl/chart/plotarea.py,sha256=em7yorXFz9SmJruqOR4Pn-2oEj0Su4rnzyNc5e0IZ_U,5805 +openpyxl/chart/print_settings.py,sha256=UwB6Kn6xkLRBejXScl-utF8dkNhV7Lm3Lfk7ACpbRgs,1454 +openpyxl/chart/radar_chart.py,sha256=93I1Y1dmXZ6Y0F1VKXz9I3x1ufgwygBOdbPZumR5n3s,1521 +openpyxl/chart/reader.py,sha256=oQD-29oxSLW2yzXdyXNhzQYNXgM64Y3kVSOIkrPZCuU,802 +openpyxl/chart/reference.py,sha256=N3T4qYMH9BVrtbDRiKIZz-qGvPAdfquWTGL0XKxD9G8,3098 +openpyxl/chart/scatter_chart.py,sha256=JMU32jjxTj7txPJ2TebBHPS5UcMsRHVqLz_psnN2YZs,1563 +openpyxl/chart/series.py,sha256=k8eR8cviH9EPllRjjr_2a-lH5S3_HWBTLyE7XKghzWc,5896 +openpyxl/chart/series_factory.py,sha256=ey1zgNwM1g4bQwB9lLhM6E-ctLIM2kLWM3X7CPw8SDs,1368 +openpyxl/chart/shapes.py,sha256=JkgMy3DUWDKLV6JZHKb_pUBvWpzTAQ3biUMr-1fJWZU,2815 +openpyxl/chart/stock_chart.py,sha256=YJ7eElBX5omHziKo41ygTA7F_NEkyIlFUfdDJXZuKhM,1604 +openpyxl/chart/surface_chart.py,sha256=_-yGEX-Ou2NJVmJCA_K_bSLyzk-RvbPupyQLmjfCWj0,2914 +openpyxl/chart/text.py,sha256=voJCf4PK5olmX0g_5u9aQo8B5LpCUlOeq4j4pnOy_A0,1847 +openpyxl/chart/title.py,sha256=L-7KxwcpMb2aZk4ikgMsIgFPVtBafIppx9ykd5FPJ4w,1952 +openpyxl/chart/trendline.py,sha256=9pWSJa9Adwtd6v_i7dPT7qNKzhOrSMWZ4QuAOntZWVg,3045 +openpyxl/chart/updown_bars.py,sha256=QA4lyEMtMVvZCrYUpHZYMVS1xsnaN4_T5UBi6E7ilQ0,897 +openpyxl/chartsheet/__init__.py,sha256=3Ony1WNbxxWuddTW-peuUPvO3xqIWFWe3Da2OUzsVnI,71 +openpyxl/chartsheet/__pycache__/__init__.cpython-311.pyc,, +openpyxl/chartsheet/__pycache__/chartsheet.cpython-311.pyc,, +openpyxl/chartsheet/__pycache__/custom.cpython-311.pyc,, +openpyxl/chartsheet/__pycache__/properties.cpython-311.pyc,, +openpyxl/chartsheet/__pycache__/protection.cpython-311.pyc,, +openpyxl/chartsheet/__pycache__/publish.cpython-311.pyc,, +openpyxl/chartsheet/__pycache__/relation.cpython-311.pyc,, +openpyxl/chartsheet/__pycache__/views.cpython-311.pyc,, +openpyxl/chartsheet/chartsheet.py,sha256=GTXNfQPYBaS4B7XB4f7gDkAo2kCjtZqidl6iDxp-JQ8,3911 +openpyxl/chartsheet/custom.py,sha256=qVgeCzT7t1tN_pDwaLqtR3ubuPDLeTR5KKlcxwnTWa8,1691 +openpyxl/chartsheet/properties.py,sha256=dR1nrp22FsPkyDrwQaZV7t-p-Z2Jc88Y2IhIGbBvFhk,679 +openpyxl/chartsheet/protection.py,sha256=eJixEBmdoTDO2_0h6g51sdSdfSdCaP8UUNsbEqHds6U,1265 +openpyxl/chartsheet/publish.py,sha256=PrwqsUKn2SK67ZM3NEGT9FH4nOKC1cOxxm3322hHawQ,1587 +openpyxl/chartsheet/relation.py,sha256=ZAAfEZb639ve0k6ByRwmHdjBrjqVC0bHOLgIcBwRx6o,2731 +openpyxl/chartsheet/views.py,sha256=My3Au-DEAcC4lwBARhrCcwsN7Lp9H6cFQT-SiAcJlko,1341 +openpyxl/comments/__init__.py,sha256=k_QJ-OPRme8HgAYQlyxbbRhmS1n2FyowqIeekBW-7vw,67 +openpyxl/comments/__pycache__/__init__.cpython-311.pyc,, +openpyxl/comments/__pycache__/author.cpython-311.pyc,, +openpyxl/comments/__pycache__/comment_sheet.cpython-311.pyc,, +openpyxl/comments/__pycache__/comments.cpython-311.pyc,, +openpyxl/comments/__pycache__/shape_writer.cpython-311.pyc,, +openpyxl/comments/author.py,sha256=PZB_fjQqiEm8BdHDblbfzB0gzkFvECWq5i1jSHeJZco,388 +openpyxl/comments/comment_sheet.py,sha256=Uv2RPpIxrikDPHBr5Yj1dDkusZB97yVE-NQTM0-EnBk,5753 +openpyxl/comments/comments.py,sha256=CxurAWM7WbCdbeya-DQklbiWSFaxhtrUNBZEzulTyxc,1466 +openpyxl/comments/shape_writer.py,sha256=Ls1d0SscfxGM9H2spjxMNHeJSaZJuLawlXs4t4qH7v4,3809 +openpyxl/compat/__init__.py,sha256=fltF__CdGK97l2V3MtIDxbwgV_p1AZvLdyqcEtXKsqs,1592 +openpyxl/compat/__pycache__/__init__.cpython-311.pyc,, +openpyxl/compat/__pycache__/abc.cpython-311.pyc,, +openpyxl/compat/__pycache__/numbers.cpython-311.pyc,, +openpyxl/compat/__pycache__/product.cpython-311.pyc,, +openpyxl/compat/__pycache__/singleton.cpython-311.pyc,, +openpyxl/compat/__pycache__/strings.cpython-311.pyc,, +openpyxl/compat/abc.py,sha256=Y-L6pozzgjr81OfXsjDkGDeKEq6BOfMr6nvrFps_o6Q,155 +openpyxl/compat/numbers.py,sha256=2dckE0PHT7eB89Sc2BdlWOH4ZLXWt3_eo73-CzRujUY,1617 +openpyxl/compat/product.py,sha256=-bDgNMHGDgbahgw0jqale8TeIARLw7HO0soQAL9b_4k,264 +openpyxl/compat/singleton.py,sha256=R1HiH7XpjaW4kr3GILWMc4hRGZkXyc0yK7T1jcg_QWg,1023 +openpyxl/compat/strings.py,sha256=D_TWf8QnMH6WMx6xuCDfXl0boc1k9q7j8hGalVQ2RUk,604 +openpyxl/descriptors/__init__.py,sha256=eISTR0Sa1ZKKNQPxMZtqlE39JugYzkjxiZf7u9fttiw,1952 +openpyxl/descriptors/__pycache__/__init__.cpython-311.pyc,, +openpyxl/descriptors/__pycache__/base.cpython-311.pyc,, +openpyxl/descriptors/__pycache__/container.cpython-311.pyc,, +openpyxl/descriptors/__pycache__/excel.cpython-311.pyc,, +openpyxl/descriptors/__pycache__/namespace.cpython-311.pyc,, +openpyxl/descriptors/__pycache__/nested.cpython-311.pyc,, +openpyxl/descriptors/__pycache__/sequence.cpython-311.pyc,, +openpyxl/descriptors/__pycache__/serialisable.cpython-311.pyc,, +openpyxl/descriptors/__pycache__/slots.cpython-311.pyc,, +openpyxl/descriptors/base.py,sha256=-CuNfswEGazgOoX3GuM2Bs2zkBImT992TvR2R1xsnXM,7135 +openpyxl/descriptors/container.py,sha256=IcO91M02hR0vXZtWGurz0IH1Vi2PoEECP1PEbz62FJQ,889 +openpyxl/descriptors/excel.py,sha256=d6a6mtoZ-33jwMGlgvNTL54cqLANKyhMihG6887j8r0,2412 +openpyxl/descriptors/namespace.py,sha256=LjI4e9R09NSbClr_ewv0YmHgWY8RO5xq1s-SpAvz2wo,313 +openpyxl/descriptors/nested.py,sha256=5LSsf2uvTKsrGEEQF1KVXMLHZFoRgmLfL_lzW0lWQjI,2603 +openpyxl/descriptors/sequence.py,sha256=OqF34K_nUC46XD5B_6xzGHeEICz_82hkFkNFXpBkSSE,3490 +openpyxl/descriptors/serialisable.py,sha256=U_7wMEGQRIOiimUUL4AbdOiWMc_aLyKeaRnj_Z7dVO8,7361 +openpyxl/descriptors/slots.py,sha256=xNj5vLWWoounpYqbP2JDnnhlTiTLRn-uTfQxncpFfn0,824 +openpyxl/drawing/__init__.py,sha256=xlXVaT3Fs9ltvbbRIGTSRow9kw9nhLY3Zj1Mm6vXRHE,66 +openpyxl/drawing/__pycache__/__init__.cpython-311.pyc,, +openpyxl/drawing/__pycache__/colors.cpython-311.pyc,, +openpyxl/drawing/__pycache__/connector.cpython-311.pyc,, +openpyxl/drawing/__pycache__/drawing.cpython-311.pyc,, +openpyxl/drawing/__pycache__/effect.cpython-311.pyc,, +openpyxl/drawing/__pycache__/fill.cpython-311.pyc,, +openpyxl/drawing/__pycache__/geometry.cpython-311.pyc,, +openpyxl/drawing/__pycache__/graphic.cpython-311.pyc,, +openpyxl/drawing/__pycache__/image.cpython-311.pyc,, +openpyxl/drawing/__pycache__/line.cpython-311.pyc,, +openpyxl/drawing/__pycache__/picture.cpython-311.pyc,, +openpyxl/drawing/__pycache__/properties.cpython-311.pyc,, +openpyxl/drawing/__pycache__/relation.cpython-311.pyc,, +openpyxl/drawing/__pycache__/spreadsheet_drawing.cpython-311.pyc,, +openpyxl/drawing/__pycache__/text.cpython-311.pyc,, +openpyxl/drawing/__pycache__/xdr.cpython-311.pyc,, +openpyxl/drawing/colors.py,sha256=d92d6LQv2xi4xVt0F6bEJz-kpe4ahghNsOIY0_cxgQI,15251 +openpyxl/drawing/connector.py,sha256=4be6kFwDmixqYX6ko22JE3cqJ9xUM7lRonSer1BDVgY,3863 +openpyxl/drawing/drawing.py,sha256=Wbv24TZbNaPngDR3adOj6jUBg-iyMYyfvgEPg-5IPu8,2339 +openpyxl/drawing/effect.py,sha256=vZ5r9k3JfyaAoBggFzN9wyvsEDnMnAmkQZsdVQN1-wo,9435 +openpyxl/drawing/fill.py,sha256=Z_kAY5bncgu1WkZNvgjiX5ucrYI6GLXyUi6H3_mne2k,13092 +openpyxl/drawing/geometry.py,sha256=0UM5hMHYy_R3C-lHt5x3NECDn7O1tfbKu5BweLwdLlg,17523 +openpyxl/drawing/graphic.py,sha256=013KhmTqp1PFKht9lRRA6SHjznxq9EL4u_ybA88OuCk,4811 +openpyxl/drawing/image.py,sha256=ROO0YJjzH9eqjPUKU5bMtt4bXnHFK9uofDa2__R3G2k,1455 +openpyxl/drawing/line.py,sha256=CRxV0NUpce4RfXPDllodcneoHk8vr2Ind8HaWnUv2HE,3904 +openpyxl/drawing/picture.py,sha256=tDYob2x4encQ9rUWOe29PqtiRSDEj746j-SvQ7rVV10,4205 +openpyxl/drawing/properties.py,sha256=TyLOF3ehp38XJvuupNZdsOqZ0HNXkVPBDYwU5O1GhBM,4948 +openpyxl/drawing/relation.py,sha256=InbM75ymWUjICXhjyCcYqp1FWcfCFp9q9vecYLptzk4,344 +openpyxl/drawing/spreadsheet_drawing.py,sha256=CUWSpIYWOHUEp-USOAGVNlLfXBQObcGdg_RZ_bggPYM,10721 +openpyxl/drawing/text.py,sha256=6_ShIu9FLG7MJvMLs_G_tTatTaBqxpaX5KMKxSfTY7Y,22421 +openpyxl/drawing/xdr.py,sha256=XE2yRzlCqoJBWg3TPRxelzZ4GmBV9dDFTtiJgJZku-U,626 +openpyxl/formatting/__init__.py,sha256=vpkL3EimMa-moJjcWk4l3bIWdJ3c7a8pKOfGlnPte9c,59 +openpyxl/formatting/__pycache__/__init__.cpython-311.pyc,, +openpyxl/formatting/__pycache__/formatting.cpython-311.pyc,, +openpyxl/formatting/__pycache__/rule.cpython-311.pyc,, +openpyxl/formatting/formatting.py,sha256=AdXlrhic4CPvyJ300oFJPJUH-2vS0VNOLiNudt3U26c,2701 +openpyxl/formatting/rule.py,sha256=96Fc5-hSByCrvkC1O0agEoZyL9G_AdeulrjRXnf_rZ8,9288 +openpyxl/formula/__init__.py,sha256=AgvEdunVryhzwecuFVO2EezdJT3h5gCXpw2j3f5VUWA,69 +openpyxl/formula/__pycache__/__init__.cpython-311.pyc,, +openpyxl/formula/__pycache__/tokenizer.cpython-311.pyc,, +openpyxl/formula/__pycache__/translate.cpython-311.pyc,, +openpyxl/formula/tokenizer.py,sha256=o1jDAOl79YiCWr-2LmSICyAbhm2hdb-37jriasmv4dc,15088 +openpyxl/formula/translate.py,sha256=Zs9adqfZTAuo8J_QNbqK3vjQDlSFhWc0vWc6TCMDYrI,6653 +openpyxl/packaging/__init__.py,sha256=KcNtO2zoYizOgG-iZzayZffSL1WeZR98i1Q8QYTRhfI,90 +openpyxl/packaging/__pycache__/__init__.cpython-311.pyc,, +openpyxl/packaging/__pycache__/core.cpython-311.pyc,, +openpyxl/packaging/__pycache__/custom.cpython-311.pyc,, +openpyxl/packaging/__pycache__/extended.cpython-311.pyc,, +openpyxl/packaging/__pycache__/interface.cpython-311.pyc,, +openpyxl/packaging/__pycache__/manifest.cpython-311.pyc,, +openpyxl/packaging/__pycache__/relationship.cpython-311.pyc,, +openpyxl/packaging/__pycache__/workbook.cpython-311.pyc,, +openpyxl/packaging/core.py,sha256=OSbSFGZrKYcZszcHe3LhQEyiAf2Wylwxm4_6N8WO-Yo,4061 +openpyxl/packaging/custom.py,sha256=uCEl7IwITFX2pOxiAITnvNbfsav80uHB0wXUFvjIRUQ,6738 +openpyxl/packaging/extended.py,sha256=JFksxDd67rA57n-vxg48tbeZh2g2LEOb0fgJLeqbTWM,4810 +openpyxl/packaging/interface.py,sha256=vlGVt4YvyUR4UX9Tr9xmkn1G8s_ynYVtAx4okJ6-g_8,920 +openpyxl/packaging/manifest.py,sha256=y5zoDQnhJ1aW_HPLItY_WE94fSLS4jxvfIqn_J2zJ6Q,5366 +openpyxl/packaging/relationship.py,sha256=jLhvFvDVZBRTZTXokRrrsEiLI9CmFlulhGzA_OYKM0Q,3974 +openpyxl/packaging/workbook.py,sha256=s4jl4gqqMkaUHmMAR52dc9ZoNTieuXcq1OG3cgNDYjw,6495 +openpyxl/pivot/__init__.py,sha256=c12-9kMPWlUdjwSoZPsFpmeW8KVXH0HCGpO3dlCTVqI,35 +openpyxl/pivot/__pycache__/__init__.cpython-311.pyc,, +openpyxl/pivot/__pycache__/cache.cpython-311.pyc,, +openpyxl/pivot/__pycache__/fields.cpython-311.pyc,, +openpyxl/pivot/__pycache__/record.cpython-311.pyc,, +openpyxl/pivot/__pycache__/table.cpython-311.pyc,, +openpyxl/pivot/cache.py,sha256=kKQMEcoYb9scl_CNNWfmNOTewD5S3hpBGwViMtDCyx0,27840 +openpyxl/pivot/fields.py,sha256=0CQLdTOBhYAa9gfEZb_bvkgCx8feASYp64dqFskDkqU,7057 +openpyxl/pivot/record.py,sha256=c45ft1YsPAVRneMVh_WvUQ1nZt9RJQ_josRuolKx3qE,2671 +openpyxl/pivot/table.py,sha256=riKBeb1aICXWipnhpSaSx9iqP-AkfcyOSm3Dfl407dA,40756 +openpyxl/reader/__init__.py,sha256=c12-9kMPWlUdjwSoZPsFpmeW8KVXH0HCGpO3dlCTVqI,35 +openpyxl/reader/__pycache__/__init__.cpython-311.pyc,, +openpyxl/reader/__pycache__/drawings.cpython-311.pyc,, +openpyxl/reader/__pycache__/excel.cpython-311.pyc,, +openpyxl/reader/__pycache__/strings.cpython-311.pyc,, +openpyxl/reader/__pycache__/workbook.cpython-311.pyc,, +openpyxl/reader/drawings.py,sha256=iZPok8Dc_mZMyRPk_EfDXDQvZdwfHwbYjvxfK2cXtag,2209 +openpyxl/reader/excel.py,sha256=kgStQtO1j0vV56GWaXxo3GA2EXuouGtnFrRVMocq8EY,12357 +openpyxl/reader/strings.py,sha256=oG2Mq6eBD0-ElFOxPdHTBUmshUxTNrK1sns1UJRaVis,1113 +openpyxl/reader/workbook.py,sha256=4w0LRV7qNNGHDnYd19zUgWnJOEX8tHjm3vlkxwllzv4,4352 +openpyxl/styles/__init__.py,sha256=2QNNdlz4CjhnkBQVNhZ-12Yz73_uHIinqRKWo_TjNwg,363 +openpyxl/styles/__pycache__/__init__.cpython-311.pyc,, +openpyxl/styles/__pycache__/alignment.cpython-311.pyc,, +openpyxl/styles/__pycache__/borders.cpython-311.pyc,, +openpyxl/styles/__pycache__/builtins.cpython-311.pyc,, +openpyxl/styles/__pycache__/cell_style.cpython-311.pyc,, +openpyxl/styles/__pycache__/colors.cpython-311.pyc,, +openpyxl/styles/__pycache__/differential.cpython-311.pyc,, +openpyxl/styles/__pycache__/fills.cpython-311.pyc,, +openpyxl/styles/__pycache__/fonts.cpython-311.pyc,, +openpyxl/styles/__pycache__/named_styles.cpython-311.pyc,, +openpyxl/styles/__pycache__/numbers.cpython-311.pyc,, +openpyxl/styles/__pycache__/protection.cpython-311.pyc,, +openpyxl/styles/__pycache__/proxy.cpython-311.pyc,, +openpyxl/styles/__pycache__/styleable.cpython-311.pyc,, +openpyxl/styles/__pycache__/stylesheet.cpython-311.pyc,, +openpyxl/styles/__pycache__/table.cpython-311.pyc,, +openpyxl/styles/alignment.py,sha256=wQOEtmYhPJFtnuBq0juMe5EsCp9DNSVS1ieBhlAnwWE,2198 +openpyxl/styles/borders.py,sha256=BLUTOyBbxWQzv8Kuh1u4sWfJiIPJc8QExb7nGwdSmXc,3302 +openpyxl/styles/builtins.py,sha256=cMtJverVSjdIdCckP6L-AlI0OLMRPgbQwaJWUkldA0U,31182 +openpyxl/styles/cell_style.py,sha256=8Ol5F6ktKeSqhDVF-10w5eIh7W-jkzijpPPHqqv1qDs,5414 +openpyxl/styles/colors.py,sha256=Ss3QqNS5YISVkJxlNfd4q_YSrFKdKjATWLDSu2rPMBc,4612 +openpyxl/styles/differential.py,sha256=dqEGny_ou1jC3tegBal1w_UbONyQEJXvGPURs8xWwfU,2267 +openpyxl/styles/fills.py,sha256=LmR4H00GzKDWyYjzDEayzKZN28S_muD65DvAFWlbaCI,6380 +openpyxl/styles/fonts.py,sha256=nkeiJUgKYnWaETvn51sOo9zQXJiOEJKHDTqvxt0JiBc,3516 +openpyxl/styles/named_styles.py,sha256=nfL1KPpd6b0Y0qBrGJQ15EUOebfeO1eZBQhPVpcZW-o,7254 +openpyxl/styles/numbers.py,sha256=6kK7mdBD-0xs7bjYDFNGsUAvoFvRu5wSMjOF9J5j-Go,5097 +openpyxl/styles/protection.py,sha256=BUHgARq7SjOVfW_ST53hKCUofVBEWXn3Lnn_c5n4i_I,394 +openpyxl/styles/proxy.py,sha256=ajsvzRp_MOeV_rZSEfVoti6-3tW8aowo5_Hjwp2AlfA,1432 +openpyxl/styles/styleable.py,sha256=Yl_-oPljEuFzg9tXKSSCuvWRL4L0HC5bHMFJVhex6Oc,4499 +openpyxl/styles/stylesheet.py,sha256=7kZpzyavLrOJcdZqZzl3WZTyM60CqWP8i_OQ0J_1xy0,8790 +openpyxl/styles/table.py,sha256=VexRqPPQmjRzWe1rVTOgyOQgvlCBuEYTif5MEV_0qsk,2801 +openpyxl/utils/__init__.py,sha256=wCMNXgIoA4aF4tpSuSzxm1k3SmJJGOEjtdbqdJZZG7I,324 +openpyxl/utils/__pycache__/__init__.cpython-311.pyc,, +openpyxl/utils/__pycache__/bound_dictionary.cpython-311.pyc,, +openpyxl/utils/__pycache__/cell.cpython-311.pyc,, +openpyxl/utils/__pycache__/dataframe.cpython-311.pyc,, +openpyxl/utils/__pycache__/datetime.cpython-311.pyc,, +openpyxl/utils/__pycache__/escape.cpython-311.pyc,, +openpyxl/utils/__pycache__/exceptions.cpython-311.pyc,, +openpyxl/utils/__pycache__/formulas.cpython-311.pyc,, +openpyxl/utils/__pycache__/indexed_list.cpython-311.pyc,, +openpyxl/utils/__pycache__/inference.cpython-311.pyc,, +openpyxl/utils/__pycache__/protection.cpython-311.pyc,, +openpyxl/utils/__pycache__/units.cpython-311.pyc,, +openpyxl/utils/bound_dictionary.py,sha256=zfzflQom1FqfEw8uexBqI8eExCeAWELzSk4TqqpD-w8,717 +openpyxl/utils/cell.py,sha256=P7og4c4JcSN__amIsubIMgSMlQ4SrAA5eZ0cjkoXlaQ,6967 +openpyxl/utils/dataframe.py,sha256=d3SPeb4p9YKFwlFTUWhdVUYYyMLNrd9atC6iSf2QB6w,2957 +openpyxl/utils/datetime.py,sha256=xQ8zHJFb-n4nlN6fA_fFZKHlHeNOB7El48p9-YOPvGE,4529 +openpyxl/utils/escape.py,sha256=4dgcSlSdPNk0vkJNHRUK9poEe8pn4sBIQ5Rjz-7H1Uk,790 +openpyxl/utils/exceptions.py,sha256=WT40gTyd9YUhg1MeqZNzHp9qJnL5eXzbCEb_VtHp3Kk,889 +openpyxl/utils/formulas.py,sha256=-I0zyvicBZMaAH1XzsmmEEzE4GB-NA605aArWVt9ik4,4248 +openpyxl/utils/indexed_list.py,sha256=hBsQP9gunTit7iKdMGw_tM3y5uIpXDjUx7jswbQF6Dc,1257 +openpyxl/utils/inference.py,sha256=dM1FBW_Rx_xE7P8vGo6WNhbBe-2eqpGuJj4eqdS7UjE,1583 +openpyxl/utils/protection.py,sha256=opm7GVM2ePQvpNzKT-W56u-0yP8liS9WJkxpzpG_tE0,830 +openpyxl/utils/units.py,sha256=eGpGrdzyoKlqLs99eALNC5c1gSLXRo4GdUNAqdB4wzg,2642 +openpyxl/workbook/__init__.py,sha256=yKMikN8VqoVZJcoZSVW3p9Smt88ibeqNq9NHhGBJqEM,68 +openpyxl/workbook/__pycache__/__init__.cpython-311.pyc,, +openpyxl/workbook/__pycache__/_writer.cpython-311.pyc,, +openpyxl/workbook/__pycache__/child.cpython-311.pyc,, +openpyxl/workbook/__pycache__/defined_name.cpython-311.pyc,, +openpyxl/workbook/__pycache__/external_reference.cpython-311.pyc,, +openpyxl/workbook/__pycache__/function_group.cpython-311.pyc,, +openpyxl/workbook/__pycache__/properties.cpython-311.pyc,, +openpyxl/workbook/__pycache__/protection.cpython-311.pyc,, +openpyxl/workbook/__pycache__/smart_tags.cpython-311.pyc,, +openpyxl/workbook/__pycache__/views.cpython-311.pyc,, +openpyxl/workbook/__pycache__/web.cpython-311.pyc,, +openpyxl/workbook/__pycache__/workbook.cpython-311.pyc,, +openpyxl/workbook/_writer.py,sha256=pB4s05erNEBJFT_w5LT-2DlxqXkZLOutXWVgewRLVds,6506 +openpyxl/workbook/child.py,sha256=r_5V9DNkGSYZhzi62P10ZnsO5iT518YopcTdmSvtAUc,4052 +openpyxl/workbook/defined_name.py,sha256=EAF1WvGYU4WG7dusDi29yBAr15BhkYtkF_GrFym1DDY,5394 +openpyxl/workbook/external_link/__init__.py,sha256=YOkLI226nyopB6moShzGIfBRckdQgPiFXjVZwXW-DpE,71 +openpyxl/workbook/external_link/__pycache__/__init__.cpython-311.pyc,, +openpyxl/workbook/external_link/__pycache__/external.cpython-311.pyc,, +openpyxl/workbook/external_link/external.py,sha256=LXXuej0-d0iRnwlJ-13S81kbuDxvhAWo3qfnxpsClvM,4509 +openpyxl/workbook/external_reference.py,sha256=9bKX9_QgNJxv7fEUd0G-ocXyZajMAsDzG11d0miguxY,348 +openpyxl/workbook/function_group.py,sha256=x5QfUpFdsjtbFbAJzZof7SrZ376nufNY92mpCcaSPiQ,803 +openpyxl/workbook/properties.py,sha256=vMUriu67iQU11xIos37ayv73gjq1kdHgI27ncJ3Vk24,5261 +openpyxl/workbook/protection.py,sha256=LhiyuoOchdrun9xMwq_pxGzbkysziThfKivk0dHHOLw,6008 +openpyxl/workbook/smart_tags.py,sha256=xHHXCrUPnHeRoM_eakrCOz-eCpct3Y7xKHShr9wGv7s,1181 +openpyxl/workbook/views.py,sha256=uwQqZCrRavAoBDLZIBtgz7riOEhEaHplybV4cX_TMgY,5214 +openpyxl/workbook/web.py,sha256=87B5mEZ6vfHTwywcGtcYL6u7D3RyJVDCJxV0nHZeS-w,2642 +openpyxl/workbook/workbook.py,sha256=oaErvSH1qUphUAPOZTCHj2UHyKeDqsj2DycKCDcgo7M,13232 +openpyxl/worksheet/__init__.py,sha256=c12-9kMPWlUdjwSoZPsFpmeW8KVXH0HCGpO3dlCTVqI,35 +openpyxl/worksheet/__pycache__/__init__.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/_read_only.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/_reader.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/_write_only.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/_writer.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/cell_range.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/cell_watch.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/controls.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/copier.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/custom.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/datavalidation.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/dimensions.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/drawing.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/errors.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/filters.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/formula.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/header_footer.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/hyperlink.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/merge.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/ole.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/page.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/pagebreak.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/picture.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/print_settings.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/properties.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/protection.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/related.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/scenario.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/smart_tag.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/table.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/views.cpython-311.pyc,, +openpyxl/worksheet/__pycache__/worksheet.cpython-311.pyc,, +openpyxl/worksheet/_read_only.py,sha256=6Kd4Q-73UoJDY66skRJy_ks-wCHNttlGhsDxvB99PuY,5709 +openpyxl/worksheet/_reader.py,sha256=vp_D7w4DiADMdyNrYpQglrCVvVLT9_DsSZikOd--n2c,16375 +openpyxl/worksheet/_write_only.py,sha256=yqW-DtBDDYTwGCBHRVIwkheSB7SSLO3xlw-RsXtPorE,4232 +openpyxl/worksheet/_writer.py,sha256=bDtw6BV5tdztARQEkQPprExRr8hZVFkj0DyolqxVu2k,10283 +openpyxl/worksheet/cell_range.py,sha256=YP8AUnqUFP5wOV_avMDFRSZ0Qi2p78RWFuwyyCua7m8,15013 +openpyxl/worksheet/cell_watch.py,sha256=LdxGcTmXbZ4sxm6inasFgZPld1ijdL5_ODSUvvz13DU,608 +openpyxl/worksheet/controls.py,sha256=FPLg4N94T-IL27NLg8Le_U4WYDT_6Aa25LDG_kiEDVA,2735 +openpyxl/worksheet/copier.py,sha256=0Di1qSks0g7Jtgmpc_M20O-KPCW81Yr2myC5j458nyU,2319 +openpyxl/worksheet/custom.py,sha256=CRlQ98GwqqKmEDkv8gPUCa0ApNM2Vz-BLs_-RMu3jLA,639 +openpyxl/worksheet/datavalidation.py,sha256=m-O7NOoTDr_bAfxB9xEeY5QttFiuPtzs-IFAlF0j4FE,6131 +openpyxl/worksheet/dimensions.py,sha256=HzM77FrYixiQDCugRT-C9ZpKq7GNFaGchxT73U4cisY,9102 +openpyxl/worksheet/drawing.py,sha256=2nfrLyTX0kAizPIINF12KwDW9mRnaq8hs-NrSBcWpmE,275 +openpyxl/worksheet/errors.py,sha256=KkFC4bnckvCp74XsVXA7JUCi4MIimEFu3uAddcQpjo0,2435 +openpyxl/worksheet/filters.py,sha256=8eUj2LuP8Qbz1R1gkK1c6W_UKS8-__6XlFMVkunIua0,13854 +openpyxl/worksheet/formula.py,sha256=5yuul6s1l-K_78KXHC6HrF_pLhxypoldh5jMg7zmlyY,1045 +openpyxl/worksheet/header_footer.py,sha256=91F6NUDUEwrhgeWrxG9XtDPyPD03XAtGU_ONBpkAfUc,7886 +openpyxl/worksheet/hyperlink.py,sha256=sXzPkkjl9BWNzCxwwEEaSS53J37jIXPmnnED-j8MIBo,1103 +openpyxl/worksheet/merge.py,sha256=gNOIH6EJ8wVcJpibAv4CMc7UpD7_DrGvgaCSvG2im5A,4125 +openpyxl/worksheet/ole.py,sha256=khVvqMt4GPc9Yr6whLDfkUo51euyLXfJe1p4zFee4no,3530 +openpyxl/worksheet/page.py,sha256=4jeSRcDE0S2RPzIAmA3Bh-uXRyq0hnbO5h5pJdGHbbQ,4901 +openpyxl/worksheet/pagebreak.py,sha256=XXFIMOY4VdPQCd86nGPghA6hOfLGK5G_KFuvjBNPRsw,1811 +openpyxl/worksheet/picture.py,sha256=72TctCxzk2JU8uFfjiEbTBufEe5eQxIieSPBRhU6m1Q,185 +openpyxl/worksheet/print_settings.py,sha256=k_g4fkrs9bfz-S-RIKIBGqzVgubufMdryWQ3ejXQoRI,5215 +openpyxl/worksheet/properties.py,sha256=9iXTOVC8B9C-2pp_iU5l0r5Fjf3Uzv0SIOUKRrZ2hw4,3087 +openpyxl/worksheet/protection.py,sha256=vj5M6WWC5xKiHeWS_tJqXxrlOJHJ7GpW2JdPw7r9jjE,3758 +openpyxl/worksheet/related.py,sha256=ZLDpgcrW6DWl8vvh2sSVB_r1JyG8bC8EicCBKjfssTs,335 +openpyxl/worksheet/scenario.py,sha256=VlJW4pi1OTy1cJ9m7ZxazIy8PSlo17BGpnUYixmNotQ,2401 +openpyxl/worksheet/smart_tag.py,sha256=nLbt04IqeJllk7TmNS1eTNdb7On5jMf3llfyy3otDSk,1608 +openpyxl/worksheet/table.py,sha256=gjt-jNP8dhVy8w5g-gMJpfHO-eV1EoxJy91yi-5HG64,11671 +openpyxl/worksheet/views.py,sha256=DkZcptwpbpklHILSlvK-a2LmJ7BWb1wbDcz2JVl7404,4974 +openpyxl/worksheet/worksheet.py,sha256=4JM5qjoJumtcqftHFkimtFEQrz7E2DBmXnkVo7R3WX8,27572 +openpyxl/writer/__init__.py,sha256=c12-9kMPWlUdjwSoZPsFpmeW8KVXH0HCGpO3dlCTVqI,35 +openpyxl/writer/__pycache__/__init__.cpython-311.pyc,, +openpyxl/writer/__pycache__/excel.cpython-311.pyc,, +openpyxl/writer/__pycache__/theme.cpython-311.pyc,, +openpyxl/writer/excel.py,sha256=6ioXn3hSHHIUnkW2wCyBgPA4CncO6FXL5yGSAzsqp6Y,9572 +openpyxl/writer/theme.py,sha256=5Hhq-0uP55sf_Zhw7i3M9azCfCjALQxoo7CV_9QPmTA,10320 +openpyxl/xml/__init__.py,sha256=A5Kj0GWk5XI-zJxbAL5vIppV_AgEHLRveGu8RK5c7U0,1016 +openpyxl/xml/__pycache__/__init__.cpython-311.pyc,, +openpyxl/xml/__pycache__/constants.cpython-311.pyc,, +openpyxl/xml/__pycache__/functions.cpython-311.pyc,, +openpyxl/xml/constants.py,sha256=HDNnhcj-WO9ayO4Mqwca3Au0ZTNfsDqWDtleREs_Wto,4833 +openpyxl/xml/functions.py,sha256=jBtfa8__w4gBlEPGHLGCAtJiaNKPyihTLsfmigyq2_Q,2025 diff --git a/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/REQUESTED b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/REQUESTED new file mode 100755 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/WHEEL b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/WHEEL new file mode 100755 index 0000000..832be11 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.43.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/top_level.txt new file mode 100755 index 0000000..794cc3d --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl-3.1.5.dist-info/top_level.txt @@ -0,0 +1 @@ +openpyxl diff --git a/venv/lib/python3.11/site-packages/openpyxl/__init__.py b/venv/lib/python3.11/site-packages/openpyxl/__init__.py new file mode 100755 index 0000000..14e8432 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/__init__.py @@ -0,0 +1,19 @@ +# Copyright (c) 2010-2024 openpyxl + +DEBUG = False + +from openpyxl.compat.numbers import NUMPY +from openpyxl.xml import DEFUSEDXML, LXML +from openpyxl.workbook import Workbook +from openpyxl.reader.excel import load_workbook as open +from openpyxl.reader.excel import load_workbook +import openpyxl._constants as constants + +# Expose constants especially the version number + +__author__ = constants.__author__ +__author_email__ = constants.__author_email__ +__license__ = constants.__license__ +__maintainer_email__ = constants.__maintainer_email__ +__url__ = constants.__url__ +__version__ = constants.__version__ diff --git a/venv/lib/python3.11/site-packages/openpyxl/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..2e1f6746cb09e01be25ac16c92026c18b688ed58 GIT binary patch literal 839 zcmY+9!EVz)5Qf)@9VbqmCUsB{Z~!5Jg49@Ph2VfVprl;d3aJVdb67d?7ToOG*4hcl z&2Q01K=1%OhYvYeJ|S`97OA(M7)P-cuV&Z(_s^_n_J^t}2v+;W&GnZOLVr`p7Vu`> z{({d9vXFr+!75RKm5h>*>M|`e(GZzrNE;Sug~^7z(Gsn)nxX9I+D2Dso$VQ_fQWkC z*mgih186^|eV}GeO`ujzEue#(4uG_rG^=ufy7I}t)aeR|bUr%!@VQ$`l)><1bTJ%U zo}DJ*DV&h3escMA?7CCXDs@c@f8QGC-F6}khVMr2laA{V$6GFFZ{jk~40_ItjS2U8 z89F3;d3M1l7s29E>bG(~`z5cW{=MAi#Iy+Sk;Q~iE~hy$%_Ul1fhVrx2c{GFiL#?> zyEZmw!8eyGxaN%R!} literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/__pycache__/_constants.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/__pycache__/_constants.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..fa160ea72f2b710581ac0cece2ce5cef74b81aba GIT binary patch literal 530 zcmX|8y>8nu5T-2uRj!R7anYee(xpIJn1mCwFoK{+w|3|c>a>Fvf)y{aVoDT9%7``j zE%FFO-zKBrwJ%^GTc)0pI!Ey1eaE}w@$PrO9}tw`>+8!SkC4AL*$VP|xqXGlHIXDF z(hEJ=2piH5ec23~vK6*uJ8a8N*pb~SIeb#?2H!+97cm^9;Di)T1Z8guaPZ;B`Nyx{ zr{&9NCX7meMoO6Z**%UTo!LUUB#S8&Yyb17^KxJ3kmbuOH7YC^dlqXQD~OFQa!Vtf zmisg3a(lwq){z032IDwqPpxg@!s7OCB?uI2h#*ZM2WyW4!K?6PdF#U*2_3Q!NVx z@67<8s)uDy5H`N&d7E~_Yi>vlT{3vF3aY(#H)N+8?5%p$^T`bvR>7N9ry4v%-rrpX J^)gQ}{2$*&sPg~- literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/_constants.py b/venv/lib/python3.11/site-packages/openpyxl/_constants.py new file mode 100755 index 0000000..e7ff6b9 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/_constants.py @@ -0,0 +1,13 @@ +# Copyright (c) 2010-2024 openpyxl + +""" +Package metadata +""" + +__author__ = "See AUTHORS" +__author_email__ = "charlie.clark@clark-consulting.eu" +__license__ = "MIT" +__maintainer_email__ = "openpyxl-users@googlegroups.com" +__url__ = "https://openpyxl.readthedocs.io" +__version__ = "3.1.5" +__python__ = "3.8" diff --git a/venv/lib/python3.11/site-packages/openpyxl/cell/__init__.py b/venv/lib/python3.11/site-packages/openpyxl/cell/__init__.py new file mode 100755 index 0000000..0c1ca3f --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/cell/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2010-2024 openpyxl + +from .cell import Cell, WriteOnlyCell, MergedCell +from .read_only import ReadOnlyCell diff --git a/venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..0d95ae01be6f8fe2309e4c771022eed8424d58e2 GIT binary patch literal 370 zcmZ`#!AiqG5Z%otp_b<69|%GOyQE$`s29&FC@2I1P+pCJBCkCLk= zZ-w4^a#rk3hvCh8GqW?h`xZrgg0_FOe166F>BP>wU$QwwvLu2CDv6>gRbJ{TmNM#c zp7d3a2FTeRiTy8%%`xlzOOUdQ9!$}|jh5|?>|cSIfp9#g-QX5-v8!FjVdqbFWC zzJmav+cVgeRXDBPN=s zN}mjqgj>AMah*@fe1=D>8g$*hNbVN%EGu-;WZAH8x4kn}iMfOeGr(=`P4*mN%_ybo TkkHYJB>(vbIavMW#(niS!SiO* literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/_writer.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/_writer.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..c604947dd6407e1593b888d1d4593cad7ec4652a GIT binary patch literal 6491 zcmb7JZ)_Vy7T>kk_O5r`#EzYRbs9H`n>bwJq@|%isVGfK)26+fC zcGG`2C?McWRjFqMU;JyfCuP?3gLYY>JITomT4&GXkyeKiaw)~_i z-gX0eyrpY^TGP~NOSS&BCdpBy34&*Cfd0318(t@&2V1qij-sn&$S<{2X|R-%+_jvs zU$I$gtJS3`V^0fIvX8e{t&}?IIXBTk*W1{S=9Mkg_NdR$8kS1=$v0Q2`Y-V6Esgq- zU|ZTeW11!c>_xxb2hX%1`J$;5;$z8(B={mp-p9ivlP=5&TD?jll@wJbmW;=e!n6cA zNhN1gl2@(L#aMDCb?oBl2|RIqd`b{~$&}<1=jY~9Nb=#Sdoh)S(pVBp6>xz#>^m_l z_{wc@g#@{3We{`tQm0M}QOTE>7bV{*!6$->Qp$G>Bn_)%GT>D0HH}qTlrF@DaEwftHWy3lxs@BNdoRH)L7L@`s=N5|7%owzz*$ zwP*^7c*;>;PjYyW_0JC;7mLso(axfn28I56g(>=&j#bMQ&1qy zrjomcM@NGqV8{?)$eGB?&@=`8&RsYk58{4<;d2OT(eT^_wJ8i<3*)Y1r{=*rGzcAY z@Du&8E*6OrO}JW@x)%>Cj^^xOf$LhFP;8D8L0SfscJGR#;OWm;GSRo~>o)d{S92|^ zHgCb^RXo0OX~wQFj?3F}yH=TP1!kM#=~()8g`aD_d}MLL&}@x$Wq0QWifpgU_Lc|} zGfm#Ke8Lq5o?dfpg+9BElXnTSWtzONrBLFSCQDWVL_I09T{7EWA}D6xXZFu`|2Ez)B$JyxK{*4gH)KeM+$wcP`65mAhq)dvrrhM;dj zx=ctq!T@HN(q`idei5*0fm*OgI?@3$k!g#OYr&ePUW1>GsBLK?ucKVGWBg598`m;V zOhdmlB<0N&?7SKy7HmfRl(axwmS@xewbf(iLx^SroYk=t@NGwf+&Tnmkn8+mxjcBs zfVw!A*lvKgZs{IdpuszXXGqm+ zQkUKhk+vHp0sb?a=>0I~W)?O?SCW7^Q6D|65PuD^dVz&ebW7cJdNtUPW^4NYwD}*f zA5+PwN+2Au5muud2DDAmcX)v!CoVL_M3p=nXx4BL;YF=l%4pe%d3-p*1E*4aEGns# z1luQsM;PHnubN*LB!q)1>cd$ZY|$hn2*`?y@N^Aus_FcU%A8A~GvX|OH}d1E9XJ_) zM77tjST(^e&sxr_wwcOK&QXrAl}#ktjT>4J3 zFy=>3L-7#&#E&(ozti4-le#%mY~L-n?=DiF#fi)lcbMjEOZIe;*)B8N7oSmV+~Pvc zl6Sq!=2(TcU!gD2S=Za#WiG=h^p=d(0OyLcC1btAda}ZMFBaKBnH?+_(9U~a}jco0};_~K>=UehKMc0t*8p_xdwz

cjjGr*UICWXD?4FZfI`MY|W??&G;2=%azGX zlUZRoaV>E*wUjDyJ7jK0L3{6bd-LP(99=n@Il9);ncH=B@6z7PxYFL08NWQa#_n04lexZv_Ws98wD;tD^3h`3pxibH{?p7^^F4BN zqUhTx`*vogWUgzSvi|1K>xVMOUz>VkYEk<`kHDB6Gz1(BS$KBc`!~$k9~*E0{KyIr zn$pzb2rQ_&Kn2n&4{vG=M!N};VDRY*{)|f)pOL1CUSgCGsdJ|D=99!Zk|a(7KS0V) zk`KVEhc`W7{RIM+Rnh@k+k)$xbD}{P2v~S~R(T!@SP)E4<7KHmTEH^O)wjkE$#wp) zTrF&DW~&*(vjOz5F9G)UK%l6zq^cKe1sWhw4_@8i&$^>et;NGZtr6U@h8vGwlHFwN z>PMp*2ES<-iA@hfXb{3(-B{FgHHNzd+om?z8f{4aYt#AE5EikA8#Kim?#g2v4Kxii z3^o%#E<9I`u5c5Org^*Mt;!^bi!ihBVYfb*@l={N_6GJ+XN$8l%(C3Y=94&&9IFv+8j-AO@KRwhCv~OqgXAnqaeDXEY&p!2VQLpnv@rh| zP^uX&bW{tz)tN&WM6`WFIova74=#8dC&oyRp1@^zlAtGX(hrG<7qlL_%W=CYem)Ve z58DTU=Okv%0pu?dYa4{^bsLv8z5dGLD_J3%P#jHHLYG20b1qbL49JcFINC5RTB2~S zlDV4EO5l9Ow7~JI!cb$~hIxlr*59B(FOrOm3m53h8sFo;f)8&1+ z=~dQOV10_GEpzZr6YK~6;4L-{%T2?uLvVDhb#&!~cebu<%~~PIuGq7dtmTe#Yi{D3 z-d#oKqq6f+*da8qd9#*vXUlTuwa(mud~4A;AUnZOvtzrKC@t-UmcE!|X?cy1#9$Y<7K&sfp>*jiU#e)^`r*fk<|jpR&9Pk+v|VpG~Xe^0+l=Uwk`D_o8% zHC6l3dc2Ffy|4FO)1raWd|+s)F+3=_375M(P*=N`y75rL)PSTsNRoErOG+~&UCx+bTA()2L2EHmsUt8-GDn0N6My|2&H+Kka>e7?TSpL^)kE{P&@S&`eA6ea>yw|t#;0; z$;D@uVFXv!VeQbR!7sk8(#|mmqoQipj%wQJ<|9JeCum~(x^O@0Y>WHKSjk`8D!g9`gbzqUct8q<4@wQ;r=-U4 zApVD>rf^7V4i8H$;SqU2J}5sW56VMwNFJ6)7F^*&@?oh#K7yYp338v*h#5XDwch5! zN2OhW&sexqoYZ!kliFqB6YS?_=AMR+vAPb_?XIhPR_c;EZ}Z{jB-<=EuqXXr=c38z z6yDE!gs1##~sEQVm018XS*m z(K)I=i7qRNsO}q8l;~=ygyudvkC}Mv>KrDY?)%>BBO@b2ua6uWd1DRvLq{n8w2^-X z`6I{P7;vT?ebX1Grh3xOzVXS|hDRv#+UV59iJr8*Z)W0T4>cG)H}MjRSbEPlw!Z1% zQJq(HenIDxIzO+w<4H_Wp4Akcmvt-lFa|bbCOdL;9UuK0zz3XW5)H?#@mf{OPmur2 zEGt%tzhy~Y*wNl*j?2}xx1jxVJK8(GrM(sHdv>%hvr2T+7(+GsFIeiHW4jIxi_f{0}&FPaGFj)uPFmtk80F-|XDXo z;pNqZ1ZZ~nx}3Z|oQTf@pMICxx9KaF-!!-KxlbY zchN;A>QzKMY!pBBhX5IF%h|Br|4~=oxxe7tzs`0|obi zZO*x);&|S@ui)Od&Dm=!e$zSlH;LTt=kx9p1^0<<&T3XabOo}GVzBW?C$op%o-BI( znaM|(0vD^gOq_Yqnt{bdqXwn4S>3LT8vI=17lnYrwAi*iAfne&*ch+^lXz zQ{B3xq;$_~#MBv|(;X%LWmQPrDkNKV+k8}&%QsW$CX~SL5S~-wcgjIvU&T-TDFCjL zukC@a^S-Zh<3iroUGQ~hCW=nqHpkmrib8YNR}40MVE?K8edk^02ESq1u-x@-b2fWB z16kWvu=7DsydM-doAbeah2Xxdz32^Ya~5}daZle*rZyVhJzs2U%TCc}+Ya=uAB4 z&|zw6D%>i!R*ebmW@mktyUB-lfxULlMB3ySt8(4x8qD{xDq!LG@%;e+WA@dh}t%R&y{1ez1 zzh??2mrRzrpk#0-F+jaTx0rW zRWHU-yzF2iQPOvGcO=4e&PYV1Inl9-VutY<k$5Q7i^mp z?!y&j$K;fgs4h`Nxy?_2QvCoK?xE0h=gor9mvi-f%S85~ZS6T$PV|XWvdhb<*wvl$ z(cPpRFw-X;U>jwY-=}HOl`*H)QxNv&T>I;1W!=~8GBz_bB^{JZ7Dg*^A^<}A+ zZ!%7n4xXTSiA)O$y?N-?i=Wz*188mRv|Wp930Zl85IgpoxSk>}E0KuFf{fx{qOnSP zP=+fCJr9Hf_k{!Znm^xN7&!jr_}`z;3sVJQD(9Lq7HU#HI+!{wTrYG4d>q7J zsV$nhR5G`)baV9DrQhOfTh?(IA-?;jNVnR+{(XJXIn@m!19v+KpVytYM zPsjiJhoFW%Vl0{@<#%2dS5&A8aBrBRM-2@)6>=9TEd+>sbXyVzH7xz9sfkmgQ<1UL zqcfvpa}zVOk(mkIwLtC?C=v=S`%{DCGU-;saeXnGam1K$y20QPRj8k#v-)EI+=&>ePw;&u0Lzv@(RBR_CE-Q?gvBnR`S84h2YUIw7mC3!3*PxchB%!jr;E%%^i5v z_~sig6dEt&d>5F;U4Iu%q8rC7KY$WZYdY87m|3omt2XZUa*B=TF2V0O%iZ8^S}$=o z_yJ2=oKwi51CLQGmAnpBO=M<8uP7%}S%jxS3E*Mia&#Da^jau@z-NBVR`;f!UZ$p>`CtS!*h{qS@EhV%N-m$z_agFO9ya z(Jd$?n9Hr@JPh-i)vFg_z|&FHrJbt-6Eoe%^=p?L*Vw5jU2FU%UBtR1Icw*xxFlEg zsV9S&r|DScxa*wal-$)Vh$%-%>aiq|s^>``JQatxMvNNn(?KvOI6F)Fk)pskD3Ync z>=fo=nof6(87!?#MofAUT`?D`LVk7Thf?~G`-XpkIir+j6b2fYKCauCi-&eYcb%12 z4eAn6RQ3}%K!DCg_ZvRUYD?Z=n8d!7S!!YhC)PdiaVeU5Bd%T5y%RGt=Vu~g=f@{z znISM>W2&8D1u)kE?UG8{P3pX%rFtXt;H`#rRU+jo%oo(*Amk!b`Z~HuJKypJ*IV8_ zd*^JH-?muYd$$^PZSZ&7v#(@d0d?;p!rof}TMg|SJsTJE4Sj`%K5CPFg(!V5C>^}i z7swvp=+AXLwbj^}>pJnEYwUj4*jE$zt}}(MGx^4|g~qcv-`R&=KMg1rySiZ!OryBo z^xkvX=eC-9Hun~KpUyWOEi@fP6aTYY{ZD^!A>V(j(0^>*RtWZf{m?J0A9?Rm_R>e` zd;NdgneTqF(EVceQn9)1L3988=Kf7N-#l1o9t4*c8rP4$o4%9Y7=7=p>|2}t4|)&Z z?>+p*k$ms5LhrHcTg9He>$bar^+2(q^`ob94gL6*a1UE|V{5!wd{iRO4gWswla5iV z^;Z@iu*QdG>Yh(f-T(X){6+A-tK>F-L>+aspWKUN(p?Q$qu8qLq0WVRVuOs>HWF2wgub(RaVLxU-8v2c~O1{+1BPr znU*zv(Uj@S4wOs7Nyl#PQ7Hh3O90X~2vZbCSF{v7 z#$>`Lu>CTEeROLsv#~Cl_B@$VBmzVVV~G@28#ITQU(v+X)C#HN;u6f)g;m51#pnVq z)QzYDb}`Qe)=0;%8r$q&a__Ag8b7r#r;KOf!HT>TjVCK}K3#Uk8S%=c)OFJS7Yufm z5-(q#P9^2bmqXJ!C>c&Zc|ms=cWuCJTr6f8c(DJ51sJCs<33~&>#js9hAl}Y8RbH4 zHM}p_l4=!ISwP#J_wZkVQxgCn?EvQ!vd9<(`^rJ(6!dQfNK0ZY{QU+)ZW2?wl&_>7jl_GVOChZ?Q}KFr4c;cJIjNCm-cP2xnLja>gmzsey?FFwKl)R8+zFC9^5+A8cDJk*i=)EhFfiD;*x!apOL^Lt?83< z3ZlZ;_zItaYs&~Fkl!|{icwN=D9ZOJx03@nO99uC zu(rx>E zhnmj>&VLvzlD3Q}R4m^?+gbXPSN3so$006FREr`r$WjXn zAZl~3nIJdXg1J|ni!q4d0;?X!z&v@Va*x{46hmJq%l&dhGQ@ZfiI&Uej6hz@uRMhP zfjapz{tUk{^N87~$AI0?GN}n`tow~+l>+m+r&Odx6C-8J%}_oaMpfENPYoFbn6R8m zK4x5(R<6D4L*M50eA`ggUu8exI`(X_(64qgRxfga4W|`3n}Sd^?PZAA=J>Ak*V5Jo_XZ!iKp~r z)9cFO7$iN)qLUHNt(>c~UUbs>*cyL{42jOS2O*k}HH!iRmJALI#;RLP@Es$gELSjb9n)`OHxcD>g zhu(F2(bw>2XWl!ruH}851z%^5eT)9a>>K1H%DzEN?A!yNc;6@HeZ2)=Z_d|SY$IE# z615nxO(TJvh?y}k&_=$@WEAn*2x3?f2zWL6QvRjML8)V{Z>YA4-*7;+dH>86P#cpJE#eOIWi%FoWpzj z^=*sAF48(gs%$JHjLANBiRG$p>eX!yi9D@dC}4J$fc@ER4uEP~O-wJFjME;VS3?43 zPeL^N?I*F!Iw-O(b~-2kvkM_GfB)_8Z(F?fJ=+`rRW?^67`6foxlPw2hM$>;Rw+H2 z19)tF-x{_{wy;C8hMoAiBqxja+Y#?~Q(Qmnk-dvPHU>c0Cp*J_*&YtCc(njY?b1Ex zWY{ed36%85j9pYh*Tml|;c61ZC2`K)y+f=F9ZT_TsOhk{mr1m;LCQKi4Ka_fAl@%4 ztKU`qN`ik5jSO|4J)$xrQi-F66-ZjJp)`Xjn6lG|@y2ZBCE}kpjed`aPXB+g>stTW z&d7Cb+?ry|M%c@y9K{nEv#Ct5EbX7ADs$QfdngO{jKLy^OQoACi#MaiFA(3QzF-+U zqQ!YvU%^F@vU0502o#fFrCzYpF0q}NLWX?7oA|F!)v91c0jw5UwRRyXeADUH6P1}) z#i^9Dc)(8C%^2;Dr5aJGFVV{{ta(UkKgPK7X??{PI_Oe?6QRW(vYg&Nagp z_o)REBB-p=6G&rKC`zoX5x7Nw*+5JMCmwC^ZQ5jm&l9y7qTmSSh|en-0&fFUv+h43 zB!NMi96h6&b=&O3x(NihhThENLw`f&WHAUPUJNv5P8EaAVCN1iafv4ZA8(&!eAI*v zuCeuQcjin{Xw95P)Fm@f{urEsW>e$lcL2eTmRzDcqsWMoL1X#c@(C`$XLJczBBN)T zxn7~Dvg>JTu7;(^GkFD@({e*)m}+}b_kTx0fa!cPu}Z8%c^6}zrTw8-&u~q>!bb1r zg?po4T+Df&&wHOQc%RSNo;POyr)V;8oE;PiPKay6%7Ub(HR!IgLru3RvMyBg?bOn8 zR5RXBY&Wqhcm-DtkvqtEeV2v2^gwMriZQqDW-HPaLU`TaYJ@xxil4@?(bD1ehFej06O`lx zjD3o_>&?bnZ;|oQxd{g7RXDw+8hZ)p+_~}b!+JwCni@V++mcY@6H{}e%3h3ZgtF}O ztD3ATbb`i@p#nuDaF76_aUvFWKR-2meT>_F<2qp|kS{8qqaHVxQzlNj^=8=MecB}_FLp8a*z8KxshD$7Yd)Ss}ShkZ2Lvm7p`CWzr0y^=|avwlkq&X z`3km{^(%$e!$q6#_PO=_g~nks_Y`skTkHCb!mg*c-S%K(#z$4{h!7F#FQ)Sn}Sx`KE2I9;|o&p0IzYRK3Xa6yJV4U|jKk028UJLI3~& literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/read_only.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/read_only.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..8f535365a46fffd799d1010065cd8b1bc922b46f GIT binary patch literal 6672 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/rich_text.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/rich_text.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..916576c6ed6fabf36ba7f43c1d4fcea92e03c609 GIT binary patch literal 11213 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 H87Kb}80;6d literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/text.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/cell/__pycache__/text.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..45c53aefd2c33a77cdb172e1566d68c98204f2c8 GIT binary patch literal 6217 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/cell/_writer.py b/venv/lib/python3.11/site-packages/openpyxl/cell/_writer.py new file mode 100755 index 0000000..4a27d68 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/cell/_writer.py @@ -0,0 +1,136 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.compat import safe_string +from openpyxl.xml.functions import Element, SubElement, whitespace, XML_NS +from openpyxl import LXML +from openpyxl.utils.datetime import to_excel, to_ISO8601 +from datetime import timedelta + +from openpyxl.worksheet.formula import DataTableFormula, ArrayFormula +from openpyxl.cell.rich_text import CellRichText + +def _set_attributes(cell, styled=None): + """ + Set coordinate and datatype + """ + coordinate = cell.coordinate + attrs = {'r': coordinate} + if styled: + attrs['s'] = f"{cell.style_id}" + + if cell.data_type == "s": + attrs['t'] = "inlineStr" + elif cell.data_type != 'f': + attrs['t'] = cell.data_type + + value = cell._value + + if cell.data_type == "d": + if hasattr(value, "tzinfo") and value.tzinfo is not None: + raise TypeError("Excel does not support timezones in datetimes. " + "The tzinfo in the datetime/time object must be set to None.") + + if cell.parent.parent.iso_dates and not isinstance(value, timedelta): + value = to_ISO8601(value) + else: + attrs['t'] = "n" + value = to_excel(value, cell.parent.parent.epoch) + + if cell.hyperlink: + cell.parent._hyperlinks.append(cell.hyperlink) + + return value, attrs + + +def etree_write_cell(xf, worksheet, cell, styled=None): + + value, attributes = _set_attributes(cell, styled) + + el = Element("c", attributes) + if value is None or value == "": + xf.write(el) + return + + if cell.data_type == 'f': + attrib = {} + + if isinstance(value, ArrayFormula): + attrib = dict(value) + value = value.text + + elif isinstance(value, DataTableFormula): + attrib = dict(value) + value = None + + formula = SubElement(el, 'f', attrib) + if value is not None and not attrib.get('t') == "dataTable": + formula.text = value[1:] + value = None + + if cell.data_type == 's': + if isinstance(value, CellRichText): + el.append(value.to_tree()) + else: + inline_string = Element("is") + text = Element('t') + text.text = value + whitespace(text) + inline_string.append(text) + el.append(inline_string) + + else: + cell_content = SubElement(el, 'v') + if value is not None: + cell_content.text = safe_string(value) + + xf.write(el) + + +def lxml_write_cell(xf, worksheet, cell, styled=False): + value, attributes = _set_attributes(cell, styled) + + if value == '' or value is None: + with xf.element("c", attributes): + return + + with xf.element('c', attributes): + if cell.data_type == 'f': + attrib = {} + + if isinstance(value, ArrayFormula): + attrib = dict(value) + value = value.text + + elif isinstance(value, DataTableFormula): + attrib = dict(value) + value = None + + with xf.element('f', attrib): + if value is not None and not attrib.get('t') == "dataTable": + xf.write(value[1:]) + value = None + + if cell.data_type == 's': + if isinstance(value, CellRichText): + el = value.to_tree() + xf.write(el) + else: + with xf.element("is"): + if isinstance(value, str): + attrs = {} + if value != value.strip(): + attrs["{%s}space" % XML_NS] = "preserve" + el = Element("t", attrs) # lxml can't handle xml-ns + el.text = value + xf.write(el) + + else: + with xf.element("v"): + if value is not None: + xf.write(safe_string(value)) + + +if LXML: + write_cell = lxml_write_cell +else: + write_cell = etree_write_cell diff --git a/venv/lib/python3.11/site-packages/openpyxl/cell/cell.py b/venv/lib/python3.11/site-packages/openpyxl/cell/cell.py new file mode 100755 index 0000000..d29be28 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/cell/cell.py @@ -0,0 +1,332 @@ +# Copyright (c) 2010-2024 openpyxl + +"""Manage individual cells in a spreadsheet. + +The Cell class is required to know its value and type, display options, +and any other features of an Excel cell. Utilities for referencing +cells using Excel's 'A1' column/row nomenclature are also provided. + +""" + +__docformat__ = "restructuredtext en" + +# Python stdlib imports +from copy import copy +import datetime +import re + + +from openpyxl.compat import ( + NUMERIC_TYPES, +) + +from openpyxl.utils.exceptions import IllegalCharacterError + +from openpyxl.utils import get_column_letter +from openpyxl.styles import numbers, is_date_format +from openpyxl.styles.styleable import StyleableObject +from openpyxl.worksheet.hyperlink import Hyperlink +from openpyxl.worksheet.formula import DataTableFormula, ArrayFormula +from openpyxl.cell.rich_text import CellRichText + +# constants + +TIME_TYPES = (datetime.datetime, datetime.date, datetime.time, datetime.timedelta) +TIME_FORMATS = { + datetime.datetime:numbers.FORMAT_DATE_DATETIME, + datetime.date:numbers.FORMAT_DATE_YYYYMMDD2, + datetime.time:numbers.FORMAT_DATE_TIME6, + datetime.timedelta:numbers.FORMAT_DATE_TIMEDELTA, + } + +STRING_TYPES = (str, bytes, CellRichText) +KNOWN_TYPES = NUMERIC_TYPES + TIME_TYPES + STRING_TYPES + (bool, type(None)) + +ILLEGAL_CHARACTERS_RE = re.compile(r'[\000-\010]|[\013-\014]|[\016-\037]') +ERROR_CODES = ('#NULL!', '#DIV/0!', '#VALUE!', '#REF!', '#NAME?', '#NUM!', + '#N/A') + +TYPE_STRING = 's' +TYPE_FORMULA = 'f' +TYPE_NUMERIC = 'n' +TYPE_BOOL = 'b' +TYPE_NULL = 'n' +TYPE_INLINE = 'inlineStr' +TYPE_ERROR = 'e' +TYPE_FORMULA_CACHE_STRING = 'str' + +VALID_TYPES = (TYPE_STRING, TYPE_FORMULA, TYPE_NUMERIC, TYPE_BOOL, + TYPE_NULL, TYPE_INLINE, TYPE_ERROR, TYPE_FORMULA_CACHE_STRING) + + +_TYPES = {int:'n', float:'n', str:'s', bool:'b'} + + +def get_type(t, value): + if isinstance(value, NUMERIC_TYPES): + dt = 'n' + elif isinstance(value, STRING_TYPES): + dt = 's' + elif isinstance(value, TIME_TYPES): + dt = 'd' + elif isinstance(value, (DataTableFormula, ArrayFormula)): + dt = 'f' + else: + return + _TYPES[t] = dt + return dt + + +def get_time_format(t): + value = TIME_FORMATS.get(t) + if value: + return value + for base in t.mro()[1:]: + value = TIME_FORMATS.get(base) + if value: + TIME_FORMATS[t] = value + return value + raise ValueError("Could not get time format for {0!r}".format(value)) + + +class Cell(StyleableObject): + """Describes cell associated properties. + + Properties of interest include style, type, value, and address. + + """ + __slots__ = ( + 'row', + 'column', + '_value', + 'data_type', + 'parent', + '_hyperlink', + '_comment', + ) + + def __init__(self, worksheet, row=None, column=None, value=None, style_array=None): + super().__init__(worksheet, style_array) + self.row = row + """Row number of this cell (1-based)""" + self.column = column + """Column number of this cell (1-based)""" + # _value is the stored value, while value is the displayed value + self._value = None + self._hyperlink = None + self.data_type = 'n' + if value is not None: + self.value = value + self._comment = None + + + @property + def coordinate(self): + """This cell's coordinate (ex. 'A5')""" + col = get_column_letter(self.column) + return f"{col}{self.row}" + + + @property + def col_idx(self): + """The numerical index of the column""" + return self.column + + + @property + def column_letter(self): + return get_column_letter(self.column) + + + @property + def encoding(self): + return self.parent.encoding + + @property + def base_date(self): + return self.parent.parent.epoch + + + def __repr__(self): + return "".format(self.parent.title, self.coordinate) + + def check_string(self, value): + """Check string coding, length, and line break character""" + if value is None: + return + # convert to str string + if not isinstance(value, str): + value = str(value, self.encoding) + value = str(value) + # string must never be longer than 32,767 characters + # truncate if necessary + value = value[:32767] + if next(ILLEGAL_CHARACTERS_RE.finditer(value), None): + raise IllegalCharacterError(f"{value} cannot be used in worksheets.") + return value + + def check_error(self, value): + """Tries to convert Error" else N/A""" + try: + return str(value) + except UnicodeDecodeError: + return u'#N/A' + + + def _bind_value(self, value): + """Given a value, infer the correct data type""" + + self.data_type = "n" + t = type(value) + try: + dt = _TYPES[t] + except KeyError: + dt = get_type(t, value) + + if dt is None and value is not None: + raise ValueError("Cannot convert {0!r} to Excel".format(value)) + + if dt: + self.data_type = dt + + if dt == 'd': + if not is_date_format(self.number_format): + self.number_format = get_time_format(t) + + elif dt == "s" and not isinstance(value, CellRichText): + value = self.check_string(value) + if len(value) > 1 and value.startswith("="): + self.data_type = 'f' + elif value in ERROR_CODES: + self.data_type = 'e' + + self._value = value + + + @property + def value(self): + """Get or set the value held in the cell. + + :type: depends on the value (string, float, int or + :class:`datetime.datetime`) + """ + return self._value + + @value.setter + def value(self, value): + """Set the value and infer type and display options.""" + self._bind_value(value) + + @property + def internal_value(self): + """Always returns the value for excel.""" + return self._value + + @property + def hyperlink(self): + """Return the hyperlink target or an empty string""" + return self._hyperlink + + + @hyperlink.setter + def hyperlink(self, val): + """Set value and display for hyperlinks in a cell. + Automatically sets the `value` of the cell with link text, + but you can modify it afterwards by setting the `value` + property, and the hyperlink will remain. + Hyperlink is removed if set to ``None``.""" + if val is None: + self._hyperlink = None + else: + if not isinstance(val, Hyperlink): + val = Hyperlink(ref="", target=val) + val.ref = self.coordinate + self._hyperlink = val + if self._value is None: + self.value = val.target or val.location + + + @property + def is_date(self): + """True if the value is formatted as a date + + :type: bool + """ + return self.data_type == 'd' or ( + self.data_type == 'n' and is_date_format(self.number_format) + ) + + + def offset(self, row=0, column=0): + """Returns a cell location relative to this cell. + + :param row: number of rows to offset + :type row: int + + :param column: number of columns to offset + :type column: int + + :rtype: :class:`openpyxl.cell.Cell` + """ + offset_column = self.col_idx + column + offset_row = self.row + row + return self.parent.cell(column=offset_column, row=offset_row) + + + @property + def comment(self): + """ Returns the comment associated with this cell + + :type: :class:`openpyxl.comments.Comment` + """ + return self._comment + + + @comment.setter + def comment(self, value): + """ + Assign a comment to a cell + """ + + if value is not None: + if value.parent: + value = copy(value) + value.bind(self) + elif value is None and self._comment: + self._comment.unbind() + self._comment = value + + +class MergedCell(StyleableObject): + + """ + Describes the properties of a cell in a merged cell and helps to + display the borders of the merged cell. + + The value of a MergedCell is always None. + """ + + __slots__ = ('row', 'column') + + _value = None + data_type = "n" + comment = None + hyperlink = None + + + def __init__(self, worksheet, row=None, column=None): + super().__init__(worksheet) + self.row = row + self.column = column + + + def __repr__(self): + return "".format(self.parent.title, self.coordinate) + + coordinate = Cell.coordinate + _comment = comment + value = _value + + +def WriteOnlyCell(ws=None, value=None): + return Cell(worksheet=ws, column=1, row=1, value=value) diff --git a/venv/lib/python3.11/site-packages/openpyxl/cell/read_only.py b/venv/lib/python3.11/site-packages/openpyxl/cell/read_only.py new file mode 100755 index 0000000..2eec09e --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/cell/read_only.py @@ -0,0 +1,136 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.cell import Cell +from openpyxl.utils import get_column_letter +from openpyxl.utils.datetime import from_excel +from openpyxl.styles import is_date_format +from openpyxl.styles.numbers import BUILTIN_FORMATS, BUILTIN_FORMATS_MAX_SIZE + + +class ReadOnlyCell: + + __slots__ = ('parent', 'row', 'column', '_value', 'data_type', '_style_id') + + def __init__(self, sheet, row, column, value, data_type='n', style_id=0): + self.parent = sheet + self._value = None + self.row = row + self.column = column + self.data_type = data_type + self.value = value + self._style_id = style_id + + + def __eq__(self, other): + for a in self.__slots__: + if getattr(self, a) != getattr(other, a): + return + return True + + def __ne__(self, other): + return not self.__eq__(other) + + + def __repr__(self): + return "".format(self.parent.title, self.coordinate) + + + @property + def coordinate(self): + column = get_column_letter(self.column) + return "{1}{0}".format(self.row, column) + + + @property + def coordinate(self): + return Cell.coordinate.__get__(self) + + + @property + def column_letter(self): + return Cell.column_letter.__get__(self) + + + @property + def style_array(self): + return self.parent.parent._cell_styles[self._style_id] + + + @property + def has_style(self): + return self._style_id != 0 + + + @property + def number_format(self): + _id = self.style_array.numFmtId + if _id < BUILTIN_FORMATS_MAX_SIZE: + return BUILTIN_FORMATS.get(_id, "General") + else: + return self.parent.parent._number_formats[ + _id - BUILTIN_FORMATS_MAX_SIZE] + + @property + def font(self): + _id = self.style_array.fontId + return self.parent.parent._fonts[_id] + + @property + def fill(self): + _id = self.style_array.fillId + return self.parent.parent._fills[_id] + + @property + def border(self): + _id = self.style_array.borderId + return self.parent.parent._borders[_id] + + @property + def alignment(self): + _id = self.style_array.alignmentId + return self.parent.parent._alignments[_id] + + @property + def protection(self): + _id = self.style_array.protectionId + return self.parent.parent._protections[_id] + + + @property + def is_date(self): + return Cell.is_date.__get__(self) + + + @property + def internal_value(self): + return self._value + + @property + def value(self): + return self._value + + @value.setter + def value(self, value): + if self._value is not None: + raise AttributeError("Cell is read only") + self._value = value + + +class EmptyCell: + + __slots__ = () + + value = None + is_date = False + font = None + border = None + fill = None + number_format = None + alignment = None + data_type = 'n' + + + def __repr__(self): + return "" + +EMPTY_CELL = EmptyCell() diff --git a/venv/lib/python3.11/site-packages/openpyxl/cell/rich_text.py b/venv/lib/python3.11/site-packages/openpyxl/cell/rich_text.py new file mode 100755 index 0000000..373e263 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/cell/rich_text.py @@ -0,0 +1,202 @@ +# Copyright (c) 2010-2024 openpyxl + +""" +RichText definition +""" +from copy import copy +from openpyxl.compat import NUMERIC_TYPES +from openpyxl.cell.text import InlineFont, Text +from openpyxl.descriptors import ( + Strict, + String, + Typed +) + +from openpyxl.xml.functions import Element, whitespace + +class TextBlock(Strict): + """ Represents text string in a specific format + + This class is used as part of constructing a rich text strings. + """ + font = Typed(expected_type=InlineFont) + text = String() + + def __init__(self, font, text): + self.font = font + self.text = text + + + def __eq__(self, other): + return self.text == other.text and self.font == other.font + + + def __str__(self): + """Just retun the text""" + return self.text + + + def __repr__(self): + font = self.font != InlineFont() and self.font or "default" + return f"{self.__class__.__name__} text={self.text}, font={font}" + + + def to_tree(self): + el = Element("r") + el.append(self.font.to_tree(tagname="rPr")) + t = Element("t") + t.text = self.text + whitespace(t) + el.append(t) + return el + +# +# Rich Text class. +# This class behaves just like a list whose members are either simple strings, or TextBlock() instances. +# In addition, it can be initialized in several ways: +# t = CellRFichText([...]) # initialize with a list. +# t = CellRFichText((...)) # initialize with a tuple. +# t = CellRichText(node) # where node is an Element() from either lxml or xml.etree (has a 'tag' element) +class CellRichText(list): + """Represents a rich text string. + + Initialize with a list made of pure strings or :class:`TextBlock` elements + Can index object to access or modify individual rich text elements + it also supports the + and += operators between rich text strings + There are no user methods for this class + + operations which modify the string will generally call an optimization pass afterwards, + that merges text blocks with identical formats, consecutive pure text strings, + and remove empty strings and empty text blocks + """ + + def __init__(self, *args): + if len(args) == 1: + args = args[0] + if isinstance(args, (list, tuple)): + CellRichText._check_rich_text(args) + else: + CellRichText._check_element(args) + args = [args] + else: + CellRichText._check_rich_text(args) + super().__init__(args) + + + @classmethod + def _check_element(cls, value): + if not isinstance(value, (str, TextBlock, NUMERIC_TYPES)): + raise TypeError(f"Illegal CellRichText element {value}") + + + @classmethod + def _check_rich_text(cls, rich_text): + for t in rich_text: + CellRichText._check_element(t) + + @classmethod + def from_tree(cls, node): + text = Text.from_tree(node) + if text.t: + return (text.t.replace('x005F_', ''),) + s = [] + for r in text.r: + t = "" + if r.t: + t = r.t.replace('x005F_', '') + if r.rPr: + s.append(TextBlock(r.rPr, t)) + else: + s.append(t) + return cls(s) + + # Merge TextBlocks with identical formatting + # remove empty elements + def _opt(self): + last_t = None + l = CellRichText(tuple()) + for t in self: + if isinstance(t, str): + if not t: + continue + elif not t.text: + continue + if type(last_t) == type(t): + if isinstance(t, str): + last_t += t + continue + elif last_t.font == t.font: + last_t.text += t.text + continue + if last_t: + l.append(last_t) + last_t = t + if last_t: + # Add remaining TextBlock at end of rich text + l.append(last_t) + super().__setitem__(slice(None), l) + return self + + + def __iadd__(self, arg): + # copy used here to create new TextBlock() so we don't modify the right hand side in _opt() + CellRichText._check_rich_text(arg) + super().__iadd__([copy(e) for e in list(arg)]) + return self._opt() + + + def __add__(self, arg): + return CellRichText([copy(e) for e in list(self) + list(arg)])._opt() + + + def __setitem__(self, indx, val): + CellRichText._check_element(val) + super().__setitem__(indx, val) + self._opt() + + + def append(self, arg): + CellRichText._check_element(arg) + super().append(arg) + + + def extend(self, arg): + CellRichText._check_rich_text(arg) + super().extend(arg) + + + def __repr__(self): + return "CellRichText([{}])".format(', '.join((repr(s) for s in self))) + + + def __str__(self): + return ''.join([str(s) for s in self]) + + + def as_list(self): + """ + Returns a list of the strings contained. + The main reason for this is to make editing easier. + """ + return [str(s) for s in self] + + + def to_tree(self): + """ + Return the full XML representation + """ + container = Element("is") + for obj in self: + if isinstance(obj, TextBlock): + container.append(obj.to_tree()) + + else: + el = Element("r") + t = Element("t") + t.text = obj + whitespace(t) + el.append(t) + container.append(el) + + return container + diff --git a/venv/lib/python3.11/site-packages/openpyxl/cell/text.py b/venv/lib/python3.11/site-packages/openpyxl/cell/text.py new file mode 100755 index 0000000..54923dd --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/cell/text.py @@ -0,0 +1,184 @@ +# Copyright (c) 2010-2024 openpyxl + +""" +Richtext definition +""" + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Alias, + Typed, + Integer, + Set, + NoneSet, + Bool, + String, + Sequence, +) +from openpyxl.descriptors.nested import ( + NestedBool, + NestedInteger, + NestedString, + NestedText, +) +from openpyxl.styles.fonts import Font + + +class PhoneticProperties(Serialisable): + + tagname = "phoneticPr" + + fontId = Integer() + type = NoneSet(values=(['halfwidthKatakana', 'fullwidthKatakana', + 'Hiragana', 'noConversion'])) + alignment = NoneSet(values=(['noControl', 'left', 'center', 'distributed'])) + + def __init__(self, + fontId=None, + type=None, + alignment=None, + ): + self.fontId = fontId + self.type = type + self.alignment = alignment + + +class PhoneticText(Serialisable): + + tagname = "rPh" + + sb = Integer() + eb = Integer() + t = NestedText(expected_type=str) + text = Alias('t') + + def __init__(self, + sb=None, + eb=None, + t=None, + ): + self.sb = sb + self.eb = eb + self.t = t + + +class InlineFont(Font): + + """ + Font for inline text because, yes what you need are different objects with the same elements but different constraints. + """ + + tagname = "RPrElt" + + rFont = NestedString(allow_none=True) + charset = Font.charset + family = Font.family + b =Font.b + i = Font.i + strike = Font.strike + outline = Font.outline + shadow = Font.shadow + condense = Font.condense + extend = Font.extend + color = Font.color + sz = Font.sz + u = Font.u + vertAlign = Font.vertAlign + scheme = Font.scheme + + __elements__ = ('rFont', 'charset', 'family', 'b', 'i', 'strike', + 'outline', 'shadow', 'condense', 'extend', 'color', 'sz', 'u', + 'vertAlign', 'scheme') + + def __init__(self, + rFont=None, + charset=None, + family=None, + b=None, + i=None, + strike=None, + outline=None, + shadow=None, + condense=None, + extend=None, + color=None, + sz=None, + u=None, + vertAlign=None, + scheme=None, + ): + self.rFont = rFont + self.charset = charset + self.family = family + self.b = b + self.i = i + self.strike = strike + self.outline = outline + self.shadow = shadow + self.condense = condense + self.extend = extend + self.color = color + self.sz = sz + self.u = u + self.vertAlign = vertAlign + self.scheme = scheme + + +class RichText(Serialisable): + + tagname = "RElt" + + rPr = Typed(expected_type=InlineFont, allow_none=True) + font = Alias("rPr") + t = NestedText(expected_type=str, allow_none=True) + text = Alias("t") + + __elements__ = ('rPr', 't') + + def __init__(self, + rPr=None, + t=None, + ): + self.rPr = rPr + self.t = t + + +class Text(Serialisable): + + tagname = "text" + + t = NestedText(allow_none=True, expected_type=str) + plain = Alias("t") + r = Sequence(expected_type=RichText, allow_none=True) + formatted = Alias("r") + rPh = Sequence(expected_type=PhoneticText, allow_none=True) + phonetic = Alias("rPh") + phoneticPr = Typed(expected_type=PhoneticProperties, allow_none=True) + PhoneticProperties = Alias("phoneticPr") + + __elements__ = ('t', 'r', 'rPh', 'phoneticPr') + + def __init__(self, + t=None, + r=(), + rPh=(), + phoneticPr=None, + ): + self.t = t + self.r = r + self.rPh = rPh + self.phoneticPr = phoneticPr + + + @property + def content(self): + """ + Text stripped of all formatting + """ + snippets = [] + if self.plain is not None: + snippets.append(self.plain) + for block in self.formatted: + if block.t is not None: + snippets.append(block.t) + return u"".join(snippets) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/_3d.py b/venv/lib/python3.11/site-packages/openpyxl/chart/_3d.py new file mode 100755 index 0000000..1651a99 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/_3d.py @@ -0,0 +1,105 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors import Typed, Alias +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors.nested import ( + NestedBool, + NestedInteger, + NestedMinMax, +) +from openpyxl.descriptors.excel import ExtensionList +from .marker import PictureOptions +from .shapes import GraphicalProperties + + +class View3D(Serialisable): + + tagname = "view3D" + + rotX = NestedMinMax(min=-90, max=90, allow_none=True) + x_rotation = Alias('rotX') + hPercent = NestedMinMax(min=5, max=500, allow_none=True) + height_percent = Alias('hPercent') + rotY = NestedInteger(min=-90, max=90, allow_none=True) + y_rotation = Alias('rotY') + depthPercent = NestedInteger(allow_none=True) + rAngAx = NestedBool(allow_none=True) + right_angle_axes = Alias('rAngAx') + perspective = NestedInteger(allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('rotX', 'hPercent', 'rotY', 'depthPercent', 'rAngAx', + 'perspective',) + + def __init__(self, + rotX=15, + hPercent=None, + rotY=20, + depthPercent=None, + rAngAx=True, + perspective=None, + extLst=None, + ): + self.rotX = rotX + self.hPercent = hPercent + self.rotY = rotY + self.depthPercent = depthPercent + self.rAngAx = rAngAx + self.perspective = perspective + + +class Surface(Serialisable): + + tagname = "surface" + + thickness = NestedInteger(allow_none=True) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias('spPr') + pictureOptions = Typed(expected_type=PictureOptions, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('thickness', 'spPr', 'pictureOptions',) + + def __init__(self, + thickness=None, + spPr=None, + pictureOptions=None, + extLst=None, + ): + self.thickness = thickness + self.spPr = spPr + self.pictureOptions = pictureOptions + + +class _3DBase(Serialisable): + + """ + Base class for 3D charts + """ + + tagname = "ChartBase" + + view3D = Typed(expected_type=View3D, allow_none=True) + floor = Typed(expected_type=Surface, allow_none=True) + sideWall = Typed(expected_type=Surface, allow_none=True) + backWall = Typed(expected_type=Surface, allow_none=True) + + def __init__(self, + view3D=None, + floor=None, + sideWall=None, + backWall=None, + ): + if view3D is None: + view3D = View3D() + self.view3D = view3D + if floor is None: + floor = Surface() + self.floor = floor + if sideWall is None: + sideWall = Surface() + self.sideWall = sideWall + if backWall is None: + backWall = Surface() + self.backWall = backWall + super(_3DBase, self).__init__() diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__init__.py b/venv/lib/python3.11/site-packages/openpyxl/chart/__init__.py new file mode 100755 index 0000000..ecc4d8b --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/__init__.py @@ -0,0 +1,19 @@ +# Copyright (c) 2010-2024 openpyxl + +from .area_chart import AreaChart, AreaChart3D +from .bar_chart import BarChart, BarChart3D +from .bubble_chart import BubbleChart +from .line_chart import LineChart, LineChart3D +from .pie_chart import ( + PieChart, + PieChart3D, + DoughnutChart, + ProjectedPieChart +) +from .radar_chart import RadarChart +from .scatter_chart import ScatterChart +from .stock_chart import StockChart +from .surface_chart import SurfaceChart, SurfaceChart3D + +from .series_factory import SeriesFactory as Series +from .reference import Reference diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/_3d.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/_3d.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..a0faa7fb1f21a0209c94f1f756e40f5a42958cd3 GIT binary patch literal 4194 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/_chart.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/_chart.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..6bf98173cdee41446955a6afbbce7431b3695e76 GIT binary patch literal 9653 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 N;cFcIW`K!@@qclv6(axu literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/axis.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/axis.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..c4fee3410a44ff6932e2f59d67205d90ef0ccbde GIT binary patch literal 14837 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/bubble_chart.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/bubble_chart.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..13d0c181f8cf247e1cf9e31c8b2fa42198d7afe8 GIT binary patch literal 2909 zcmcIm&2Jk;6rc6y`eWnTv0XQA(-sQFQ4+VMRHy}#wzTCVwGb%?Rzjze1qoD+IiOP19(v@@uq7W>BOyiN)SFQ`pq_YdH=8!amEgd5{N{bln~(RK zr~O$`k_1|Q>h|Y@I3d5I5VYtv^XLvRw~0Xv$s)F-N)qxRD`bb&upLn&c2tepF*Rn# z)wnIIvYk*9o=@0H+9@^V@ewO+E2?6Tsbh9V&44ay#H>AbR?T{R+{)SG>bRX(^PVhQ z1-qygJw9RWwM%MAA|Y~#7|C12NYU(_Fd_Hg?>BXykzOPf87v8!9AQa;C2d5XiKIMdg)z`)jF^FI$j>BY&vWKv zL7y`cMshiHKlRKy<6ukB{D^%OJWKI@`k5JfpQA4s3czAaok)<~KO?tJu1ZGsRzfYW zleVPp2k4B8)VY-}#>ETU3nkYt7XfUG_K5K{jvF4{3{0P8$vv5xxDcQTv6|6A&b52%{AI zAN>jB2kAEHNFAaDR?-Q9v;&|{7^EH0bRr<_ytz&kq)0Ha69XxLDCxvOiUl?&6L18o z2&6W=8;sy92Ohh80oo&ccTN)`P9c~_2-c~4JL2bfMz0wWlXMb4N#A;v3sN1eJ;bv2 zFb|{>Vn<;R@j7dAezwhCL1mg9hJn3+1QWnsL~;blOGsWuk^>@QZB54~9b5CqC|?0U z2wBt2hUsWpB_$%9T37!?KoNubu)rM=y1ptBnpU@T&NYqWK@RP-?&GEE$4v_g2(NOz zVVL~-@e{9CuY&XSYHRJPMX6K0K^r%!mbnB9=UTJz>g@63Rc<&q~;*`kfs zTHC7Du|idSd}*FA+gfACV9lF(A6MRkm<=q_q zNV=s%Feq;M<@LxwF1eG_IF^I)x8mVV_TWUXc&cAKH7K3}-_$6bE0?~Beii>Z4l#Q2 zB=jFo_~QG>RTLFlp=r5`+nxK{5*jwgImiYQ0xE za8uNxHojI(^KM-z+nKLZ%L4pJ>?BO%_#)@oYZ#^&5G)=1b+AAxg5TCyxqE3VTi%%1 zbb8t8es+40o$kKpCUfhrY?dAvz2upG^2{K4rhDE^XV))mD!(4-rRVzTxj}lad%?{X zHwqi8-%Wl$36nDW)^BcJ>1C$+nW;f$s{4+co7|Y*Jbw2@n3S9A=jH~vx$gUJ;oydP z_hhedtY0`bC>-n7+`a!=&tkTM4+(~~Pvl4WF%K?S{}`4%247QzVNqiU z9ER8u6Qd^1(l%t8Aznmzq(j5|=3pMSJiH-fMa+M!Y!3=h=uOVDz;0J1A7dVxMbyI2 z2_MQHcCf_xM@Kw8mf!H-$Xo0ZhzK-(2Iw#>NzxWM-P_%VAz2Cy$^SueM0%}9PCng- zp$M+_Ur3rrlRa|a>F$!Fy;0pI`+K{)OAhsR_hD>G0#yBzY*hY0?Vlq|-sS!cR-V}h literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/chartspace.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/chartspace.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..b213366ff2a640b42e5e37d87645c729d9e1a197 GIT binary patch literal 7151 zcmcgw+i%0DJ12i{xSG)6V%Q$v3%| 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/data_source.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/data_source.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..8843f8c579fab71263b90d3a0f2ad40ad71e4718 GIT binary patch literal 9577 zcmc&(U5wjSb|xiKqBQ!Me~stQa$?U|S!ZUQWSzBZ$8qePG>KPj*G^ifi>k87u~k#j zEJ;ml!$8$V&{cu}oh{OJUKSW&fpiV$!9ZWqx1xRNLmxDNPzVHq1}OGn-(-vn6#LZg z9FiK1NHyu!MJe%+yyx=XL*9?yIp^NLO(x?4w&@oh{MpZD1>xW6!rNr`Wd9#UL3kjj zLP1bPHKdExP$4AJc~}ourGiwI3vxA5h*YD6XjLgF)mS0MdP$F0#|mS7F6)VEvXHE% z3aM(kkQRlI@TQHkTVb4a3Uo0oHKdzhT^zbG-+hy;OF)84nh zf-ddTO|xzsx(T0dhINzBP5E@Qteb{z#;41$ZWg+XPdCT9Ip~h~bVpb>58Z-KH_y67 z=$3rC1=cM?chsj_RI}HF+_8IW@ym5x*UDC0= zZ24Bnu*|jiuW2}PqMf*=8I_V=F-tdeEf=w+H|llWmapI4(o|c%q*qF&9l2&1mD)`^ z`c}=-Zfb_DT+@Ek&}wB34J5yJ$I@yhdc9gPtz6hn}b|l}Z zZd9%OM!AnYG(!E*_5O1Z4}|;TeW8dmXS*N56}|^&Q-y27LouHV*>SwMYRS4>S2a6f z)*D7yyIQH;)>J&LWNP}RF^OA@DF~Aq&t|i~DXqU(*Be#MTsKQKwPM~r{nB^WH}#Tv zdwuKfrmkt$`nFcvUe_x(P+;Av*Ir&beR|!jSlWwQrSk34P25`F(rR0G@9671YU^sr zDixjn*S7B3O0ig}Rjgw1UfOxqHLqZSEI9(v6ncuVaH1uBobE23Y)KvENSpurPzt$F zej}$)JGD|(D;Di|u~@CE4V}&t#o~_|CEd{&QB-%HQlc|@R0EtMJQR!!ozIX+dxA9P z21K*}`)VSyGyBuIPv)9$cc(Htul)4PCuf>hdl6yjSa6Q?HjSTQ(b8_`0LTqNxE^Imwtt6Sh*RnN|s3 zyDe|iTeD-uVi`y_QIE{PduuuXcpg{xmI7Zeu*r?SfGXw%i2rN~-LdhVjgKz2E`E9J zc6%>DbRAD78iW~>zV+7~)0c2+kf7@3TM#hN`}IO0S?LKR z6k&3<`F2kl0o5Q3JMg8p%h>yyH-h_rf}*ddJXO>ppAU_0Aqp~74kM!wBQgXX%Blo9 zjH_Xce}w4}n7^J287I-7k%h>YJsWUwK#kwV#eYwY_rpMGA7g|tV*)pU4#O4o4)cU9 zZoBv~UWCfwjy0TlkjXmlov4EO3&!>N>$_BsUKsc*E=*^@UrKlWIMdj~Bo2`le*9h^ zhV%J+Zfpn%hJu@&juUitlmwGBk2Bf9^kooJI^)9(_AR<3@e+3PPa!-AG=;C?6Rp(` zb06oLm%9@SJM+8N7caLbF78cS>`Yt)t0_xuWob`2+EI=+FM-%*=evtpa9uANm8W{b z2;p>2T?T{WFQGXM4oy-;9}r{!A%gPoXTbEMz7KN%qQyR!hRWlpKc*!DT1u*NA>}{_ zAd0C9K$KRAJL7f~pEgnC^@kw_5JTyq=pC}K^~1v(AH>_ga-X6`0oxSAHpbld18viI1qRvT z=5>Re9>sbvs}Dp9ME8jg zne`^8i08U4Ot#{?Q*8zQ_(VrJ(Y(}+r&}j>!XLiy@e82E^mMDS`|4w>oj$*pKHo{7Z~ksD z(vCCIrsulz%LKD%L_XFNMhNG*$)ZCr3!{Lx{kI_wU`DYYAR-MpMTVIc1#ceaM}=Kw zM3n)Tm@0wgqMYu)8`%*=N;ooX44@GH((9BurV_gThN*<(Aw!N+A_tTUJKV+Ykv$`| zc9^Wv$f5=vV;wb27b1%17>7I}JUknliw~j1j#{Og6we2G$B{nq3i>oi+@j8Z05JfF z)NJ$3LC5F=2sy$Gc|k<@@PZ?RGse_O8GC<|+_U`}PW)r6hJ60c8|PtvrvMW%Esi_n zAwn5bBZY)Z8*w!T93<5!a4=>^@$$*r*--$2-JbC>>~QelQV26V@w)5dJd4Tj-v%HC zc_WWP`i+mIka5?)svM+{+sNq5sxl)v)2!(@A z#g?yX+nR2N^=&7DK$`R_T69t&at+=_=hW#wO|}f@-TmC!_#w1#?No^yGU>iUnN5m& z><`%AL2srZ5KcyfsTqvaK_-*O6bR+M{?TF=5QB<+zGL&qV6i~;NIb&MvnB(hm72nL z>q|Ypnwsa}Zzj_Vhl#yM2xoYx?L)&Op@6pkpO9eU`wiWy@OySWubr-P(YEduTptl6 z{4tDvRzX4uZF#)TK>{^ClGo>bM)xuDPq@$fsQcl<)GVN)wD5Dr;QQ2DF!A#=3tPa5 zVK}fYhqK(#p#tSR28q8XONK**qX1B9rgd|7x}93tORaQLE68T!ldY4xGwt~5UVOC^ zUq#*#n9Z&*%n&NfWZWDhL!m;Ta2}NG2nO30G~bL1+(5yfxO#ztUo(cp)r&x##5L(A zuH%PBj(9vZfHqunEb6!mtW%5+C^>}S4EKMZ*MfG~uW#Zlc(CgijD+2hVdML#`&Sz4 zBM^g$ZuZ->JVA44_&ejVPW=S~FDT+*ERl@|(<`Har&2u<|AO5YaV!IPzEq~0S=?!~ zzjgkfr`wtQUMAnk>retn*?mijsg z^VdXCyxo^^)wj-DFIm2nRe3dtL$YkOVOq2#v}M${D=L=$qIS4cyKBd2rSyA-Q8$c! zP-Xl++U4jTA(x@yA{QBoySR!$X)Wtb>K>^-wt+}&X7FA1zn)*Csv8*nM@kr<+S&MY zV|U}18;|qtsmpumE1mR}o*>3v`*L!jy?B0a@LSVpGAq9zl!*2cpVmO5OhEbpMA%1;y*qxc* zdAFTA`wwb+=AFHncRDlgH1mj%IAp}fO8@Nf-dIw8u_ufW&L>M&=W|QODvtIsZ?Sew z?XN1DYv#b}xtY$IS*$aUcYP=9{j8ThB zn4H;DNXRQ)&ZIPl;~bq|A;nuHcoaDjXOGUr%A-h6%yFah0%mae8|A#SX8f9A;*!2( z^H=x^dtp%&v2Z3zSU7`F1o3y;!nwhJFBBC+SQ&X{Vq6fv(-vMC{P#imskn%> zXuoLv@ClVZJy6XjsHR_h`t}nleR`l;PKucQ@(XGcrB4r3*$ELrv0t?GCsg|MKy@-L zV%F3zs7;hUJy0D_Q15<0HBm}-y87jD>fJA>ca%OoP_2wp?|wmTqLga7`js&e37B8( zTzx{NPY+a!W7NA}w74dE@2eKaMFetw@o9p3&rt8K9(Ka(`o+$Ds(G4fy84xjh%eqR PcFsSc(x(9`{tW&LA?lBo literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/descriptors.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/descriptors.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..a30b2584e7d09ad69ff9f584a020f4a53f23554a GIT binary patch literal 1759 zcmbVM&1)M+6rb4-X(d^9Q|y)|{ZI-`tU#^0rO-nO4QUf7wR(ut!(N8T&M4V>zdAE= z<=}!2fx4wo7gFp)3pu$2|1%DRVipXBo_te~4<#4(&8}C8BNs|%cYpidy!U3_d-LA> zQLk4KjOj}oU+)_T{iT^=*vG`M55xvyh~WT**u_}WMqq@dYXWUDE3iV_wK1w716@bV zzK2+e<1G`RZTRxxmNHoxWX_nZoXIL6t8()NJBQV7pytGZUZ#oDi8hytvjsm|pgrL2 z#g&A!1Ds1s?QVE2R9?Pkj#{M0@GQUv;>g7exdy|o$qd(GrfV|`wy@KweC_Krxe~_R zNG%FT3i1zOh4#Zz>JSpqkQ0(t2?=A?4KzJL$TwXY6cQQ)@wX(3Bc7U}9|6$bLp0P5 zJf*F#;-DLH*^)G3zFeAr|D#qXpmM2|taJj-Rco0?%dNn_1rzE{9DOi1Ki`tR;_oKZ zTcWqYG){Pwtn`AGcZUkqVqAK{PgE@AT(Tk@*e8RRfsk(i^heMBnVJ6QyVY9%>Tb2( zzp5W`rqKVNDXZrx`*N9!fF_InZ%0Q*2MiW%i;7d)nxP zd-_!L7+wPS{)IE;7M!Qymex=QGxMI~me)`ZyAGVNmA(S?af^#&S?I`4tYQ&vJC$ngHG2@x)qBp8+@WFyl^TYc9zv2y~ilPI4)lh}Q zz-tcbD*7zb+ycApk?nVeD#P^g*nPtV8 zibft3r&L0eV1d+@-Gqy@Oo-%)5Xh1xdC*Cnk*>W=gDy`igm_S_5)}33kg&eUPW5%* z?!I|?YUhrZodq3v8Q||e+N;g1^WSegs-1saJ3m0U^7h{J+074sS-8Kj_Sv3O|DpU- z`RA!0r#77j?>us5A3L)<#hcYqvm*4pC2ATb0JQTg_6W%%s`Fj~N5~mba5;#&R?|MF z_2URU9t03677dt{I^Un?9H9RO zc`N7*+RaLOuIS~t=esz{E;ymv)u>U^AE zS(n8{FxN55KLG|N#&}RQa0w#&7jO{1xPvY{|L&u=c22&K2W$iSaaa$Y=-I<( eqRDZk%y9jSG0hr=1dqe!%_n;H@Dx#&=YIh5L!C|l literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/error_bar.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/error_bar.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..2e2d02d1584520af6eca6f785cd709002d28bcc8 GIT binary patch literal 2546 zcmbtV%Wo4$7@xIw*Y>VAj$`L#0-+E>%_9~RN=0c%At7yrBBW5HE~-`=?4|jH* zCdienih~b5q*A3&sfVZsXa$EJ^JmzS534;P^~B9pdg9W4GwVdD6E5xN@i*UdUf*wK zpDT)lfb!?IzIr!-&>vLUBcUtoeh0!9GLXSp$mUdzqjJoO*>N>)^D1u(s$h$%$n0?| zVJFojlX)v;OR8kcs%)p#w5_NL*abth`s|FFVRFLix3g-NLoqaujN}t!q%ij^j?fGE zN2CrI(jqF#uc=z(!t^30rf!*@zGUGd9}4$3D%c2xJC>{aVSEw$q42R~>K?=@bL&2K zJkxdVnw}5A$^!O$Y%I7Arh%zQrJ@vxw_Mi>XBmS>j5P!v(dg@mA7=3*N5qdB8MTl?y+0#wrwj#-lw;~~G~`m3Q}n@-gW`HBTxin1um zibBYjtDYYwm(6u-JkYIBg36b%e;>amD@*>B&koPM0NHIx|5!GU#?L)8@2W`LjH6FD6%UBaY+XFVL ziJY%TX}{;ly)!*&0z z=X-S1C->=%R(jxCRU3OHPj?K{dvxjY2c>08_a2oh8_O2PerXLmYbDEE0)xNmI`2(g zx>WK^A78BK%M(3BuQ0$nN?EI=m(xgqG1U1KBFNbSNHsF*rX z-33O)F}eUpx3Q*$lBU_NQMIU?*0isyy4Ce00H0JODHtX?Qd*iYWtarO2k#@H=f*%5 z3ZB1V;RtKIXFkS6rao3FT6)q)8HHU`vow`h;WAXB)eCbghaX3hr0ybh!|JewZMZj{ zrjhet`VA3!SmYdK**!+F?9Br*>-)b~eZ%$nS4yGr<@W7gbKBRON~xuk+DfT@C+HvC z6gF3X$o!b8e;Q;9o1@LsH@Yo5-O5h4v(xp@f^@bqw|SwJ9&e||>vP?>FPf)W%RX#n zAGWg(Ax`dZT-_XN$tT+KiTZ4i8Erh?&i_8q%v@__uC+7Q>YuQXr{C`6oAPu^o^H$2 z5J!jKR(2+u>6@+e&35`G%pnan&Tr?N(qv1TY)g~%+bpv=etE}l%Cjwbwk^*>YGM58 znQif>i$7m%^232L(D;1&_|BE4GSgCK+R9A*&Z}Ixez%iEqsN1>Q^D9|P&g3`6@uYo z!QdzrM#eh10b#U*-om0YrpLQb%!Tjl;d;t|PZu#OzDv9*@4)Ak(2F1DkBTD<3iR?5 zdglqlQ{kw{DZF0B7OQ@E?8t!VVT{1ZaL52haTUr2d~-FAeRLV{;B{TqE7&6pYz!&y z)A{$&^Co#Cx&_nZBXH1X&HEczC(dzPM?~C*O?3TW>%;^u)<-CQHOo$ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/label.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/label.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..0b21176c6c795c78dea790a3fd5f4007bfe6270b GIT binary patch literal 4927 zcmcgw-ER}w6~AMTKgQ#+Lt;DM2_J!tDTzropoJ}z4Tda`rl?_&I%VZfJeR~_{IPc? z5KvV40jXYzu2QKLRO&-iRTKoO_NhXB>|bC@^I(lsDN>*I%_uxn`_yx0;z{fz60}vX zCui>OoI4-)-t+t2JNdIDg$R_`$*0T5I|%tFf@bk;SGN8Nm8V1{DyNY=CvzOuJ(?%) zmA!dh=JP(;XZyUGKOc|-cAeLPc|jKPAvu&6WicO?!{GO+eoe|p7%2TddQLg&`*GiFK)wd6JBNhqp;`R(PJWoTBA) zWkI7!uN9o9U#-wWmRi2gw49<_zFQAVRE3t(l~scl^jxtpo70UXZ%K1hH>f&SEYNvs zSRn^a7mJz|cIxv6%M})z4X+gpx=7h~ob%+a8K#t$a#=;Y$%-Y)j2zYBF~OhavP-w< zs*!a%>R5goZ2b+ceo82jIhDvB520R_Q$4S}&pj|Y@aGhnhlr2*Rqi$4770KksQRA6 zeO}?4*hLoX_Mv^+i*|c|Tl+A0rA49!{>Z%!w#6d$6+)Xg3f>O5f2hq5^SG}c=5Sws z*8%?60si;_{=@}-H$hV9E3CTKP z-Yi}(-DDPTtlnfv!3r!uK3>fk7Pnw|vj(&LxdJ}I^5qIw3aZ6vmcO`S*i~k61|*yR zzM`#A-3q9)3);=1{*tqA{4#9$3oH4nd4nb3IjkGaQGBALFBKomLK+v;8}y+SKzLix zED5evEh$Vfifk?$ zfd@7VW;Swv>n~uQk~MCPWSTLu<^km9@|qWr%Y-!^kgFPNK0r+_ku^V{rkatp03d(! zrfWe!0T&5?f-VXH5?mw#vegnjYhgfQGo})lb8e1}fFl`!`J&ogb{s(4xUv)I`v}b_ znk1T&Xnug^6q+$GmLG&+RyTAUo5L;T`=6(77qyi<)l<4sP;>gdiOEk=cQr-7mnuEH zt5IsC?$g5kl$Kinhp|*Fd^|oekd&(kQ3PMyUJzUjN*(HS;DGk$fy!6lt zW-_@#&d6jQb+_j4cr$>nr!Rmhlg1F~9<1ly&ja<|qi}Vk0>3SI3Q0~8?^LDfnlx=n z)8(smv7>UPIz0KtsEX;Dm^Q_9IbH7?es+Ar|NF5&j8*w=yUDZFZ_`!rTunS@iszt3 zyl?%BXJ>!&MK8WXQ=Zw3#wsi8KdVKD&FFCX^LlJ( z{rZcMYAjWYrOa5W{NsA0r?R|}u11ozNYacX%QN-Pf%TIw_-f}^t#i!m94p^=FHd}U zU4AiDji0W?Pn+@6@P3KI>&q|F)x<mCL;d;+NqrcC0 ztU(Si&LrXdw5-=n#o6+}T>Wa-imh_87giGfIb87y{+uGiTD|P5jT`{vs*M~3f_C+s|=Mo>&i6%WFmHH z>vJ%_pm(lf_Ch4x7=`w^ThpS}W%s7z|x-vua4{JC8xg^uqm4B82CFF=wS1=8Htr=HbdQ&v9D84Qsv8= zQoku3Md|4^#Uap=<~cH8Mn-`4v7=_}Gz!8t?mTREooR{0n(D}0Wd8PMCoup5AilQ%c$~3G_O&ShyMix-d1+J7>4d$z zuzOy3sz^>whX29$gfNSVPLox6VFf9TQ2LTYfDxYj5-|$uOLQTA2iWkc1O{u#g zZ@`i}T9ZaiX%sZ!|E3KmUJRMZbge6m+TcZP_yFT*1NL_=8MBTw_rl{U)w3*Df{zk? zT;KKY0*0Aq#rA9GOdMts^JAmF{ThwaRnT607ijhG+WAUx zQlh%Og@sQ**qJ&zRXZ_k<+f)JiRbhSH2z?YU|PPPjawH+iTYEyhZQ3 lozODZ!$Dr`HS3YL=zX^nI@^aW_nP&&x9EMhPskqYe*=~rT2=r6 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/layout.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/layout.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..a5276f34c085e6c775a3bdd323e8bd9287d28529 GIT binary patch literal 2845 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 OU3rPxS6xgZU;YC~@VC(b literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/line_chart.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/line_chart.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..9aeb7844133077334cd6c3efbb39b8a8fb5c99bf GIT binary patch literal 5364 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 Tz`#5zc4l9q_H~yk9;5#Po&Bn( literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/marker.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/marker.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..d1c309389d24016887f2d7ea2adc6a85deb2edf3 GIT binary patch literal 3324 zcmbVO&2JmW6`v)S%jL(Clt_uP{F&HEO(h~DIf>)MNtKqhqrhTRSjl0LfLL+I(#HG2 z&MsX^U;rL+V1OKaa|-le^x)cc4na>rPyG{?01w0h1q}4$Q)t+yobukRC`&d42YDR+ z=HtEjdT-`8`%gtl5|F~&tuN0)>Hk<6No=?9_}@^tMRcMICb0xn5U?CEBUV(6TB0iQ zden?rk}6qoHO}jzDO(9OVI|e1l~PkyT1`WHOqWc>%BUG$j+<))RMNo%eCATvUbIXU5oP^`x3hknpD~dirZYozPS0>p)u3*mZD-WbwR|3Z#a? z8YT@yU2`{sxNc~cW9vawcf26p3>^`OO|#_&lKYpI#=z9|G#1Dngv;K5uEJIzYAw%! zAW1hgvqjw??m2ajQTh-!|L`M#wNf;QT80e(AxLVb>HL*P?jD2|LP;ACySfK4XJ^11 zCTXrR=p(t?);dH~bd4R#eg~>rW8{CRz~LhV&)efwfLo+3v`HOGp|m4V+w)mF+R1qP z`rZMf`y*5GRkR%i>%Ft9ldI&OP%DY-EZDFTK#;%8wC1MK(9Bilz)C%Xx_nKg7%Y&Q z*Phz)=0Kub-WAt#an@5PKYw2N%rRRQbt|rB>xO%MVey^HHB)o1SDM?`OiI1V4Qk)0 zn8rFZc$i16g8_%62dQFaK&Uf3}}L+pX?4cN5*jW9UFiVhyA; ziKE+^MeFq-S+84;-ZHVAuGisQn7f*|r)^-7rJyH^BXIvAgK;M^5lgQlU^E%JCdhA$ zajb;uGOA$;YEp~Zo?EZ8H=yYrVGF3PAWV$l7!=(90Ce_#4>Hr8%MX;jB3JwH|L zrK2LFYpZCS$K$+}*di(f~Z~DqoPg&|KOPxy(^7EZ5Fy@itgXvjJ zGslLBWbDY090K9Ca7PCy2c3rUScc>LJmnlb%4!VALDC~YKnF=94(&2cfJS_VWRi#U zK=KjCjFjdhDPu;;fF`TQo|!qv?I*_APjXFujHaMV>ePtHM!BBQWgxU^Jr0DH3=&n% z(^ehB_JFchy|t3S>4Uujz6x(__7bFLaB z@I7(xeF?8_W|#bSUx8X9f&Sl>J=W<$!;4r4SOx95w8i}#(~d!H6k5`jfS>T%?8?EQ zekHXfu*OTlr5%SF-Y+i5R_rw>mSlDjGWI?KZjpU}@Oy-(mu?BFr36DhINY3HPqgHh z(8c|84nqhp9^S;A$-NNlkqr{Qy8-}YQy_&Ru#7x7^+s3h%Ww~laqgKp1(`B9@-k$Z zLnvr);&tqE)aQv`jgpLHgi^xR+x9lB+r_}Q^1QxzM>Z$R6qL++OpubG__bKReg?XplR8Q@LC4bLC#H+|QLe z%fE(=re<$`diTVCtNzq-Z)&+ewcM$VW2m7h6y5`lk_oWW%dY}K4Q5Xaj-EuaI&}v5 zYGN`rKO~1h=nM2ftu!6HGs7t)2#+I z!>HiF4~~wtviWBqQXuL8;B-*`-c3M(RDu;CkHQ)|Lki|D~~4Mf10!|LlA z3y%yB@xieFEME+tzYo~QFaUmGxGR9es2~Wy_QHEUd3S#rMxsJwNL~!d7n|@=k}(|b zw?T#oM}0E8KMlxf|6m%BDSwm(B=3*XfXw)#G?Zopc*&lJ?&puN^~qD!+ouIML(jv_ N^doG2GDgKu)-S9D9RC0S literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/picture.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/picture.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..325c5af9ec8dcadb56154eac8b318f7026dcb5bb GIT binary patch literal 1524 zcmbVM&u<$=6rNe{t{ulVH8z+gO-Vw9*httIIFJUR2tg{L#8h(I!v?h4dM3$|*&pnz zLjykekVBC;_?9c;P+Eadj{F&p)p zREi&^5c&A#$B^zgRF|s4{X+^Jj_ADPc)IU zgMc00@i#)>18K*s=@80c`6TwaM?`+S`-UI7a0ge$v?+JE>p4-QrB5`3Ug{|?`g{}M z7PqsQGnqoO97ke-%){0OQfR#o7^Il80dl6PKaillSH#rI^t(2v_WOhSg%kY*I*R-Wxr%Mw}3a(&Wf z($87ew{4q^Bk9QAm2N17ds&~f9E(Mg-*T*!oK6{asTXm}3g=+_2@2(Vv=-qr=J|X?m+G%NRP+IG54lf!j&iCeij!r)77gtYuCECUk z$~p^US!1D=B%O-)Ec0=4OP_={ARvpL{|GQjVT>UQyw*oIpKl{o!^#N#KPXf%i11(N Pef75-{pW&EeAIsdF4l_c literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/pie_chart.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/pie_chart.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..3a28e56ebafd231e498632bf3df40367543d5279 GIT binary patch literal 7112 zcmcIo&2JmW6`$qja!HD$NXZiQwYK9pjBUx1^W`|LB}tP~dHujU($()pbzp&{26u63DZvUYP?pbXc_VvMqbbqyF0PlTYI!adi<;%TmM>h( zu37%81(PmQX8F^_0$re{<$YT#X5rtAmd_fNxIjNzrG*?#xvcQzHIo*Me6cW}H%v>q zPFao?%M< z`-QzN$ovv?lM+QxiQ;k*>Q;q^uKO_eS2#aUiU;bw)CU~*eHU=xx6kndN2Gy6I1+Gz zs;6V5km^;!s!!<&5d2f6O|m4YfsX@9WRt83N)*mBXoWM^^R&6`#RstOtfm$3W(sg* z58zzrT8ZXB_!$#Un2o|>EU!9$Q!^}gDNj>wOS+R~>$63z$e_xgj2(qG4@f%aY#rB+ z+d#$MV?cfw^33qucxj!bV5)olZKpHttn_8z8Lt8PcbPOKGIV0o^GT#0 z?}vY4y)Oy>q;JIVul%3*|0xdqLma4z$(op~INu)hBq{eII|2XGsThi&kkx4>V@a8e zUQ|~#%!e|Wk5;pq&0#&z)|N~VbAw2@Eb$On5(!F`AxK-2>KKFp!+=tNop1%hL8(S{ zFl~@0-z2D@E#Dl~v`prKz)rys25Q4JJB>pQJ7f$QUjTu9JAXT|p{?Y$S&5yl#!lB_ zr_1lwrQXe#w)?-Ht4Qao()pTnzC2qG#WpW*habIA30WZ=PX{&x00AVx0PjOz2PXt0gq`tJ|2@bm;SN0L;dl_? zcpy4(V2PlP92gjy;_eC@2;hNR&liAX*A^L`2Ebr=DbEaZLCfdpOkp{lLo;_0?hDmr z?;RlBX73_qOY3&Sz10K&RmhVK_n(Ddb8imD>`HUZO}W_*U|9AN5;PYuakLCxYx(G! zIS-!1b^ETZP)*ylm5SR}%-LMC4r;(gPf-7aOAbAx? zt6{v3l}Hc^jL(6z8b;4R`N~dgv=&RDO&qC7Ludzswa{4k@=ikDn%}XtA%?=jJR4bo|^L*K%8* z)2UF$$+1h&{m@f8?5q$`?Y(m3n!_TJdH5MufH<&KCObXJ?>L{Qo<(^c|Li$%pv;kn}K z@=9UVFw zP608{BVgPims`NAzfDL@1Y5=qXlaOGA>ts|fDB~7Pi^fY9(@^8o5x5TqwWuT_AU@8o%a% zTyhw34*Wmh+;b4yE^!ZScIha^-W$Ma$2sua9_sD72l!OC;)kf+uX;Zg6jAj7c8OMS zcGWP8`a(&|n^qtP1)fa_Ooo9Wcn=yhS1hOiao0`mBy%ocI0^H(l)VIy&KMlyWOfo5 z>;@3f?In_%@ryea7UG=Cda4XZ*uB2iE|fM@`k*B*^t31%xu13 z@aEw4<>Hde|1tSymN_N+rXm*$&@6B8QS1wu{C+`O=Y4s!EAKZnR^YNM-=s3!083hS zovP#VB3};}C_afe^YfwX)+#kAgD9HHcULGZp6%}ddR#9WGTbKRreQnXp}JJk*2noU zmQ-AF1i_AhOf5HT0Uspp;G>3N1vnq4$181i)ht>b9MbZ`eHUL<;Obt4%Q`e)WOyjt zP41$a@BST&@8X~$?9qPx@H6zTmbjcP{W!0hD^>tDYwr(QVHOt7u49{U6MxXrvYSws zW4hCx9;Ngjt_pr^hc6AT_Zq%`ufee(&%E5V^} zhF|<*{txq;bDvy$<_JRMx@n(&I?a}0@^m^ScVNHe&t%kM4&DMTL4!l%>^L&GoG@;) zJp3VQ04uq`(c{=s$MdsAkJ@1S2!04WDrr9nOS)Ce7cv???>&2jg3%#EQih-L0YGd^ zgwpW%ydvI;#72}vhRRRBd_@Ph0^6^Cd18CK5}m3>r)tru^3{4Uy7}tXP&GJG3yzfM z>XFgSUsNMFMz86Vsu5P~xZz7S4)yTzK8Tn`Wo7)HLgid|LR1pw0{j>T!4qfZnAatG1fjgV2#HGw3jZj`EzVJhAsE` zrzK&$LAuG-$YZR1a==RVW1nuab?q_MJ~?1b1qBF?yUEt+$5{L1fHgdcV|J6z!;i7{ K$ssJRd;bLhC{Zr} literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/pivot.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/pivot.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..6df6824e1920b7dd32b03c2852a28c7c97c88758 GIT binary patch literal 2685 zcmah~y>Ht_6hBHLC6S^(lH|Z+$Dzmgcu4HcA|v5 zfL}PYK5k2aO>MLF8(j+|)BOfrGeVGBpv=@Q)76(Onu!GB4a?NsKwR7?Q3GT(M_rE^ z_Z*L|P!`CcxJb($ELLxqJ?gk-(U~`0?~M>{nVi!-eO_Op7Pv_Fb+$$saQ%0gURpH^ zy7hn+OO$ygbwQo@+AOT%euePxA&s?!eFvCrLWw3AM2i@L7L5=ZqvFfR4!rIKzLF13 z0)3n&+Vn}#%TzIy@ldBE6_kG zy%#WMS}xH7TuI)8D_Y!*uwK|Nkaf!{{*ZTy4&99eF-Ny)ATHb9JtJ2*2nOGaug65~ ze+*=sYzmts4_r7lBOo1yWRL~2E96)jjG0&vbE&n=20&ngKmrNwY~J-;-2DuUci(0o z7Oi!gx>;9u4AWh^bouk_vZcFg+0w?cMX8s4M4d-j%UlA5w_0>Qo4#}@>zW>&D(Qta zeFc_6W}MPS*~%7Hb>?Mx?9-)}j$w zFbaQi6`p;tkW4g}%VoN8E4-e3K9KWyyJ)Oi$fxr8@7Hy!Wr=(G3bHH?3xlZZu`qJL z9*Cyn@jGA$J(fT+iU!z&TGXbF=jQVa&$LU}DKw8E={_KRz_{x`Du>Tr*I4E5o-$CK zeSXVVF4U9@b>%{3u8|t4-v1-&rzUHu$$DzCa=W4SRlj+D>h%?0yi+6k~E4e^A( z%>9)P{weM+o$yz=e^&?pZf@!6VCm&M#ZT9=5Sa6z`EOuuMggYi&&OsAq{H63DT0KMcV?CMBP>N$KU{UJtRE@a7#4O!yJ6Azrk^kl$NrZtR{K& zWu)*10Fb%NAo~cmV5gCsL2?!eA}u^A2U!Y5er60V=wE4X=1fH&e%A?X=r@bT22)VS zBg7AA80H~h*#zn^K6Vbtd#IjA5ee$uzkwWu>M%f69;!|~^L%-tCQsDmiOQ{p(o?$I zo$S*s`0zYq%>|3_*)!395eZW?GaDhNU|L4+@SGJAA3BT*sJB>zuf?M=ZaH`-@|T=9?3Ju>be vpA9nVAD<0!-akIueVS5_0Ij~AY)$@y+PCjbpNtET`F4VypncoH#OvW-zMX^t literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/plotarea.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/plotarea.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..ae72a9b9127dbeb0fe35663d2538aa719134d833 GIT binary patch literal 7803 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 SQLJe({{xf!?GE%YN_s%fBX* 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 F{{ltYbG!fm literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/reader.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/reader.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..1b496a070079f271e1d0a37885dafec0dc46e397 GIT binary patch literal 1568 zcmZWp&1)M+6rb5$%lfkG4{amGP9lf2i4r2kH5fsSi$&Z^Tm>3%OK4eE+OfUzNW1K; zj1*)L#n6k70_UJZPH9W>NAypyVGm-U;L=Nb6Zqy+->kaQnvS%yzxUqny_xss&Hgeo z6Gt#okI!oNWrY3`LNM@u;A#%Q88XmoWZ)C@8XM9pl#}1g#=j-Hk=3)+1Kn}s)qpSD z6nG#Wy1FX~-wry)9b6L@f7Hg@W2qz6fHN8f&IAx0%VA4L*2b(Gk;E$g0LBD|*AjaP z7*k^$W<fe0u5QGO4V|1hb(tStoQj{I&hz~T4J7#P8c zr2;$DA%vlml=45qcB6m9YHRRZJ%H&2!hR3^n7G+RyXXvKbec2}M8V}8=CWzDauS#F z&p2jG1j%Nve<igho*`#5&TeRRed%=OuCr;jOU&l7~NrSX(XY^0ZGwbkwxAk_V|JewK=PTerPJG%RdwP?)Ih9ZOfqB%Xmb(Qj@#)c0 zj8D0yO9@XxZgz?4jYGD@_^gnq-qtFLy4m0n zMjVqc9)*+9Dmo)PsyW1L7^KBh`;KlOm{2FpcA&tH3(TCt<9?9#BOM}GBY0*n8cb{J-=T3Lt&Y!;QZVyuF-cEP> z8Vz?yU)7d9Zk^_a#tv28(L1*!xPrVFZB? zxT?2$-+SukU?>m5IDNZ6D?+G)%u+w?Wu6G((?8Vo=$wC5KQ05h$gF#r_22QiTDnk6 zo?7zbD6yZ*Kb0?(l&7T5l@u&^|ADts6cO%TCg!?3j`)<6q1C4~&9JJP=I8$#^7Vdk puA>`u%V<)v={y9k_~5cfFb!pl@h~D`Wr)NS&EWYV`v2rd`WF<{W{Cg* literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/reference.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/reference.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..068e8fd1d8ee1820e9cb4b5adee01501c08dda3b GIT binary patch literal 5267 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 J9*H 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 P@Q{sDy@%+O&2{;Ic#rUR literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/shapes.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/shapes.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..67c5b1280e41b68e60eec90f3ace29c1f9a078a6 GIT binary patch literal 3341 zcmbtW&2JmW6`$qza=9cWQD3%fuk1J~V~33F29Yhhjcv)YY*#fRwJsJ#h!uAzZoMDu z%u*6t7T_T$7{CX&2w)$B9$XYQ3LkUSpFjdU5DNqd&{J;=oKr6Cn<1ByWg0zncK7Z3 znm4m=es5;~F3WKQE%U+C-~9);e=)&t;Q{md&%iuII?@FbS%NAEj1QOrE2svokQ(B0 z&}Bj&tZ~p!Jcr?4_=6%f!=p@&h%&`3(<3Z1+%h}Dasn)IT|74KN$x*4!v7Sv zoE~90!z0CyMN+u`{0RTEx}=^H(dbK0>hc$Y`ktNuyrsN}HKJ9@Mo}{lF``|8HHs_H zHUR^BWzAJ~wVf(9Ys#g?+$FdcuY96Vtwt5MY|yK5?z;u7f=z5;+f`@<7mX6&4Lq>I zkfphG*sW`;N`eCH)y$LH>aXypOPN?x#N5-+4xUB?UU5Uu7#Oc%0U^P+~m z%NdcWAC?Uld*U{Pc*M1F&i2(|&U@iK?i48-x{htA>d3BURx#aztwF~7kZkzqf(v_u z7uQVF*(=zNjlB>{6L^cZW?@=^IeG!pW)r-uXGNj_^u3s$VJ~7kw+++uMCzD^&e<4D zaKKd{g-l1zvR=`_YLIgvZ4_moeq&Y4_O;gsK%SzyP)7ye`mG)SX}AN_gCGs7z8(T; zxFgoXAo+U>sz*TbcWhLTHj?gO-X&j_ZeOCU+U zO-E26!bUdXMfxb>2_xshPTpr^fsvmu!s7K46Z4@<-ebBfBP>T*8Pbl;61l)M3L~Qe zvE=qUU1S`O!Mb}9yzkzpE@fZMDs$L={B8c%j#-8E%~PlhgFafkw3IKI8hwt28CO8?8~{u#XJSneF%_vr0qagI3DauZQsoEg3MEPLeN~L=EVvH!#3PP z;SX~F&f_~p&bR&?rbRK32I|eB=~Kv#Bzi7YbgyP_P`mYBD}i zDEz*vnFC9-P|%$ssH3j7!*pJB11e<`PCC9Y3~(gDh{6a%oF}^e=}1`i3168cbpHg=0O$NCu@Q8*AUmndZYD5>9_Eyh($}iSH4R9~f!e?!{4JtoiY? zKfZEX(zUj9ts`A)taQ_pPr^@1f04hE8|&Rvrde&ByL=F8rB>Ui)lO=)ac88m7eUFX z=5M}^x8w_L`9ep&(74@ApKqnlx6=!q^ujRKl>@z%y4OzK>!j`tV=WzQwNiK6sk@!j z-Nv2o#AI{w+2`McTH^J#c)cTDZ`|xk>E_2zGG8t~UWPd)Cz|-{g;#njx!g`JcaqDE zHSX|i@6}IR(o$Pm>PSlizbCi9v>sdFAdfeH)tdk0V5KFmx8?PYybd`C37HQY_j@rk zd#XEiqB}F!J$a^k;xxN6GhI;jd2Z^>o(RwO&^t(fx!6i=WGB3Nzg~0t@Q07)=#hU$ z!ZuPbGs=%}kaK9C9A(ehn8I;FIIyP=J&3jkCwQ*N{x&IL0QV-}vX|0%S27j7_!^)-Um&kvm{uM+%(;+6xMT0B{kOTj=W1 zyB7!wfgbwbBo<(P?;;Qx!d^LgchR|)e|OPGtvBypAj0DPzhwNTAOJc>(`OgI=awJd IVdrW4FEXieLI3~& literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/stock_chart.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/stock_chart.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..8143b0f991109cea809a4adfb3880174a0dff6b3 GIT binary patch literal 2411 zcmb7F&2JM&6rc6S+FpATJD-jd0urTH4;*!p18S64=ty@H?{*I;lT6koA))d`~<=?ViHrbi6d!}gmTCZIbkjAM6`$#)uO@{wq+-# z#XydjQ9JG=w1kjlTXB+F(n)D4N7Ynei`fItpf)JvxSe(~T1LnTd&n8qh9wdrw}`2H zOUxuq?1c$=4o{b~5i_+y^6D#8^Ab<3P-YpnPBR8+DJCU8_>aI^*e_$~0n&IN&_+47}7VDPFlgl*+HZBQ85iv!pOmQFO zUUjLmS-xg4vFnoI8AW52+PEvYWjqjdOWoskd8DTtWZ|vfK|U$bB$H?%Q_{jALL)T# zM`#ax&+$}(G#TtM8aKm#MD{}9fv4w5fJZT-@5CoXeCmXF^}U_};Tb$(OU>QK%2!?+vO1(aLUU(>{7-?F(_fON>!l8l?PU_ zve}bshdAKFP*m5?NwdlqQhnkl|u3*L4HBf#Hd{yd@MKb!%11cwE=5vgPS|KEWd{ zwb$Oe7nh-{imt~)8=E|#>m}Q8U0rt*u5T zp}MtZQ|c8S(ek5$ZLNaAdr&D~n!j+N;94G?s~V*Z<322{RB5@oRksTz?COFjAzjGx z)h%`wUii)Mn;M(%|AkM$;TpjHZIaFq85!S>JdOvWIhd4S;v<*_g4}tS27A-XvFRu4 zPuIbcd^vXZiSyJ!F^Fe>h<+b?9Baq3eta6nFBiM>AwPhZki0C?zl@Zh#7veAhw3_4 zbls_#H5=uWu0O09cFz;@jQc1uEJ}v8(M>m26&pZ?rOvQ?xMKD{NiIvF^$oNtssdju zbaoCIBF(0eA9Zkpz*T^`?f>=%a?M-&%Fy=A?wGI4w3L~)GSj>sq%zw#cGVZ>{nXV~>S{Z6wRt1R zjO~o>Y(ANOI^Dbzq(^t6yLVn(_R|Zk^g=tm(7Y`IcC{BverBq*r)y6Eayl0*?!H=n{aC|tLjylJCEt_-)am$Bz)wg zI41BHH6ftSofI@r>i`o&#JSw<28O+dUp;7Ufxmzri-jj^RTHi^eHHFEhV{auHePR{ z%DCLEi*5x9jPXO#{YQxV>-d-53jT^+0Tm0v{SR0tEJ;#FCejx^`TXtC2}Pt(hkOWA zi1e9HF26nY$tnNn2*@S>{Uadf{G%fvXZ)ihAUXf&=*Z_KfciMwnfM#6|D50wsreu7 CQdmO( literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/surface_chart.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/surface_chart.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..71d02efe6c028c4523395a21f987b77acd57052a GIT binary patch literal 5228 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 b4&bgD@<2R@!RKBFPs#Ue_J=kkuK0fgxz=3j literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/trendline.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/trendline.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..f0e470e7dfb44f3fc0f1a5f9710bf12e8eb451a2 GIT binary patch literal 3779 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 Ldw(2Y;_3Atk6(k* literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/updown_bars.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chart/__pycache__/updown_bars.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..ecedbf68fff47afd2fe4fbe8a271d2ac3de57555 GIT binary patch literal 1459 zcmZ`&&2QX96d!-=uJ^+=bfb`lv?LNLED~!1MM8y;@YQgLR!D6@^2M6$OtNmqAIx~$ z4T{7f^{_}BIFV~lsjBh^ehIaoeL;*{G~;nWjv?A)uJM%WF1Fe z`C&JR+xgZx>SO0@0AwFg?44Ew5RML7g%n4 zDtJ=l%=R?!&d*8^RH(GL1+hjU)dgi+{0(sUn-Z=9q($0`H$*JthKtf(V*AICb$u#q zfdk@+o#l@|v$q%)J9f0Y#VC#KhctL-Gj9_n;!YTR(p+A)g%{HgBi!D>+prXR97MZ4 zX18U7?QSH`=Sp#!(QazEt`~T*>;6)IrCxI~`4*HSt^@SZsD`dB4fH?EWOe}_)nsl_ zdIPx5AOSUWUWZ4k)oNUkZw;_dT{o?`t{;*vlf34-KX)-3M@li?mXw!aS+0fru(%=N zToo?W;Ija7Ic3zRK`dOC&%x9)#IMP)ER$C!Py-@<2k4()Cs$_s>nGNY!LLWw;<2^Z z|2{FV4(>mhKh%fj%8|KpY_9b0B-YHJ`{efFyF+XB$XY$NRwsGa4{r_4wIg%w*j(%1 zIjMiz-xw9q+c%QAg=AjhsB9FLM(8z=S1Ai@HOzEr(vc>iqRqW14xty~!cWZQHHKA(ChfH;%LGe{qJtwUcu8jKxaWyX*R*?&Km57y MLeBnsNhmwWf7?5I;Q#;t literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/_chart.py b/venv/lib/python3.11/site-packages/openpyxl/chart/_chart.py new file mode 100755 index 0000000..6a61354 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/_chart.py @@ -0,0 +1,199 @@ +# Copyright (c) 2010-2024 openpyxl + +from collections import OrderedDict +from operator import attrgetter + +from openpyxl.descriptors import ( + Typed, + Integer, + Alias, + MinMax, + Bool, + Set, +) +from openpyxl.descriptors.sequence import ValueSequence +from openpyxl.descriptors.serialisable import Serialisable + +from ._3d import _3DBase +from .data_source import AxDataSource, NumRef +from .layout import Layout +from .legend import Legend +from .reference import Reference +from .series_factory import SeriesFactory +from .series import attribute_mapping +from .shapes import GraphicalProperties +from .title import TitleDescriptor + +class AxId(Serialisable): + + val = Integer() + + def __init__(self, val): + self.val = val + + +def PlotArea(): + from .chartspace import PlotArea + return PlotArea() + + +class ChartBase(Serialisable): + + """ + Base class for all charts + """ + + legend = Typed(expected_type=Legend, allow_none=True) + layout = Typed(expected_type=Layout, allow_none=True) + roundedCorners = Bool(allow_none=True) + axId = ValueSequence(expected_type=int) + visible_cells_only = Bool(allow_none=True) + display_blanks = Set(values=['span', 'gap', 'zero']) + graphical_properties = Typed(expected_type=GraphicalProperties, allow_none=True) + + _series_type = "" + ser = () + series = Alias('ser') + title = TitleDescriptor() + anchor = "E15" # default anchor position + width = 15 # in cm, approx 5 rows + height = 7.5 # in cm, approx 14 rows + _id = 1 + _path = "/xl/charts/chart{0}.xml" + style = MinMax(allow_none=True, min=1, max=48) + mime_type = "application/vnd.openxmlformats-officedocument.drawingml.chart+xml" + graphical_properties = Typed(expected_type=GraphicalProperties, allow_none=True) # mapped to chartspace + + __elements__ = () + + + def __init__(self, axId=(), **kw): + self._charts = [self] + self.title = None + self.layout = None + self.roundedCorners = None + self.legend = Legend() + self.graphical_properties = None + self.style = None + self.plot_area = PlotArea() + self.axId = axId + self.display_blanks = 'gap' + self.pivotSource = None + self.pivotFormats = () + self.visible_cells_only = True + self.idx_base = 0 + self.graphical_properties = None + super().__init__() + + + def __hash__(self): + """ + Just need to check for identity + """ + return id(self) + + def __iadd__(self, other): + """ + Combine the chart with another one + """ + if not isinstance(other, ChartBase): + raise TypeError("Only other charts can be added") + self._charts.append(other) + return self + + + def to_tree(self, namespace=None, tagname=None, idx=None): + self.axId = [id for id in self._axes] + if self.ser is not None: + for s in self.ser: + s.__elements__ = attribute_mapping[self._series_type] + return super().to_tree(tagname, idx) + + + def _reindex(self): + """ + Normalise and rebase series: sort by order and then rebase order + + """ + # sort data series in order and rebase + ds = sorted(self.series, key=attrgetter("order")) + for idx, s in enumerate(ds): + s.order = idx + self.series = ds + + + def _write(self): + from .chartspace import ChartSpace, ChartContainer + self.plot_area.layout = self.layout + + idx_base = self.idx_base + for chart in self._charts: + if chart not in self.plot_area._charts: + chart.idx_base = idx_base + idx_base += len(chart.series) + self.plot_area._charts = self._charts + + container = ChartContainer(plotArea=self.plot_area, legend=self.legend, title=self.title) + if isinstance(chart, _3DBase): + container.view3D = chart.view3D + container.floor = chart.floor + container.sideWall = chart.sideWall + container.backWall = chart.backWall + container.plotVisOnly = self.visible_cells_only + container.dispBlanksAs = self.display_blanks + container.pivotFmts = self.pivotFormats + cs = ChartSpace(chart=container) + cs.style = self.style + cs.roundedCorners = self.roundedCorners + cs.pivotSource = self.pivotSource + cs.spPr = self.graphical_properties + return cs.to_tree() + + + @property + def _axes(self): + x = getattr(self, "x_axis", None) + y = getattr(self, "y_axis", None) + z = getattr(self, "z_axis", None) + return OrderedDict([(axis.axId, axis) for axis in (x, y, z) if axis]) + + + def set_categories(self, labels): + """ + Set the categories / x-axis values + """ + if not isinstance(labels, Reference): + labels = Reference(range_string=labels) + for s in self.ser: + s.cat = AxDataSource(numRef=NumRef(f=labels)) + + + def add_data(self, data, from_rows=False, titles_from_data=False): + """ + Add a range of data in a single pass. + The default is to treat each column as a data series. + """ + if not isinstance(data, Reference): + data = Reference(range_string=data) + + if from_rows: + values = data.rows + + else: + values = data.cols + + for ref in values: + series = SeriesFactory(ref, title_from_data=titles_from_data) + self.series.append(series) + + + def append(self, value): + """Append a data series to the chart""" + l = self.series[:] + l.append(value) + self.series = l + + + @property + def path(self): + return self._path.format(self._id) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/area_chart.py b/venv/lib/python3.11/site-packages/openpyxl/chart/area_chart.py new file mode 100755 index 0000000..d3d9808 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/area_chart.py @@ -0,0 +1,106 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Set, + Bool, + Integer, + Sequence, + Alias, +) + +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedMinMax, + NestedSet, + NestedBool, +) + +from ._chart import ChartBase +from .descriptors import NestedGapAmount +from .axis import TextAxis, NumericAxis, SeriesAxis, ChartLines +from .label import DataLabelList +from .series import Series + + +class _AreaChartBase(ChartBase): + + grouping = NestedSet(values=(['percentStacked', 'standard', 'stacked'])) + varyColors = NestedBool(nested=True, allow_none=True) + ser = Sequence(expected_type=Series, allow_none=True) + dLbls = Typed(expected_type=DataLabelList, allow_none=True) + dataLabels = Alias("dLbls") + dropLines = Typed(expected_type=ChartLines, allow_none=True) + + _series_type = "area" + + __elements__ = ('grouping', 'varyColors', 'ser', 'dLbls', 'dropLines') + + def __init__(self, + grouping="standard", + varyColors=None, + ser=(), + dLbls=None, + dropLines=None, + ): + self.grouping = grouping + self.varyColors = varyColors + self.ser = ser + self.dLbls = dLbls + self.dropLines = dropLines + super().__init__() + + +class AreaChart(_AreaChartBase): + + tagname = "areaChart" + + grouping = _AreaChartBase.grouping + varyColors = _AreaChartBase.varyColors + ser = _AreaChartBase.ser + dLbls = _AreaChartBase.dLbls + dropLines = _AreaChartBase.dropLines + + # chart properties actually used by containing classes + x_axis = Typed(expected_type=TextAxis) + y_axis = Typed(expected_type=NumericAxis) + + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = _AreaChartBase.__elements__ + ('axId',) + + def __init__(self, + axId=None, + extLst=None, + **kw + ): + self.x_axis = TextAxis() + self.y_axis = NumericAxis() + super().__init__(**kw) + + +class AreaChart3D(AreaChart): + + tagname = "area3DChart" + + grouping = _AreaChartBase.grouping + varyColors = _AreaChartBase.varyColors + ser = _AreaChartBase.ser + dLbls = _AreaChartBase.dLbls + dropLines = _AreaChartBase.dropLines + + gapDepth = NestedGapAmount() + + x_axis = Typed(expected_type=TextAxis) + y_axis = Typed(expected_type=NumericAxis) + z_axis = Typed(expected_type=SeriesAxis, allow_none=True) + + __elements__ = AreaChart.__elements__ + ('gapDepth', ) + + def __init__(self, gapDepth=None, **kw): + self.gapDepth = gapDepth + super(AreaChart3D, self).__init__(**kw) + self.x_axis = TextAxis() + self.y_axis = NumericAxis() + self.z_axis = SeriesAxis() diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/axis.py b/venv/lib/python3.11/site-packages/openpyxl/chart/axis.py new file mode 100755 index 0000000..7e99416 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/axis.py @@ -0,0 +1,401 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Float, + NoneSet, + Bool, + Integer, + MinMax, + NoneSet, + Set, + String, + Alias, +) + +from openpyxl.descriptors.excel import ( + ExtensionList, + Percentage, + _explicit_none, +) +from openpyxl.descriptors.nested import ( + NestedValue, + NestedSet, + NestedBool, + NestedNoneSet, + NestedFloat, + NestedInteger, + NestedMinMax, +) +from openpyxl.xml.constants import CHART_NS + +from .descriptors import NumberFormatDescriptor +from .layout import Layout +from .text import Text, RichText +from .shapes import GraphicalProperties +from .title import Title, TitleDescriptor + + +class ChartLines(Serialisable): + + tagname = "chartLines" + + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias('spPr') + + def __init__(self, spPr=None): + self.spPr = spPr + + +class Scaling(Serialisable): + + tagname = "scaling" + + logBase = NestedFloat(allow_none=True) + orientation = NestedSet(values=(['maxMin', 'minMax'])) + max = NestedFloat(allow_none=True) + min = NestedFloat(allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('logBase', 'orientation', 'max', 'min',) + + def __init__(self, + logBase=None, + orientation="minMax", + max=None, + min=None, + extLst=None, + ): + self.logBase = logBase + self.orientation = orientation + self.max = max + self.min = min + + +class _BaseAxis(Serialisable): + + axId = NestedInteger(expected_type=int) + scaling = Typed(expected_type=Scaling) + delete = NestedBool(allow_none=True) + axPos = NestedSet(values=(['b', 'l', 'r', 't'])) + majorGridlines = Typed(expected_type=ChartLines, allow_none=True) + minorGridlines = Typed(expected_type=ChartLines, allow_none=True) + title = TitleDescriptor() + numFmt = NumberFormatDescriptor() + number_format = Alias("numFmt") + majorTickMark = NestedNoneSet(values=(['cross', 'in', 'out']), to_tree=_explicit_none) + minorTickMark = NestedNoneSet(values=(['cross', 'in', 'out']), to_tree=_explicit_none) + tickLblPos = NestedNoneSet(values=(['high', 'low', 'nextTo'])) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias('spPr') + txPr = Typed(expected_type=RichText, allow_none=True) + textProperties = Alias('txPr') + crossAx = NestedInteger(expected_type=int) # references other axis + crosses = NestedNoneSet(values=(['autoZero', 'max', 'min'])) + crossesAt = NestedFloat(allow_none=True) + + # crosses & crossesAt are mutually exclusive + + __elements__ = ('axId', 'scaling', 'delete', 'axPos', 'majorGridlines', + 'minorGridlines', 'title', 'numFmt', 'majorTickMark', 'minorTickMark', + 'tickLblPos', 'spPr', 'txPr', 'crossAx', 'crosses', 'crossesAt') + + def __init__(self, + axId=None, + scaling=None, + delete=None, + axPos='l', + majorGridlines=None, + minorGridlines=None, + title=None, + numFmt=None, + majorTickMark=None, + minorTickMark=None, + tickLblPos=None, + spPr=None, + txPr= None, + crossAx=None, + crosses=None, + crossesAt=None, + ): + self.axId = axId + if scaling is None: + scaling = Scaling() + self.scaling = scaling + self.delete = delete + self.axPos = axPos + self.majorGridlines = majorGridlines + self.minorGridlines = minorGridlines + self.title = title + self.numFmt = numFmt + self.majorTickMark = majorTickMark + self.minorTickMark = minorTickMark + self.tickLblPos = tickLblPos + self.spPr = spPr + self.txPr = txPr + self.crossAx = crossAx + self.crosses = crosses + self.crossesAt = crossesAt + + +class DisplayUnitsLabel(Serialisable): + + tagname = "dispUnitsLbl" + + layout = Typed(expected_type=Layout, allow_none=True) + tx = Typed(expected_type=Text, allow_none=True) + text = Alias("tx") + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias("spPr") + txPr = Typed(expected_type=RichText, allow_none=True) + textPropertes = Alias("txPr") + + __elements__ = ('layout', 'tx', 'spPr', 'txPr') + + def __init__(self, + layout=None, + tx=None, + spPr=None, + txPr=None, + ): + self.layout = layout + self.tx = tx + self.spPr = spPr + self.txPr = txPr + + +class DisplayUnitsLabelList(Serialisable): + + tagname = "dispUnits" + + custUnit = NestedFloat(allow_none=True) + builtInUnit = NestedNoneSet(values=(['hundreds', 'thousands', + 'tenThousands', 'hundredThousands', 'millions', 'tenMillions', + 'hundredMillions', 'billions', 'trillions'])) + dispUnitsLbl = Typed(expected_type=DisplayUnitsLabel, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('custUnit', 'builtInUnit', 'dispUnitsLbl',) + + def __init__(self, + custUnit=None, + builtInUnit=None, + dispUnitsLbl=None, + extLst=None, + ): + self.custUnit = custUnit + self.builtInUnit = builtInUnit + self.dispUnitsLbl = dispUnitsLbl + + +class NumericAxis(_BaseAxis): + + tagname = "valAx" + + axId = _BaseAxis.axId + scaling = _BaseAxis.scaling + delete = _BaseAxis.delete + axPos = _BaseAxis.axPos + majorGridlines = _BaseAxis.majorGridlines + minorGridlines = _BaseAxis.minorGridlines + title = _BaseAxis.title + numFmt = _BaseAxis.numFmt + majorTickMark = _BaseAxis.majorTickMark + minorTickMark = _BaseAxis.minorTickMark + tickLblPos = _BaseAxis.tickLblPos + spPr = _BaseAxis.spPr + txPr = _BaseAxis.txPr + crossAx = _BaseAxis.crossAx + crosses = _BaseAxis.crosses + crossesAt = _BaseAxis.crossesAt + + crossBetween = NestedNoneSet(values=(['between', 'midCat'])) + majorUnit = NestedFloat(allow_none=True) + minorUnit = NestedFloat(allow_none=True) + dispUnits = Typed(expected_type=DisplayUnitsLabelList, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = _BaseAxis.__elements__ + ('crossBetween', 'majorUnit', + 'minorUnit', 'dispUnits',) + + + def __init__(self, + crossBetween=None, + majorUnit=None, + minorUnit=None, + dispUnits=None, + extLst=None, + **kw + ): + self.crossBetween = crossBetween + self.majorUnit = majorUnit + self.minorUnit = minorUnit + self.dispUnits = dispUnits + kw.setdefault('majorGridlines', ChartLines()) + kw.setdefault('axId', 100) + kw.setdefault('crossAx', 10) + super().__init__(**kw) + + + @classmethod + def from_tree(cls, node): + """ + Special case value axes with no gridlines + """ + self = super().from_tree(node) + gridlines = node.find("{%s}majorGridlines" % CHART_NS) + if gridlines is None: + self.majorGridlines = None + return self + + + +class TextAxis(_BaseAxis): + + tagname = "catAx" + + axId = _BaseAxis.axId + scaling = _BaseAxis.scaling + delete = _BaseAxis.delete + axPos = _BaseAxis.axPos + majorGridlines = _BaseAxis.majorGridlines + minorGridlines = _BaseAxis.minorGridlines + title = _BaseAxis.title + numFmt = _BaseAxis.numFmt + majorTickMark = _BaseAxis.majorTickMark + minorTickMark = _BaseAxis.minorTickMark + tickLblPos = _BaseAxis.tickLblPos + spPr = _BaseAxis.spPr + txPr = _BaseAxis.txPr + crossAx = _BaseAxis.crossAx + crosses = _BaseAxis.crosses + crossesAt = _BaseAxis.crossesAt + + auto = NestedBool(allow_none=True) + lblAlgn = NestedNoneSet(values=(['ctr', 'l', 'r'])) + lblOffset = NestedMinMax(min=0, max=1000) + tickLblSkip = NestedInteger(allow_none=True) + tickMarkSkip = NestedInteger(allow_none=True) + noMultiLvlLbl = NestedBool(allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = _BaseAxis.__elements__ + ('auto', 'lblAlgn', 'lblOffset', + 'tickLblSkip', 'tickMarkSkip', 'noMultiLvlLbl') + + def __init__(self, + auto=None, + lblAlgn=None, + lblOffset=100, + tickLblSkip=None, + tickMarkSkip=None, + noMultiLvlLbl=None, + extLst=None, + **kw + ): + self.auto = auto + self.lblAlgn = lblAlgn + self.lblOffset = lblOffset + self.tickLblSkip = tickLblSkip + self.tickMarkSkip = tickMarkSkip + self.noMultiLvlLbl = noMultiLvlLbl + kw.setdefault('axId', 10) + kw.setdefault('crossAx', 100) + super().__init__(**kw) + + +class DateAxis(TextAxis): + + tagname = "dateAx" + + axId = _BaseAxis.axId + scaling = _BaseAxis.scaling + delete = _BaseAxis.delete + axPos = _BaseAxis.axPos + majorGridlines = _BaseAxis.majorGridlines + minorGridlines = _BaseAxis.minorGridlines + title = _BaseAxis.title + numFmt = _BaseAxis.numFmt + majorTickMark = _BaseAxis.majorTickMark + minorTickMark = _BaseAxis.minorTickMark + tickLblPos = _BaseAxis.tickLblPos + spPr = _BaseAxis.spPr + txPr = _BaseAxis.txPr + crossAx = _BaseAxis.crossAx + crosses = _BaseAxis.crosses + crossesAt = _BaseAxis.crossesAt + + auto = NestedBool(allow_none=True) + lblOffset = NestedInteger(allow_none=True) + baseTimeUnit = NestedNoneSet(values=(['days', 'months', 'years'])) + majorUnit = NestedFloat(allow_none=True) + majorTimeUnit = NestedNoneSet(values=(['days', 'months', 'years'])) + minorUnit = NestedFloat(allow_none=True) + minorTimeUnit = NestedNoneSet(values=(['days', 'months', 'years'])) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = _BaseAxis.__elements__ + ('auto', 'lblOffset', + 'baseTimeUnit', 'majorUnit', 'majorTimeUnit', 'minorUnit', + 'minorTimeUnit') + + def __init__(self, + auto=None, + lblOffset=None, + baseTimeUnit=None, + majorUnit=None, + majorTimeUnit=None, + minorUnit=None, + minorTimeUnit=None, + extLst=None, + **kw + ): + self.auto = auto + self.lblOffset = lblOffset + self.baseTimeUnit = baseTimeUnit + self.majorUnit = majorUnit + self.majorTimeUnit = majorTimeUnit + self.minorUnit = minorUnit + self.minorTimeUnit = minorTimeUnit + kw.setdefault('axId', 500) + kw.setdefault('lblOffset', lblOffset) + super().__init__(**kw) + + +class SeriesAxis(_BaseAxis): + + tagname = "serAx" + + axId = _BaseAxis.axId + scaling = _BaseAxis.scaling + delete = _BaseAxis.delete + axPos = _BaseAxis.axPos + majorGridlines = _BaseAxis.majorGridlines + minorGridlines = _BaseAxis.minorGridlines + title = _BaseAxis.title + numFmt = _BaseAxis.numFmt + majorTickMark = _BaseAxis.majorTickMark + minorTickMark = _BaseAxis.minorTickMark + tickLblPos = _BaseAxis.tickLblPos + spPr = _BaseAxis.spPr + txPr = _BaseAxis.txPr + crossAx = _BaseAxis.crossAx + crosses = _BaseAxis.crosses + crossesAt = _BaseAxis.crossesAt + + tickLblSkip = NestedInteger(allow_none=True) + tickMarkSkip = NestedInteger(allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = _BaseAxis.__elements__ + ('tickLblSkip', 'tickMarkSkip') + + def __init__(self, + tickLblSkip=None, + tickMarkSkip=None, + extLst=None, + **kw + ): + self.tickLblSkip = tickLblSkip + self.tickMarkSkip = tickMarkSkip + kw.setdefault('axId', 1000) + kw.setdefault('crossAx', 10) + super().__init__(**kw) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/bar_chart.py b/venv/lib/python3.11/site-packages/openpyxl/chart/bar_chart.py new file mode 100755 index 0000000..fa08e07 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/bar_chart.py @@ -0,0 +1,144 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Bool, + Integer, + Sequence, + Alias, +) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedNoneSet, + NestedSet, + NestedBool, + NestedInteger, + NestedMinMax, +) + +from .descriptors import ( + NestedGapAmount, + NestedOverlap, +) +from ._chart import ChartBase +from ._3d import _3DBase +from .axis import TextAxis, NumericAxis, SeriesAxis, ChartLines +from .shapes import GraphicalProperties +from .series import Series +from .legend import Legend +from .label import DataLabelList + + +class _BarChartBase(ChartBase): + + barDir = NestedSet(values=(['bar', 'col'])) + type = Alias("barDir") + grouping = NestedSet(values=(['percentStacked', 'clustered', 'standard', + 'stacked'])) + varyColors = NestedBool(nested=True, allow_none=True) + ser = Sequence(expected_type=Series, allow_none=True) + dLbls = Typed(expected_type=DataLabelList, allow_none=True) + dataLabels = Alias("dLbls") + + __elements__ = ('barDir', 'grouping', 'varyColors', 'ser', 'dLbls') + + _series_type = "bar" + + def __init__(self, + barDir="col", + grouping="clustered", + varyColors=None, + ser=(), + dLbls=None, + **kw + ): + self.barDir = barDir + self.grouping = grouping + self.varyColors = varyColors + self.ser = ser + self.dLbls = dLbls + super().__init__(**kw) + + +class BarChart(_BarChartBase): + + tagname = "barChart" + + barDir = _BarChartBase.barDir + grouping = _BarChartBase.grouping + varyColors = _BarChartBase.varyColors + ser = _BarChartBase.ser + dLbls = _BarChartBase.dLbls + + gapWidth = NestedGapAmount() + overlap = NestedOverlap() + serLines = Typed(expected_type=ChartLines, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + # chart properties actually used by containing classes + x_axis = Typed(expected_type=TextAxis) + y_axis = Typed(expected_type=NumericAxis) + + __elements__ = _BarChartBase.__elements__ + ('gapWidth', 'overlap', 'serLines', 'axId') + + def __init__(self, + gapWidth=150, + overlap=None, + serLines=None, + extLst=None, + **kw + ): + self.gapWidth = gapWidth + self.overlap = overlap + self.serLines = serLines + self.x_axis = TextAxis() + self.y_axis = NumericAxis() + self.legend = Legend() + super().__init__(**kw) + + +class BarChart3D(_BarChartBase, _3DBase): + + tagname = "bar3DChart" + + barDir = _BarChartBase.barDir + grouping = _BarChartBase.grouping + varyColors = _BarChartBase.varyColors + ser = _BarChartBase.ser + dLbls = _BarChartBase.dLbls + + view3D = _3DBase.view3D + floor = _3DBase.floor + sideWall = _3DBase.sideWall + backWall = _3DBase.backWall + + gapWidth = NestedGapAmount() + gapDepth = NestedGapAmount() + shape = NestedNoneSet(values=(['cone', 'coneToMax', 'box', 'cylinder', 'pyramid', 'pyramidToMax'])) + serLines = Typed(expected_type=ChartLines, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + x_axis = Typed(expected_type=TextAxis) + y_axis = Typed(expected_type=NumericAxis) + z_axis = Typed(expected_type=SeriesAxis, allow_none=True) + + __elements__ = _BarChartBase.__elements__ + ('gapWidth', 'gapDepth', 'shape', 'serLines', 'axId') + + def __init__(self, + gapWidth=150, + gapDepth=150, + shape=None, + serLines=None, + extLst=None, + **kw + ): + self.gapWidth = gapWidth + self.gapDepth = gapDepth + self.shape = shape + self.serLines = serLines + self.x_axis = TextAxis() + self.y_axis = NumericAxis() + self.z_axis = SeriesAxis() + + super(BarChart3D, self).__init__(**kw) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/bubble_chart.py b/venv/lib/python3.11/site-packages/openpyxl/chart/bubble_chart.py new file mode 100755 index 0000000..3fca043 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/bubble_chart.py @@ -0,0 +1,67 @@ +#Autogenerated schema +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Set, + MinMax, + Bool, + Integer, + Alias, + Sequence, +) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedNoneSet, + NestedMinMax, + NestedBool, +) + +from ._chart import ChartBase +from .axis import TextAxis, NumericAxis +from .series import XYSeries +from .label import DataLabelList + + +class BubbleChart(ChartBase): + + tagname = "bubbleChart" + + varyColors = NestedBool(allow_none=True) + ser = Sequence(expected_type=XYSeries, allow_none=True) + dLbls = Typed(expected_type=DataLabelList, allow_none=True) + dataLabels = Alias("dLbls") + bubble3D = NestedBool(allow_none=True) + bubbleScale = NestedMinMax(min=0, max=300, allow_none=True) + showNegBubbles = NestedBool(allow_none=True) + sizeRepresents = NestedNoneSet(values=(['area', 'w'])) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + x_axis = Typed(expected_type=NumericAxis) + y_axis = Typed(expected_type=NumericAxis) + + _series_type = "bubble" + + __elements__ = ('varyColors', 'ser', 'dLbls', 'bubble3D', 'bubbleScale', + 'showNegBubbles', 'sizeRepresents', 'axId') + + def __init__(self, + varyColors=None, + ser=(), + dLbls=None, + bubble3D=None, + bubbleScale=None, + showNegBubbles=None, + sizeRepresents=None, + extLst=None, + **kw + ): + self.varyColors = varyColors + self.ser = ser + self.dLbls = dLbls + self.bubble3D = bubble3D + self.bubbleScale = bubbleScale + self.showNegBubbles = showNegBubbles + self.sizeRepresents = sizeRepresents + self.x_axis = NumericAxis(axId=10, crossAx=20) + self.y_axis = NumericAxis(axId=20, crossAx=10) + super().__init__(**kw) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/chartspace.py b/venv/lib/python3.11/site-packages/openpyxl/chart/chartspace.py new file mode 100755 index 0000000..cba213c --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/chartspace.py @@ -0,0 +1,195 @@ + +# Copyright (c) 2010-2024 openpyxl + +""" +Enclosing chart object. The various chart types are actually child objects. +Will probably need to call this indirectly +""" + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + String, + Alias, +) +from openpyxl.descriptors.excel import ( + ExtensionList, + Relation +) +from openpyxl.descriptors.nested import ( + NestedBool, + NestedNoneSet, + NestedString, + NestedMinMax, +) +from openpyxl.descriptors.sequence import NestedSequence +from openpyxl.xml.constants import CHART_NS + +from openpyxl.drawing.colors import ColorMapping +from .text import RichText +from .shapes import GraphicalProperties +from .legend import Legend +from ._3d import _3DBase +from .plotarea import PlotArea +from .title import Title +from .pivot import ( + PivotFormat, + PivotSource, +) +from .print_settings import PrintSettings + + +class ChartContainer(Serialisable): + + tagname = "chart" + + title = Typed(expected_type=Title, allow_none=True) + autoTitleDeleted = NestedBool(allow_none=True) + pivotFmts = NestedSequence(expected_type=PivotFormat) + view3D = _3DBase.view3D + floor = _3DBase.floor + sideWall = _3DBase.sideWall + backWall = _3DBase.backWall + plotArea = Typed(expected_type=PlotArea, ) + legend = Typed(expected_type=Legend, allow_none=True) + plotVisOnly = NestedBool() + dispBlanksAs = NestedNoneSet(values=(['span', 'gap', 'zero'])) + showDLblsOverMax = NestedBool(allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('title', 'autoTitleDeleted', 'pivotFmts', 'view3D', + 'floor', 'sideWall', 'backWall', 'plotArea', 'legend', 'plotVisOnly', + 'dispBlanksAs', 'showDLblsOverMax') + + def __init__(self, + title=None, + autoTitleDeleted=None, + pivotFmts=(), + view3D=None, + floor=None, + sideWall=None, + backWall=None, + plotArea=None, + legend=None, + plotVisOnly=True, + dispBlanksAs="gap", + showDLblsOverMax=None, + extLst=None, + ): + self.title = title + self.autoTitleDeleted = autoTitleDeleted + self.pivotFmts = pivotFmts + self.view3D = view3D + self.floor = floor + self.sideWall = sideWall + self.backWall = backWall + if plotArea is None: + plotArea = PlotArea() + self.plotArea = plotArea + self.legend = legend + self.plotVisOnly = plotVisOnly + self.dispBlanksAs = dispBlanksAs + self.showDLblsOverMax = showDLblsOverMax + + +class Protection(Serialisable): + + tagname = "protection" + + chartObject = NestedBool(allow_none=True) + data = NestedBool(allow_none=True) + formatting = NestedBool(allow_none=True) + selection = NestedBool(allow_none=True) + userInterface = NestedBool(allow_none=True) + + __elements__ = ("chartObject", "data", "formatting", "selection", "userInterface") + + def __init__(self, + chartObject=None, + data=None, + formatting=None, + selection=None, + userInterface=None, + ): + self.chartObject = chartObject + self.data = data + self.formatting = formatting + self.selection = selection + self.userInterface = userInterface + + +class ExternalData(Serialisable): + + tagname = "externalData" + + autoUpdate = NestedBool(allow_none=True) + id = String() # Needs namespace + + def __init__(self, + autoUpdate=None, + id=None + ): + self.autoUpdate = autoUpdate + self.id = id + + +class ChartSpace(Serialisable): + + tagname = "chartSpace" + + date1904 = NestedBool(allow_none=True) + lang = NestedString(allow_none=True) + roundedCorners = NestedBool(allow_none=True) + style = NestedMinMax(allow_none=True, min=1, max=48) + clrMapOvr = Typed(expected_type=ColorMapping, allow_none=True) + pivotSource = Typed(expected_type=PivotSource, allow_none=True) + protection = Typed(expected_type=Protection, allow_none=True) + chart = Typed(expected_type=ChartContainer) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphical_properties = Alias("spPr") + txPr = Typed(expected_type=RichText, allow_none=True) + textProperties = Alias("txPr") + externalData = Typed(expected_type=ExternalData, allow_none=True) + printSettings = Typed(expected_type=PrintSettings, allow_none=True) + userShapes = Relation() + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('date1904', 'lang', 'roundedCorners', 'style', + 'clrMapOvr', 'pivotSource', 'protection', 'chart', 'spPr', 'txPr', + 'externalData', 'printSettings', 'userShapes') + + def __init__(self, + date1904=None, + lang=None, + roundedCorners=None, + style=None, + clrMapOvr=None, + pivotSource=None, + protection=None, + chart=None, + spPr=None, + txPr=None, + externalData=None, + printSettings=None, + userShapes=None, + extLst=None, + ): + self.date1904 = date1904 + self.lang = lang + self.roundedCorners = roundedCorners + self.style = style + self.clrMapOvr = clrMapOvr + self.pivotSource = pivotSource + self.protection = protection + self.chart = chart + self.spPr = spPr + self.txPr = txPr + self.externalData = externalData + self.printSettings = printSettings + self.userShapes = userShapes + + + def to_tree(self, tagname=None, idx=None, namespace=None): + tree = super().to_tree() + tree.set("xmlns", CHART_NS) + return tree diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/data_source.py b/venv/lib/python3.11/site-packages/openpyxl/chart/data_source.py new file mode 100755 index 0000000..c38eafb --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/data_source.py @@ -0,0 +1,246 @@ +""" +Collection of utility primitives for charts. +""" + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Bool, + Typed, + Alias, + String, + Integer, + Sequence, +) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedString, + NestedText, + NestedInteger, +) + + +class NumFmt(Serialisable): + + formatCode = String() + sourceLinked = Bool() + + def __init__(self, + formatCode=None, + sourceLinked=False + ): + self.formatCode = formatCode + self.sourceLinked = sourceLinked + + +class NumberValueDescriptor(NestedText): + """ + Data should be numerical but isn't always :-/ + """ + + allow_none = True + + def __set__(self, instance, value): + if value == "#N/A": + self.expected_type = str + else: + self.expected_type = float + super().__set__(instance, value) + + +class NumVal(Serialisable): + + idx = Integer() + formatCode = NestedText(allow_none=True, expected_type=str) + v = NumberValueDescriptor() + + def __init__(self, + idx=None, + formatCode=None, + v=None, + ): + self.idx = idx + self.formatCode = formatCode + self.v = v + + +class NumData(Serialisable): + + formatCode = NestedText(expected_type=str, allow_none=True) + ptCount = NestedInteger(allow_none=True) + pt = Sequence(expected_type=NumVal) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('formatCode', 'ptCount', 'pt') + + def __init__(self, + formatCode=None, + ptCount=None, + pt=(), + extLst=None, + ): + self.formatCode = formatCode + self.ptCount = ptCount + self.pt = pt + + +class NumRef(Serialisable): + + f = NestedText(expected_type=str) + ref = Alias('f') + numCache = Typed(expected_type=NumData, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('f', 'numCache') + + def __init__(self, + f=None, + numCache=None, + extLst=None, + ): + self.f = f + self.numCache = numCache + + +class StrVal(Serialisable): + + tagname = "strVal" + + idx = Integer() + v = NestedText(expected_type=str) + + def __init__(self, + idx=0, + v=None, + ): + self.idx = idx + self.v = v + + +class StrData(Serialisable): + + tagname = "strData" + + ptCount = NestedInteger(allow_none=True) + pt = Sequence(expected_type=StrVal) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('ptCount', 'pt') + + def __init__(self, + ptCount=None, + pt=(), + extLst=None, + ): + self.ptCount = ptCount + self.pt = pt + + +class StrRef(Serialisable): + + tagname = "strRef" + + f = NestedText(expected_type=str, allow_none=True) + strCache = Typed(expected_type=StrData, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('f', 'strCache') + + def __init__(self, + f=None, + strCache=None, + extLst=None, + ): + self.f = f + self.strCache = strCache + + +class NumDataSource(Serialisable): + + numRef = Typed(expected_type=NumRef, allow_none=True) + numLit = Typed(expected_type=NumData, allow_none=True) + + + def __init__(self, + numRef=None, + numLit=None, + ): + self.numRef = numRef + self.numLit = numLit + + +class Level(Serialisable): + + tagname = "lvl" + + pt = Sequence(expected_type=StrVal) + + __elements__ = ('pt',) + + def __init__(self, + pt=(), + ): + self.pt = pt + + +class MultiLevelStrData(Serialisable): + + tagname = "multiLvlStrData" + + ptCount = Integer(allow_none=True) + lvl = Sequence(expected_type=Level) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('ptCount', 'lvl',) + + def __init__(self, + ptCount=None, + lvl=(), + extLst=None, + ): + self.ptCount = ptCount + self.lvl = lvl + + +class MultiLevelStrRef(Serialisable): + + tagname = "multiLvlStrRef" + + f = NestedText(expected_type=str) + multiLvlStrCache = Typed(expected_type=MultiLevelStrData, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('multiLvlStrCache', 'f') + + def __init__(self, + f=None, + multiLvlStrCache=None, + extLst=None, + ): + self.f = f + self.multiLvlStrCache = multiLvlStrCache + + +class AxDataSource(Serialisable): + + tagname = "cat" + + numRef = Typed(expected_type=NumRef, allow_none=True) + numLit = Typed(expected_type=NumData, allow_none=True) + strRef = Typed(expected_type=StrRef, allow_none=True) + strLit = Typed(expected_type=StrData, allow_none=True) + multiLvlStrRef = Typed(expected_type=MultiLevelStrRef, allow_none=True) + + def __init__(self, + numRef=None, + numLit=None, + strRef=None, + strLit=None, + multiLvlStrRef=None, + ): + if not any([numLit, numRef, strRef, strLit, multiLvlStrRef]): + raise TypeError("A data source must be provided") + self.numRef = numRef + self.numLit = numLit + self.strRef = strRef + self.strLit = strLit + self.multiLvlStrRef = multiLvlStrRef diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/descriptors.py b/venv/lib/python3.11/site-packages/openpyxl/chart/descriptors.py new file mode 100755 index 0000000..6bc9434 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/descriptors.py @@ -0,0 +1,43 @@ +# Copyright (c) 2010-2024 openpyxl + + + +from openpyxl.descriptors.nested import ( + NestedMinMax + ) + +from openpyxl.descriptors import Typed + +from .data_source import NumFmt + +""" +Utility descriptors for the chart module. +For convenience but also clarity. +""" + +class NestedGapAmount(NestedMinMax): + + allow_none = True + min = 0 + max = 500 + + +class NestedOverlap(NestedMinMax): + + allow_none = True + min = -100 + max = 100 + + +class NumberFormatDescriptor(Typed): + """ + Allow direct assignment of format code + """ + + expected_type = NumFmt + allow_none = True + + def __set__(self, instance, value): + if isinstance(value, str): + value = NumFmt(value) + super().__set__(instance, value) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/error_bar.py b/venv/lib/python3.11/site-packages/openpyxl/chart/error_bar.py new file mode 100755 index 0000000..6ae2445 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/error_bar.py @@ -0,0 +1,62 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Float, + Set, + Alias +) + +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedNoneSet, + NestedSet, + NestedBool, + NestedFloat, +) + +from .data_source import NumDataSource +from .shapes import GraphicalProperties + + +class ErrorBars(Serialisable): + + tagname = "errBars" + + errDir = NestedNoneSet(values=(['x', 'y'])) + direction = Alias("errDir") + errBarType = NestedSet(values=(['both', 'minus', 'plus'])) + style = Alias("errBarType") + errValType = NestedSet(values=(['cust', 'fixedVal', 'percentage', 'stdDev', 'stdErr'])) + size = Alias("errValType") + noEndCap = NestedBool(nested=True, allow_none=True) + plus = Typed(expected_type=NumDataSource, allow_none=True) + minus = Typed(expected_type=NumDataSource, allow_none=True) + val = NestedFloat(allow_none=True) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias("spPr") + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('errDir','errBarType', 'errValType', 'noEndCap','minus', 'plus', 'val', 'spPr') + + + def __init__(self, + errDir=None, + errBarType="both", + errValType="fixedVal", + noEndCap=None, + plus=None, + minus=None, + val=None, + spPr=None, + extLst=None, + ): + self.errDir = errDir + self.errBarType = errBarType + self.errValType = errValType + self.noEndCap = noEndCap + self.plus = plus + self.minus = minus + self.val = val + self.spPr = spPr diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/label.py b/venv/lib/python3.11/site-packages/openpyxl/chart/label.py new file mode 100755 index 0000000..d6eacb1 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/label.py @@ -0,0 +1,127 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Sequence, + Alias, + Typed +) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedNoneSet, + NestedBool, + NestedString, + NestedInteger, + ) + +from .shapes import GraphicalProperties +from .text import RichText + + +class _DataLabelBase(Serialisable): + + numFmt = NestedString(allow_none=True, attribute="formatCode") + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias('spPr') + txPr = Typed(expected_type=RichText, allow_none=True) + textProperties = Alias('txPr') + dLblPos = NestedNoneSet(values=['bestFit', 'b', 'ctr', 'inBase', 'inEnd', + 'l', 'outEnd', 'r', 't']) + position = Alias('dLblPos') + showLegendKey = NestedBool(allow_none=True) + showVal = NestedBool(allow_none=True) + showCatName = NestedBool(allow_none=True) + showSerName = NestedBool(allow_none=True) + showPercent = NestedBool(allow_none=True) + showBubbleSize = NestedBool(allow_none=True) + showLeaderLines = NestedBool(allow_none=True) + separator = NestedString(allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ("numFmt", "spPr", "txPr", "dLblPos", "showLegendKey", + "showVal", "showCatName", "showSerName", "showPercent", "showBubbleSize", + "showLeaderLines", "separator") + + def __init__(self, + numFmt=None, + spPr=None, + txPr=None, + dLblPos=None, + showLegendKey=None, + showVal=None, + showCatName=None, + showSerName=None, + showPercent=None, + showBubbleSize=None, + showLeaderLines=None, + separator=None, + extLst=None, + ): + self.numFmt = numFmt + self.spPr = spPr + self.txPr = txPr + self.dLblPos = dLblPos + self.showLegendKey = showLegendKey + self.showVal = showVal + self.showCatName = showCatName + self.showSerName = showSerName + self.showPercent = showPercent + self.showBubbleSize = showBubbleSize + self.showLeaderLines = showLeaderLines + self.separator = separator + + +class DataLabel(_DataLabelBase): + + tagname = "dLbl" + + idx = NestedInteger() + + numFmt = _DataLabelBase.numFmt + spPr = _DataLabelBase.spPr + txPr = _DataLabelBase.txPr + dLblPos = _DataLabelBase.dLblPos + showLegendKey = _DataLabelBase.showLegendKey + showVal = _DataLabelBase.showVal + showCatName = _DataLabelBase.showCatName + showSerName = _DataLabelBase.showSerName + showPercent = _DataLabelBase.showPercent + showBubbleSize = _DataLabelBase.showBubbleSize + showLeaderLines = _DataLabelBase.showLeaderLines + separator = _DataLabelBase.separator + extLst = _DataLabelBase.extLst + + __elements__ = ("idx",) + _DataLabelBase.__elements__ + + def __init__(self, idx=0, **kw ): + self.idx = idx + super().__init__(**kw) + + +class DataLabelList(_DataLabelBase): + + tagname = "dLbls" + + dLbl = Sequence(expected_type=DataLabel, allow_none=True) + + delete = NestedBool(allow_none=True) + numFmt = _DataLabelBase.numFmt + spPr = _DataLabelBase.spPr + txPr = _DataLabelBase.txPr + dLblPos = _DataLabelBase.dLblPos + showLegendKey = _DataLabelBase.showLegendKey + showVal = _DataLabelBase.showVal + showCatName = _DataLabelBase.showCatName + showSerName = _DataLabelBase.showSerName + showPercent = _DataLabelBase.showPercent + showBubbleSize = _DataLabelBase.showBubbleSize + showLeaderLines = _DataLabelBase.showLeaderLines + separator = _DataLabelBase.separator + extLst = _DataLabelBase.extLst + + __elements__ = ("delete", "dLbl",) + _DataLabelBase.__elements__ + + def __init__(self, dLbl=(), delete=None, **kw): + self.dLbl = dLbl + self.delete = delete + super().__init__(**kw) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/layout.py b/venv/lib/python3.11/site-packages/openpyxl/chart/layout.py new file mode 100755 index 0000000..f2f6553 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/layout.py @@ -0,0 +1,74 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + NoneSet, + Float, + Typed, + Alias, +) + +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedNoneSet, + NestedSet, + NestedMinMax, +) + +class ManualLayout(Serialisable): + + tagname = "manualLayout" + + layoutTarget = NestedNoneSet(values=(['inner', 'outer'])) + xMode = NestedNoneSet(values=(['edge', 'factor'])) + yMode = NestedNoneSet(values=(['edge', 'factor'])) + wMode = NestedSet(values=(['edge', 'factor'])) + hMode = NestedSet(values=(['edge', 'factor'])) + x = NestedMinMax(min=-1, max=1, allow_none=True) + y = NestedMinMax(min=-1, max=1, allow_none=True) + w = NestedMinMax(min=0, max=1, allow_none=True) + width = Alias('w') + h = NestedMinMax(min=0, max=1, allow_none=True) + height = Alias('h') + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('layoutTarget', 'xMode', 'yMode', 'wMode', 'hMode', 'x', + 'y', 'w', 'h') + + def __init__(self, + layoutTarget=None, + xMode=None, + yMode=None, + wMode="factor", + hMode="factor", + x=None, + y=None, + w=None, + h=None, + extLst=None, + ): + self.layoutTarget = layoutTarget + self.xMode = xMode + self.yMode = yMode + self.wMode = wMode + self.hMode = hMode + self.x = x + self.y = y + self.w = w + self.h = h + + +class Layout(Serialisable): + + tagname = "layout" + + manualLayout = Typed(expected_type=ManualLayout, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('manualLayout',) + + def __init__(self, + manualLayout=None, + extLst=None, + ): + self.manualLayout = manualLayout diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/legend.py b/venv/lib/python3.11/site-packages/openpyxl/chart/legend.py new file mode 100755 index 0000000..1f7c802 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/legend.py @@ -0,0 +1,75 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Integer, + Alias, + Sequence, +) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedBool, + NestedSet, + NestedInteger +) + +from .layout import Layout +from .shapes import GraphicalProperties +from .text import RichText + + +class LegendEntry(Serialisable): + + tagname = "legendEntry" + + idx = NestedInteger() + delete = NestedBool() + txPr = Typed(expected_type=RichText, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('idx', 'delete', 'txPr') + + def __init__(self, + idx=0, + delete=False, + txPr=None, + extLst=None, + ): + self.idx = idx + self.delete = delete + self.txPr = txPr + + +class Legend(Serialisable): + + tagname = "legend" + + legendPos = NestedSet(values=(['b', 'tr', 'l', 'r', 't'])) + position = Alias('legendPos') + legendEntry = Sequence(expected_type=LegendEntry) + layout = Typed(expected_type=Layout, allow_none=True) + overlay = NestedBool(allow_none=True) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias('spPr') + txPr = Typed(expected_type=RichText, allow_none=True) + textProperties = Alias('txPr') + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('legendPos', 'legendEntry', 'layout', 'overlay', 'spPr', 'txPr',) + + def __init__(self, + legendPos="r", + legendEntry=(), + layout=None, + overlay=None, + spPr=None, + txPr=None, + extLst=None, + ): + self.legendPos = legendPos + self.legendEntry = legendEntry + self.layout = layout + self.overlay = overlay + self.spPr = spPr + self.txPr = txPr diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/line_chart.py b/venv/lib/python3.11/site-packages/openpyxl/chart/line_chart.py new file mode 100755 index 0000000..0aa3ad5 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/line_chart.py @@ -0,0 +1,129 @@ +#Autogenerated schema +from openpyxl.descriptors import ( + Typed, + Sequence, + Alias, + ) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedSet, + NestedBool, +) + +from ._chart import ChartBase +from .updown_bars import UpDownBars +from .descriptors import NestedGapAmount +from .axis import TextAxis, NumericAxis, SeriesAxis, ChartLines, _BaseAxis +from .label import DataLabelList +from .series import Series + + +class _LineChartBase(ChartBase): + + grouping = NestedSet(values=(['percentStacked', 'standard', 'stacked'])) + varyColors = NestedBool(allow_none=True) + ser = Sequence(expected_type=Series, allow_none=True) + dLbls = Typed(expected_type=DataLabelList, allow_none=True) + dataLabels = Alias("dLbls") + dropLines = Typed(expected_type=ChartLines, allow_none=True) + + _series_type = "line" + + __elements__ = ('grouping', 'varyColors', 'ser', 'dLbls', 'dropLines') + + def __init__(self, + grouping="standard", + varyColors=None, + ser=(), + dLbls=None, + dropLines=None, + **kw + ): + self.grouping = grouping + self.varyColors = varyColors + self.ser = ser + self.dLbls = dLbls + self.dropLines = dropLines + super().__init__(**kw) + + +class LineChart(_LineChartBase): + + tagname = "lineChart" + + grouping = _LineChartBase.grouping + varyColors = _LineChartBase.varyColors + ser = _LineChartBase.ser + dLbls = _LineChartBase.dLbls + dropLines =_LineChartBase.dropLines + + hiLowLines = Typed(expected_type=ChartLines, allow_none=True) + upDownBars = Typed(expected_type=UpDownBars, allow_none=True) + marker = NestedBool(allow_none=True) + smooth = NestedBool(allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + x_axis = Typed(expected_type=_BaseAxis) + y_axis = Typed(expected_type=NumericAxis) + + __elements__ = _LineChartBase.__elements__ + ('hiLowLines', 'upDownBars', 'marker', 'smooth', 'axId') + + def __init__(self, + hiLowLines=None, + upDownBars=None, + marker=None, + smooth=None, + extLst=None, + **kw + ): + self.hiLowLines = hiLowLines + self.upDownBars = upDownBars + self.marker = marker + self.smooth = smooth + self.x_axis = TextAxis() + self.y_axis = NumericAxis() + + super().__init__(**kw) + + +class LineChart3D(_LineChartBase): + + tagname = "line3DChart" + + grouping = _LineChartBase.grouping + varyColors = _LineChartBase.varyColors + ser = _LineChartBase.ser + dLbls = _LineChartBase.dLbls + dropLines =_LineChartBase.dropLines + + gapDepth = NestedGapAmount() + hiLowLines = Typed(expected_type=ChartLines, allow_none=True) + upDownBars = Typed(expected_type=UpDownBars, allow_none=True) + marker = NestedBool(allow_none=True) + smooth = NestedBool(allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + x_axis = Typed(expected_type=TextAxis) + y_axis = Typed(expected_type=NumericAxis) + z_axis = Typed(expected_type=SeriesAxis) + + __elements__ = _LineChartBase.__elements__ + ('gapDepth', 'hiLowLines', + 'upDownBars', 'marker', 'smooth', 'axId') + + def __init__(self, + gapDepth=None, + hiLowLines=None, + upDownBars=None, + marker=None, + smooth=None, + **kw + ): + self.gapDepth = gapDepth + self.hiLowLines = hiLowLines + self.upDownBars = upDownBars + self.marker = marker + self.smooth = smooth + self.x_axis = TextAxis() + self.y_axis = NumericAxis() + self.z_axis = SeriesAxis() + super(LineChart3D, self).__init__(**kw) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/marker.py b/venv/lib/python3.11/site-packages/openpyxl/chart/marker.py new file mode 100755 index 0000000..61e2641 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/marker.py @@ -0,0 +1,90 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Alias, +) + +from openpyxl.descriptors.excel import( + ExtensionList, + _explicit_none, +) + +from openpyxl.descriptors.nested import ( + NestedBool, + NestedInteger, + NestedMinMax, + NestedNoneSet, +) + +from .layout import Layout +from .picture import PictureOptions +from .shapes import * +from .text import * +from .error_bar import * + + +class Marker(Serialisable): + + tagname = "marker" + + symbol = NestedNoneSet(values=(['circle', 'dash', 'diamond', 'dot', 'picture', + 'plus', 'square', 'star', 'triangle', 'x', 'auto']), + to_tree=_explicit_none) + size = NestedMinMax(min=2, max=72, allow_none=True) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias('spPr') + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('symbol', 'size', 'spPr') + + def __init__(self, + symbol=None, + size=None, + spPr=None, + extLst=None, + ): + self.symbol = symbol + self.size = size + if spPr is None: + spPr = GraphicalProperties() + self.spPr = spPr + + +class DataPoint(Serialisable): + + tagname = "dPt" + + idx = NestedInteger() + invertIfNegative = NestedBool(allow_none=True) + marker = Typed(expected_type=Marker, allow_none=True) + bubble3D = NestedBool(allow_none=True) + explosion = NestedInteger(allow_none=True) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias('spPr') + pictureOptions = Typed(expected_type=PictureOptions, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('idx', 'invertIfNegative', 'marker', 'bubble3D', + 'explosion', 'spPr', 'pictureOptions') + + def __init__(self, + idx=None, + invertIfNegative=None, + marker=None, + bubble3D=None, + explosion=None, + spPr=None, + pictureOptions=None, + extLst=None, + ): + self.idx = idx + self.invertIfNegative = invertIfNegative + self.marker = marker + self.bubble3D = bubble3D + self.explosion = explosion + if spPr is None: + spPr = GraphicalProperties() + self.spPr = spPr + self.pictureOptions = pictureOptions diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/picture.py b/venv/lib/python3.11/site-packages/openpyxl/chart/picture.py new file mode 100755 index 0000000..8c917d8 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/picture.py @@ -0,0 +1,35 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable + +from openpyxl.descriptors.nested import ( + NestedBool, + NestedFloat, + NestedMinMax, + NestedNoneSet, +) + +class PictureOptions(Serialisable): + + tagname = "pictureOptions" + + applyToFront = NestedBool(allow_none=True, nested=True) + applyToSides = NestedBool(allow_none=True, nested=True) + applyToEnd = NestedBool(allow_none=True, nested=True) + pictureFormat = NestedNoneSet(values=(['stretch', 'stack', 'stackScale']), nested=True) + pictureStackUnit = NestedFloat(allow_none=True, nested=True) + + __elements__ = ('applyToFront', 'applyToSides', 'applyToEnd', 'pictureFormat', 'pictureStackUnit') + + def __init__(self, + applyToFront=None, + applyToSides=None, + applyToEnd=None, + pictureFormat=None, + pictureStackUnit=None, + ): + self.applyToFront = applyToFront + self.applyToSides = applyToSides + self.applyToEnd = applyToEnd + self.pictureFormat = pictureFormat + self.pictureStackUnit = pictureStackUnit diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/pie_chart.py b/venv/lib/python3.11/site-packages/openpyxl/chart/pie_chart.py new file mode 100755 index 0000000..6bb67e1 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/pie_chart.py @@ -0,0 +1,177 @@ +#Autogenerated schema +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Bool, + MinMax, + Integer, + NoneSet, + Float, + Alias, + Sequence, +) +from openpyxl.descriptors.excel import ExtensionList, Percentage +from openpyxl.descriptors.nested import ( + NestedBool, + NestedMinMax, + NestedInteger, + NestedFloat, + NestedNoneSet, + NestedSet, +) +from openpyxl.descriptors.sequence import ValueSequence + +from ._chart import ChartBase +from .axis import ChartLines +from .descriptors import NestedGapAmount +from .series import Series +from .label import DataLabelList + + +class _PieChartBase(ChartBase): + + varyColors = NestedBool(allow_none=True) + ser = Sequence(expected_type=Series, allow_none=True) + dLbls = Typed(expected_type=DataLabelList, allow_none=True) + dataLabels = Alias("dLbls") + + _series_type = "pie" + + __elements__ = ('varyColors', 'ser', 'dLbls') + + def __init__(self, + varyColors=True, + ser=(), + dLbls=None, + ): + self.varyColors = varyColors + self.ser = ser + self.dLbls = dLbls + super().__init__() + + + +class PieChart(_PieChartBase): + + tagname = "pieChart" + + varyColors = _PieChartBase.varyColors + ser = _PieChartBase.ser + dLbls = _PieChartBase.dLbls + + firstSliceAng = NestedMinMax(min=0, max=360) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = _PieChartBase.__elements__ + ('firstSliceAng', ) + + def __init__(self, + firstSliceAng=0, + extLst=None, + **kw + ): + self.firstSliceAng = firstSliceAng + super().__init__(**kw) + + +class PieChart3D(_PieChartBase): + + tagname = "pie3DChart" + + varyColors = _PieChartBase.varyColors + ser = _PieChartBase.ser + dLbls = _PieChartBase.dLbls + + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = _PieChartBase.__elements__ + + +class DoughnutChart(_PieChartBase): + + tagname = "doughnutChart" + + varyColors = _PieChartBase.varyColors + ser = _PieChartBase.ser + dLbls = _PieChartBase.dLbls + + firstSliceAng = NestedMinMax(min=0, max=360) + holeSize = NestedMinMax(min=1, max=90, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = _PieChartBase.__elements__ + ('firstSliceAng', 'holeSize') + + def __init__(self, + firstSliceAng=0, + holeSize=10, + extLst=None, + **kw + ): + self.firstSliceAng = firstSliceAng + self.holeSize = holeSize + super().__init__(**kw) + + +class CustomSplit(Serialisable): + + tagname = "custSplit" + + secondPiePt = ValueSequence(expected_type=int) + + __elements__ = ('secondPiePt',) + + def __init__(self, + secondPiePt=(), + ): + self.secondPiePt = secondPiePt + + +class ProjectedPieChart(_PieChartBase): + + """ + From the spec 21.2.2.126 + + This element contains the pie of pie or bar of pie series on this + chart. Only the first series shall be displayed. The splitType element + shall determine whether the splitPos and custSplit elements apply. + """ + + tagname = "ofPieChart" + + varyColors = _PieChartBase.varyColors + ser = _PieChartBase.ser + dLbls = _PieChartBase.dLbls + + ofPieType = NestedSet(values=(['pie', 'bar'])) + type = Alias('ofPieType') + gapWidth = NestedGapAmount() + splitType = NestedNoneSet(values=(['auto', 'cust', 'percent', 'pos', 'val'])) + splitPos = NestedFloat(allow_none=True) + custSplit = Typed(expected_type=CustomSplit, allow_none=True) + secondPieSize = NestedMinMax(min=5, max=200, allow_none=True) + serLines = Typed(expected_type=ChartLines, allow_none=True) + join_lines = Alias('serLines') + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = _PieChartBase.__elements__ + ('ofPieType', 'gapWidth', + 'splitType', 'splitPos', 'custSplit', 'secondPieSize', 'serLines') + + def __init__(self, + ofPieType="pie", + gapWidth=None, + splitType="auto", + splitPos=None, + custSplit=None, + secondPieSize=75, + serLines=None, + extLst=None, + **kw + ): + self.ofPieType = ofPieType + self.gapWidth = gapWidth + self.splitType = splitType + self.splitPos = splitPos + self.custSplit = custSplit + self.secondPieSize = secondPieSize + if serLines is None: + self.serLines = ChartLines() + super().__init__(**kw) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/pivot.py b/venv/lib/python3.11/site-packages/openpyxl/chart/pivot.py new file mode 100755 index 0000000..937fd29 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/pivot.py @@ -0,0 +1,65 @@ + +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Alias, + Typed, +) +from openpyxl.descriptors.nested import NestedInteger, NestedText +from openpyxl.descriptors.excel import ExtensionList + +from .label import DataLabel +from .marker import Marker +from .shapes import GraphicalProperties +from .text import RichText + + +class PivotSource(Serialisable): + + tagname = "pivotSource" + + name = NestedText(expected_type=str) + fmtId = NestedInteger(expected_type=int) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('name', 'fmtId') + + def __init__(self, + name=None, + fmtId=None, + extLst=None, + ): + self.name = name + self.fmtId = fmtId + + +class PivotFormat(Serialisable): + + tagname = "pivotFmt" + + idx = NestedInteger(nested=True) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias("spPr") + txPr = Typed(expected_type=RichText, allow_none=True) + TextBody = Alias("txPr") + marker = Typed(expected_type=Marker, allow_none=True) + dLbl = Typed(expected_type=DataLabel, allow_none=True) + DataLabel = Alias("dLbl") + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('idx', 'spPr', 'txPr', 'marker', 'dLbl') + + def __init__(self, + idx=0, + spPr=None, + txPr=None, + marker=None, + dLbl=None, + extLst=None, + ): + self.idx = idx + self.spPr = spPr + self.txPr = txPr + self.marker = marker + self.dLbl = dLbl diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/plotarea.py b/venv/lib/python3.11/site-packages/openpyxl/chart/plotarea.py new file mode 100755 index 0000000..268bfbc --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/plotarea.py @@ -0,0 +1,162 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Alias, +) +from openpyxl.descriptors.excel import ( + ExtensionList, +) +from openpyxl.descriptors.sequence import ( + MultiSequence, + MultiSequencePart, +) +from openpyxl.descriptors.nested import ( + NestedBool, +) + +from ._3d import _3DBase +from .area_chart import AreaChart, AreaChart3D +from .bar_chart import BarChart, BarChart3D +from .bubble_chart import BubbleChart +from .line_chart import LineChart, LineChart3D +from .pie_chart import PieChart, PieChart3D, ProjectedPieChart, DoughnutChart +from .radar_chart import RadarChart +from .scatter_chart import ScatterChart +from .stock_chart import StockChart +from .surface_chart import SurfaceChart, SurfaceChart3D +from .layout import Layout +from .shapes import GraphicalProperties +from .text import RichText + +from .axis import ( + NumericAxis, + TextAxis, + SeriesAxis, + DateAxis, +) + + +class DataTable(Serialisable): + + tagname = "dTable" + + showHorzBorder = NestedBool(allow_none=True) + showVertBorder = NestedBool(allow_none=True) + showOutline = NestedBool(allow_none=True) + showKeys = NestedBool(allow_none=True) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias('spPr') + txPr = Typed(expected_type=RichText, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('showHorzBorder', 'showVertBorder', 'showOutline', + 'showKeys', 'spPr', 'txPr') + + def __init__(self, + showHorzBorder=None, + showVertBorder=None, + showOutline=None, + showKeys=None, + spPr=None, + txPr=None, + extLst=None, + ): + self.showHorzBorder = showHorzBorder + self.showVertBorder = showVertBorder + self.showOutline = showOutline + self.showKeys = showKeys + self.spPr = spPr + self.txPr = txPr + + +class PlotArea(Serialisable): + + tagname = "plotArea" + + layout = Typed(expected_type=Layout, allow_none=True) + dTable = Typed(expected_type=DataTable, allow_none=True) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias("spPr") + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + # at least one chart + _charts = MultiSequence() + areaChart = MultiSequencePart(expected_type=AreaChart, store="_charts") + area3DChart = MultiSequencePart(expected_type=AreaChart3D, store="_charts") + lineChart = MultiSequencePart(expected_type=LineChart, store="_charts") + line3DChart = MultiSequencePart(expected_type=LineChart3D, store="_charts") + stockChart = MultiSequencePart(expected_type=StockChart, store="_charts") + radarChart = MultiSequencePart(expected_type=RadarChart, store="_charts") + scatterChart = MultiSequencePart(expected_type=ScatterChart, store="_charts") + pieChart = MultiSequencePart(expected_type=PieChart, store="_charts") + pie3DChart = MultiSequencePart(expected_type=PieChart3D, store="_charts") + doughnutChart = MultiSequencePart(expected_type=DoughnutChart, store="_charts") + barChart = MultiSequencePart(expected_type=BarChart, store="_charts") + bar3DChart = MultiSequencePart(expected_type=BarChart3D, store="_charts") + ofPieChart = MultiSequencePart(expected_type=ProjectedPieChart, store="_charts") + surfaceChart = MultiSequencePart(expected_type=SurfaceChart, store="_charts") + surface3DChart = MultiSequencePart(expected_type=SurfaceChart3D, store="_charts") + bubbleChart = MultiSequencePart(expected_type=BubbleChart, store="_charts") + + # axes + _axes = MultiSequence() + valAx = MultiSequencePart(expected_type=NumericAxis, store="_axes") + catAx = MultiSequencePart(expected_type=TextAxis, store="_axes") + dateAx = MultiSequencePart(expected_type=DateAxis, store="_axes") + serAx = MultiSequencePart(expected_type=SeriesAxis, store="_axes") + + __elements__ = ('layout', '_charts', '_axes', 'dTable', 'spPr') + + def __init__(self, + layout=None, + dTable=None, + spPr=None, + _charts=(), + _axes=(), + extLst=None, + ): + self.layout = layout + self.dTable = dTable + self.spPr = spPr + self._charts = _charts + self._axes = _axes + + + def to_tree(self, tagname=None, idx=None, namespace=None): + axIds = {ax.axId for ax in self._axes} + for chart in self._charts: + for id, axis in chart._axes.items(): + if id not in axIds: + setattr(self, axis.tagname, axis) + axIds.add(id) + + return super().to_tree(tagname) + + + @classmethod + def from_tree(cls, node): + self = super().from_tree(node) + axes = dict((axis.axId, axis) for axis in self._axes) + for chart in self._charts: + if isinstance(chart, (ScatterChart, BubbleChart)): + x, y = (axes[axId] for axId in chart.axId) + chart.x_axis = x + chart.y_axis = y + continue + + for axId in chart.axId: + axis = axes.get(axId) + if axis is None and isinstance(chart, _3DBase): + # Series Axis can be optional + chart.z_axis = None + continue + if axis.tagname in ("catAx", "dateAx"): + chart.x_axis = axis + elif axis.tagname == "valAx": + chart.y_axis = axis + elif axis.tagname == "serAx": + chart.z_axis = axis + + return self diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/print_settings.py b/venv/lib/python3.11/site-packages/openpyxl/chart/print_settings.py new file mode 100755 index 0000000..6513731 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/print_settings.py @@ -0,0 +1,57 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Float, + Typed, + Alias, +) + +from openpyxl.worksheet.page import PrintPageSetup +from openpyxl.worksheet.header_footer import HeaderFooter + + +class PageMargins(Serialisable): + """ + Identical to openpyxl.worksheet.page.Pagemargins but element names are different :-/ + """ + tagname = "pageMargins" + + l = Float() + left = Alias('l') + r = Float() + right = Alias('r') + t = Float() + top = Alias('t') + b = Float() + bottom = Alias('b') + header = Float() + footer = Float() + + def __init__(self, l=0.75, r=0.75, t=1, b=1, header=0.5, footer=0.5): + self.l = l + self.r = r + self.t = t + self.b = b + self.header = header + self.footer = footer + + +class PrintSettings(Serialisable): + + tagname = "printSettings" + + headerFooter = Typed(expected_type=HeaderFooter, allow_none=True) + pageMargins = Typed(expected_type=PageMargins, allow_none=True) + pageSetup = Typed(expected_type=PrintPageSetup, allow_none=True) + + __elements__ = ("headerFooter", "pageMargins", "pageMargins") + + def __init__(self, + headerFooter=None, + pageMargins=None, + pageSetup=None, + ): + self.headerFooter = headerFooter + self.pageMargins = pageMargins + self.pageSetup = pageSetup diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/radar_chart.py b/venv/lib/python3.11/site-packages/openpyxl/chart/radar_chart.py new file mode 100755 index 0000000..fa3aa0d --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/radar_chart.py @@ -0,0 +1,55 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Sequence, + Typed, + Alias, +) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedBool, + NestedInteger, + NestedSet +) + +from ._chart import ChartBase +from .axis import TextAxis, NumericAxis +from .series import Series +from .label import DataLabelList + + +class RadarChart(ChartBase): + + tagname = "radarChart" + + radarStyle = NestedSet(values=(['standard', 'marker', 'filled'])) + type = Alias("radarStyle") + varyColors = NestedBool(nested=True, allow_none=True) + ser = Sequence(expected_type=Series, allow_none=True) + dLbls = Typed(expected_type=DataLabelList, allow_none=True) + dataLabels = Alias("dLbls") + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + _series_type = "radar" + + x_axis = Typed(expected_type=TextAxis) + y_axis = Typed(expected_type=NumericAxis) + + __elements__ = ('radarStyle', 'varyColors', 'ser', 'dLbls', 'axId') + + def __init__(self, + radarStyle="standard", + varyColors=None, + ser=(), + dLbls=None, + extLst=None, + **kw + ): + self.radarStyle = radarStyle + self.varyColors = varyColors + self.ser = ser + self.dLbls = dLbls + self.x_axis = TextAxis() + self.y_axis = NumericAxis() + super().__init__(**kw) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/reader.py b/venv/lib/python3.11/site-packages/openpyxl/chart/reader.py new file mode 100755 index 0000000..0ef719f --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/reader.py @@ -0,0 +1,32 @@ +# Copyright (c) 2010-2024 openpyxl + +""" +Read a chart +""" + +def read_chart(chartspace): + cs = chartspace + plot = cs.chart.plotArea + + chart = plot._charts[0] + chart._charts = plot._charts + + chart.title = cs.chart.title + chart.display_blanks = cs.chart.dispBlanksAs + chart.visible_cells_only = cs.chart.plotVisOnly + chart.layout = plot.layout + chart.legend = cs.chart.legend + + # 3d attributes + chart.floor = cs.chart.floor + chart.sideWall = cs.chart.sideWall + chart.backWall = cs.chart.backWall + chart.pivotSource = cs.pivotSource + chart.pivotFormats = cs.chart.pivotFmts + chart.idx_base = min((s.idx for s in chart.series), default=0) + chart._reindex() + + # Border, fill, etc. + chart.graphical_properties = cs.graphical_properties + + return chart diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/reference.py b/venv/lib/python3.11/site-packages/openpyxl/chart/reference.py new file mode 100755 index 0000000..dc10279 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/reference.py @@ -0,0 +1,124 @@ +# Copyright (c) 2010-2024 openpyxl + +from itertools import chain + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + MinMax, + Typed, + String, + Strict, +) +from openpyxl.worksheet.worksheet import Worksheet +from openpyxl.utils import ( + get_column_letter, + range_to_tuple, + quote_sheetname +) + + +class DummyWorksheet: + + + def __init__(self, title): + self.title = title + + +class Reference(Strict): + + """ + Normalise cell range references + """ + + min_row = MinMax(min=1, max=1000000, expected_type=int) + max_row = MinMax(min=1, max=1000000, expected_type=int) + min_col = MinMax(min=1, max=16384, expected_type=int) + max_col = MinMax(min=1, max=16384, expected_type=int) + range_string = String(allow_none=True) + + def __init__(self, + worksheet=None, + min_col=None, + min_row=None, + max_col=None, + max_row=None, + range_string=None + ): + if range_string is not None: + sheetname, boundaries = range_to_tuple(range_string) + min_col, min_row, max_col, max_row = boundaries + worksheet = DummyWorksheet(sheetname) + + self.worksheet = worksheet + self.min_col = min_col + self.min_row = min_row + if max_col is None: + max_col = min_col + self.max_col = max_col + if max_row is None: + max_row = min_row + self.max_row = max_row + + + def __repr__(self): + return str(self) + + + def __str__(self): + fmt = u"{0}!${1}${2}:${3}${4}" + if (self.min_col == self.max_col + and self.min_row == self.max_row): + fmt = u"{0}!${1}${2}" + return fmt.format(self.sheetname, + get_column_letter(self.min_col), self.min_row, + get_column_letter(self.max_col), self.max_row + ) + + + __str__ = __str__ + + + + def __len__(self): + if self.min_row == self.max_row: + return 1 + self.max_col - self.min_col + return 1 + self.max_row - self.min_row + + + def __eq__(self, other): + return str(self) == str(other) + + + @property + def rows(self): + """ + Return all rows in the range + """ + for row in range(self.min_row, self.max_row+1): + yield Reference(self.worksheet, self.min_col, row, self.max_col, row) + + + @property + def cols(self): + """ + Return all columns in the range + """ + for col in range(self.min_col, self.max_col+1): + yield Reference(self.worksheet, col, self.min_row, col, self.max_row) + + + def pop(self): + """ + Return and remove the first cell + """ + cell = "{0}{1}".format(get_column_letter(self.min_col), self.min_row) + if self.min_row == self.max_row: + self.min_col += 1 + else: + self.min_row += 1 + return cell + + + @property + def sheetname(self): + return quote_sheetname(self.worksheet.title) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/scatter_chart.py b/venv/lib/python3.11/site-packages/openpyxl/chart/scatter_chart.py new file mode 100755 index 0000000..2699239 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/scatter_chart.py @@ -0,0 +1,53 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Sequence, + Alias +) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedNoneSet, + NestedBool, +) + +from ._chart import ChartBase +from .axis import NumericAxis, TextAxis +from .series import XYSeries +from .label import DataLabelList + + +class ScatterChart(ChartBase): + + tagname = "scatterChart" + + scatterStyle = NestedNoneSet(values=(['line', 'lineMarker', 'marker', 'smooth', 'smoothMarker'])) + varyColors = NestedBool(allow_none=True) + ser = Sequence(expected_type=XYSeries, allow_none=True) + dLbls = Typed(expected_type=DataLabelList, allow_none=True) + dataLabels = Alias("dLbls") + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + x_axis = Typed(expected_type=(NumericAxis, TextAxis)) + y_axis = Typed(expected_type=NumericAxis) + + _series_type = "scatter" + + __elements__ = ('scatterStyle', 'varyColors', 'ser', 'dLbls', 'axId',) + + def __init__(self, + scatterStyle=None, + varyColors=None, + ser=(), + dLbls=None, + extLst=None, + **kw + ): + self.scatterStyle = scatterStyle + self.varyColors = varyColors + self.ser = ser + self.dLbls = dLbls + self.x_axis = NumericAxis(axId=10, crossAx=20) + self.y_axis = NumericAxis(axId=20, crossAx=10) + super().__init__(**kw) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/series.py b/venv/lib/python3.11/site-packages/openpyxl/chart/series.py new file mode 100755 index 0000000..f1403a6 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/series.py @@ -0,0 +1,197 @@ +# Copyright (c) 2010-2024 openpyxl + + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + String, + Integer, + Bool, + Alias, + Sequence, +) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedInteger, + NestedBool, + NestedNoneSet, + NestedText, +) + +from .shapes import GraphicalProperties +from .data_source import ( + AxDataSource, + NumDataSource, + NumRef, + StrRef, +) +from .error_bar import ErrorBars +from .label import DataLabelList +from .marker import DataPoint, PictureOptions, Marker +from .trendline import Trendline + +attribute_mapping = { + 'area': ('idx', 'order', 'tx', 'spPr', 'pictureOptions', 'dPt', 'dLbls', 'errBars', + 'trendline', 'cat', 'val',), + 'bar':('idx', 'order','tx', 'spPr', 'invertIfNegative', 'pictureOptions', 'dPt', + 'dLbls', 'trendline', 'errBars', 'cat', 'val', 'shape'), + 'bubble':('idx','order', 'tx', 'spPr', 'invertIfNegative', 'dPt', 'dLbls', + 'trendline', 'errBars', 'xVal', 'yVal', 'bubbleSize', 'bubble3D'), + 'line':('idx', 'order', 'tx', 'spPr', 'marker', 'dPt', 'dLbls', 'trendline', + 'errBars', 'cat', 'val', 'smooth'), + 'pie':('idx', 'order', 'tx', 'spPr', 'explosion', 'dPt', 'dLbls', 'cat', 'val'), + 'radar':('idx', 'order', 'tx', 'spPr', 'marker', 'dPt', 'dLbls', 'cat', 'val'), + 'scatter':('idx', 'order', 'tx', 'spPr', 'marker', 'dPt', 'dLbls', 'trendline', + 'errBars', 'xVal', 'yVal', 'smooth'), + 'surface':('idx', 'order', 'tx', 'spPr', 'cat', 'val'), + } + + +class SeriesLabel(Serialisable): + + tagname = "tx" + + strRef = Typed(expected_type=StrRef, allow_none=True) + v = NestedText(expected_type=str, allow_none=True) + value = Alias('v') + + __elements__ = ('strRef', 'v') + + def __init__(self, + strRef=None, + v=None): + self.strRef = strRef + self.v = v + + +class Series(Serialisable): + + """ + Generic series object. Should not be instantiated directly. + User the chart.Series factory instead. + """ + + tagname = "ser" + + idx = NestedInteger() + order = NestedInteger() + tx = Typed(expected_type=SeriesLabel, allow_none=True) + title = Alias('tx') + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias('spPr') + + # area chart + pictureOptions = Typed(expected_type=PictureOptions, allow_none=True) + dPt = Sequence(expected_type=DataPoint, allow_none=True) + data_points = Alias("dPt") + dLbls = Typed(expected_type=DataLabelList, allow_none=True) + labels = Alias("dLbls") + trendline = Typed(expected_type=Trendline, allow_none=True) + errBars = Typed(expected_type=ErrorBars, allow_none=True) + cat = Typed(expected_type=AxDataSource, allow_none=True) + identifiers = Alias("cat") + val = Typed(expected_type=NumDataSource, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + #bar chart + invertIfNegative = NestedBool(allow_none=True) + shape = NestedNoneSet(values=(['cone', 'coneToMax', 'box', 'cylinder', 'pyramid', 'pyramidToMax'])) + + #bubble chart + xVal = Typed(expected_type=AxDataSource, allow_none=True) + yVal = Typed(expected_type=NumDataSource, allow_none=True) + bubbleSize = Typed(expected_type=NumDataSource, allow_none=True) + zVal = Alias("bubbleSize") + bubble3D = NestedBool(allow_none=True) + + #line chart + marker = Typed(expected_type=Marker, allow_none=True) + smooth = NestedBool(allow_none=True) + + #pie chart + explosion = NestedInteger(allow_none=True) + + __elements__ = () + + + def __init__(self, + idx=0, + order=0, + tx=None, + spPr=None, + pictureOptions=None, + dPt=(), + dLbls=None, + trendline=None, + errBars=None, + cat=None, + val=None, + invertIfNegative=None, + shape=None, + xVal=None, + yVal=None, + bubbleSize=None, + bubble3D=None, + marker=None, + smooth=None, + explosion=None, + extLst=None, + ): + self.idx = idx + self.order = order + self.tx = tx + if spPr is None: + spPr = GraphicalProperties() + self.spPr = spPr + self.pictureOptions = pictureOptions + self.dPt = dPt + self.dLbls = dLbls + self.trendline = trendline + self.errBars = errBars + self.cat = cat + self.val = val + self.invertIfNegative = invertIfNegative + self.shape = shape + self.xVal = xVal + self.yVal = yVal + self.bubbleSize = bubbleSize + self.bubble3D = bubble3D + if marker is None: + marker = Marker() + self.marker = marker + self.smooth = smooth + self.explosion = explosion + + + def to_tree(self, tagname=None, idx=None): + """The index can need rebasing""" + if idx is not None: + if self.order == self.idx: + self.order = idx # rebase the order if the index has been rebased + self.idx = idx + return super().to_tree(tagname) + + +class XYSeries(Series): + + """Dedicated series for charts that have x and y series""" + + idx = Series.idx + order = Series.order + tx = Series.tx + spPr = Series.spPr + + dPt = Series.dPt + dLbls = Series.dLbls + trendline = Series.trendline + errBars = Series.errBars + xVal = Series.xVal + yVal = Series.yVal + + invertIfNegative = Series.invertIfNegative + + bubbleSize = Series.bubbleSize + bubble3D = Series.bubble3D + + marker = Series.marker + smooth = Series.smooth diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/series_factory.py b/venv/lib/python3.11/site-packages/openpyxl/chart/series_factory.py new file mode 100755 index 0000000..90b368d --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/series_factory.py @@ -0,0 +1,41 @@ +# Copyright (c) 2010-2024 openpyxl + +from .data_source import NumDataSource, NumRef, AxDataSource +from .reference import Reference +from .series import Series, XYSeries, SeriesLabel, StrRef +from openpyxl.utils import rows_from_range, quote_sheetname + + +def SeriesFactory(values, xvalues=None, zvalues=None, title=None, title_from_data=False): + """ + Convenience Factory for creating chart data series. + """ + + if not isinstance(values, Reference): + values = Reference(range_string=values) + + if title_from_data: + cell = values.pop() + title = u"{0}!{1}".format(values.sheetname, cell) + title = SeriesLabel(strRef=StrRef(title)) + elif title is not None: + title = SeriesLabel(v=title) + + source = NumDataSource(numRef=NumRef(f=values)) + if xvalues is not None: + if not isinstance(xvalues, Reference): + xvalues = Reference(range_string=xvalues) + series = XYSeries() + series.yVal = source + series.xVal = AxDataSource(numRef=NumRef(f=xvalues)) + if zvalues is not None: + if not isinstance(zvalues, Reference): + zvalues = Reference(range_string=zvalues) + series.zVal = NumDataSource(NumRef(f=zvalues)) + else: + series = Series() + series.val = source + + if title is not None: + series.title = title + return series diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/shapes.py b/venv/lib/python3.11/site-packages/openpyxl/chart/shapes.py new file mode 100755 index 0000000..7736c1a --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/shapes.py @@ -0,0 +1,89 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Alias +) +from openpyxl.descriptors.nested import ( + EmptyTag +) +from openpyxl.drawing.colors import ColorChoiceDescriptor +from openpyxl.drawing.fill import * +from openpyxl.drawing.line import LineProperties +from openpyxl.drawing.geometry import ( + Shape3D, + Scene3D, + Transform2D, + CustomGeometry2D, + PresetGeometry2D, +) + + +class GraphicalProperties(Serialisable): + + """ + Somewhat vaguely 21.2.2.197 says this: + + This element specifies the formatting for the parent chart element. The + custGeom, prstGeom, scene3d, and xfrm elements are not supported. The + bwMode attribute is not supported. + + This doesn't leave much. And the element is used in different places. + """ + + tagname = "spPr" + + bwMode = NoneSet(values=(['clr', 'auto', 'gray', 'ltGray', 'invGray', + 'grayWhite', 'blackGray', 'blackWhite', 'black', 'white', 'hidden'] + ) + ) + + xfrm = Typed(expected_type=Transform2D, allow_none=True) + transform = Alias('xfrm') + custGeom = Typed(expected_type=CustomGeometry2D, allow_none=True) # either or + prstGeom = Typed(expected_type=PresetGeometry2D, allow_none=True) + + # fills one of + noFill = EmptyTag(namespace=DRAWING_NS) + solidFill = ColorChoiceDescriptor() + gradFill = Typed(expected_type=GradientFillProperties, allow_none=True) + pattFill = Typed(expected_type=PatternFillProperties, allow_none=True) + + ln = Typed(expected_type=LineProperties, allow_none=True) + line = Alias('ln') + scene3d = Typed(expected_type=Scene3D, allow_none=True) + sp3d = Typed(expected_type=Shape3D, allow_none=True) + shape3D = Alias('sp3d') + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + __elements__ = ('xfrm', 'prstGeom', 'noFill', 'solidFill', 'gradFill', 'pattFill', + 'ln', 'scene3d', 'sp3d') + + def __init__(self, + bwMode=None, + xfrm=None, + noFill=None, + solidFill=None, + gradFill=None, + pattFill=None, + ln=None, + scene3d=None, + custGeom=None, + prstGeom=None, + sp3d=None, + extLst=None, + ): + self.bwMode = bwMode + self.xfrm = xfrm + self.noFill = noFill + self.solidFill = solidFill + self.gradFill = gradFill + self.pattFill = pattFill + if ln is None: + ln = LineProperties() + self.ln = ln + self.custGeom = custGeom + self.prstGeom = prstGeom + self.scene3d = scene3d + self.sp3d = sp3d diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/stock_chart.py b/venv/lib/python3.11/site-packages/openpyxl/chart/stock_chart.py new file mode 100755 index 0000000..119c790 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/stock_chart.py @@ -0,0 +1,54 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Sequence, + Alias, +) +from openpyxl.descriptors.excel import ExtensionList + +from ._chart import ChartBase +from .axis import TextAxis, NumericAxis, ChartLines +from .updown_bars import UpDownBars +from .label import DataLabelList +from .series import Series + + +class StockChart(ChartBase): + + tagname = "stockChart" + + ser = Sequence(expected_type=Series) #min 3, max4 + dLbls = Typed(expected_type=DataLabelList, allow_none=True) + dataLabels = Alias('dLbls') + dropLines = Typed(expected_type=ChartLines, allow_none=True) + hiLowLines = Typed(expected_type=ChartLines, allow_none=True) + upDownBars = Typed(expected_type=UpDownBars, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + x_axis = Typed(expected_type=TextAxis) + y_axis = Typed(expected_type=NumericAxis) + + _series_type = "line" + + __elements__ = ('ser', 'dLbls', 'dropLines', 'hiLowLines', 'upDownBars', + 'axId') + + def __init__(self, + ser=(), + dLbls=None, + dropLines=None, + hiLowLines=None, + upDownBars=None, + extLst=None, + **kw + ): + self.ser = ser + self.dLbls = dLbls + self.dropLines = dropLines + self.hiLowLines = hiLowLines + self.upDownBars = upDownBars + self.x_axis = TextAxis() + self.y_axis = NumericAxis() + super().__init__(**kw) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/surface_chart.py b/venv/lib/python3.11/site-packages/openpyxl/chart/surface_chart.py new file mode 100755 index 0000000..5f388e1 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/surface_chart.py @@ -0,0 +1,119 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Integer, + Bool, + Alias, + Sequence, +) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedInteger, + NestedBool, +) + +from ._chart import ChartBase +from ._3d import _3DBase +from .axis import TextAxis, NumericAxis, SeriesAxis +from .shapes import GraphicalProperties +from .series import Series + + +class BandFormat(Serialisable): + + tagname = "bandFmt" + + idx = NestedInteger() + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias("spPr") + + __elements__ = ('idx', 'spPr') + + def __init__(self, + idx=0, + spPr=None, + ): + self.idx = idx + self.spPr = spPr + + +class BandFormatList(Serialisable): + + tagname = "bandFmts" + + bandFmt = Sequence(expected_type=BandFormat, allow_none=True) + + __elements__ = ('bandFmt',) + + def __init__(self, + bandFmt=(), + ): + self.bandFmt = bandFmt + + +class _SurfaceChartBase(ChartBase): + + wireframe = NestedBool(allow_none=True) + ser = Sequence(expected_type=Series, allow_none=True) + bandFmts = Typed(expected_type=BandFormatList, allow_none=True) + + _series_type = "surface" + + __elements__ = ('wireframe', 'ser', 'bandFmts') + + def __init__(self, + wireframe=None, + ser=(), + bandFmts=None, + **kw + ): + self.wireframe = wireframe + self.ser = ser + self.bandFmts = bandFmts + super().__init__(**kw) + + +class SurfaceChart3D(_SurfaceChartBase, _3DBase): + + tagname = "surface3DChart" + + wireframe = _SurfaceChartBase.wireframe + ser = _SurfaceChartBase.ser + bandFmts = _SurfaceChartBase.bandFmts + + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + x_axis = Typed(expected_type=TextAxis) + y_axis = Typed(expected_type=NumericAxis) + z_axis = Typed(expected_type=SeriesAxis) + + __elements__ = _SurfaceChartBase.__elements__ + ('axId',) + + def __init__(self, **kw): + self.x_axis = TextAxis() + self.y_axis = NumericAxis() + self.z_axis = SeriesAxis() + super(SurfaceChart3D, self).__init__(**kw) + + +class SurfaceChart(SurfaceChart3D): + + tagname = "surfaceChart" + + wireframe = _SurfaceChartBase.wireframe + ser = _SurfaceChartBase.ser + bandFmts = _SurfaceChartBase.bandFmts + + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = SurfaceChart3D.__elements__ + + def __init__(self, **kw): + super().__init__(**kw) + self.y_axis.delete = True + self.view3D.x_rotation = 90 + self.view3D.y_rotation = 0 + self.view3D.perspective = False + self.view3D.right_angle_axes = False diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/text.py b/venv/lib/python3.11/site-packages/openpyxl/chart/text.py new file mode 100755 index 0000000..bd034c2 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/text.py @@ -0,0 +1,78 @@ +# Copyright (c) 2010-2024 openpyxl +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Alias, + Sequence, +) + + +from openpyxl.drawing.text import ( + RichTextProperties, + ListStyle, + Paragraph, +) + +from .data_source import StrRef + + +class RichText(Serialisable): + + """ + From the specification: 21.2.2.216 + + This element specifies text formatting. The lstStyle element is not supported. + """ + + tagname = "rich" + + bodyPr = Typed(expected_type=RichTextProperties) + properties = Alias("bodyPr") + lstStyle = Typed(expected_type=ListStyle, allow_none=True) + p = Sequence(expected_type=Paragraph) + paragraphs = Alias('p') + + __elements__ = ("bodyPr", "lstStyle", "p") + + def __init__(self, + bodyPr=None, + lstStyle=None, + p=None, + ): + if bodyPr is None: + bodyPr = RichTextProperties() + self.bodyPr = bodyPr + self.lstStyle = lstStyle + if p is None: + p = [Paragraph()] + self.p = p + + +class Text(Serialisable): + + """ + The value can be either a cell reference or a text element + If both are present then the reference will be used. + """ + + tagname = "tx" + + strRef = Typed(expected_type=StrRef, allow_none=True) + rich = Typed(expected_type=RichText, allow_none=True) + + __elements__ = ("strRef", "rich") + + def __init__(self, + strRef=None, + rich=None + ): + self.strRef = strRef + if rich is None: + rich = RichText() + self.rich = rich + + + def to_tree(self, tagname=None, idx=None, namespace=None): + if self.strRef and self.rich: + self.rich = None # can only have one + return super().to_tree(tagname, idx, namespace) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/title.py b/venv/lib/python3.11/site-packages/openpyxl/chart/title.py new file mode 100755 index 0000000..10f79d7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/title.py @@ -0,0 +1,76 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Alias, +) + +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import NestedBool + +from .text import Text, RichText +from .layout import Layout +from .shapes import GraphicalProperties + +from openpyxl.drawing.text import ( + Paragraph, + RegularTextRun, + LineBreak, + ParagraphProperties, + CharacterProperties, +) + + +class Title(Serialisable): + tagname = "title" + + tx = Typed(expected_type=Text, allow_none=True) + text = Alias('tx') + layout = Typed(expected_type=Layout, allow_none=True) + overlay = NestedBool(allow_none=True) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias('spPr') + txPr = Typed(expected_type=RichText, allow_none=True) + body = Alias('txPr') + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('tx', 'layout', 'overlay', 'spPr', 'txPr') + + def __init__(self, + tx=None, + layout=None, + overlay=None, + spPr=None, + txPr=None, + extLst=None, + ): + if tx is None: + tx = Text() + self.tx = tx + self.layout = layout + self.overlay = overlay + self.spPr = spPr + self.txPr = txPr + + + +def title_maker(text): + title = Title() + paraprops = ParagraphProperties() + paraprops.defRPr = CharacterProperties() + paras = [Paragraph(r=[RegularTextRun(t=s)], pPr=paraprops) for s in text.split("\n")] + + title.tx.rich.paragraphs = paras + return title + + +class TitleDescriptor(Typed): + + expected_type = Title + allow_none = True + + def __set__(self, instance, value): + if isinstance(value, str): + value = title_maker(value) + super().__set__(instance, value) diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/trendline.py b/venv/lib/python3.11/site-packages/openpyxl/chart/trendline.py new file mode 100755 index 0000000..bf6d236 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/trendline.py @@ -0,0 +1,98 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + String, + Alias +) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.descriptors.nested import ( + NestedBool, + NestedInteger, + NestedFloat, + NestedSet +) + +from .data_source import NumFmt +from .shapes import GraphicalProperties +from .text import RichText, Text +from .layout import Layout + + +class TrendlineLabel(Serialisable): + + tagname = "trendlineLbl" + + layout = Typed(expected_type=Layout, allow_none=True) + tx = Typed(expected_type=Text, allow_none=True) + numFmt = Typed(expected_type=NumFmt, allow_none=True) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias("spPr") + txPr = Typed(expected_type=RichText, allow_none=True) + textProperties = Alias("txPr") + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('layout', 'tx', 'numFmt', 'spPr', 'txPr') + + def __init__(self, + layout=None, + tx=None, + numFmt=None, + spPr=None, + txPr=None, + extLst=None, + ): + self.layout = layout + self.tx = tx + self.numFmt = numFmt + self.spPr = spPr + self.txPr = txPr + + +class Trendline(Serialisable): + + tagname = "trendline" + + name = String(allow_none=True) + spPr = Typed(expected_type=GraphicalProperties, allow_none=True) + graphicalProperties = Alias('spPr') + trendlineType = NestedSet(values=(['exp', 'linear', 'log', 'movingAvg', 'poly', 'power'])) + order = NestedInteger(allow_none=True) + period = NestedInteger(allow_none=True) + forward = NestedFloat(allow_none=True) + backward = NestedFloat(allow_none=True) + intercept = NestedFloat(allow_none=True) + dispRSqr = NestedBool(allow_none=True) + dispEq = NestedBool(allow_none=True) + trendlineLbl = Typed(expected_type=TrendlineLabel, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('spPr', 'trendlineType', 'order', 'period', 'forward', + 'backward', 'intercept', 'dispRSqr', 'dispEq', 'trendlineLbl') + + def __init__(self, + name=None, + spPr=None, + trendlineType='linear', + order=None, + period=None, + forward=None, + backward=None, + intercept=None, + dispRSqr=None, + dispEq=None, + trendlineLbl=None, + extLst=None, + ): + self.name = name + self.spPr = spPr + self.trendlineType = trendlineType + self.order = order + self.period = period + self.forward = forward + self.backward = backward + self.intercept = intercept + self.dispRSqr = dispRSqr + self.dispEq = dispEq + self.trendlineLbl = trendlineLbl diff --git a/venv/lib/python3.11/site-packages/openpyxl/chart/updown_bars.py b/venv/lib/python3.11/site-packages/openpyxl/chart/updown_bars.py new file mode 100755 index 0000000..6de7ab8 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chart/updown_bars.py @@ -0,0 +1,31 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import Typed +from openpyxl.descriptors.excel import ExtensionList + +from .shapes import GraphicalProperties +from .axis import ChartLines +from .descriptors import NestedGapAmount + + +class UpDownBars(Serialisable): + + tagname = "upbars" + + gapWidth = NestedGapAmount() + upBars = Typed(expected_type=ChartLines, allow_none=True) + downBars = Typed(expected_type=ChartLines, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = ('gapWidth', 'upBars', 'downBars') + + def __init__(self, + gapWidth=150, + upBars=None, + downBars=None, + extLst=None, + ): + self.gapWidth = gapWidth + self.upBars = upBars + self.downBars = downBars diff --git a/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__init__.py b/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__init__.py new file mode 100755 index 0000000..1726676 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2010-2024 openpyxl + +from .chartsheet import Chartsheet diff --git a/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..d549fe334ba3e1e8f48b69e891d8b0dbc68aab57 GIT binary patch literal 269 zcmZ3^%ge<81R`3~v)qC7V-N=hn4pZ$LO{lJh7^Vr#vF!R#wbQch7_h?22JLdj6exZ z##>y@8Hq(D#TluoC4QPrx44qw+#+V6ij@qXK_>l5)(^|iDa}nS)-O)XOUW$GHZ-!( zPs>Rx&ekueOv?f4)-OxVE7Q-(Oacm&WaQ@=>lqsA7iX5F>J}s>XD6luwdNP3<`q;{ z{X I#0FFY0B_hy)Bpeg literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/chartsheet.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/chartsheet.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..1e70d13002bd765978e19fecf273e9651ae3ac9d GIT binary patch literal 4966 zcma)9OKcm*8J^{H`F=?x^?q5FDBEP5D2W>vi4;E~*^Vq&ZUQWdZr9wA#dw!wXP1)f zGB67Ss1g{6TC}i%wt#>FZj0p5qmMb}(8Dqyki`N90`!!d3b#O!Q~#MISENEaT@L@9 z|1q<(GynI^>|Y|0AcAXP;o%4G#1Q%?RXUfiU3qp0m4`@1GN&Mw6FAi+xKy{`=BUl3 zcvP?8Wp%gWQ~iRU)jbNY284hb6oO3mDj_v2gw==;VY*L=sxcwP>V74zCWHj5^GZ@p z2`N?&CZ1S z-SRFgB}vP1R^-yIj>}r9QodHwbTEWBFeyn&Nt13VIOnpW%eS8AMZ^6Hwnwqf~hT)GDLZ#nuFE-TRPYUQ$(-k^hc zTPohUO)9mryk08mHG-kjfeTv_(b*W+Nu`R3Uc&Tkd+jhR)VPaeg;SHe5(sTjOa z)AWkk>!aPo-p9ArYqwyMwpMklYDIg(ZP}UsXa9f^{~GcQBY~5V;F3APExQB{+`Y0} z@W~#*??RZz0onVx@39Nk4*vEf1equFx&JZr@)>=1b_ro-kMwB~Wu90cPn>xYeLP9# zN%ipzFwbBgPnvl$eLPv_8S3L1W}cBgo>Ar*>*E;*&xFi>9ym4wldQ$m_hx1q>@#xk zSoD+}0vv>e*#LUcPfqQjO-_z~6cA2QJPC75PkzJ;^LuEQ6LJ(uR`4hntYFc}G0V&B z_eKl5O5w+yQ*^Uid3yCrJ_W0uCQH}^N^TjaBNnHD(Tvp%I0RNh~-ML zrsA@m*N$+eD*2;cPeGHL6ef7L3JHv5Q3qUGK}k_6J7T#~1^|#T$QFRSf4iiW0LPYZ zt0c>~Yz4P5xx2#ZkjK7lNvUDY3U75|GGzJN$gzT~LLs49u@0Qtu(9Gr29FI2LOUc> z?P7rdRTu$~85oV_muM`G5+LID z+(V>0$Ux{ZI6kxEKpu2?93!en>d{`Lap*RxBhf)#odb*d(iluT%7e&i2+8IYqKy#9& zVwQ@NRLoH^PeqOjy1axAi7ZfYii*=zoB?5lSl)=5F6kJaOkSnW35a4*ku*&dwFKys$F9bAxbPlqWGV(&N@cmE-8uX6xxywi zxl^d#-Bcip3){H7T~JE5z@Tqc%CF?lo-Jr49iOSfCIjiL6)0w_cY9#oh4_5+E_nqW zelNucfxUUYGpBEWL;Ev`|2EKnrcogJvHyYpYd-rGpM8`*7;N%$Eq>16=giE|p65Z> z%#5>JXwV3aJsmpL96Hk)I(3xaqZ!&jPcyU4%v>uox95e~=ED!dU-Khh@gt8eHTmflKW%gh z`7y*7otFZ|;h}l3zL43UpKjNF`bIpOnGVpxo>gBu-fxA9%_(xl)a|aIp zI8C5(oKb+sxC4iqx+CkZUhd%#L^{0H9Vxr?fg}Am$JRMmRQH;_6L?_&6T=Ue=|!OuhUy%5W*Tx_lTA_W)=+xT(|l#a`iih+)UqNrBnnnLSgQT#rPt$Vd_RkYL3=8+gU4q;FXPwFI5f(*mJbBy_!w^ZOvRF_Nb{ zkj?aTSF-6oL~D%mkLW&0ZH)6%w8n@(OKX(<3C%|GIu&$17*i9vU)h@m&1w2RSi$tn z1Kdq%T+(#{RmP-bnFiC_3W^|<$U4g(vdVkQEecec$YbMUM z66YFM%=E}UHWuFea?wbyH`D8_^m^mEnHk-$8K;)MylG@^G&46^nHz>@z)WWLXAkZ? zk&WbqX7WNSd7*LDj1TU657wUOM*Lzkez6t52!o)HKA8KvY(&pDqvu=E^YCOAxBBFS z5r3;0f2$RLs~u-dpZnsb5xvrkUTHm_0Wfg$Ia16b86O{K533knIjYC__R3$o6ZE4V9$=yk{L3`P99E7 zdFKw%^TZ10^3DKoIwHt>2M*EyCm3Sb60hZEt%1&FoR_gyB&DieA)1}qEZJCg4fhMm z<6X!imYmj9-vF)aE0|CcwN4zx*$3I~6S~7;ltpb`%Q*2n@PTU|1?Z8OFgQ^pSw~|# z3h9s`1(-G2rw{wAE^e|9Xoe-L_fhm)8on3cW17&jpp|wy0p86QD`hx}0oE9I5_%%E zcwh?lSwa|?DUPjR)%kE{M8OR0qd%c6VR^UdcL6&aT0Z+*fKbwaQ@#CdOc)I?ROZ2M zFCN{czvF*wv)P+u6I2Re?GGRi-5kdq@`!uIKrcV9m}t@HEhc)y=q-mXH|IJ;KP>nk z4q?5(m#$vj*xZCdwJT#Y88J-g4-> X&T)XV{&Ii(VDw+i_wVOKu*Lfy8UF9S literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/custom.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/custom.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..e3ff0c92483f4416d04fe53276006d35fb1490df GIT binary patch literal 2531 zcmbtW%Wo4$7@xIw{f=$yJV^*9ZGbH$7KNgg5~?-{A!_O(IpVOF)#9DR+w6MH>^czS zgAW{ngsR+v)JxPustEo7j-09<9m%S!Jw@uNH=}Uk)bHE1jY*7p=y>Kg-(z-W=X&(tr_{;vDgjMWP0t5H(1ndwxP*!0?)saCITjg-_^` zY9vp@=s&nrS0O;dM*OC_7GQRevb)OLiG%`#P;P@X=h&{BcI zWBg)8Q}OXUWtyUEmU3UGqR)xmRo3W_3R}}kmJ`3rw33Yy*rie~v|rDi_%?I&7Z5vy z5{XlZ%V94LNm;OBt*2D0c6b4;HvqM*E4lt4Z|HBwfv^KAMyol+t0+`%|N8#xS?4Zn9vCnHC3f0C$d4=<{g&?GY2*ly+W-OAR~&dn-ArZ zS)%(sXMjE`(}GP^*#;l6LAVX<7A^O9A&iXc04G-LadwU+VRa$Ywg66O4veCsBESx* za#bP&<+Z90xUPw-e&D+1tMb5gh z1goHc5d_OtZ0dv`o2Id1-qvh30_)i*!We)Ua(IjCt84-#XAmY4&LVuc)WZ8^+U=c^ zy=UqbgIZZjDXE&Ze&vg=va7mct!K-dt2#I+yFp7ESzWsi0=sCIuFhP!lC?COUM?$z zb+DwBHOsVA-h8BI3thKnJ&(?mH=U3yYbDK=<;Q3GIe(_3J_qk*%>vX&D@BIJw)kh^ z=Fn-FBAsb$3b=T4{QMT*2#q$|?8HT6$LelBf(?im%z4htK@*4Y6-tUhW!Z_yvSF$f z9qE`XKd2~rTNAXEH6&RWHt_6-KJtu-{_!k|Ui8cwL@J8l8aRfO>kxFi>lHkK>eQem z+mdBA1@e8uK0!5Jmc=`OQEL4GQ0xAh@w2tX!)Rjb+SBXLuGi+9vGmsB)1_xiwS{IZ zu{Bp8{ifYxvj?%+Mr;-o$-!-Ym#-(M50cZ3Cr_skugKuJ%JS zIkYY8=3d$L;w*Jbkq^r{&;3%7P4_ru*(3Vk7ba?O)Pva zlkxmF1@z;|zVFhFYP_qJ0)VIvkW3asb)xQe&rEoX7-pZs#HJC>BV0hhO!a~Uk7gGU z@JuEmypN+x$Rb>YVJ!pn#!;rWcsM+{U94aJ?oYKooIe=OH-_`IpAOR(T>nm;Z~6T~ zwnaVy-a)v1PCVsgI>|os&}8dw37_$bsJ!ZaG8tOc8SE}osa0TF**2NQFansHRc=DL z8HAT~PWM|rLmw5W?&hO&uI~b?=UdD0e}^;DUHAU=u-toz>gK4Mb*{-iG~>I_O|LZE zV%K0REbJEi%OEX3$8q30?na$_-P>Dyfb+G;|Ajc=KChEYy}e1`tPgt2=f|`D8)6e2 gB<4wYe)A1V-@aGfig4iclkj}`4NBkkQMsY;FWrx3)&Kwi literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/properties.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/properties.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..0d44ae58fc230fb06469a0b6c64ac146936ec1e9 GIT binary patch literal 1278 zcmb7Dy>AmS6u0jqmxP9kXev-eQ7hC+K_W*%NGMbcbSOwDLTbfu%jp`s?NQ$c_N6qa zLxv6+7+?xxr&g#8{3)r_A-bs&6I)Q3n0U@50Yn*iXaD@ZY`^!5b5tng5lHD)=jD-t z&=+ZpL?0^WHBdT;Ac7h4v5kGjR(#b~vGgfS^L1Mv=qk(jhHYS^pcO>4eMEGsAF2o) z!%W4_lFTY98(*baRuk=U7_ua@8gnn$O!T#8L`fMZ6RVVaF7t%D&M4UWa>znnA09GT zw4rexfYLz}*_a?(A=p+GL^Yy(QV%g)4Ko#62Y==QzXAR%%|S#v1QL#64tL~pPAU~+}B4iDp3QM>F@x=Dx-3QhN zbH%n5H8&VEZ0*os$70?(IO44^xK~+Rw1gMa+mTz}b~j-wFcL(~U1rtCG+EJ@r%KdJ zvX0{gUhFt;W-g+#G73-0;${F^sGmpEH{06V%e`x}uoQ+%yU;G2LjpXfTCG+t$fE;j z*Kv}(JuY&nXv@fs_#W^0^^FQX_X#MtvH@!g2T{xIQ9Y zlHn^7awC`kMKl0fz27eg4NCqA>LEY! literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/protection.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/protection.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..2b2c317324f0d5714f6e8c8a7d907ae5abc72e6a GIT binary patch literal 1782 zcma)6y>Ht_6hD4Qq(03!0vxNhmDUMh#;^o8K@k)|2dAj(Aw~fg8MqL%c$R1%KYB+c zaiKv4I%vq?%^5SLDOz;v);~f9G!UE&bn2$Soig;Eun*OwB0T!XDDqzj(N-OR>D=`y^I&yb!lA zjk9|pb-b1?#KkR(;m_`EIi5w2dAx_IV-bg0`vmJ^TxwgaZ3Y%&Pkm~~dGj0UhqxJH zyE(pBvPk3L;tz065k`h!BSW+WLlO~|ZShy>l>ko&Gc_Xve0Bz}T*0fr=Vs*RfiKM9 zi&yX^TQ5t7SXW}D z>4Usp7%Tq%AxOkxb*fvA%lOzL9USLa;CK)H4kYH7MZ%OVS)}DtCv3aBmWy|r>O?45 zMVMURivZvhb%ic6!Aq?xLNt}ND?!Bb6YI(lO-h5h8HlDW(#=AYnPw_K7CUML#|H$e(0GEqCk^840}-};?{0l_v%#DYZvusM`swZE)v-v&#Cgvfg_XX-g-?*YZHyIMX(U+D30@7PD}oyu3Hi*3PuG zp|%D&<@vt-!XA`Y&&sRA@@jAUL*`sN?Cp%QsJap@E=M2L##e1Ms;-RYw9M@hx&qP@ z@x$n)SmCc0G)G*SG(p|QtVx|9^eLl>I*C|Z%D6f!sg9pDF`-=H_~V%g?7godRe0X= zG!H(EN6E*b{;uOFZ*iLAkZ4}x-n0&H)dy+azo55agTKA(H-M2O2ttI)y=0uD`-7{m p2;CiAz9RJb;PN$+B|#ja|Ayj{0BU~-FCM(EzTy1eGd7d+`~$aX#bN*e literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/publish.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/publish.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..81fa2f747d71cd7fcc1ea03013755dd26763d2be GIT binary patch literal 2378 zcmbtVOK;mo5MD}rNs;WRk`l}B#7b&9jfFI5QM5_X26?$imBKdKf+$K*;@W0HkqSvU zaiD_^IXFNL3J}0K20f$=;@{9ie}M$(K=4om=&3gaPA@rihLlu4PhD}potYhScfXw( z{hCb13AD`I)}4zyA%CILZ(L8YJPm*~A3HOo|D{KOKqb=A-vwPet8Z=qmdd&SB| zk-a}n)PzTjd|cy!wwOQk11)`5D*+K}3ofnrL-+USlIU~J8U^xVRUp#++NP=>S8J|y zT{m1Hn6p)LmHJ$HO|@M=Ue(tvcNsbLIpEsf@Hs;*Q3Dv~*HxoNo#j^ye84cQ`-*9q zv{;Vyxq&eP9j|?79bk*pnL1HG3R^t_+JMP=6g2b?TAc-L5HNKPwEjJkIuBYuC`nxa z4MMi}o(P)I*EF(3UNJ>DbVS#DPSe*HG(YZGHM>lgH>%W+h4La@@e`qVyL5+^U4K}k zj;ouht6L^81E+U&7ltHKwMeTW!@xJ|P-Df;!HV`M!WhCh!UV!3!W6sj_uKnY z;d{%dRj5;NR8!NPyB9wGtgvFJ&fP+FW5s}5Dy&m;yc#`35ZqXBw}syJ=BpdNs3^LryNdGg~oofIM(#?=`c9VS~ zc-c`H;@)T;hG8#v8ipZne0G!Vh&gX+9>?*%)5ILAqpjfCfe%6Y7JE%f;SNl-LKVf2 zD@w)EY6i*)MY&f~joysls;em4c*!A~c)=m1c)3UOia`>PYtMl6ir9HHoJPQs7C;gN z=MR9!;O7lZHg3F$9p60pIQJyixZ))~*u4Ju=98O^YhEhTOt&VS-jk}eQ?*X2*7(Ld zexk`g6`zTX1uvaze)?j$m7Z&-=Q`=R#x3u}cys0H+OxIB?ciI_wN_%LotWt)X5f>V zk>=GGS6dmWosl{jsqt->C)u2La?Bf__Qs~X$zbVf^84Fxsg>E7WuyMF|4c zme3=Q5X9;^ln~BCcYX%g9jj9itBLgHjpuGFk#8sRokSjjDm&5q@wZ|td%2yx+{s>U z6yK!JHf}*=jf{KK`7XzC=ey(x2$#kMi&EUr^sC4`)V;E;S6$0?Y~(OJQ;>{79^%3L zQ-`_FJG=gYZ4uuM5->Q~-qXGpFNKBROZy`D;e|WD19YPd!*qF`iFC>Tg(1Rx(ITJk le!Bbw1DSOYnm@fo>%0G^zG9LLkarN8##^+$J7g-L^j}H)E*Ag* literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/relation.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/relation.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..d793600061617edacd8f6cac8ceb00b872703801 GIT binary patch literal 4090 zcmeHKOK;mo5MEN0M9K0?55MBXvJ=OV>sn2N0!0uMNZLFK1a43VJqQH^hFsaKsYjP` zUeLjZ99$p;db14pkW-2vMgKtmgbMT^@Y+*v3Y=3;omq;av=-qaK+#K=(x>@$J`H!d z!&&m@(a|`8mR>#h?lo9{BJof3ZvV>f=LS?0(a64p$%aKAv zA~Ly64CNUy!Zh+SM96FSx~&l9z6kiDCw!`*ZjxN=FO=qFC;DZjPPZs?!q+WRvvZQ8 zeoZZ{ZdNN`CpIZFHOsWM2Nu=4;rWl;CC6)E91uzhl0gcxAr(S0p~_3>echE1QV1LJ zGg62cAvm?-Ol@vcTEC&`J6o)}TQTmLdVQBsCt7n2-3yKZ(8ie^rvVN~Lu!yBSZ*`O zCV3@oz({4&fY~TEwMr}jP8NvYqdrzwI`3QyuPimx{agHv+h+|uRU?p zV$rOa^HgZu6RME<`SajmWV!3MUT4*PV z#qW1DtLur@wJkIm<_(`K!>F$ao4}4S1l5BPFzhP;d%dGQHobSd9h=;r`C;z)+}@3j zB84*@auVEl7;0eUy)-+14wk?2u<9XU)fMOq8`3ZGO9`?8zHTc-pg(GagkCj39ph?6 zP{#w*BU~L8)QJG~C|5@W^;m#TCO|#Q)d@j87oa}F)uV!XK0tkztH%WOxd8P7SC0$oY=C-^t0x5YQh@qAS5FG+ z3jyk7u1*T-ivj8tu1*Q+O9AQ}SEmK_YK;7o!Yy)w`U0qa%zh62nhEu;|!rg%Xc5n$dfNg7dLk)BTl7VWVZ zFsxX-HR8ZxJvIW2@50#ANC3m?$XjC+7;YOb8v}+#+GXRwu&TOj0vOg?mrVl0vg@)W zu*n`v0ZV!ecPfVG%cb0!JqtFQLpXylk8l>@9Kr%Z7GV)#3E@1#1%zdUiwG+Smk@FY zs{pw)!?FL%XR&eBvqPG@0pS&Tn(Sp`Z~war{q~Old!(~UQW@L<+o>t|QU9Z#eRW^u zJ6$fdakAys7%nKobz~_7f7iuqWqcViQ=OzmOZ7WcGbsDYFz(@l17BY!x_j&w)n0Ny& zKOUx|JKtN?Dh#tXUrbSVR<6U3hI!lX@q=M9d-D~-VTyZm5(8r95BmI&ctdpOD@4S* zq&q1wAl^FzElZIbN6umXuhRP4e`${G?!n557&;?TFUf$_|IgUpS;K%UOT$hQf7wye}1uf^TqPv z-J`oLW%fP%r;YEl^PlGb|N8W;UnfE`v+ei#bXHcv(;X53ZYpB}Z{%W5+Iz)WH>j;M zvsSM%oAC&?t6V?xM#a>Cj8zRyr15w*WCA=&)9X);ZuVB z8$c%{Nm3^glH?9K9aJKH)FS!*Pn%qA4SqV2u$1YLlhFM34fekET@xFU1eb6){*-vb LJ#Pd2{0jdKm!7)i literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/views.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/chartsheet/__pycache__/views.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..4cc174c2106394ac7939adc048121ea21cf7dc71 GIT binary patch literal 2128 zcmbVNOK;mo5MELgMLo?bc5K;-V<&NC28~s>ZebK{V603KH@U3TF*uubmn&91@Laj84jo%#>M~EeGU4nUgsN*I7MS=4IZS z2lP-`kOhXYrlfknZ`=Vc3>fvr&dYTOSZbI(_+`BH*j6y^beRE z5=vx7BQmQoa)2e2)7Y1RV+JCH?l(CI>->QA5UwAC(Tg)vA`4gS0jH%A8iifBV;0_k z?l(E61?6~{oIP4t6P_`0LgOI=5jXM8hH5$X2BprU65Vmby=ehX8BulJ+))hEpeL*w zr@Iwebf~5{kRU4t4o*nULRUq;>kbE8zB?3mW(s%dUw=*wMI!F*71B;Mt0s;^l| z@M>K{7)BTYaCy4xtk{l?F;98z-IMGiQ{O66J8P?kR8ib%t?aGoke%!{ zHMX;QX%!Zn4b%8^Zhk&%mmGSpq82yRb$HdRP@}T9t7nV7oMyKnGJCGF=L(8aGD?o3 z?2led`P`Xe48pNL1gMfuf}}Gwt|g4MQ@3i|uZi~LM<`Bo#ag14I0Z{01#|ud6mrrK z`Y_ZoRTMX(C}mUI(s3SBl&4#&-qnO0bseV`=GjjVR_vu5S;$K(gfI$#dqDon)NpJ? zu~N7`gfNbPfm=v%58^Pfp955TPdkySK75_LUcYm6r;*GwlbKdBQ~jD;=Ip-fBp54=~m_rSou z4FGj3kl08gntqkaG*eP5B{jzG)|Sr|t(SX=&E=$+H36?!X@naHlL$!3_mN$yLhB}K z2NmBmDiCI%+fM+_7vDG(pEy<*j(%x~i%oH{B`#i7P19aArKhlnf;<+{72p>Uy39#Y zcleC@a~idaR;l8cmhCf)0~7xocs6%@kmVfREmGa1n>#(wz&`hHV+pvW$2afX7m4^z z_|j+oeJcZY40QW%fKGs6m<}Ig*be!B5F^ZI4YF|l*Ct;yF8(_F2m@K`hx(6iaP{qb U)yE06?1$&+H@NzCfXd7Ie+9wp8vp!>E~o70R>7j^7D-K3=Q>*GfPr+3lfvF6VriO^9xe*3Mwmd z^kG)$$H!;pWtPOp>lIY~;;_lhPbtkwwJYKP+6Z!4u{@CYz|6?V_<@6gQSJhREG8;q H1F8W44kbq6 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/comments/__pycache__/author.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/comments/__pycache__/author.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..b8dabdfb4c1a1e5ba72fe0143d62e4ef2b4851b3 GIT binary patch literal 980 zcmah{&ui2`6n>K*yXm&6VppnYq29WJ8&)r(QYeBIk%AONav9Rhw8owMXeL{_(!(Bl zSfPjB_Ufr3^^d9GL2@d1^0u;`dh$)uwM8qwWWM?4P2PLoo6HB>t^r#8_TbGf0r;jC zV>3_5Xc5T(7%(CrBrYL}YeEZkR}T%>AfUlAFnt%8!O4LRaEPNc*JS1@G%DZKvO)5x zRh|Z(2&A_rctgvrRleEbkGMEldDSbpM0GabPPm_OMze0h^Gdn% z5qxc20cXXPvQZsj06Sy{D6-NRV1BaFAgMZ7Y|xNgtQQNZ0_W#XsPi%wosdgMdJzj` zyLI=zvo1W@c9QP8;5>7-c(mn+U=1B8GrHGowHz5_{7&NeZEpiZC$X(zi2bZ8pcwE2u(VLg>M;0<&{{V{fvL&j?+hgiqq!sHrTG7jjDT z8l_>(IzsU&N;f;6INhmc-iD&7fibx*v$W_mRaYmq6sST)#`Lmc(+a9%P?h8hgx>Gx zczU+Cd~9Fszk2`p$X@ttFMP2VdQZMi&-D5J(|7S++*?N3*KZ7U-JBc3KcK9p3avCM z`K|G3H5r$F8YEeq%BDPb6I1m=^ZG^K6}^=m6~dM1vt~}LN9EZprq^&o-9*_z80v(O kp#|jO5j;5m4mF)`r4hw}csV5^Yz3$+yOF8}}l literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/comments/__pycache__/comment_sheet.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/comments/__pycache__/comment_sheet.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..cee8d272e5f7fbbf8bd68b5194e7d29f00746eea GIT binary patch literal 8109 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/comments/__pycache__/shape_writer.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/comments/__pycache__/shape_writer.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..5c098ec51f938904c58a327dd83fb85476d25297 GIT binary patch literal 5542 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/comments/author.py b/venv/lib/python3.11/site-packages/openpyxl/comments/author.py new file mode 100755 index 0000000..9155fa5 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/comments/author.py @@ -0,0 +1,21 @@ +# Copyright (c) 2010-2024 openpyxl + + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Sequence, + Alias +) + + +class AuthorList(Serialisable): + + tagname = "authors" + + author = Sequence(expected_type=str) + authors = Alias("author") + + def __init__(self, + author=(), + ): + self.author = author diff --git a/venv/lib/python3.11/site-packages/openpyxl/comments/comment_sheet.py b/venv/lib/python3.11/site-packages/openpyxl/comments/comment_sheet.py new file mode 100755 index 0000000..67dccc5 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/comments/comment_sheet.py @@ -0,0 +1,211 @@ +# Copyright (c) 2010-2024 openpyxl + +## Incomplete! +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Integer, + Set, + String, + Bool, +) +from openpyxl.descriptors.excel import Guid, ExtensionList +from openpyxl.descriptors.sequence import NestedSequence + +from openpyxl.utils.indexed_list import IndexedList +from openpyxl.xml.constants import SHEET_MAIN_NS + +from openpyxl.cell.text import Text +from .author import AuthorList +from .comments import Comment +from .shape_writer import ShapeWriter + + +class Properties(Serialisable): + + locked = Bool(allow_none=True) + defaultSize = Bool(allow_none=True) + _print = Bool(allow_none=True) + disabled = Bool(allow_none=True) + uiObject = Bool(allow_none=True) + autoFill = Bool(allow_none=True) + autoLine = Bool(allow_none=True) + altText = String(allow_none=True) + textHAlign = Set(values=(['left', 'center', 'right', 'justify', 'distributed'])) + textVAlign = Set(values=(['top', 'center', 'bottom', 'justify', 'distributed'])) + lockText = Bool(allow_none=True) + justLastX = Bool(allow_none=True) + autoScale = Bool(allow_none=True) + rowHidden = Bool(allow_none=True) + colHidden = Bool(allow_none=True) + # anchor = Typed(expected_type=ObjectAnchor, ) + + __elements__ = ('anchor',) + + def __init__(self, + locked=None, + defaultSize=None, + _print=None, + disabled=None, + uiObject=None, + autoFill=None, + autoLine=None, + altText=None, + textHAlign=None, + textVAlign=None, + lockText=None, + justLastX=None, + autoScale=None, + rowHidden=None, + colHidden=None, + anchor=None, + ): + self.locked = locked + self.defaultSize = defaultSize + self._print = _print + self.disabled = disabled + self.uiObject = uiObject + self.autoFill = autoFill + self.autoLine = autoLine + self.altText = altText + self.textHAlign = textHAlign + self.textVAlign = textVAlign + self.lockText = lockText + self.justLastX = justLastX + self.autoScale = autoScale + self.rowHidden = rowHidden + self.colHidden = colHidden + self.anchor = anchor + + +class CommentRecord(Serialisable): + + tagname = "comment" + + ref = String() + authorId = Integer() + guid = Guid(allow_none=True) + shapeId = Integer(allow_none=True) + text = Typed(expected_type=Text) + commentPr = Typed(expected_type=Properties, allow_none=True) + author = String(allow_none=True) + + __elements__ = ('text', 'commentPr') + __attrs__ = ('ref', 'authorId', 'guid', 'shapeId') + + def __init__(self, + ref="", + authorId=0, + guid=None, + shapeId=0, + text=None, + commentPr=None, + author=None, + height=79, + width=144 + ): + self.ref = ref + self.authorId = authorId + self.guid = guid + self.shapeId = shapeId + if text is None: + text = Text() + self.text = text + self.commentPr = commentPr + self.author = author + self.height = height + self.width = width + + + @classmethod + def from_cell(cls, cell): + """ + Class method to convert cell comment + """ + comment = cell._comment + ref = cell.coordinate + self = cls(ref=ref, author=comment.author) + self.text.t = comment.content + self.height = comment.height + self.width = comment.width + return self + + + @property + def content(self): + """ + Remove all inline formatting and stuff + """ + return self.text.content + + +class CommentSheet(Serialisable): + + tagname = "comments" + + authors = Typed(expected_type=AuthorList) + commentList = NestedSequence(expected_type=CommentRecord, count=0) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + _id = None + _path = "/xl/comments/comment{0}.xml" + mime_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml" + _rel_type = "comments" + _rel_id = None + + __elements__ = ('authors', 'commentList') + + def __init__(self, + authors=None, + commentList=None, + extLst=None, + ): + self.authors = authors + self.commentList = commentList + + + def to_tree(self): + tree = super().to_tree() + tree.set("xmlns", SHEET_MAIN_NS) + return tree + + + @property + def comments(self): + """ + Return a dictionary of comments keyed by coord + """ + authors = self.authors.author + + for c in self.commentList: + yield c.ref, Comment(c.content, authors[c.authorId], c.height, c.width) + + + @classmethod + def from_comments(cls, comments): + """ + Create a comment sheet from a list of comments for a particular worksheet + """ + authors = IndexedList() + + # dedupe authors and get indexes + for comment in comments: + comment.authorId = authors.add(comment.author) + + return cls(authors=AuthorList(authors), commentList=comments) + + + def write_shapes(self, vml=None): + """ + Create the VML for comments + """ + sw = ShapeWriter(self.comments) + return sw.write(vml) + + + @property + def path(self): + """ + Return path within the archive + """ + return self._path.format(self._id) diff --git a/venv/lib/python3.11/site-packages/openpyxl/comments/comments.py b/venv/lib/python3.11/site-packages/openpyxl/comments/comments.py new file mode 100755 index 0000000..192bbc4 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/comments/comments.py @@ -0,0 +1,62 @@ +# Copyright (c) 2010-2024 openpyxl + + +class Comment: + + _parent = None + + def __init__(self, text, author, height=79, width=144): + self.content = text + self.author = author + self.height = height + self.width = width + + + @property + def parent(self): + return self._parent + + + def __eq__(self, other): + return ( + self.content == other.content + and self.author == other.author + ) + + def __repr__(self): + return "Comment: {0} by {1}".format(self.content, self.author) + + + def __copy__(self): + """Create a detached copy of this comment.""" + clone = self.__class__(self.content, self.author, self.height, self.width) + return clone + + + def bind(self, cell): + """ + Bind comment to a particular cell + """ + if cell is not None and self._parent is not None and self._parent != cell: + fmt = "Comment already assigned to {0} in worksheet {1}. Cannot assign a comment to more than one cell" + raise AttributeError(fmt.format(cell.coordinate, cell.parent.title)) + self._parent = cell + + + def unbind(self): + """ + Unbind a comment from a cell + """ + self._parent = None + + + @property + def text(self): + """ + Any comment text stripped of all formatting. + """ + return self.content + + @text.setter + def text(self, value): + self.content = value diff --git a/venv/lib/python3.11/site-packages/openpyxl/comments/shape_writer.py b/venv/lib/python3.11/site-packages/openpyxl/comments/shape_writer.py new file mode 100755 index 0000000..cebfbc3 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/comments/shape_writer.py @@ -0,0 +1,112 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.xml.functions import ( + Element, + SubElement, + tostring, +) + +from openpyxl.utils import coordinate_to_tuple + +vmlns = "urn:schemas-microsoft-com:vml" +officens = "urn:schemas-microsoft-com:office:office" +excelns = "urn:schemas-microsoft-com:office:excel" + + +class ShapeWriter: + """ + Create VML for comments + """ + + vml = None + vml_path = None + + + def __init__(self, comments): + self.comments = comments + + + def add_comment_shapetype(self, root): + shape_layout = SubElement(root, "{%s}shapelayout" % officens, + {"{%s}ext" % vmlns: "edit"}) + SubElement(shape_layout, + "{%s}idmap" % officens, + {"{%s}ext" % vmlns: "edit", "data": "1"}) + shape_type = SubElement(root, + "{%s}shapetype" % vmlns, + {"id": "_x0000_t202", + "coordsize": "21600,21600", + "{%s}spt" % officens: "202", + "path": "m,l,21600r21600,l21600,xe"}) + SubElement(shape_type, "{%s}stroke" % vmlns, {"joinstyle": "miter"}) + SubElement(shape_type, + "{%s}path" % vmlns, + {"gradientshapeok": "t", + "{%s}connecttype" % officens: "rect"}) + + + def add_comment_shape(self, root, idx, coord, height, width): + row, col = coordinate_to_tuple(coord) + row -= 1 + col -= 1 + shape = _shape_factory(row, col, height, width) + + shape.set('id', "_x0000_s%04d" % idx) + root.append(shape) + + + def write(self, root): + + if not hasattr(root, "findall"): + root = Element("xml") + + # Remove any existing comment shapes + comments = root.findall("{%s}shape[@type='#_x0000_t202']" % vmlns) + for c in comments: + root.remove(c) + + # check whether comments shape type already exists + shape_types = root.find("{%s}shapetype[@id='_x0000_t202']" % vmlns) + if shape_types is None: + self.add_comment_shapetype(root) + + for idx, (coord, comment) in enumerate(self.comments, 1026): + self.add_comment_shape(root, idx, coord, comment.height, comment.width) + + return tostring(root) + + +def _shape_factory(row, column, height, width): + style = ("position:absolute; " + "margin-left:59.25pt;" + "margin-top:1.5pt;" + "width:{width}px;" + "height:{height}px;" + "z-index:1;" + "visibility:hidden").format(height=height, + width=width) + attrs = { + "type": "#_x0000_t202", + "style": style, + "fillcolor": "#ffffe1", + "{%s}insetmode" % officens: "auto" + } + shape = Element("{%s}shape" % vmlns, attrs) + + SubElement(shape, "{%s}fill" % vmlns, + {"color2": "#ffffe1"}) + SubElement(shape, "{%s}shadow" % vmlns, + {"color": "black", "obscured": "t"}) + SubElement(shape, "{%s}path" % vmlns, + {"{%s}connecttype" % officens: "none"}) + textbox = SubElement(shape, "{%s}textbox" % vmlns, + {"style": "mso-direction-alt:auto"}) + SubElement(textbox, "div", {"style": "text-align:left"}) + client_data = SubElement(shape, "{%s}ClientData" % excelns, + {"ObjectType": "Note"}) + SubElement(client_data, "{%s}MoveWithCells" % excelns) + SubElement(client_data, "{%s}SizeWithCells" % excelns) + SubElement(client_data, "{%s}AutoFill" % excelns).text = "False" + SubElement(client_data, "{%s}Row" % excelns).text = str(row) + SubElement(client_data, "{%s}Column" % excelns).text = str(column) + return shape diff --git a/venv/lib/python3.11/site-packages/openpyxl/compat/__init__.py b/venv/lib/python3.11/site-packages/openpyxl/compat/__init__.py new file mode 100755 index 0000000..dac0909 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/compat/__init__.py @@ -0,0 +1,54 @@ +# Copyright (c) 2010-2024 openpyxl + +from .numbers import NUMERIC_TYPES +from .strings import safe_string + +import warnings +from functools import wraps +import inspect + + +class DummyCode: + + pass + + +# from https://github.com/tantale/deprecated/blob/master/deprecated/__init__.py +# with an enhancement to update docstrings of deprecated functions +string_types = (type(b''), type(u'')) +def deprecated(reason): + + if isinstance(reason, string_types): + + def decorator(func1): + + if inspect.isclass(func1): + fmt1 = "Call to deprecated class {name} ({reason})." + else: + fmt1 = "Call to deprecated function {name} ({reason})." + + @wraps(func1) + def new_func1(*args, **kwargs): + #warnings.simplefilter('default', DeprecationWarning) + warnings.warn( + fmt1.format(name=func1.__name__, reason=reason), + category=DeprecationWarning, + stacklevel=2 + ) + return func1(*args, **kwargs) + + # Enhance docstring with a deprecation note + deprecationNote = "\n\n.. note::\n Deprecated: " + reason + if new_func1.__doc__: + new_func1.__doc__ += deprecationNote + else: + new_func1.__doc__ = deprecationNote + return new_func1 + + return decorator + + elif inspect.isclass(reason) or inspect.isfunction(reason): + raise TypeError("Reason for deprecation must be supplied") + + else: + raise TypeError(repr(type(reason))) diff --git a/venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..fa94d4bbe2766e6ed916805d4d23f8bf1141c067 GIT binary patch literal 2445 zcmZ`)-EY%Y6u;MY;y7)R7CIU>N?mB_LQ6uSn*gDT(K49OI>g7OMb(Un9Tw`?*|k$> zX|)JdYm3knCQyq6QXg2S2_E*ir)hseBIO~ngj8wbfw!PC386jgTst34fn(oa?mhS1 zb8~+8oa^5L0Y3ui*uQ-3h!>%M=%6NCwX^XPbe55V6s(~%j$=&wjK-wdI17DN;WRGJ z!LLX2q`h%(RmaD92AxKVcOEJH8iUXiXs*P43{nNfw}wFr%@s!{H0zQ~+^_iOQM^Ur zE}%%u3u+y~c3}L{m#5BuF)CgB_S~rpplC7Wq$-&fN$FQ#P=Di~^js%$#!R^GU99c4 z5rpwFQc)Z$D9$Jtyfd~imQAOpM-4?CkFd5+l5{z(N|NoDq_m-AHQH~Lq#v@f=Fa?% zHmKh>QtWF(%cfN`X3DyfGAD-)9f>71*_@1JrjwegTCpirpNeUzE1qdlC@NHIS6y`R&Ioz#wi|is=%$N}7cKWEJ9rqlw{sw}aM zXqULBxH;)8n(b9ln5XO-#QmfmJ4OszVrNkb&Em)SXBs&-4#msS2yL$$-wV1eD1DTJ zs|K02{iX$lrm0h^7V+4=>oU>dt}tzm_H1v`AZghm0xYw)jaAtLBEE6$Uoam`4`nmH0x)PzA~%ODL^ zeZ_9-?;ODE9QxOb+IQXylsm%9XMZ`ndg<|Ze}0}nTkIGub&Njiij}*?3eUA~dx-#E zQK&fJN8zq~c10<49#~BR(6{Y?b2rTF^82GvQ8z60*fGBdQj1qrj)@V@=2NL$%m|t8ws1=znhza#<8l)Cj3ZJkwQMq$-W*>(ia! z!Mq3X`ZdJ=JhbD^k1N??sIL_2s~|RT2A4a>@?4%wF7o(Hz&KUtc%Gf`pqK(vD1 z120(={IF)!fx1uNzxNe)pIQ8>91530BK135ZrfRC>nXMMtV+eUVYdso-g`JNfVRAS zSD|&6%V7U`r;0?#ntG|xs!3-}OT40rW;T=2QmPX1+5VIXbXu~WQ0-Rt10`A08Py~` zl&L)c)TUN=wr~+9PZ44en3RGjjoeQpdOF z_dOac^8F>gzk+%^gB7k*=&GQ1z##5`Y!XGx+Q2QtzjKOci@a zO1&eF=2@__5dN$fJXs2!Eci}Bf`-D6xJMUP_dS?+I8hAmFNOCPg9D}DK*2ZQ@D*vb zc|DuHq7swPI<|S22$RtJmxQTGa2PNQ&2+NOWyksK4N#kY3N%2{O2PTs(K>tMJMMm( zN60}K(%ag63Q%D&#uYEZdkbjK=C_Q*Li4+hLOJItqmK&BZy5!1&QtL+Sg4@4;U(3* qYD@%C`v;Jm7w!u8gq7iy;Z^p*(T7J1p}t&eh1rV-E9h--qWK?5g+}uL literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/abc.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/abc.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..04885c99f08d1149baeb6b1fc7d48fb8993fd5f1 GIT binary patch literal 441 zcmZuqJ4*vW5T3ogJiKV32);@m$q8nOHWngiu&~fVMM%0!Zljmn-5z(BS0`3tWtV`B zRYd$V5iCMlE4zaA_(ZDTZ{yea#(NPSr@CYK7uh^b^OHBV7N;b%pE7xb8iK;HE!3KX%ukaUkiIDoyjoI@cEXb6)V~mT7|=Hr`a%B zQCN=VGd!Pmn#1^>CG@Jv_uT}ZBA8woOF#)BL0l$kPhRN$7hx|p7l1_6-_ny;x__gm q%-$s**4rEH<)^bZCH1bPZnBdXM9>?Cp*M}^Zlem^FC}S*BoofF zTO8l!ILmR4!AI)p8v# zD0`mcVaeYmjOB2kMbe~!rI0CV)UZem95WreMPD2bM=0*y25`}@Vk6}4&V{=VvVnkGVldVuT$)oj;^BiME9 zrG;Wq_1gh@;OdQiy+ukL7ujy-$W$AS!-o43Wx7;oFdrCS25OSh7nWB+y znRZS0`~4^e#CQa9u++=UeBC;E+shYD-cg}Z!AwR>>`-5A6y2u8lBxKWe>jS;x=Uh| uc)34o!vw2fL$;$w*?j3A$WE2IYxIr;vLjp6r{DYsIRic^)4~@xE&K<%A3F>H literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/product.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/product.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..e5d3d9f6565b6a02bf2ace172884befe7aaff83e GIT binary patch literal 690 zcmZuuzi-n(6n@=ujaBkN}|ysS;8>5E=VIlh{6UcTN+; zkb#{s3k)p$5dTb&Iz*P3nAjp^i8^sFX#)fA?tS;}-Mf3=d-r8+tqe*w?~Xba0r-WR zOEE5t*%M`qAOsIW5^53g$YRwzE!5wErEE2iNX_y5xw^&NKFB#AE zIE$(zw}j$JlYk0L;+(&5pR*{7sc?m#gl*BS@9w*;$QNBV9ke1!rQ4%P&yCtIl>-ZE z)arFtv?bk1{h;f=Qdd=yBpvi4H(+t49u54&+@H^xR|rjArCxq+9e#k|;ThAe0{IkthD2>3*9VAuH-H0{T6%D8;UIpg1e z+Za<)aBdyMibO>3@pZMuVntuUR40T?O^p~+K(K(UkKx*KPT=ZrF{TC~dsA3}rIX6U oxIX^hoKK1y7+U!Y6MJL$U^y^fWj>z^Wc%LSf>Ci>|3tR+KX|XH!2kdN literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/singleton.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/singleton.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..2725f98a6fdd6413db279b8773cab7528c02f4b0 GIT binary patch literal 2332 zcmb_d&1)M+6rb5$N$W4Eu>wj{A}=PUIJ8n7yUkg;w%|iaF}d`ZKSKc>#6qFaQ*R2+q2$uOw=1pX*rcKDtoFAv^XB8t zZ{F|e=ZT3?0_E(bz4gCDLVm}_pv3x>!}p=GM+{<6ixh}JJ|KqhH8Dg+@4}pW@P?%z z1U3n5u@g4YpetlH{s#`dqW5P6AEDnkd38!KACURfjoDF>Tk=Y@I1iQPGrORYliqg>9Lxms6G<<|?-1 zDK&?em73|TDXQvPj_0asu#irN4vf5};63~h;9I%}jCw=%yU=?N-mt7kmIgIRL->i_ zq7?3;LDT_n&{`n}^vbO0$J~u7Yr63La;A9#ew8YF0+chr16sL3+0+W zqN>5Ez-F{b_*k*FB$YO085Aor5{S2Z0;ASoqglJ006({a_ee0m2Q32mb3ghm~@c9U2Uzx;MPY~ zwc;2X7S_jA^@|P7>RS@3YB)MLhSUeH_!IrB*BN?zKzR}!!LWNfbQlAIBj7pRPXWNg z!P66@nA{@><3enzM@|7*M8mT|aF}4X|1C$vmo$Bi8QXUPDPjX+@QL)Wv}RgHC~S~& z&9p4gJ&0fDO!Jsxvs#n`TucJq8moYWHes+?4A#XoVL%?RU-T5sf@wzmKc)wa)_<2C zyg}-Q71pCDKOW-{&v>Un!2}XUaV!YnAUga+jcH}hihlYNs9e{q4Yq9Rm?$+~_mgT! zD~3AIds?Ii@=k@rB5h}3M|U3JAGG~zCfmteevnz{WEMc=<4t&i;5a67JRC~y&;tlW zPKRZ_N%+KYyFs6aaba1(yc?18v=nfQd?_@9KEach%J&{t{ixZmKN#fIs iCn@BVldvm2#NJ0ors*>jd_4)xYY(ya(J7|DpT7a6G7oJ4 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/strings.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/compat/__pycache__/strings.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..73889ad672998e2d7945deefd8c88c6cc28b7032 GIT binary patch literal 1112 zcmZWo%}d*07=O|vO;ha}nRNqk)LD@ZG<0LbL)m5Yu(5T+Zh~b@V)Is``6zi~S*1b` zJ9Myv%AgKb@Z=c&GZuO%0YMl$cq@4Gv?uLaYkiWu@ALifd&sX)CMxv2n+IH)IMBoDIu-vXDr~RCCCDLCI|?>lkVkh*>Co*5#aK6ck6sI-0po z7YZeJgyMXwU4<=SNe?i3fJX)X3S)b-^{Iw1*A(X35acJ%Mx?#S*W|Zk8(1+`e|i-8 zk^I>eTH_PdR5f)zK6yy?-+F9Iyi=WONfTAR%AbjM_fqx6h8Sy#F%0G>TT-MJJ_t9Y z>83Q@aS7c!~dvjqsO^I9P52w^F}&_DwAaRyxnQUu^m(D(pEtJiYn0{UK(o4Y!X@JO2P%eE@|3 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/compat/abc.py b/venv/lib/python3.11/site-packages/openpyxl/compat/abc.py new file mode 100755 index 0000000..36a47f3 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/compat/abc.py @@ -0,0 +1,8 @@ +# Copyright (c) 2010-2024 openpyxl + + +try: + from abc import ABC +except ImportError: + from abc import ABCMeta + ABC = ABCMeta('ABC', (object, ), {}) diff --git a/venv/lib/python3.11/site-packages/openpyxl/compat/numbers.py b/venv/lib/python3.11/site-packages/openpyxl/compat/numbers.py new file mode 100755 index 0000000..7d58345 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/compat/numbers.py @@ -0,0 +1,43 @@ +# Copyright (c) 2010-2024 openpyxl + +from decimal import Decimal + +NUMERIC_TYPES = (int, float, Decimal) + + +try: + import numpy + NUMPY = True +except ImportError: + NUMPY = False + + +if NUMPY: + NUMERIC_TYPES = NUMERIC_TYPES + (numpy.short, + numpy.ushort, + numpy.intc, + numpy.uintc, + numpy.int_, + numpy.uint, + numpy.longlong, + numpy.ulonglong, + numpy.half, + numpy.float16, + numpy.single, + numpy.double, + numpy.longdouble, + numpy.int8, + numpy.int16, + numpy.int32, + numpy.int64, + numpy.uint8, + numpy.uint16, + numpy.uint32, + numpy.uint64, + numpy.intp, + numpy.uintp, + numpy.float32, + numpy.float64, + numpy.bool_, + numpy.floating, + numpy.integer) diff --git a/venv/lib/python3.11/site-packages/openpyxl/compat/product.py b/venv/lib/python3.11/site-packages/openpyxl/compat/product.py new file mode 100755 index 0000000..68fdae9 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/compat/product.py @@ -0,0 +1,17 @@ +# Copyright (c) 2010-2024 openpyxl + +""" +math.prod equivalent for < Python 3.8 +""" + +import functools +import operator + +def product(sequence): + return functools.reduce(operator.mul, sequence) + + +try: + from math import prod +except ImportError: + prod = product diff --git a/venv/lib/python3.11/site-packages/openpyxl/compat/singleton.py b/venv/lib/python3.11/site-packages/openpyxl/compat/singleton.py new file mode 100755 index 0000000..1fe6a90 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/compat/singleton.py @@ -0,0 +1,40 @@ +# Copyright (c) 2010-2024 openpyxl + +import weakref + + +class Singleton(type): + """ + Singleton metaclass + Based on Python Cookbook 3rd Edition Recipe 9.13 + Only one instance of a class can exist. Does not work with __slots__ + """ + + def __init__(self, *args, **kw): + super().__init__(*args, **kw) + self.__instance = None + + def __call__(self, *args, **kw): + if self.__instance is None: + self.__instance = super().__call__(*args, **kw) + return self.__instance + + +class Cached(type): + """ + Caching metaclass + Child classes will only create new instances of themselves if + one doesn't already exist. Does not work with __slots__ + """ + + def __init__(self, *args, **kw): + super().__init__(*args, **kw) + self.__cache = weakref.WeakValueDictionary() + + def __call__(self, *args): + if args in self.__cache: + return self.__cache[args] + + obj = super().__call__(*args) + self.__cache[args] = obj + return obj diff --git a/venv/lib/python3.11/site-packages/openpyxl/compat/strings.py b/venv/lib/python3.11/site-packages/openpyxl/compat/strings.py new file mode 100755 index 0000000..2cc9d60 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/compat/strings.py @@ -0,0 +1,25 @@ +# Copyright (c) 2010-2024 openpyxl + +from datetime import datetime +from math import isnan, isinf +import sys + +VER = sys.version_info + +from .numbers import NUMERIC_TYPES + + +def safe_string(value): + """Safely and consistently format numeric values""" + if isinstance(value, NUMERIC_TYPES): + if isnan(value) or isinf(value): + value = "" + else: + value = "%.16g" % value + elif value is None: + value = "none" + elif isinstance(value, datetime): + value = value.isoformat() + elif not isinstance(value, str): + value = str(value) + return value diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/__init__.py b/venv/lib/python3.11/site-packages/openpyxl/descriptors/__init__.py new file mode 100755 index 0000000..df86a3c --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/descriptors/__init__.py @@ -0,0 +1,58 @@ +# Copyright (c) 2010-2024 openpyxl + +from .base import * +from .sequence import Sequence + + +class MetaStrict(type): + + def __new__(cls, clsname, bases, methods): + for k, v in methods.items(): + if isinstance(v, Descriptor): + v.name = k + return type.__new__(cls, clsname, bases, methods) + + +class Strict(metaclass=MetaStrict): + + pass + + +class MetaSerialisable(type): + + def __new__(cls, clsname, bases, methods): + attrs = [] + nested = [] + elements = [] + namespaced = [] + for k, v in methods.items(): + if isinstance(v, Descriptor): + ns= getattr(v, 'namespace', None) + if ns: + namespaced.append((k, "{%s}%s" % (ns, k))) + if getattr(v, 'nested', False): + nested.append(k) + elements.append(k) + elif isinstance(v, Sequence): + elements.append(k) + elif isinstance(v, Typed): + if hasattr(v.expected_type, 'to_tree'): + elements.append(k) + elif isinstance(v.expected_type, tuple): + if any((hasattr(el, "to_tree") for el in v.expected_type)): + # don't bind elements as attrs + continue + else: + attrs.append(k) + else: + if not isinstance(v, Alias): + attrs.append(k) + + if methods.get('__attrs__') is None: + methods['__attrs__'] = tuple(attrs) + methods['__namespaced__'] = tuple(namespaced) + if methods.get('__nested__') is None: + methods['__nested__'] = tuple(sorted(nested)) + if methods.get('__elements__') is None: + methods['__elements__'] = tuple(sorted(elements)) + return MetaStrict.__new__(cls, clsname, bases, methods) diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..57ee7767f7ef0c9280ba13999e197fdc4895015e GIT binary patch literal 3790 zcmb6cU2ogg^^zhbO0p||P_Z4Q{-|Y5a$IR{ksxjyXU2>aLl+xqvOX9K2u5TQHMA^W z(n+1rogea`6#=Rh1?;9RssXL1zztwv7?6iO>|sAZEC^H}AfUrAV0)9{JZyQ|xuo?$ zIS!I5-owj#&OPVcbMN`kpE^4O2pT`W`C-wA&_BsXy|D*_{TvK7k%S~lL08C|R;VR< zk){xh-bIq2fEW185_p}&MPzD``WOqjpYFAKeW;-1ummR@IMrAN>COx z4uHEXudK@1w4AOBAa6oJ+CC3p6Uk_ilF%Y8QTNfJN1}m?#|m7OHSw~BGifc&*wha2 z!i#9TUjnd+bWai9hubzx?KGz6(AAOO(g>|H>#Ww;D?&P}wea2siXG@q!#T0Q_an!P5fGJG$|+RbH2wWwPbbz3Dy8MfOq zDfPj!vbrRzDOJo$8THoWTW3<&6;ZvF%B@{jWLZnymb150O6D3&0F&(7$;ru-3c9_S z6VtcE8?baaCuehOA1NuRp`Mx&giJQ02|_ZrhC4yv-Ja$VB@guV!@RlxU;|b7$mYe* zF8*QR^Mx9s{Sh1del9)nM@rY)~?W9Jhd+y{8vPrv{H z#|dbvbb@>m&;?x$0cfi96T@xHIkbcV+{h2dEvDfR)#vN-0zc}q4@t%uQOT&{HAQxL z6S>jkhVMUQ$Zl?chd^hcd!hSY*1HPS)tv2L+`8Z8U;d;0t3cr^8aa@Iru!v`0`7RT z9?%2$b=_A4?G87clW0BgB_(-u?n~-x<~qF%r?XQ(AqX>V{27UL^T#K3_9))%ymar& zQa;GH*}#s~j{a>i=GZH6{c{`Fj;2N0xPGjW3w6+R|A&pZC3)K@Uq$}DTYi(P)>D^- zP#ga@G;-w+n&i8WTD6%&?kMfHIHn8KgEyh4bmnC(57ZajT58AY(%W@Y!>_~_gD z)4xED*G=jE0y#l@&nKFi6fiXbd_JHv=%CzL>yPv{{U@L6nYSrC=$={7%ZNL0PMRd zs-mW02=R3C=N2t1Dk&6(hwTLO%s+iY&dML<@XXzl?eVsr8k5t?a#~c>nPh`_99XCm z0R9cX4OAYw1kaPVzVnsn(yxr+)8_DLXRa06iNW#<0?|i>zTj@`%|ri=9<6qH1}7hvik5F%UVKmJ|nxASMYClVipt$Kh@O7Hcbwqh!q0HM0VZ zqm?j;C73vnMQ2qt2m`yWae$M~?c$^VC_9t9tDc6_ffA&vC(l;8d-L8(Z#d6Y!hQLG zt1Joo<9i6ebIOuE#COK4d}M2O>t1Qj;3rLfvOohLs8_nrSNOpn`LQ4PvEoW`W%nBS zJsEj2QXZc!$Ico2jLFZG`I&0(@vX_Nn7XLJl#qlwbE z5j|x_Pvw2(u3>{4sT?fQjbPLaM$5qoAbK3zJ@zR1ebR_dnb9d&{A;75LHV%}jG4h$ zIhd@*PCmY{d&ZcUHYcWy*f}$H4ru3%j!~#Ue+-TM5E?0t7Vqq`yLXJxc{6mr%$>L0 zYaWxd(O$C+kvRfLPE+FmHX6SgGs^ygs-fpYra)Y zqNFXRP5v`(+9`Nv@C=ZUFsA+$K+Qu@RLzShzKnXEr-BB{?x*JUQg9g#g95)tW}h}u lJv8Nq!#)HGckS6df_mD-2gWF}@#n*Wwr69W9)Y(F^M5E|9}xfm literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/base.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/base.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..d66dd938ce0e7480254f72130f2f2655ab25211b GIT binary patch literal 15895 zcmdU0Yit`=cAnu3DZXUN5-rKLWREO4mSjf{%ds7=W5>4SBzB@aoMaOr3x*~~79)yO zW=4K6a-g_r%LMMOHb@(x@fP}#q;b;%`LO|lBEYu4x+q#;=yDr@s89ooEs!4tWXJ{5 z{OWh^JUGLV9J$>t+RK@vJNMkVk8{sC_uMl_e_mf7=8)pOAH4Rj+d1yn^kAicnOVK) zB!sMScKJxqDH+OuBj1axJ|&twD{xyqJvK7jHsH2< za7_%?23)%b7iYK~!0q(Rehb4%z;(!5@TPkf%?!H>*iO%zEezKM+-?u9mEj%$ZjWd7 zTN$n!xE{}Y+Ze7FxV@hDwlmy5;2!kg+8C}6xPDKY?P=dRu4ka|X82@MmD5r_Cp~jT zo4}t_`TXR0+|rPemPXPUEtAjflMeR{4uvN)ZTd)me`+E#B`e9kZ1TL?msjLWHhZNn zm7nUT*VO*O{X+vr8hUsLl?M*@O=wfu&O|z+re;(%Gm}f9&BWl)K=>PCjL{yx;vXJ4 z`NCt!M8}oox zz0HpaX#rd=rg_ZNUkMM(YD&pWYk6ffWxYtvkRV2Iuf7KG0XNIfatY*&H0xWWF?iA^ zDEZ7T9p--2{0iEA&QTp!H{ulGv8PKF(P3Az?$-(`H`^U3Mb+Ui@ z%6L|mwf>88?qYv7a~=h>u0wr;gZ(P{c@SirOkTjN`Dr;fedThtKW$S+?LQB8=$pP$ z2__PmTt-VI3QbkQ^;v~Y7>RlcV2)dgw-&|gp{0292amt^_)pKge`bZ_LlOh;3>Qxn zUtf+k%?~ehEIeC^?kq=l>g-w(tV*kBhD+JX2@jN~d$kJyE8?5wX>E)&%e`i=$Was# zEfrF;Jw6(AI+Mbn8Rc#Y$|jUof|;DEC37jz`C>9VBdgRlsHij&wl0wX*)h*X*F0HS zD=Mfh0GQ^UeZ^ooxOJiHMo%f&rL#+k17~#Zr_O0H6NySVk(kP-XR?%!CK9jDB(nxa zA-XBs0B&-|yEFtPXo1bhsD}XN?B9wg_(4oJ2=o32L0}Is+N9=Exa~yqrL_7Cz#lpV z1w!KEWQfZrpy_8eUB~=sVJv{VuE>pJ<9Qof4a@nF3#9`Pt8kIK%#TGNT6Gow^H-+j zbU}KNQCFIpQ8g()E+wVuq@ra~GufmfX{a)KI%Ri(kq|q_Xjm@+{4xIl_AP^57}GWds*wDq6&kEvZX7NGZ@1 zSF<1%kw9Ywa%L0nLxZ?9KbG+9Y8%gjMq@G4Yz+@# zG3u@gTGYaW&-dMD`{Jw*z4*VUmk@fPRWZ}7;O6CPyhdVWCO1qQuMwJSF_FNF@p(k7kXH-l1D8vVqa59_C zUrOZiIazrC1%`?jiQyC?eI-Q9GomPYMcGAoQWiaa#(@f{BV{Yq5~kD(?0tJrFd2}l z7wRnrWJ+ugiqs_l@ZWN5>%#8Ec)4S!6gyCk9a!N4q218n??1i5`RmP`K)LP*_3nq4 zwsw@a?$w)BT%V@@GGpZaX1F~3qLKa8_-p#)bZPwc^7!jU$-J=K)C%3Sxxg>A?=H9Z z>)Wp2`n>DsJx1=AV)^kgBdaIJjm)pI)B5WdOW8~1>?NaQ{?u~w&PCy;x%YE=L)UV! zo`mKnv3Fw&!NuLBV0Ss#ty`BNA`Z>LQJ#rN12Wh^xa#&{Z5F)J1>8-ZQC6iF%>4jr zT#=_0YzVd-8_$ENqtZqLF>Z*zAJv0xtmmGn0^6Qb$Oci`2~f+*UIMh{N-sbqkdsxY zmg)|m3{Y{ssYz0DHk(LbIK&ieIFA|{MZ&W}fSOmY0bm)e-;&s?i@mqwt=M1VwDrzC zwY0f;?#xnsL(dR$SuW;+YV9?*Q!mR<~yuY0`m-T_M&CsA+hEyF27}bl&)Tkxs zX}3tJgCXd97)ZQZT(9!Eu1+kVMlG2s&AW{%_ZtP&a+h4=FAFbom-tz-{CtHIVJK+n z)P$UxtV$~OfV?85k~tFNR6ci6Rfpj5VLJ z$|RR6ZAF%05looPDhE+Y8-V%(z#R7|NnR|FIRH5IVLL@0foI z>>cke$GeLo#gT7Ue0=EGa^v=evwzk3=~SurXu0=jsqJW~@sV=lBYO0aZ@>L^Dbg_a zq)L1KdyyU7pLHA;QpnrM+8kF&o7C?8Y)|)LPZ!y4?gzPqO5~J5jm-J1TYOF&7U!Zncc)r?eATBBvze(zr&F(aHiSrqUtxuk0r_h${uk3W0NGPq*MKLGi z)f&Usc-WY9fL+R)b}5+);wbiMOl9*_2B+TK1qlzvsFfWU-%YVnH<487 zz{j+SvES1P!92JyThrh-k|LYks7fIUBH1S9vnW}$_$<<};42<49{>2zrw71OorlVu zhl#vE*nm7g<|OOA<(b*7 zc3+cBhLt^5yA&?eP7>*)+SQZ#`4)y?FM zfvY{iS{*_%RtYmUX7*eqFrHVYl3LZSQ;wiY%?W}exDYWGm+6ofQLuUipsGW}&}sgA zmB>;oKCiuh`BrSF9^1LxEa@FXUw0h2)p6v@17963bqtp~hD*&O<>nE+VIvCXW_T@y zQ}K^y^O#a6#%Ii*n3HMFwbjs3LK8TPTTKGE)X;z~4&07!HO&}0`|hN(uLpz!q^ULr z3{6FSrf}QI-WdN!nkthk^wemo3yPf7WSn>{WtGYOe^FMLO;uTCat>vs90%bPws(-U z)#{>5&elaTRXj<6oFguK;CH7#&@%?`e_DT7?lCczmhBtY&?uPhGf;?Vz&EK;8?StL7!(ki*b9DZE#;gX+Ps05zM zn8*flO*Mvw$D6RGZ)S5wQzi9x4$nG}%Ybb*O6u@Ky72%w$751{3vJ*-^m%T#A z6mpGANeK%~F09F1{*ob~s@tJWV#cf>9U0RK^1%vE|xZtxQ6$vGYihU3*wE49_hrj+=#Q&jaN#I zz2(MUJ=(j0lM@@z&AK&p0Aq*s&roD$D+Dgnc+La3jF*RW@u3yb&zvszgqsAiUN!~{ z1w)zx|Fc??*z z)Fj%grgV)r$8f$Hd?Z#6NeXdPMM$R83b|Ek%xET{4dyg$A-zr&Nq3QuI$iN=$Xzgc zJ;EH0Vky{O4z}yo#a6^+*VtnB3Ys>=F3nH+@W3g)GzV{mwZWmJMwlEJs&AxwoILQw z5DNpR)AvhItU7%rMe}G}?FXRQM;hi&zl&2MeZJd>{m$W-sX892^vJ6DQylp`JFw%dUNwcff{kI}W%+CJ~!z-9xBqlVQ) z1W9C#wOxOs8K=P$Sj4S90^pRWcA2=M^!hho2sVAQB&b;D3e?^nkHKp@)bfXaXf--3WZ0=NazuiASGo8g*#iOeH z8X?x~UZV~P{555&-BXdPdjSQMR(k=QnjmfH0pHu9F~N4yR=*ASD}g8F+y!l79lPLF zG)GDSUe^trH()(j1HpUlZL#`IpLtcSul=T1HIQYaD6}(!AICfzlM!|R8wOwWr?VM+ zY9rkV4%&x54zpoBV9PRKd< z9I{z_3sq!oM#-sgrASr~0}Gv*kk|S~dLnJa3MR8s+Gx^rPFNpVrx7rNR^j);heHjG zRKw0#*Xt-1a)UXPil2giYzKrb86E{wPfo^-%A(q;7x8Rt%fvo zqN>slP!rHV3yOdS#~h53C8|nW6!|QgzK(U=iglD?o#j}k9_%#st}w73E5Bpvgd;<;WhmGRi8gX-MT0mVSQkXlR9#Vghf^}h|rD=Wj;j~ z7fR8gekKrsG=2IGRQxBhnWS3y1>;ASmsN{>XNY+(k$A`%a4-4y84G6=l+#DN3?hMK zi30t|rJKuZ5{vbb)2uZLHpu73XV`~8$bcDb+bv({lXg+~&#oQ{NJvUkh^VziBXhCZ zBE*IIVyzjk&E(RulFj7gT@pSmNxNot^)Rd}D#K6zQ>A(U@XwZQ2w4jk@nZ{;5>RX<+OFt%bw5DOp@Aa!thIt@ z*9Oa0N9a?iCpIvp1v!;kgiFqdlObceP;U*7Z597UmD&Jc%?D%iL4Wh5Jt~dG*%H(S=BXc3Nl1($fiAX_V^8I zn}WF{~nbQ_!sJczQN7ezZIWIB1s_1 z`?r(OnIPbfG_85G<4_Gjq}Efo?If5vw)iecBsVK@6W$=gBK`iSk z_|~nZCZ2(i$x5!Ui@A4I!`{R9)YOEO#9nnlzKnQNRz*6!&R$Z+P#k;7?<6e1?ErV$ zT2+@fL?B?%OQTR8GreXzVcoojAXmE~6U{-QZNO=^k)>y+8pMpSF z#O_aLaH#k(DpcxT9C_~K)8|GiQ5 z(x=+zFPHWlFYh^y#~Sze?R$IVmfLpRIJ2mIH2cMKKOZZ#Jz8#iv?wAXTW6P7j%}s0 z1L}oV9q~rZpfpBhB-I`EQ4@%EjTDnr6@Cj(w9*OSZGXo)Hh4`;th&c}824S?&?D%Rzn-@+}a+*y2t+4v8Y8V{Bm59-l_w~fFmAv9JS z6mh$$rQFo@byM%Hrru8c@B%4{_@2jx)D9&iwMgKO8M}yj1RZsnq;( zx%p+i;pN|af4r%2ObFKcC%S05y#&7Jz(B5Og}}e#RxbcxlGblY+^38CSSTlbP&k1o z&U?a!Fnv(i7%;Rn_3YBp7ALRLuIJR!vQUk$S;tQp97e#y^Z2JA*QQUrO}c;ep8*W{ zd+XGO{e^uYSI|{$boo_ZuDz4fY^}+0U7XT@uu)rM;y*(?5`Bp?0z;iz*lkPS|B1K5 zAvcg2{O6LC201j4gRC-$0%G;5E=i(_asJ&!Ikr>NDWc~41v6(FEV@FkGJyy~lc{uq zW@@!TkFQ6EYE~ zh5+IJaZmyAr1$21m3#$%8tdi$V%rH(@YoArPQBJ&KHj z|8K|J%JJRg<=j|^4+{k{7@L~x*2z=&t=7=V9!Ygflq-&SM!NBuUScu=7sosljq>md zctKIVL#21Cs2!V#wY`8?7NvKqs9nuOQ7@Q3Ld*?{+Nk|us_6yAnLAW^cMTNNQU3*@ CR%?d< literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/container.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/container.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..0b41b130c548a76d6748f579c73bd359d3b270d8 GIT binary patch literal 2494 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/namespace.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/namespace.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..4786b13104fe5d6927cced94aa9aa8d8304e45dd GIT binary patch literal 545 zcmZ`$F>4z!6xO?QxU++cn-=87JN4ZLYeigl zSlVqxQW|zH<8u~;$GBm>CGp-)z0P!KEfeKTTD9u)ucG7NM zSye(6uU{%WG!Xjap+cU&8rs9J<2Uy;_NT@swS&86|I^f|O`I(p)9tsza2Sp^$D5Ol z`n5A%-{|{ug>vqR2onU17!jO5sDOMkrd#ea3lEQKZPuK5Ec+%pqJ)GLp~Ha^}Shsh)c>JJ# zI5ThN&DVRs_g4QH91Ih9;-?P(ov8~KIuU&jf3<6tXT0$$G9{B(t{uk`lN@rbPS}2KpOB# z4|C~ZkdA}YKkvACWR4`?T7NrygXSsAW;7en$YpKgc8+S9oMGG44*vu zIV_uB{0XlkDYy~aSfFW}wSgd2Er~mdqx+<$I$ypd&GUIC>6<_ zcJI5qFN-?CmPSHM-nyi=8Z+oEKpm^7aYwpoXnDDIB-k1R~(uQy1^yG#yX3FHdprU>2o8uLT4ER zTL>+%f|Yg{rLJPHEW^DA(`lPJ>2y+YWt-*}Ts51w9V4HC9&q+6lpR1-p>&#?9rRY9 zuEDeM^X-|>3%M1G+B3G1H?#KLGw+|9Spe(2JF~pDkfYR@xkvN&W^&ov(BLc;@*hl} zIWuE}*}My8bJtjep@n6dUtU|y&6sVIwP*7D`lpxI*f`9#KIEChbaSnTq0P1c{83n2==JwgMHj z7H*4Yq3{T9uL8fl4_H{+;=1i`j%*33r07bE;E|#BMQ(}g2&jSkE5M=PjGD$Y_+f_t z)`y#?(Z0(GXtfgn8)Q2=`t9mBt7Z9zp;~mZ9-XYJlk6CXQklIri+9LZ{tya2AA)#L zl)4!h{6zffy`uD$YKlead+^?(@V)Ri`M&T{?-CuHr}=`1D}) z@cGT)PW)&^sl`v$<0rv#Mh};NS(*R)7f)xa6Cc$^FVsgbR0l3JLS*1AP{MCuOG>3u zK-X$IjcZM(-EcZ>70i_!mIu=5->-Pg3blae0DP0&1^CUg_h6;&VAB;dG?xRv71&YS z1X|c-&q!iWWC-ZFHU$7bY5hGL9ND+GL0Q zym3jHy$|!S4-hZ_A;Fo2OggTIaJt8ltGE4T2B=KH0eDjl&^b z8*4Gat_BkS#vrcACdM}bqMQWV47g!$Q}cAyS--_s`x#wk)P}HXYes%e^X{B)`pc}d zv}ebL%`2G#1Z(VFSm1Ry9T{YY+2f6@@$S>pgRX9fuNxciDkeu#-^frI&bT zozrcKxrALYtK<~(aILD2@nhMCR(^z@uSqMHUP&uLH)-CNyJ*E1o{MrCch4Uu)G7ht z$lY25Xz?hAC81YRVei6^M=hLWaK{YK5JbqvYzCoCFs?{*?NHccXLQf?*q-BSvdk4| zw-*5Z2bLKbD<7?7<*cnJ{vaeGQQ>E1Q=z-GB#^4^d zVQAS~0iQRp^U&Ji67~^RF+6z8aS=-hXzcbU0DaveEGUPNADW=5N}@sb0Z%*X>~fwq zDSwara$xN725T7f?y;F4r`R^*oN>K7G@FnVPex8Of}$5&P>?Uf2KG{_8u%S5@g?;aGOko zZwg)1A;S;}zPr3w z{4+$tx$q#Ef`FIK@ZOk;5JJFYg+&0|XzLYoI#aNg4ToWTcN6W_RSU>yC7*G!g}m)$ z02oAg@aOrgmo8!q<6(v~J||;NHQd9w|1s_#{0O>v>1Xw#m*`(&I%q+6xBm)0(vSo} zXaqz-hI|ts5EcRr^8bPa5vHnSa_?uGd{W*2(+C_A;7yGH~RY=6-ahI_m5p_`vp4!(BZ3za}m zUs-?v(hHm8WfOOH0(aKzF|^+ru9t80=-sbxpe((1-?QbjJ$<7BI9M-~?rl2HvHe9K IA$Pq00)}{`o&W#< literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/sequence.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/sequence.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..92da7ecbed1f950e8a52e9c65f8f28dc0b32993b GIT binary patch literal 7509 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 Dmv~|+ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/serialisable.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/descriptors/__pycache__/serialisable.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..725e92a016209d81fb37b4a918adb773576c0934 GIT binary patch literal 10341 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 self.max: + raise ValueError('Max value is {0}'.format(self.max)) + super().__set__(instance, value) + + +class Min(Convertible): + """Values must be greater than a `min` value""" + + expected_type = float + allow_none = False + + def __init__(self, **kw): + if 'min' not in kw and not hasattr(self, 'min'): + raise TypeError('missing min value') + super().__init__(**kw) + + def __set__(self, instance, value): + if ((self.allow_none and value is not None) + or not self.allow_none): + value = _convert(self.expected_type, value) + if value < self.min: + raise ValueError('Min value is {0}'.format(self.min)) + super().__set__(instance, value) + + +class MinMax(Min, Max): + """Values must be greater than `min` value and less than a `max` one""" + pass + + +class Set(Descriptor): + """Value can only be from a set of know values""" + + def __init__(self, name=None, **kw): + if not 'values' in kw: + raise TypeError("missing set of values") + kw['values'] = set(kw['values']) + super().__init__(name, **kw) + self.__doc__ = "Value must be one of {0}".format(self.values) + + def __set__(self, instance, value): + if value not in self.values: + raise ValueError(self.__doc__) + super().__set__(instance, value) + + +class NoneSet(Set): + + """'none' will be treated as None""" + + def __init__(self, name=None, **kw): + super().__init__(name, **kw) + self.values.add(None) + + def __set__(self, instance, value): + if value == 'none': + value = None + super().__set__(instance, value) + + +class Integer(Convertible): + + expected_type = int + + +class Float(Convertible): + + expected_type = float + + +class Bool(Convertible): + + expected_type = bool + + def __set__(self, instance, value): + if isinstance(value, str): + if value in ('false', 'f', '0'): + value = False + super().__set__(instance, value) + + +class String(Typed): + + expected_type = str + + +class Text(String, Convertible): + + pass + + +class ASCII(Typed): + + expected_type = bytes + + +class Tuple(Typed): + + expected_type = tuple + + +class Length(Descriptor): + + def __init__(self, name=None, **kw): + if "length" not in kw: + raise TypeError("value length must be supplied") + super().__init__(**kw) + + + def __set__(self, instance, value): + if len(value) != self.length: + raise ValueError("Value must be length {0}".format(self.length)) + super().__set__(instance, value) + + +class Default(Typed): + """ + When called returns an instance of the expected type. + Additional default values can be passed in to the descriptor + """ + + def __init__(self, name=None, **kw): + if "defaults" not in kw: + kw['defaults'] = {} + super().__init__(**kw) + + def __call__(self): + return self.expected_type() + + +class Alias(Descriptor): + """ + Aliases can be used when either the desired attribute name is not allowed + or confusing in Python (eg. "type") or a more descriptive name is desired + (eg. "underline" for "u") + """ + + def __init__(self, alias): + self.alias = alias + + def __set__(self, instance, value): + setattr(instance, self.alias, value) + + def __get__(self, instance, cls): + return getattr(instance, self.alias) + + +class MatchPattern(Descriptor): + """Values must match a regex pattern """ + allow_none = False + + def __init__(self, name=None, **kw): + if 'pattern' not in kw and not hasattr(self, 'pattern'): + raise TypeError('missing pattern value') + + super().__init__(name, **kw) + self.test_pattern = re.compile(self.pattern, re.VERBOSE) + + + def __set__(self, instance, value): + + if value is None and not self.allow_none: + raise ValueError("Value must not be none") + + if ((self.allow_none and value is not None) + or not self.allow_none): + if not self.test_pattern.match(value): + raise ValueError('Value does not match pattern {0}'.format(self.pattern)) + + super().__set__(instance, value) + + +class DateTime(Typed): + + expected_type = datetime.datetime + + def __set__(self, instance, value): + if value is not None and isinstance(value, str): + try: + value = from_ISO8601(value) + except ValueError: + raise ValueError("Value must be ISO datetime format") + super().__set__(instance, value) diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/container.py b/venv/lib/python3.11/site-packages/openpyxl/descriptors/container.py new file mode 100755 index 0000000..4b1839f --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/descriptors/container.py @@ -0,0 +1,41 @@ +# Copyright (c) 2010-2024 openpyxl + +""" +Utility list for top level containers that contain one type of element + +Provides the necessary API to read and write XML +""" + +from openpyxl.xml.functions import Element + + +class ElementList(list): + + + @property + def tagname(self): + raise NotImplementedError + + + @property + def expected_type(self): + raise NotImplementedError + + + @classmethod + def from_tree(cls, tree): + l = [cls.expected_type.from_tree(el) for el in tree] + return cls(l) + + + def to_tree(self): + container = Element(self.tagname) + for el in self: + container.append(el.to_tree()) + return container + + + def append(self, value): + if not isinstance(value, self.expected_type): + raise TypeError(f"Value must of type {self.expected_type} {type(value)} provided") + super().append(value) diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/excel.py b/venv/lib/python3.11/site-packages/openpyxl/descriptors/excel.py new file mode 100755 index 0000000..d8aa202 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/descriptors/excel.py @@ -0,0 +1,112 @@ +# Copyright (c) 2010-2024 openpyxl + +""" +Excel specific descriptors +""" + +from openpyxl.xml.constants import REL_NS +from openpyxl.compat import safe_string +from openpyxl.xml.functions import Element + +from . import ( + MatchPattern, + MinMax, + Integer, + String, + Sequence, +) +from .serialisable import Serialisable + + +class HexBinary(MatchPattern): + + pattern = "[0-9a-fA-F]+$" + + +class UniversalMeasure(MatchPattern): + + pattern = r"[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)" + + +class TextPoint(MinMax): + """ + Size in hundredths of points. + In theory other units of measurement can be used but these are unbounded + """ + expected_type = int + + min = -400000 + max = 400000 + + +Coordinate = Integer + + +class Percentage(MinMax): + + pattern = r"((100)|([0-9][0-9]?))(\.[0-9][0-9]?)?%" # strict + min = -1000000 + max = 1000000 + + def __set__(self, instance, value): + if isinstance(value, str) and "%" in value: + value = value.replace("%", "") + value = int(float(value) * 1000) + super().__set__(instance, value) + + +class Extension(Serialisable): + + uri = String() + + def __init__(self, + uri=None, + ): + self.uri = uri + + +class ExtensionList(Serialisable): + + ext = Sequence(expected_type=Extension) + + def __init__(self, + ext=(), + ): + self.ext = ext + + +class Relation(String): + + namespace = REL_NS + allow_none = True + + +class Base64Binary(MatchPattern): + # http://www.w3.org/TR/xmlschema11-2/#nt-Base64Binary + pattern = "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$" + + +class Guid(MatchPattern): + # https://msdn.microsoft.com/en-us/library/dd946381(v=office.12).aspx + pattern = r"{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}" + + +class CellRange(MatchPattern): + + pattern = r"^[$]?([A-Za-z]{1,3})[$]?(\d+)(:[$]?([A-Za-z]{1,3})[$]?(\d+)?)?$|^[A-Za-z]{1,3}:[A-Za-z]{1,3}$" + allow_none = True + + def __set__(self, instance, value): + + if value is not None: + value = value.upper() + super().__set__(instance, value) + + +def _explicit_none(tagname, value, namespace=None): + """ + Override serialisation because explicit none required + """ + if namespace is not None: + tagname = "{%s}%s" % (namespace, tagname) + return Element(tagname, val=safe_string(value)) diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/namespace.py b/venv/lib/python3.11/site-packages/openpyxl/descriptors/namespace.py new file mode 100755 index 0000000..93cc9e4 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/descriptors/namespace.py @@ -0,0 +1,12 @@ +# Copyright (c) 2010-2024 openpyxl + + +def namespaced(obj, tagname, namespace=None): + """ + Utility to create a namespaced tag for an object + """ + + namespace = getattr(obj, "namespace", None) or namespace + if namespace is not None: + tagname = "{%s}%s" % (namespace, tagname) + return tagname diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/nested.py b/venv/lib/python3.11/site-packages/openpyxl/descriptors/nested.py new file mode 100755 index 0000000..bda63a2 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/descriptors/nested.py @@ -0,0 +1,129 @@ +# Copyright (c) 2010-2024 openpyxl + +""" +Generic serialisable classes +""" +from .base import ( + Convertible, + Bool, + Descriptor, + NoneSet, + MinMax, + Set, + Float, + Integer, + String, + ) +from openpyxl.compat import safe_string +from openpyxl.xml.functions import Element, localname, whitespace + + +class Nested(Descriptor): + + nested = True + attribute = "val" + + def __set__(self, instance, value): + if hasattr(value, "tag"): + tag = localname(value) + if tag != self.name: + raise ValueError("Tag does not match attribute") + + value = self.from_tree(value) + super().__set__(instance, value) + + + def from_tree(self, node): + return node.get(self.attribute) + + + def to_tree(self, tagname=None, value=None, namespace=None): + namespace = getattr(self, "namespace", namespace) + if value is not None: + if namespace is not None: + tagname = "{%s}%s" % (namespace, tagname) + value = safe_string(value) + return Element(tagname, {self.attribute:value}) + + +class NestedValue(Nested, Convertible): + """ + Nested tag storing the value on the 'val' attribute + """ + pass + + +class NestedText(NestedValue): + """ + Represents any nested tag with the value as the contents of the tag + """ + + + def from_tree(self, node): + return node.text + + + def to_tree(self, tagname=None, value=None, namespace=None): + namespace = getattr(self, "namespace", namespace) + if value is not None: + if namespace is not None: + tagname = "{%s}%s" % (namespace, tagname) + el = Element(tagname) + el.text = safe_string(value) + whitespace(el) + return el + + +class NestedFloat(NestedValue, Float): + + pass + + +class NestedInteger(NestedValue, Integer): + + pass + + +class NestedString(NestedValue, String): + + pass + + +class NestedBool(NestedValue, Bool): + + + def from_tree(self, node): + return node.get("val", True) + + +class NestedNoneSet(Nested, NoneSet): + + pass + + +class NestedSet(Nested, Set): + + pass + + +class NestedMinMax(Nested, MinMax): + + pass + + +class EmptyTag(Nested, Bool): + + """ + Boolean if a tag exists or not. + """ + + def from_tree(self, node): + return True + + + def to_tree(self, tagname=None, value=None, namespace=None): + if value: + namespace = getattr(self, "namespace", namespace) + if namespace is not None: + tagname = "{%s}%s" % (namespace, tagname) + return Element(tagname) diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/sequence.py b/venv/lib/python3.11/site-packages/openpyxl/descriptors/sequence.py new file mode 100755 index 0000000..d77116b --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/descriptors/sequence.py @@ -0,0 +1,136 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.compat import safe_string +from openpyxl.xml.functions import Element +from openpyxl.utils.indexed_list import IndexedList + +from .base import Descriptor, Alias, _convert +from .namespace import namespaced + + +class Sequence(Descriptor): + """ + A sequence (list or tuple) that may only contain objects of the declared + type + """ + + expected_type = type(None) + seq_types = (list, tuple) + idx_base = 0 + unique = False + container = list + + + def __set__(self, instance, seq): + if not isinstance(seq, self.seq_types): + raise TypeError("Value must be a sequence") + seq = self.container(_convert(self.expected_type, value) for value in seq) + if self.unique: + seq = IndexedList(seq) + + super().__set__(instance, seq) + + + def to_tree(self, tagname, obj, namespace=None): + """ + Convert the sequence represented by the descriptor to an XML element + """ + for idx, v in enumerate(obj, self.idx_base): + if hasattr(v, "to_tree"): + el = v.to_tree(tagname, idx) + else: + tagname = namespaced(obj, tagname, namespace) + el = Element(tagname) + el.text = safe_string(v) + yield el + + +class UniqueSequence(Sequence): + """ + Use a set to keep values unique + """ + seq_types = (list, tuple, set) + container = set + + +class ValueSequence(Sequence): + """ + A sequence of primitive types that are stored as a single attribute. + "val" is the default attribute + """ + + attribute = "val" + + + def to_tree(self, tagname, obj, namespace=None): + tagname = namespaced(self, tagname, namespace) + for v in obj: + yield Element(tagname, {self.attribute:safe_string(v)}) + + + def from_tree(self, node): + + return node.get(self.attribute) + + +class NestedSequence(Sequence): + """ + Wrap a sequence in an containing object + """ + + count = False + + def to_tree(self, tagname, obj, namespace=None): + tagname = namespaced(self, tagname, namespace) + container = Element(tagname) + if self.count: + container.set('count', str(len(obj))) + for v in obj: + container.append(v.to_tree()) + return container + + + def from_tree(self, node): + return [self.expected_type.from_tree(el) for el in node] + + +class MultiSequence(Sequence): + """ + Sequences can contain objects with different tags + """ + + def __set__(self, instance, seq): + if not isinstance(seq, (tuple, list)): + raise ValueError("Value must be a sequence") + seq = list(seq) + Descriptor.__set__(self, instance, seq) + + + def to_tree(self, tagname, obj, namespace=None): + """ + Convert the sequence represented by the descriptor to an XML element + """ + for v in obj: + el = v.to_tree(namespace=namespace) + yield el + + +class MultiSequencePart(Alias): + """ + Allow a multisequence to be built up from parts + + Excluded from the instance __elements__ or __attrs__ as is effectively an Alias + """ + + def __init__(self, expected_type, store): + self.expected_type = expected_type + self.store = store + + + def __set__(self, instance, value): + value = _convert(self.expected_type, value) + instance.__dict__[self.store].append(value) + + + def __get__(self, instance, cls): + return self diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/serialisable.py b/venv/lib/python3.11/site-packages/openpyxl/descriptors/serialisable.py new file mode 100755 index 0000000..1bc9ef0 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/descriptors/serialisable.py @@ -0,0 +1,240 @@ +# Copyright (c) 2010-2024 openpyxl + +from copy import copy +from keyword import kwlist +KEYWORDS = frozenset(kwlist) + +from . import Descriptor +from . import MetaSerialisable +from .sequence import ( + Sequence, + NestedSequence, + MultiSequencePart, +) +from .namespace import namespaced + +from openpyxl.compat import safe_string +from openpyxl.xml.functions import ( + Element, + localname, +) + +seq_types = (list, tuple) + +class Serialisable(metaclass=MetaSerialisable): + """ + Objects can serialise to XML their attributes and child objects. + The following class attributes are created by the metaclass at runtime: + __attrs__ = attributes + __nested__ = single-valued child treated as an attribute + __elements__ = child elements + """ + + __attrs__ = None + __nested__ = None + __elements__ = None + __namespaced__ = None + + idx_base = 0 + + @property + def tagname(self): + raise(NotImplementedError) + + namespace = None + + @classmethod + def from_tree(cls, node): + """ + Create object from XML + """ + # strip known namespaces from attributes + attrib = dict(node.attrib) + for key, ns in cls.__namespaced__: + if ns in attrib: + attrib[key] = attrib[ns] + del attrib[ns] + + # strip attributes with unknown namespaces + for key in list(attrib): + if key.startswith('{'): + del attrib[key] + elif key in KEYWORDS: + attrib["_" + key] = attrib[key] + del attrib[key] + elif "-" in key: + n = key.replace("-", "_") + attrib[n] = attrib[key] + del attrib[key] + + if node.text and "attr_text" in cls.__attrs__: + attrib["attr_text"] = node.text + + for el in node: + tag = localname(el) + if tag in KEYWORDS: + tag = "_" + tag + desc = getattr(cls, tag, None) + if desc is None or isinstance(desc, property): + continue + + if hasattr(desc, 'from_tree'): + #descriptor manages conversion + obj = desc.from_tree(el) + else: + if hasattr(desc.expected_type, "from_tree"): + #complex type + obj = desc.expected_type.from_tree(el) + else: + #primitive + obj = el.text + + if isinstance(desc, NestedSequence): + attrib[tag] = obj + elif isinstance(desc, Sequence): + attrib.setdefault(tag, []) + attrib[tag].append(obj) + elif isinstance(desc, MultiSequencePart): + attrib.setdefault(desc.store, []) + attrib[desc.store].append(obj) + else: + attrib[tag] = obj + + return cls(**attrib) + + + def to_tree(self, tagname=None, idx=None, namespace=None): + + if tagname is None: + tagname = self.tagname + + # keywords have to be masked + if tagname.startswith("_"): + tagname = tagname[1:] + + tagname = namespaced(self, tagname, namespace) + namespace = getattr(self, "namespace", namespace) + + attrs = dict(self) + for key, ns in self.__namespaced__: + if key in attrs: + attrs[ns] = attrs[key] + del attrs[key] + + el = Element(tagname, attrs) + if "attr_text" in self.__attrs__: + el.text = safe_string(getattr(self, "attr_text")) + + for child_tag in self.__elements__: + desc = getattr(self.__class__, child_tag, None) + obj = getattr(self, child_tag) + if hasattr(desc, "namespace") and hasattr(obj, 'namespace'): + obj.namespace = desc.namespace + + if isinstance(obj, seq_types): + if isinstance(desc, NestedSequence): + # wrap sequence in container + if not obj: + continue + nodes = [desc.to_tree(child_tag, obj, namespace)] + elif isinstance(desc, Sequence): + # sequence + desc.idx_base = self.idx_base + nodes = (desc.to_tree(child_tag, obj, namespace)) + else: # property + nodes = (v.to_tree(child_tag, namespace) for v in obj) + for node in nodes: + el.append(node) + else: + if child_tag in self.__nested__: + node = desc.to_tree(child_tag, obj, namespace) + elif obj is None: + continue + else: + node = obj.to_tree(child_tag) + if node is not None: + el.append(node) + return el + + + def __iter__(self): + for attr in self.__attrs__: + value = getattr(self, attr) + if attr.startswith("_"): + attr = attr[1:] + elif attr != "attr_text" and "_" in attr: + desc = getattr(self.__class__, attr) + if getattr(desc, "hyphenated", False): + attr = attr.replace("_", "-") + if attr != "attr_text" and value is not None: + yield attr, safe_string(value) + + + def __eq__(self, other): + if not self.__class__ == other.__class__: + return False + elif not dict(self) == dict(other): + return False + for el in self.__elements__: + if getattr(self, el) != getattr(other, el): + return False + return True + + + def __ne__(self, other): + return not self == other + + + def __repr__(self): + s = u"<{0}.{1} object>\nParameters:".format( + self.__module__, + self.__class__.__name__ + ) + args = [] + for k in self.__attrs__ + self.__elements__: + v = getattr(self, k) + if isinstance(v, Descriptor): + v = None + args.append(u"{0}={1}".format(k, repr(v))) + args = u", ".join(args) + + return u"\n".join([s, args]) + + + def __hash__(self): + fields = [] + for attr in self.__attrs__ + self.__elements__: + val = getattr(self, attr) + if isinstance(val, list): + val = tuple(val) + fields.append(val) + + return hash(tuple(fields)) + + + def __add__(self, other): + if type(self) != type(other): + raise TypeError("Cannot combine instances of different types") + vals = {} + for attr in self.__attrs__: + vals[attr] = getattr(self, attr) or getattr(other, attr) + for el in self.__elements__: + a = getattr(self, el) + b = getattr(other, el) + if a and b: + vals[el] = a + b + else: + vals[el] = a or b + return self.__class__(**vals) + + + def __copy__(self): + # serialise to xml and back to avoid shallow copies + xml = self.to_tree(tagname="dummy") + cp = self.__class__.from_tree(xml) + # copy any non-persisted attributed + for k in self.__dict__: + if k not in self.__attrs__ + self.__elements__: + v = copy(getattr(self, k)) + setattr(cp, k, v) + return cp diff --git a/venv/lib/python3.11/site-packages/openpyxl/descriptors/slots.py b/venv/lib/python3.11/site-packages/openpyxl/descriptors/slots.py new file mode 100755 index 0000000..cadc1ef --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/descriptors/slots.py @@ -0,0 +1,18 @@ +# Metaclass for mixing slots and descriptors +# From "Programming in Python 3" by Mark Summerfield Ch.8 p. 383 + +class AutoSlotProperties(type): + + def __new__(mcl, classname, bases, dictionary): + slots = list(dictionary.get("__slots__", [])) + for getter_name in [key for key in dictionary if key.startswith("get_")]: + name = getter_name + slots.append("__" + name) + getter = dictionary.pop(getter_name) + setter = dictionary.get(setter_name, None) + if (setter is not None + and isinstance(setter, collections.Callable)): + del dictionary[setter_name] + dictionary[name] = property(getter. setter) + dictionary["__slots__"] = tuple(slots) + return super().__new__(mcl, classname, bases, dictionary) diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/__init__.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/__init__.py new file mode 100755 index 0000000..02f0587 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2010-2024 openpyxl + + +from .drawing import Drawing diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..fefab9f7b5cefc8cd6bfe7a13caf1585aa01f57e GIT binary patch literal 260 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/effect.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/effect.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..cca089557fdd9a78dd4509e547adc2082b5762e5 GIT binary patch literal 15664 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/geometry.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/geometry.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..974000769dfda9e475aa85b02373b428d9a22cd1 GIT binary patch literal 23322 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 Yeqp@-K0{!$oOA+lv>%-05Ah`be@iW6t^fc4 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/line.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/line.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..6bfe2f9b1de60faf258063ab4c6bab3847039a53 GIT binary patch literal 5334 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/picture.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/picture.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..1903b81deecb4b2632bbc2d16a55939d8c03ecd1 GIT binary patch literal 5245 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/properties.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/properties.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..148f999bb0396c5f9641f9469ed9b12c9a9e0bee GIT binary patch literal 6530 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 k4-QrDjp0B$VRz*Hq)$ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/relation.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/relation.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..68bd916156e2e92abb6bc0b95106da1425811c1b GIT binary patch literal 934 zcmZuwJ8u&~5T3nGcr{wc71k;mF(_)_sz`C?9ANWk9>X&r9!oL=3N|8OYXsRkHEdG@ znmU)3i^VnoJ597xuroxL2ODvI_Ym`F89FvyCA!O~%1d#T@T?$V2q)+S9LbVFKt@3| znV#m6vKAYHvIbY(6UuLU`|^|ZA!Hq&3QORCc%oH(vST$E7A>pYYcNV9>zD?|7V{3I zB03C%rc!3u=&eyG#Vk%4h zhDs+dp%3G`g@JLF9>_V93aFK{%0Iw9b)0z3ar}^UnBqCdIqG1xu%sj0RFtbu#92j! z%#Lz(9p?3Nb-+*H>q?PRkX}Mo60swpe>ErToBh4Ai z6Oy1RUag#tx0c=Sh2B@S-%xKLf;(gsF}Ynx+6f9KnO@YXZ+kt7{C_Xmw3f86=Co3E$uS MQQE(^nC2<{1BN{7^8f$< literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/spreadsheet_drawing.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/spreadsheet_drawing.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..9ed91f0e334648e375e68db2cb82a76c2be44b0a GIT binary patch literal 15888 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 Tpg3F8J3S96=ZkIlRIC0EJGyI1 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/text.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/text.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..47447d8b825b000a2f15574389c00669be7a0d1c GIT binary patch literal 25307 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 UUDoiy;3FG3PXyd;f@0zOzhlF(z5oCK literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/xdr.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/drawing/__pycache__/xdr.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..1e7a9e86d51fc36c90b6f9e6814e8a2a085a1255 GIT binary patch literal 1408 zcmb_b&rj4q6rO3jyKPyPA3-q^%^FW@A`N&kN=(4rh>0Q*Lrgg|bvw%z`pap-T~0lC zblx{_J`E461lq)%{S7V< z@&lcIE98S?4ugGS5uI4n5*+FZy5Nes=t{aoi9ntZOMFi(i3uM?LcT!HnqEk`0&qnp z4sgYkD*-1nX@DzP$_lBeJ9Fwvz?o@Z3o(2neFwqoxv@P}S;(+gWZcW3L({+ZF@LTty= z0Q-ayokH@0MRk!$8+}=bUI4F{&IHhl7KK9#iTb+!GXLaKt(3@y;h8Qoj6^jI*SEGD z9G4B_?Uw1}jDj`{%qHU~UP3zw?S3Z5xcBLrw(2`uz-yuDS$4QNGkafaIcB)21>Ked z%4pln+twWW4FsaL@7{p?5xE~Fg_dInicohP_?VDoFiO=9xeh5s-|Aq)#As8<;jEcjks}U^YGtRM5l1(AbhCc%qg6iQx%2Y?2(JGw|0cllS`;n Fn_q^KIUN81 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/colors.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/colors.py new file mode 100755 index 0000000..19fa5e8 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/colors.py @@ -0,0 +1,435 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Alias, + Typed, + Integer, + Set, + MinMax, +) +from openpyxl.descriptors.excel import Percentage +from openpyxl.descriptors.nested import ( + NestedNoneSet, + NestedValue, + NestedInteger, + EmptyTag, +) + +from openpyxl.styles.colors import RGB +from openpyxl.xml.constants import DRAWING_NS + +from openpyxl.descriptors.excel import ExtensionList as OfficeArtExtensionList + +PRESET_COLORS = [ + 'aliceBlue', 'antiqueWhite', 'aqua', 'aquamarine', + 'azure', 'beige', 'bisque', 'black', 'blanchedAlmond', 'blue', + 'blueViolet', 'brown', 'burlyWood', 'cadetBlue', 'chartreuse', + 'chocolate', 'coral', 'cornflowerBlue', 'cornsilk', 'crimson', 'cyan', + 'darkBlue', 'darkCyan', 'darkGoldenrod', 'darkGray', 'darkGrey', + 'darkGreen', 'darkKhaki', 'darkMagenta', 'darkOliveGreen', 'darkOrange', + 'darkOrchid', 'darkRed', 'darkSalmon', 'darkSeaGreen', 'darkSlateBlue', + 'darkSlateGray', 'darkSlateGrey', 'darkTurquoise', 'darkViolet', + 'dkBlue', 'dkCyan', 'dkGoldenrod', 'dkGray', 'dkGrey', 'dkGreen', + 'dkKhaki', 'dkMagenta', 'dkOliveGreen', 'dkOrange', 'dkOrchid', 'dkRed', + 'dkSalmon', 'dkSeaGreen', 'dkSlateBlue', 'dkSlateGray', 'dkSlateGrey', + 'dkTurquoise', 'dkViolet', 'deepPink', 'deepSkyBlue', 'dimGray', + 'dimGrey', 'dodgerBlue', 'firebrick', 'floralWhite', 'forestGreen', + 'fuchsia', 'gainsboro', 'ghostWhite', 'gold', 'goldenrod', 'gray', + 'grey', 'green', 'greenYellow', 'honeydew', 'hotPink', 'indianRed', + 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderBlush', 'lawnGreen', + 'lemonChiffon', 'lightBlue', 'lightCoral', 'lightCyan', + 'lightGoldenrodYellow', 'lightGray', 'lightGrey', 'lightGreen', + 'lightPink', 'lightSalmon', 'lightSeaGreen', 'lightSkyBlue', + 'lightSlateGray', 'lightSlateGrey', 'lightSteelBlue', 'lightYellow', + 'ltBlue', 'ltCoral', 'ltCyan', 'ltGoldenrodYellow', 'ltGray', 'ltGrey', + 'ltGreen', 'ltPink', 'ltSalmon', 'ltSeaGreen', 'ltSkyBlue', + 'ltSlateGray', 'ltSlateGrey', 'ltSteelBlue', 'ltYellow', 'lime', + 'limeGreen', 'linen', 'magenta', 'maroon', 'medAquamarine', 'medBlue', + 'medOrchid', 'medPurple', 'medSeaGreen', 'medSlateBlue', + 'medSpringGreen', 'medTurquoise', 'medVioletRed', 'mediumAquamarine', + 'mediumBlue', 'mediumOrchid', 'mediumPurple', 'mediumSeaGreen', + 'mediumSlateBlue', 'mediumSpringGreen', 'mediumTurquoise', + 'mediumVioletRed', 'midnightBlue', 'mintCream', 'mistyRose', 'moccasin', + 'navajoWhite', 'navy', 'oldLace', 'olive', 'oliveDrab', 'orange', + 'orangeRed', 'orchid', 'paleGoldenrod', 'paleGreen', 'paleTurquoise', + 'paleVioletRed', 'papayaWhip', 'peachPuff', 'peru', 'pink', 'plum', + 'powderBlue', 'purple', 'red', 'rosyBrown', 'royalBlue', 'saddleBrown', + 'salmon', 'sandyBrown', 'seaGreen', 'seaShell', 'sienna', 'silver', + 'skyBlue', 'slateBlue', 'slateGray', 'slateGrey', 'snow', 'springGreen', + 'steelBlue', 'tan', 'teal', 'thistle', 'tomato', 'turquoise', 'violet', + 'wheat', 'white', 'whiteSmoke', 'yellow', 'yellowGreen' + ] + + +SCHEME_COLORS= ['bg1', 'tx1', 'bg2', 'tx2', 'accent1', 'accent2', 'accent3', + 'accent4', 'accent5', 'accent6', 'hlink', 'folHlink', 'phClr', 'dk1', 'lt1', + 'dk2', 'lt2' + ] + + +class Transform(Serialisable): + + pass + + +class SystemColor(Serialisable): + + tagname = "sysClr" + namespace = DRAWING_NS + + # color transform options + tint = NestedInteger(allow_none=True) + shade = NestedInteger(allow_none=True) + comp = Typed(expected_type=Transform, allow_none=True) + inv = Typed(expected_type=Transform, allow_none=True) + gray = Typed(expected_type=Transform, allow_none=True) + alpha = NestedInteger(allow_none=True) + alphaOff = NestedInteger(allow_none=True) + alphaMod = NestedInteger(allow_none=True) + hue = NestedInteger(allow_none=True) + hueOff = NestedInteger(allow_none=True) + hueMod = NestedInteger(allow_none=True) + sat = NestedInteger(allow_none=True) + satOff = NestedInteger(allow_none=True) + satMod = NestedInteger(allow_none=True) + lum = NestedInteger(allow_none=True) + lumOff = NestedInteger(allow_none=True) + lumMod = NestedInteger(allow_none=True) + red = NestedInteger(allow_none=True) + redOff = NestedInteger(allow_none=True) + redMod = NestedInteger(allow_none=True) + green = NestedInteger(allow_none=True) + greenOff = NestedInteger(allow_none=True) + greenMod = NestedInteger(allow_none=True) + blue = NestedInteger(allow_none=True) + blueOff = NestedInteger(allow_none=True) + blueMod = NestedInteger(allow_none=True) + gamma = Typed(expected_type=Transform, allow_none=True) + invGamma = Typed(expected_type=Transform, allow_none=True) + + val = Set(values=( ['scrollBar', 'background', 'activeCaption', + 'inactiveCaption', 'menu', 'window', 'windowFrame', 'menuText', + 'windowText', 'captionText', 'activeBorder', 'inactiveBorder', + 'appWorkspace', 'highlight', 'highlightText', 'btnFace', 'btnShadow', + 'grayText', 'btnText', 'inactiveCaptionText', 'btnHighlight', + '3dDkShadow', '3dLight', 'infoText', 'infoBk', 'hotLight', + 'gradientActiveCaption', 'gradientInactiveCaption', 'menuHighlight', + 'menuBar'] ) + ) + lastClr = RGB(allow_none=True) + + __elements__ = ('tint', 'shade', 'comp', 'inv', 'gray', "alpha", + "alphaOff", "alphaMod", "hue", "hueOff", "hueMod", "hueOff", "sat", + "satOff", "satMod", "lum", "lumOff", "lumMod", "red", "redOff", "redMod", + "green", "greenOff", "greenMod", "blue", "blueOff", "blueMod", "gamma", + "invGamma") + + def __init__(self, + val="windowText", + lastClr=None, + tint=None, + shade=None, + comp=None, + inv=None, + gray=None, + alpha=None, + alphaOff=None, + alphaMod=None, + hue=None, + hueOff=None, + hueMod=None, + sat=None, + satOff=None, + satMod=None, + lum=None, + lumOff=None, + lumMod=None, + red=None, + redOff=None, + redMod=None, + green=None, + greenOff=None, + greenMod=None, + blue=None, + blueOff=None, + blueMod=None, + gamma=None, + invGamma=None + ): + self.val = val + self.lastClr = lastClr + self.tint = tint + self.shade = shade + self.comp = comp + self.inv = inv + self.gray = gray + self.alpha = alpha + self.alphaOff = alphaOff + self.alphaMod = alphaMod + self.hue = hue + self.hueOff = hueOff + self.hueMod = hueMod + self.sat = sat + self.satOff = satOff + self.satMod = satMod + self.lum = lum + self.lumOff = lumOff + self.lumMod = lumMod + self.red = red + self.redOff = redOff + self.redMod = redMod + self.green = green + self.greenOff = greenOff + self.greenMod = greenMod + self.blue = blue + self.blueOff = blueOff + self.blueMod = blueMod + self.gamma = gamma + self.invGamma = invGamma + + +class HSLColor(Serialisable): + + tagname = "hslClr" + + hue = Integer() + sat = MinMax(min=0, max=100) + lum = MinMax(min=0, max=100) + + #TODO add color transform options + + def __init__(self, + hue=None, + sat=None, + lum=None, + ): + self.hue = hue + self.sat = sat + self.lum = lum + + + +class RGBPercent(Serialisable): + + tagname = "rgbClr" + + r = MinMax(min=0, max=100) + g = MinMax(min=0, max=100) + b = MinMax(min=0, max=100) + + #TODO add color transform options + + def __init__(self, + r=None, + g=None, + b=None, + ): + self.r = r + self.g = g + self.b = b + + +class SchemeColor(Serialisable): + + tagname = "schemeClr" + namespace = DRAWING_NS + + tint = NestedInteger(allow_none=True) + shade = NestedInteger(allow_none=True) + comp = EmptyTag(allow_none=True) + inv = NestedInteger(allow_none=True) + gray = NestedInteger(allow_none=True) + alpha = NestedInteger(allow_none=True) + alphaOff = NestedInteger(allow_none=True) + alphaMod = NestedInteger(allow_none=True) + hue = NestedInteger(allow_none=True) + hueOff = NestedInteger(allow_none=True) + hueMod = NestedInteger(allow_none=True) + sat = NestedInteger(allow_none=True) + satOff = NestedInteger(allow_none=True) + satMod = NestedInteger(allow_none=True) + lum = NestedInteger(allow_none=True) + lumOff = NestedInteger(allow_none=True) + lumMod = NestedInteger(allow_none=True) + red = NestedInteger(allow_none=True) + redOff = NestedInteger(allow_none=True) + redMod = NestedInteger(allow_none=True) + green = NestedInteger(allow_none=True) + greenOff = NestedInteger(allow_none=True) + greenMod = NestedInteger(allow_none=True) + blue = NestedInteger(allow_none=True) + blueOff = NestedInteger(allow_none=True) + blueMod = NestedInteger(allow_none=True) + gamma = EmptyTag(allow_none=True) + invGamma = EmptyTag(allow_none=True) + val = Set(values=(['bg1', 'tx1', 'bg2', 'tx2', 'accent1', 'accent2', + 'accent3', 'accent4', 'accent5', 'accent6', 'hlink', 'folHlink', 'phClr', + 'dk1', 'lt1', 'dk2', 'lt2'])) + + __elements__ = ('tint', 'shade', 'comp', 'inv', 'gray', 'alpha', + 'alphaOff', 'alphaMod', 'hue', 'hueOff', 'hueMod', 'sat', 'satOff', + 'satMod', 'lum', 'lumMod', 'lumOff', 'red', 'redOff', 'redMod', 'green', + 'greenOff', 'greenMod', 'blue', 'blueOff', 'blueMod', 'gamma', + 'invGamma') + + def __init__(self, + tint=None, + shade=None, + comp=None, + inv=None, + gray=None, + alpha=None, + alphaOff=None, + alphaMod=None, + hue=None, + hueOff=None, + hueMod=None, + sat=None, + satOff=None, + satMod=None, + lum=None, + lumOff=None, + lumMod=None, + red=None, + redOff=None, + redMod=None, + green=None, + greenOff=None, + greenMod=None, + blue=None, + blueOff=None, + blueMod=None, + gamma=None, + invGamma=None, + val=None, + ): + self.tint = tint + self.shade = shade + self.comp = comp + self.inv = inv + self.gray = gray + self.alpha = alpha + self.alphaOff = alphaOff + self.alphaMod = alphaMod + self.hue = hue + self.hueOff = hueOff + self.hueMod = hueMod + self.sat = sat + self.satOff = satOff + self.satMod = satMod + self.lum = lum + self.lumOff = lumOff + self.lumMod = lumMod + self.red = red + self.redOff = redOff + self.redMod = redMod + self.green = green + self.greenOff = greenOff + self.greenMod = greenMod + self.blue = blue + self.blueOff = blueOff + self.blueMod = blueMod + self.gamma = gamma + self.invGamma = invGamma + self.val = val + +class ColorChoice(Serialisable): + + tagname = "colorChoice" + namespace = DRAWING_NS + + scrgbClr = Typed(expected_type=RGBPercent, allow_none=True) + RGBPercent = Alias('scrgbClr') + srgbClr = NestedValue(expected_type=str, allow_none=True) # needs pattern and can have transform + RGB = Alias('srgbClr') + hslClr = Typed(expected_type=HSLColor, allow_none=True) + sysClr = Typed(expected_type=SystemColor, allow_none=True) + schemeClr = Typed(expected_type=SchemeColor, allow_none=True) + prstClr = NestedNoneSet(values=PRESET_COLORS) + + __elements__ = ('scrgbClr', 'srgbClr', 'hslClr', 'sysClr', 'schemeClr', 'prstClr') + + def __init__(self, + scrgbClr=None, + srgbClr=None, + hslClr=None, + sysClr=None, + schemeClr=None, + prstClr=None, + ): + self.scrgbClr = scrgbClr + self.srgbClr = srgbClr + self.hslClr = hslClr + self.sysClr = sysClr + self.schemeClr = schemeClr + self.prstClr = prstClr + +_COLOR_SET = ('dk1', 'lt1', 'dk2', 'lt2', 'accent1', 'accent2', 'accent3', + 'accent4', 'accent5', 'accent6', 'hlink', 'folHlink') + + +class ColorMapping(Serialisable): + + tagname = "clrMapOvr" + + bg1 = Set(values=_COLOR_SET) + tx1 = Set(values=_COLOR_SET) + bg2 = Set(values=_COLOR_SET) + tx2 = Set(values=_COLOR_SET) + accent1 = Set(values=_COLOR_SET) + accent2 = Set(values=_COLOR_SET) + accent3 = Set(values=_COLOR_SET) + accent4 = Set(values=_COLOR_SET) + accent5 = Set(values=_COLOR_SET) + accent6 = Set(values=_COLOR_SET) + hlink = Set(values=_COLOR_SET) + folHlink = Set(values=_COLOR_SET) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + def __init__(self, + bg1="lt1", + tx1="dk1", + bg2="lt2", + tx2="dk2", + accent1="accent1", + accent2="accent2", + accent3="accent3", + accent4="accent4", + accent5="accent5", + accent6="accent6", + hlink="hlink", + folHlink="folHlink", + extLst=None, + ): + self.bg1 = bg1 + self.tx1 = tx1 + self.bg2 = bg2 + self.tx2 = tx2 + self.accent1 = accent1 + self.accent2 = accent2 + self.accent3 = accent3 + self.accent4 = accent4 + self.accent5 = accent5 + self.accent6 = accent6 + self.hlink = hlink + self.folHlink = folHlink + self.extLst = extLst + + +class ColorChoiceDescriptor(Typed): + """ + Objects can choose from 7 different kinds of color system. + Assume RGBHex if a string is passed in. + """ + + expected_type = ColorChoice + allow_none = True + + def __set__(self, instance, value): + if isinstance(value, str): + value = ColorChoice(srgbClr=value) + else: + if hasattr(self, "namespace") and value is not None: + value.namespace = self.namespace + super().__set__(instance, value) diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/connector.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/connector.py new file mode 100755 index 0000000..d25bcf7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/connector.py @@ -0,0 +1,144 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Bool, + Integer, + String, + Alias, +) +from openpyxl.descriptors.excel import ExtensionList as OfficeArtExtensionList +from openpyxl.chart.shapes import GraphicalProperties +from openpyxl.chart.text import RichText + +from .properties import ( + NonVisualDrawingProps, + NonVisualDrawingShapeProps, +) +from .geometry import ShapeStyle + +class Connection(Serialisable): + + id = Integer() + idx = Integer() + + def __init__(self, + id=None, + idx=None, + ): + self.id = id + self.idx = idx + + +class ConnectorLocking(Serialisable): + + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + def __init__(self, + extLst=None, + ): + self.extLst = extLst + + +class NonVisualConnectorProperties(Serialisable): + + cxnSpLocks = Typed(expected_type=ConnectorLocking, allow_none=True) + stCxn = Typed(expected_type=Connection, allow_none=True) + endCxn = Typed(expected_type=Connection, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + def __init__(self, + cxnSpLocks=None, + stCxn=None, + endCxn=None, + extLst=None, + ): + self.cxnSpLocks = cxnSpLocks + self.stCxn = stCxn + self.endCxn = endCxn + self.extLst = extLst + + +class ConnectorNonVisual(Serialisable): + + cNvPr = Typed(expected_type=NonVisualDrawingProps, ) + cNvCxnSpPr = Typed(expected_type=NonVisualConnectorProperties, ) + + __elements__ = ("cNvPr", "cNvCxnSpPr",) + + def __init__(self, + cNvPr=None, + cNvCxnSpPr=None, + ): + self.cNvPr = cNvPr + self.cNvCxnSpPr = cNvCxnSpPr + + +class ConnectorShape(Serialisable): + + tagname = "cxnSp" + + nvCxnSpPr = Typed(expected_type=ConnectorNonVisual) + spPr = Typed(expected_type=GraphicalProperties) + style = Typed(expected_type=ShapeStyle, allow_none=True) + macro = String(allow_none=True) + fPublished = Bool(allow_none=True) + + def __init__(self, + nvCxnSpPr=None, + spPr=None, + style=None, + macro=None, + fPublished=None, + ): + self.nvCxnSpPr = nvCxnSpPr + self.spPr = spPr + self.style = style + self.macro = macro + self.fPublished = fPublished + + +class ShapeMeta(Serialisable): + + tagname = "nvSpPr" + + cNvPr = Typed(expected_type=NonVisualDrawingProps) + cNvSpPr = Typed(expected_type=NonVisualDrawingShapeProps) + + def __init__(self, cNvPr=None, cNvSpPr=None): + self.cNvPr = cNvPr + self.cNvSpPr = cNvSpPr + + +class Shape(Serialisable): + + macro = String(allow_none=True) + textlink = String(allow_none=True) + fPublished = Bool(allow_none=True) + fLocksText = Bool(allow_none=True) + nvSpPr = Typed(expected_type=ShapeMeta, allow_none=True) + meta = Alias("nvSpPr") + spPr = Typed(expected_type=GraphicalProperties) + graphicalProperties = Alias("spPr") + style = Typed(expected_type=ShapeStyle, allow_none=True) + txBody = Typed(expected_type=RichText, allow_none=True) + + def __init__(self, + macro=None, + textlink=None, + fPublished=None, + fLocksText=None, + nvSpPr=None, + spPr=None, + style=None, + txBody=None, + ): + self.macro = macro + self.textlink = textlink + self.fPublished = fPublished + self.fLocksText = fLocksText + self.nvSpPr = nvSpPr + self.spPr = spPr + self.style = style + self.txBody = txBody diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/drawing.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/drawing.py new file mode 100755 index 0000000..45acdfe --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/drawing.py @@ -0,0 +1,92 @@ + +# Copyright (c) 2010-2024 openpyxl + +import math + +from openpyxl.utils.units import pixels_to_EMU + + +class Drawing: + """ a drawing object - eg container for shapes or charts + we assume user specifies dimensions in pixels; units are + converted to EMU in the drawing part + """ + + count = 0 + + def __init__(self): + + self.name = '' + self.description = '' + self.coordinates = ((1, 2), (16, 8)) + self.left = 0 + self.top = 0 + self._width = 21 # default in px + self._height = 192 #default in px + self.resize_proportional = False + self.rotation = 0 + self.anchortype = "absolute" + self.anchorcol = 0 # left cell + self.anchorrow = 0 # top row + + + @property + def width(self): + return self._width + + + @width.setter + def width(self, w): + if self.resize_proportional and w: + ratio = self._height / self._width + self._height = round(ratio * w) + self._width = w + + + @property + def height(self): + return self._height + + + @height.setter + def height(self, h): + if self.resize_proportional and h: + ratio = self._width / self._height + self._width = round(ratio * h) + self._height = h + + + def set_dimension(self, w=0, h=0): + + xratio = w / self._width + yratio = h / self._height + + if self.resize_proportional and w and h: + if (xratio * self._height) < h: + self._height = math.ceil(xratio * self._height) + self._width = w + else: + self._width = math.ceil(yratio * self._width) + self._height = h + + + @property + def anchor(self): + from .spreadsheet_drawing import ( + OneCellAnchor, + TwoCellAnchor, + AbsoluteAnchor) + if self.anchortype == "absolute": + anchor = AbsoluteAnchor() + anchor.pos.x = pixels_to_EMU(self.left) + anchor.pos.y = pixels_to_EMU(self.top) + + elif self.anchortype == "oneCell": + anchor = OneCellAnchor() + anchor._from.col = self.anchorcol + anchor._from.row = self.anchorrow + + anchor.ext.width = pixels_to_EMU(self._width) + anchor.ext.height = pixels_to_EMU(self._height) + + return anchor diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/effect.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/effect.py new file mode 100755 index 0000000..9edae34 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/effect.py @@ -0,0 +1,407 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + String, + Set, + Bool, + Integer, + Float, +) + +from .colors import ColorChoice + + +class TintEffect(Serialisable): + + tagname = "tint" + + hue = Integer() + amt = Integer() + + def __init__(self, + hue=0, + amt=0, + ): + self.hue = hue + self.amt = amt + + +class LuminanceEffect(Serialisable): + + tagname = "lum" + + bright = Integer() #Pct ? + contrast = Integer() #Pct# + + def __init__(self, + bright=0, + contrast=0, + ): + self.bright = bright + self.contrast = contrast + + +class HSLEffect(Serialisable): + + hue = Integer() + sat = Integer() + lum = Integer() + + def __init__(self, + hue=None, + sat=None, + lum=None, + ): + self.hue = hue + self.sat = sat + self.lum = lum + + +class GrayscaleEffect(Serialisable): + + tagname = "grayscl" + + +class FillOverlayEffect(Serialisable): + + blend = Set(values=(['over', 'mult', 'screen', 'darken', 'lighten'])) + + def __init__(self, + blend=None, + ): + self.blend = blend + + +class DuotoneEffect(Serialisable): + + pass + +class ColorReplaceEffect(Serialisable): + + pass + +class Color(Serialisable): + + pass + +class ColorChangeEffect(Serialisable): + + useA = Bool(allow_none=True) + clrFrom = Typed(expected_type=Color, ) + clrTo = Typed(expected_type=Color, ) + + def __init__(self, + useA=None, + clrFrom=None, + clrTo=None, + ): + self.useA = useA + self.clrFrom = clrFrom + self.clrTo = clrTo + + +class BlurEffect(Serialisable): + + rad = Float() + grow = Bool(allow_none=True) + + def __init__(self, + rad=None, + grow=None, + ): + self.rad = rad + self.grow = grow + + +class BiLevelEffect(Serialisable): + + thresh = Integer() + + def __init__(self, + thresh=None, + ): + self.thresh = thresh + + +class AlphaReplaceEffect(Serialisable): + + a = Integer() + + def __init__(self, + a=None, + ): + self.a = a + + +class AlphaModulateFixedEffect(Serialisable): + + amt = Integer() + + def __init__(self, + amt=None, + ): + self.amt = amt + + +class EffectContainer(Serialisable): + + type = Set(values=(['sib', 'tree'])) + name = String(allow_none=True) + + def __init__(self, + type=None, + name=None, + ): + self.type = type + self.name = name + + +class AlphaModulateEffect(Serialisable): + + cont = Typed(expected_type=EffectContainer, ) + + def __init__(self, + cont=None, + ): + self.cont = cont + + +class AlphaInverseEffect(Serialisable): + + pass + +class AlphaFloorEffect(Serialisable): + + pass + +class AlphaCeilingEffect(Serialisable): + + pass + +class AlphaBiLevelEffect(Serialisable): + + thresh = Integer() + + def __init__(self, + thresh=None, + ): + self.thresh = thresh + + +class GlowEffect(ColorChoice): + + rad = Float() + # uses element group EG_ColorChoice + scrgbClr = ColorChoice.scrgbClr + srgbClr = ColorChoice.srgbClr + hslClr = ColorChoice.hslClr + sysClr = ColorChoice.sysClr + schemeClr = ColorChoice.schemeClr + prstClr = ColorChoice.prstClr + + __elements__ = ('scrgbClr', 'srgbClr', 'hslClr', 'sysClr', 'schemeClr', 'prstClr') + + def __init__(self, + rad=None, + **kw + ): + self.rad = rad + super().__init__(**kw) + + +class InnerShadowEffect(ColorChoice): + + blurRad = Float() + dist = Float() + dir = Integer() + # uses element group EG_ColorChoice + scrgbClr = ColorChoice.scrgbClr + srgbClr = ColorChoice.srgbClr + hslClr = ColorChoice.hslClr + sysClr = ColorChoice.sysClr + schemeClr = ColorChoice.schemeClr + prstClr = ColorChoice.prstClr + + __elements__ = ('scrgbClr', 'srgbClr', 'hslClr', 'sysClr', 'schemeClr', 'prstClr') + + def __init__(self, + blurRad=None, + dist=None, + dir=None, + **kw + ): + self.blurRad = blurRad + self.dist = dist + self.dir = dir + super().__init__(**kw) + + +class OuterShadow(ColorChoice): + + tagname = "outerShdw" + + blurRad = Float(allow_none=True) + dist = Float(allow_none=True) + dir = Integer(allow_none=True) + sx = Integer(allow_none=True) + sy = Integer(allow_none=True) + kx = Integer(allow_none=True) + ky = Integer(allow_none=True) + algn = Set(values=['tl', 't', 'tr', 'l', 'ctr', 'r', 'bl', 'b', 'br']) + rotWithShape = Bool(allow_none=True) + # uses element group EG_ColorChoice + scrgbClr = ColorChoice.scrgbClr + srgbClr = ColorChoice.srgbClr + hslClr = ColorChoice.hslClr + sysClr = ColorChoice.sysClr + schemeClr = ColorChoice.schemeClr + prstClr = ColorChoice.prstClr + + __elements__ = ('scrgbClr', 'srgbClr', 'hslClr', 'sysClr', 'schemeClr', 'prstClr') + + def __init__(self, + blurRad=None, + dist=None, + dir=None, + sx=None, + sy=None, + kx=None, + ky=None, + algn=None, + rotWithShape=None, + **kw + ): + self.blurRad = blurRad + self.dist = dist + self.dir = dir + self.sx = sx + self.sy = sy + self.kx = kx + self.ky = ky + self.algn = algn + self.rotWithShape = rotWithShape + super().__init__(**kw) + + +class PresetShadowEffect(ColorChoice): + + prst = Set(values=(['shdw1', 'shdw2', 'shdw3', 'shdw4', 'shdw5', 'shdw6', + 'shdw7', 'shdw8', 'shdw9', 'shdw10', 'shdw11', 'shdw12', 'shdw13', + 'shdw14', 'shdw15', 'shdw16', 'shdw17', 'shdw18', 'shdw19', 'shdw20'])) + dist = Float() + dir = Integer() + # uses element group EG_ColorChoice + scrgbClr = ColorChoice.scrgbClr + srgbClr = ColorChoice.srgbClr + hslClr = ColorChoice.hslClr + sysClr = ColorChoice.sysClr + schemeClr = ColorChoice.schemeClr + prstClr = ColorChoice.prstClr + + __elements__ = ('scrgbClr', 'srgbClr', 'hslClr', 'sysClr', 'schemeClr', 'prstClr') + + def __init__(self, + prst=None, + dist=None, + dir=None, + **kw + ): + self.prst = prst + self.dist = dist + self.dir = dir + super().__init__(**kw) + + +class ReflectionEffect(Serialisable): + + blurRad = Float() + stA = Integer() + stPos = Integer() + endA = Integer() + endPos = Integer() + dist = Float() + dir = Integer() + fadeDir = Integer() + sx = Integer() + sy = Integer() + kx = Integer() + ky = Integer() + algn = Set(values=(['tl', 't', 'tr', 'l', 'ctr', 'r', 'bl', 'b', 'br'])) + rotWithShape = Bool(allow_none=True) + + def __init__(self, + blurRad=None, + stA=None, + stPos=None, + endA=None, + endPos=None, + dist=None, + dir=None, + fadeDir=None, + sx=None, + sy=None, + kx=None, + ky=None, + algn=None, + rotWithShape=None, + ): + self.blurRad = blurRad + self.stA = stA + self.stPos = stPos + self.endA = endA + self.endPos = endPos + self.dist = dist + self.dir = dir + self.fadeDir = fadeDir + self.sx = sx + self.sy = sy + self.kx = kx + self.ky = ky + self.algn = algn + self.rotWithShape = rotWithShape + + +class SoftEdgesEffect(Serialisable): + + rad = Float() + + def __init__(self, + rad=None, + ): + self.rad = rad + + +class EffectList(Serialisable): + + blur = Typed(expected_type=BlurEffect, allow_none=True) + fillOverlay = Typed(expected_type=FillOverlayEffect, allow_none=True) + glow = Typed(expected_type=GlowEffect, allow_none=True) + innerShdw = Typed(expected_type=InnerShadowEffect, allow_none=True) + outerShdw = Typed(expected_type=OuterShadow, allow_none=True) + prstShdw = Typed(expected_type=PresetShadowEffect, allow_none=True) + reflection = Typed(expected_type=ReflectionEffect, allow_none=True) + softEdge = Typed(expected_type=SoftEdgesEffect, allow_none=True) + + __elements__ = ('blur', 'fillOverlay', 'glow', 'innerShdw', 'outerShdw', + 'prstShdw', 'reflection', 'softEdge') + + def __init__(self, + blur=None, + fillOverlay=None, + glow=None, + innerShdw=None, + outerShdw=None, + prstShdw=None, + reflection=None, + softEdge=None, + ): + self.blur = blur + self.fillOverlay = fillOverlay + self.glow = glow + self.innerShdw = innerShdw + self.outerShdw = outerShdw + self.prstShdw = prstShdw + self.reflection = reflection + self.softEdge = softEdge diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/fill.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/fill.py new file mode 100755 index 0000000..580e0db --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/fill.py @@ -0,0 +1,425 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Alias, + Bool, + Integer, + Set, + NoneSet, + Typed, + MinMax, +) +from openpyxl.descriptors.excel import ( + Relation, + Percentage, +) +from openpyxl.descriptors.nested import NestedNoneSet, NestedValue +from openpyxl.descriptors.sequence import NestedSequence +from openpyxl.descriptors.excel import ExtensionList as OfficeArtExtensionList +from openpyxl.xml.constants import DRAWING_NS + +from .colors import ( + ColorChoice, + HSLColor, + SystemColor, + SchemeColor, + PRESET_COLORS, + RGBPercent, +) + +from .effect import ( + AlphaBiLevelEffect, + AlphaCeilingEffect, + AlphaFloorEffect, + AlphaInverseEffect, + AlphaModulateEffect, + AlphaModulateFixedEffect, + AlphaReplaceEffect, + BiLevelEffect, + BlurEffect, + ColorChangeEffect, + ColorReplaceEffect, + DuotoneEffect, + FillOverlayEffect, + GrayscaleEffect, + HSLEffect, + LuminanceEffect, + TintEffect, +) + +""" +Fill elements from drawing main schema +""" + +class PatternFillProperties(Serialisable): + + tagname = "pattFill" + namespace = DRAWING_NS + + prst = NoneSet(values=(['pct5', 'pct10', 'pct20', 'pct25', 'pct30', + 'pct40', 'pct50', 'pct60', 'pct70', 'pct75', 'pct80', 'pct90', 'horz', + 'vert', 'ltHorz', 'ltVert', 'dkHorz', 'dkVert', 'narHorz', 'narVert', + 'dashHorz', 'dashVert', 'cross', 'dnDiag', 'upDiag', 'ltDnDiag', + 'ltUpDiag', 'dkDnDiag', 'dkUpDiag', 'wdDnDiag', 'wdUpDiag', 'dashDnDiag', + 'dashUpDiag', 'diagCross', 'smCheck', 'lgCheck', 'smGrid', 'lgGrid', + 'dotGrid', 'smConfetti', 'lgConfetti', 'horzBrick', 'diagBrick', + 'solidDmnd', 'openDmnd', 'dotDmnd', 'plaid', 'sphere', 'weave', 'divot', + 'shingle', 'wave', 'trellis', 'zigZag'])) + preset = Alias("prst") + fgClr = Typed(expected_type=ColorChoice, allow_none=True) + foreground = Alias("fgClr") + bgClr = Typed(expected_type=ColorChoice, allow_none=True) + background = Alias("bgClr") + + __elements__ = ("fgClr", "bgClr") + + def __init__(self, + prst=None, + fgClr=None, + bgClr=None, + ): + self.prst = prst + self.fgClr = fgClr + self.bgClr = bgClr + + +class RelativeRect(Serialisable): + + tagname = "rect" + namespace = DRAWING_NS + + l = Percentage(allow_none=True) + left = Alias('l') + t = Percentage(allow_none=True) + top = Alias('t') + r = Percentage(allow_none=True) + right = Alias('r') + b = Percentage(allow_none=True) + bottom = Alias('b') + + def __init__(self, + l=None, + t=None, + r=None, + b=None, + ): + self.l = l + self.t = t + self.r = r + self.b = b + + +class StretchInfoProperties(Serialisable): + + tagname = "stretch" + namespace = DRAWING_NS + + fillRect = Typed(expected_type=RelativeRect, allow_none=True) + + def __init__(self, + fillRect=RelativeRect(), + ): + self.fillRect = fillRect + + +class GradientStop(Serialisable): + + tagname = "gs" + namespace = DRAWING_NS + + pos = MinMax(min=0, max=100000, allow_none=True) + # Color Choice Group + scrgbClr = Typed(expected_type=RGBPercent, allow_none=True) + RGBPercent = Alias('scrgbClr') + srgbClr = NestedValue(expected_type=str, allow_none=True) # needs pattern and can have transform + RGB = Alias('srgbClr') + hslClr = Typed(expected_type=HSLColor, allow_none=True) + sysClr = Typed(expected_type=SystemColor, allow_none=True) + schemeClr = Typed(expected_type=SchemeColor, allow_none=True) + prstClr = NestedNoneSet(values=PRESET_COLORS) + + __elements__ = ('scrgbClr', 'srgbClr', 'hslClr', 'sysClr', 'schemeClr', 'prstClr') + + def __init__(self, + pos=None, + scrgbClr=None, + srgbClr=None, + hslClr=None, + sysClr=None, + schemeClr=None, + prstClr=None, + ): + if pos is None: + pos = 0 + self.pos = pos + + self.scrgbClr = scrgbClr + self.srgbClr = srgbClr + self.hslClr = hslClr + self.sysClr = sysClr + self.schemeClr = schemeClr + self.prstClr = prstClr + + +class LinearShadeProperties(Serialisable): + + tagname = "lin" + namespace = DRAWING_NS + + ang = Integer() + scaled = Bool(allow_none=True) + + def __init__(self, + ang=None, + scaled=None, + ): + self.ang = ang + self.scaled = scaled + + +class PathShadeProperties(Serialisable): + + tagname = "path" + namespace = DRAWING_NS + + path = Set(values=(['shape', 'circle', 'rect'])) + fillToRect = Typed(expected_type=RelativeRect, allow_none=True) + + def __init__(self, + path=None, + fillToRect=None, + ): + self.path = path + self.fillToRect = fillToRect + + +class GradientFillProperties(Serialisable): + + tagname = "gradFill" + namespace = DRAWING_NS + + flip = NoneSet(values=(['x', 'y', 'xy'])) + rotWithShape = Bool(allow_none=True) + + gsLst = NestedSequence(expected_type=GradientStop, count=False) + stop_list = Alias("gsLst") + + lin = Typed(expected_type=LinearShadeProperties, allow_none=True) + linear = Alias("lin") + path = Typed(expected_type=PathShadeProperties, allow_none=True) + + tileRect = Typed(expected_type=RelativeRect, allow_none=True) + + __elements__ = ('gsLst', 'lin', 'path', 'tileRect') + + def __init__(self, + flip=None, + rotWithShape=None, + gsLst=(), + lin=None, + path=None, + tileRect=None, + ): + self.flip = flip + self.rotWithShape = rotWithShape + self.gsLst = gsLst + self.lin = lin + self.path = path + self.tileRect = tileRect + + +class SolidColorFillProperties(Serialisable): + + tagname = "solidFill" + + # uses element group EG_ColorChoice + scrgbClr = Typed(expected_type=RGBPercent, allow_none=True) + RGBPercent = Alias('scrgbClr') + srgbClr = NestedValue(expected_type=str, allow_none=True) # needs pattern and can have transform + RGB = Alias('srgbClr') + hslClr = Typed(expected_type=HSLColor, allow_none=True) + sysClr = Typed(expected_type=SystemColor, allow_none=True) + schemeClr = Typed(expected_type=SchemeColor, allow_none=True) + prstClr = NestedNoneSet(values=PRESET_COLORS) + + __elements__ = ('scrgbClr', 'srgbClr', 'hslClr', 'sysClr', 'schemeClr', 'prstClr') + + def __init__(self, + scrgbClr=None, + srgbClr=None, + hslClr=None, + sysClr=None, + schemeClr=None, + prstClr=None, + ): + self.scrgbClr = scrgbClr + self.srgbClr = srgbClr + self.hslClr = hslClr + self.sysClr = sysClr + self.schemeClr = schemeClr + self.prstClr = prstClr + + +class Blip(Serialisable): + + tagname = "blip" + namespace = DRAWING_NS + + # Using attribute groupAG_Blob + cstate = NoneSet(values=(['email', 'screen', 'print', 'hqprint'])) + embed = Relation() # rId + link = Relation() # hyperlink + noGrp = Bool(allow_none=True) + noSelect = Bool(allow_none=True) + noRot = Bool(allow_none=True) + noChangeAspect = Bool(allow_none=True) + noMove = Bool(allow_none=True) + noResize = Bool(allow_none=True) + noEditPoints = Bool(allow_none=True) + noAdjustHandles = Bool(allow_none=True) + noChangeArrowheads = Bool(allow_none=True) + noChangeShapeType = Bool(allow_none=True) + # some elements are choice + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + alphaBiLevel = Typed(expected_type=AlphaBiLevelEffect, allow_none=True) + alphaCeiling = Typed(expected_type=AlphaCeilingEffect, allow_none=True) + alphaFloor = Typed(expected_type=AlphaFloorEffect, allow_none=True) + alphaInv = Typed(expected_type=AlphaInverseEffect, allow_none=True) + alphaMod = Typed(expected_type=AlphaModulateEffect, allow_none=True) + alphaModFix = Typed(expected_type=AlphaModulateFixedEffect, allow_none=True) + alphaRepl = Typed(expected_type=AlphaReplaceEffect, allow_none=True) + biLevel = Typed(expected_type=BiLevelEffect, allow_none=True) + blur = Typed(expected_type=BlurEffect, allow_none=True) + clrChange = Typed(expected_type=ColorChangeEffect, allow_none=True) + clrRepl = Typed(expected_type=ColorReplaceEffect, allow_none=True) + duotone = Typed(expected_type=DuotoneEffect, allow_none=True) + fillOverlay = Typed(expected_type=FillOverlayEffect, allow_none=True) + grayscl = Typed(expected_type=GrayscaleEffect, allow_none=True) + hsl = Typed(expected_type=HSLEffect, allow_none=True) + lum = Typed(expected_type=LuminanceEffect, allow_none=True) + tint = Typed(expected_type=TintEffect, allow_none=True) + + __elements__ = ('alphaBiLevel', 'alphaCeiling', 'alphaFloor', 'alphaInv', + 'alphaMod', 'alphaModFix', 'alphaRepl', 'biLevel', 'blur', 'clrChange', + 'clrRepl', 'duotone', 'fillOverlay', 'grayscl', 'hsl', 'lum', 'tint') + + def __init__(self, + cstate=None, + embed=None, + link=None, + noGrp=None, + noSelect=None, + noRot=None, + noChangeAspect=None, + noMove=None, + noResize=None, + noEditPoints=None, + noAdjustHandles=None, + noChangeArrowheads=None, + noChangeShapeType=None, + extLst=None, + alphaBiLevel=None, + alphaCeiling=None, + alphaFloor=None, + alphaInv=None, + alphaMod=None, + alphaModFix=None, + alphaRepl=None, + biLevel=None, + blur=None, + clrChange=None, + clrRepl=None, + duotone=None, + fillOverlay=None, + grayscl=None, + hsl=None, + lum=None, + tint=None, + ): + self.cstate = cstate + self.embed = embed + self.link = link + self.noGrp = noGrp + self.noSelect = noSelect + self.noRot = noRot + self.noChangeAspect = noChangeAspect + self.noMove = noMove + self.noResize = noResize + self.noEditPoints = noEditPoints + self.noAdjustHandles = noAdjustHandles + self.noChangeArrowheads = noChangeArrowheads + self.noChangeShapeType = noChangeShapeType + self.extLst = extLst + self.alphaBiLevel = alphaBiLevel + self.alphaCeiling = alphaCeiling + self.alphaFloor = alphaFloor + self.alphaInv = alphaInv + self.alphaMod = alphaMod + self.alphaModFix = alphaModFix + self.alphaRepl = alphaRepl + self.biLevel = biLevel + self.blur = blur + self.clrChange = clrChange + self.clrRepl = clrRepl + self.duotone = duotone + self.fillOverlay = fillOverlay + self.grayscl = grayscl + self.hsl = hsl + self.lum = lum + self.tint = tint + + +class TileInfoProperties(Serialisable): + + tx = Integer(allow_none=True) + ty = Integer(allow_none=True) + sx = Integer(allow_none=True) + sy = Integer(allow_none=True) + flip = NoneSet(values=(['x', 'y', 'xy'])) + algn = Set(values=(['tl', 't', 'tr', 'l', 'ctr', 'r', 'bl', 'b', 'br'])) + + def __init__(self, + tx=None, + ty=None, + sx=None, + sy=None, + flip=None, + algn=None, + ): + self.tx = tx + self.ty = ty + self.sx = sx + self.sy = sy + self.flip = flip + self.algn = algn + + +class BlipFillProperties(Serialisable): + + tagname = "blipFill" + + dpi = Integer(allow_none=True) + rotWithShape = Bool(allow_none=True) + + blip = Typed(expected_type=Blip, allow_none=True) + srcRect = Typed(expected_type=RelativeRect, allow_none=True) + tile = Typed(expected_type=TileInfoProperties, allow_none=True) + stretch = Typed(expected_type=StretchInfoProperties, allow_none=True) + + __elements__ = ("blip", "srcRect", "tile", "stretch") + + def __init__(self, + dpi=None, + rotWithShape=None, + blip=None, + tile=None, + stretch=StretchInfoProperties(), + srcRect=None, + ): + self.dpi = dpi + self.rotWithShape = rotWithShape + self.blip = blip + self.tile = tile + self.stretch = stretch + self.srcRect = srcRect diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/geometry.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/geometry.py new file mode 100755 index 0000000..2cc7ca6 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/geometry.py @@ -0,0 +1,584 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Float, + Integer, + Bool, + MinMax, + Set, + NoneSet, + String, + Alias, +) +from openpyxl.descriptors.excel import Coordinate, Percentage +from openpyxl.descriptors.excel import ExtensionList as OfficeArtExtensionList +from .line import LineProperties + +from openpyxl.styles.colors import Color +from openpyxl.xml.constants import DRAWING_NS + + +class Point2D(Serialisable): + + tagname = "off" + namespace = DRAWING_NS + + x = Coordinate() + y = Coordinate() + + def __init__(self, + x=None, + y=None, + ): + self.x = x + self.y = y + + +class PositiveSize2D(Serialisable): + + tagname = "ext" + namespace = DRAWING_NS + + """ + Dimensions in EMUs + """ + + cx = Integer() + width = Alias('cx') + cy = Integer() + height = Alias('cy') + + def __init__(self, + cx=None, + cy=None, + ): + self.cx = cx + self.cy = cy + + +class Transform2D(Serialisable): + + tagname = "xfrm" + namespace = DRAWING_NS + + rot = Integer(allow_none=True) + flipH = Bool(allow_none=True) + flipV = Bool(allow_none=True) + off = Typed(expected_type=Point2D, allow_none=True) + ext = Typed(expected_type=PositiveSize2D, allow_none=True) + chOff = Typed(expected_type=Point2D, allow_none=True) + chExt = Typed(expected_type=PositiveSize2D, allow_none=True) + + __elements__ = ('off', 'ext', 'chOff', 'chExt') + + def __init__(self, + rot=None, + flipH=None, + flipV=None, + off=None, + ext=None, + chOff=None, + chExt=None, + ): + self.rot = rot + self.flipH = flipH + self.flipV = flipV + self.off = off + self.ext = ext + self.chOff = chOff + self.chExt = chExt + + +class GroupTransform2D(Serialisable): + + tagname = "xfrm" + namespace = DRAWING_NS + + rot = Integer(allow_none=True) + flipH = Bool(allow_none=True) + flipV = Bool(allow_none=True) + off = Typed(expected_type=Point2D, allow_none=True) + ext = Typed(expected_type=PositiveSize2D, allow_none=True) + chOff = Typed(expected_type=Point2D, allow_none=True) + chExt = Typed(expected_type=PositiveSize2D, allow_none=True) + + __elements__ = ("off", "ext", "chOff", "chExt") + + def __init__(self, + rot=0, + flipH=None, + flipV=None, + off=None, + ext=None, + chOff=None, + chExt=None, + ): + self.rot = rot + self.flipH = flipH + self.flipV = flipV + self.off = off + self.ext = ext + self.chOff = chOff + self.chExt = chExt + + +class SphereCoords(Serialisable): + + tagname = "sphereCoords" # usually + + lat = Integer() + lon = Integer() + rev = Integer() + + def __init__(self, + lat=None, + lon=None, + rev=None, + ): + self.lat = lat + self.lon = lon + self.rev = rev + + +class Camera(Serialisable): + + tagname = "camera" + + prst = Set(values=[ + 'legacyObliqueTopLeft', 'legacyObliqueTop', 'legacyObliqueTopRight', 'legacyObliqueLeft', + 'legacyObliqueFront', 'legacyObliqueRight', 'legacyObliqueBottomLeft', + 'legacyObliqueBottom', 'legacyObliqueBottomRight', 'legacyPerspectiveTopLeft', + 'legacyPerspectiveTop', 'legacyPerspectiveTopRight', 'legacyPerspectiveLeft', + 'legacyPerspectiveFront', 'legacyPerspectiveRight', 'legacyPerspectiveBottomLeft', + 'legacyPerspectiveBottom', 'legacyPerspectiveBottomRight', 'orthographicFront', + 'isometricTopUp', 'isometricTopDown', 'isometricBottomUp', 'isometricBottomDown', + 'isometricLeftUp', 'isometricLeftDown', 'isometricRightUp', 'isometricRightDown', + 'isometricOffAxis1Left', 'isometricOffAxis1Right', 'isometricOffAxis1Top', + 'isometricOffAxis2Left', 'isometricOffAxis2Right', 'isometricOffAxis2Top', + 'isometricOffAxis3Left', 'isometricOffAxis3Right', 'isometricOffAxis3Bottom', + 'isometricOffAxis4Left', 'isometricOffAxis4Right', 'isometricOffAxis4Bottom', + 'obliqueTopLeft', 'obliqueTop', 'obliqueTopRight', 'obliqueLeft', 'obliqueRight', + 'obliqueBottomLeft', 'obliqueBottom', 'obliqueBottomRight', 'perspectiveFront', + 'perspectiveLeft', 'perspectiveRight', 'perspectiveAbove', 'perspectiveBelow', + 'perspectiveAboveLeftFacing', 'perspectiveAboveRightFacing', + 'perspectiveContrastingLeftFacing', 'perspectiveContrastingRightFacing', + 'perspectiveHeroicLeftFacing', 'perspectiveHeroicRightFacing', + 'perspectiveHeroicExtremeLeftFacing', 'perspectiveHeroicExtremeRightFacing', + 'perspectiveRelaxed', 'perspectiveRelaxedModerately']) + fov = Integer(allow_none=True) + zoom = Typed(expected_type=Percentage, allow_none=True) + rot = Typed(expected_type=SphereCoords, allow_none=True) + + + def __init__(self, + prst=None, + fov=None, + zoom=None, + rot=None, + ): + self.prst = prst + self.fov = fov + self.zoom = zoom + self.rot = rot + + +class LightRig(Serialisable): + + tagname = "lightRig" + + rig = Set(values=['legacyFlat1', 'legacyFlat2', 'legacyFlat3', 'legacyFlat4', 'legacyNormal1', + 'legacyNormal2', 'legacyNormal3', 'legacyNormal4', 'legacyHarsh1', + 'legacyHarsh2', 'legacyHarsh3', 'legacyHarsh4', 'threePt', 'balanced', + 'soft', 'harsh', 'flood', 'contrasting', 'morning', 'sunrise', 'sunset', + 'chilly', 'freezing', 'flat', 'twoPt', 'glow', 'brightRoom'] + ) + dir = Set(values=(['tl', 't', 'tr', 'l', 'r', 'bl', 'b', 'br'])) + rot = Typed(expected_type=SphereCoords, allow_none=True) + + def __init__(self, + rig=None, + dir=None, + rot=None, + ): + self.rig = rig + self.dir = dir + self.rot = rot + + +class Vector3D(Serialisable): + + tagname = "vector" + + dx = Integer() # can be in or universl measure :-/ + dy = Integer() + dz = Integer() + + def __init__(self, + dx=None, + dy=None, + dz=None, + ): + self.dx = dx + self.dy = dy + self.dz = dz + + +class Point3D(Serialisable): + + tagname = "anchor" + + x = Integer() + y = Integer() + z = Integer() + + def __init__(self, + x=None, + y=None, + z=None, + ): + self.x = x + self.y = y + self.z = z + + +class Backdrop(Serialisable): + + anchor = Typed(expected_type=Point3D, ) + norm = Typed(expected_type=Vector3D, ) + up = Typed(expected_type=Vector3D, ) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + def __init__(self, + anchor=None, + norm=None, + up=None, + extLst=None, + ): + self.anchor = anchor + self.norm = norm + self.up = up + self.extLst = extLst + + +class Scene3D(Serialisable): + + camera = Typed(expected_type=Camera, ) + lightRig = Typed(expected_type=LightRig, ) + backdrop = Typed(expected_type=Backdrop, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + def __init__(self, + camera=None, + lightRig=None, + backdrop=None, + extLst=None, + ): + self.camera = camera + self.lightRig = lightRig + self.backdrop = backdrop + self.extLst = extLst + + +class Bevel(Serialisable): + + tagname = "bevel" + + w = Integer() + h = Integer() + prst = NoneSet(values= + ['relaxedInset', 'circle', 'slope', 'cross', 'angle', + 'softRound', 'convex', 'coolSlant', 'divot', 'riblet', + 'hardEdge', 'artDeco'] + ) + + def __init__(self, + w=None, + h=None, + prst=None, + ): + self.w = w + self.h = h + self.prst = prst + + +class Shape3D(Serialisable): + + namespace = DRAWING_NS + + z = Typed(expected_type=Coordinate, allow_none=True) + extrusionH = Integer(allow_none=True) + contourW = Integer(allow_none=True) + prstMaterial = NoneSet(values=[ + 'legacyMatte','legacyPlastic', 'legacyMetal', 'legacyWireframe', 'matte', 'plastic', + 'metal', 'warmMatte', 'translucentPowder', 'powder', 'dkEdge', + 'softEdge', 'clear', 'flat', 'softmetal'] + ) + bevelT = Typed(expected_type=Bevel, allow_none=True) + bevelB = Typed(expected_type=Bevel, allow_none=True) + extrusionClr = Typed(expected_type=Color, allow_none=True) + contourClr = Typed(expected_type=Color, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + def __init__(self, + z=None, + extrusionH=None, + contourW=None, + prstMaterial=None, + bevelT=None, + bevelB=None, + extrusionClr=None, + contourClr=None, + extLst=None, + ): + self.z = z + self.extrusionH = extrusionH + self.contourW = contourW + self.prstMaterial = prstMaterial + self.bevelT = bevelT + self.bevelB = bevelB + self.extrusionClr = extrusionClr + self.contourClr = contourClr + self.extLst = extLst + + +class Path2D(Serialisable): + + w = Float() + h = Float() + fill = NoneSet(values=(['norm', 'lighten', 'lightenLess', 'darken', 'darkenLess'])) + stroke = Bool(allow_none=True) + extrusionOk = Bool(allow_none=True) + + def __init__(self, + w=None, + h=None, + fill=None, + stroke=None, + extrusionOk=None, + ): + self.w = w + self.h = h + self.fill = fill + self.stroke = stroke + self.extrusionOk = extrusionOk + + +class Path2DList(Serialisable): + + path = Typed(expected_type=Path2D, allow_none=True) + + def __init__(self, + path=None, + ): + self.path = path + + +class GeomRect(Serialisable): + + l = Coordinate() + t = Coordinate() + r = Coordinate() + b = Coordinate() + + def __init__(self, + l=None, + t=None, + r=None, + b=None, + ): + self.l = l + self.t = t + self.r = r + self.b = b + + +class AdjPoint2D(Serialisable): + + x = Coordinate() + y = Coordinate() + + def __init__(self, + x=None, + y=None, + ): + self.x = x + self.y = y + + +class ConnectionSite(Serialisable): + + ang = MinMax(min=0, max=360) # guess work, can also be a name + pos = Typed(expected_type=AdjPoint2D, ) + + def __init__(self, + ang=None, + pos=None, + ): + self.ang = ang + self.pos = pos + + +class ConnectionSiteList(Serialisable): + + cxn = Typed(expected_type=ConnectionSite, allow_none=True) + + def __init__(self, + cxn=None, + ): + self.cxn = cxn + + +class AdjustHandleList(Serialisable): + + pass + +class GeomGuide(Serialisable): + + name = String() + fmla = String() + + def __init__(self, + name=None, + fmla=None, + ): + self.name = name + self.fmla = fmla + + +class GeomGuideList(Serialisable): + + gd = Typed(expected_type=GeomGuide, allow_none=True) + + def __init__(self, + gd=None, + ): + self.gd = gd + + +class CustomGeometry2D(Serialisable): + + avLst = Typed(expected_type=GeomGuideList, allow_none=True) + gdLst = Typed(expected_type=GeomGuideList, allow_none=True) + ahLst = Typed(expected_type=AdjustHandleList, allow_none=True) + cxnLst = Typed(expected_type=ConnectionSiteList, allow_none=True) + #rect = Typed(expected_type=GeomRect, allow_none=True) + pathLst = Typed(expected_type=Path2DList, ) + + def __init__(self, + avLst=None, + gdLst=None, + ahLst=None, + cxnLst=None, + rect=None, + pathLst=None, + ): + self.avLst = avLst + self.gdLst = gdLst + self.ahLst = ahLst + self.cxnLst = cxnLst + self.rect = None + self.pathLst = pathLst + + +class PresetGeometry2D(Serialisable): + + namespace = DRAWING_NS + + prst = Set(values=( + ['line', 'lineInv', 'triangle', 'rtTriangle', 'rect', + 'diamond', 'parallelogram', 'trapezoid', 'nonIsoscelesTrapezoid', + 'pentagon', 'hexagon', 'heptagon', 'octagon', 'decagon', 'dodecagon', + 'star4', 'star5', 'star6', 'star7', 'star8', 'star10', 'star12', + 'star16', 'star24', 'star32', 'roundRect', 'round1Rect', + 'round2SameRect', 'round2DiagRect', 'snipRoundRect', 'snip1Rect', + 'snip2SameRect', 'snip2DiagRect', 'plaque', 'ellipse', 'teardrop', + 'homePlate', 'chevron', 'pieWedge', 'pie', 'blockArc', 'donut', + 'noSmoking', 'rightArrow', 'leftArrow', 'upArrow', 'downArrow', + 'stripedRightArrow', 'notchedRightArrow', 'bentUpArrow', + 'leftRightArrow', 'upDownArrow', 'leftUpArrow', 'leftRightUpArrow', + 'quadArrow', 'leftArrowCallout', 'rightArrowCallout', 'upArrowCallout', + 'downArrowCallout', 'leftRightArrowCallout', 'upDownArrowCallout', + 'quadArrowCallout', 'bentArrow', 'uturnArrow', 'circularArrow', + 'leftCircularArrow', 'leftRightCircularArrow', 'curvedRightArrow', + 'curvedLeftArrow', 'curvedUpArrow', 'curvedDownArrow', 'swooshArrow', + 'cube', 'can', 'lightningBolt', 'heart', 'sun', 'moon', 'smileyFace', + 'irregularSeal1', 'irregularSeal2', 'foldedCorner', 'bevel', 'frame', + 'halfFrame', 'corner', 'diagStripe', 'chord', 'arc', 'leftBracket', + 'rightBracket', 'leftBrace', 'rightBrace', 'bracketPair', 'bracePair', + 'straightConnector1', 'bentConnector2', 'bentConnector3', + 'bentConnector4', 'bentConnector5', 'curvedConnector2', + 'curvedConnector3', 'curvedConnector4', 'curvedConnector5', 'callout1', + 'callout2', 'callout3', 'accentCallout1', 'accentCallout2', + 'accentCallout3', 'borderCallout1', 'borderCallout2', 'borderCallout3', + 'accentBorderCallout1', 'accentBorderCallout2', 'accentBorderCallout3', + 'wedgeRectCallout', 'wedgeRoundRectCallout', 'wedgeEllipseCallout', + 'cloudCallout', 'cloud', 'ribbon', 'ribbon2', 'ellipseRibbon', + 'ellipseRibbon2', 'leftRightRibbon', 'verticalScroll', + 'horizontalScroll', 'wave', 'doubleWave', 'plus', 'flowChartProcess', + 'flowChartDecision', 'flowChartInputOutput', + 'flowChartPredefinedProcess', 'flowChartInternalStorage', + 'flowChartDocument', 'flowChartMultidocument', 'flowChartTerminator', + 'flowChartPreparation', 'flowChartManualInput', + 'flowChartManualOperation', 'flowChartConnector', 'flowChartPunchedCard', + 'flowChartPunchedTape', 'flowChartSummingJunction', 'flowChartOr', + 'flowChartCollate', 'flowChartSort', 'flowChartExtract', + 'flowChartMerge', 'flowChartOfflineStorage', 'flowChartOnlineStorage', + 'flowChartMagneticTape', 'flowChartMagneticDisk', + 'flowChartMagneticDrum', 'flowChartDisplay', 'flowChartDelay', + 'flowChartAlternateProcess', 'flowChartOffpageConnector', + 'actionButtonBlank', 'actionButtonHome', 'actionButtonHelp', + 'actionButtonInformation', 'actionButtonForwardNext', + 'actionButtonBackPrevious', 'actionButtonEnd', 'actionButtonBeginning', + 'actionButtonReturn', 'actionButtonDocument', 'actionButtonSound', + 'actionButtonMovie', 'gear6', 'gear9', 'funnel', 'mathPlus', 'mathMinus', + 'mathMultiply', 'mathDivide', 'mathEqual', 'mathNotEqual', 'cornerTabs', + 'squareTabs', 'plaqueTabs', 'chartX', 'chartStar', 'chartPlus'])) + avLst = Typed(expected_type=GeomGuideList, allow_none=True) + + def __init__(self, + prst=None, + avLst=None, + ): + self.prst = prst + self.avLst = avLst + + +class FontReference(Serialisable): + + idx = NoneSet(values=(['major', 'minor'])) + + def __init__(self, + idx=None, + ): + self.idx = idx + + +class StyleMatrixReference(Serialisable): + + idx = Integer() + + def __init__(self, + idx=None, + ): + self.idx = idx + + +class ShapeStyle(Serialisable): + + lnRef = Typed(expected_type=StyleMatrixReference, ) + fillRef = Typed(expected_type=StyleMatrixReference, ) + effectRef = Typed(expected_type=StyleMatrixReference, ) + fontRef = Typed(expected_type=FontReference, ) + + def __init__(self, + lnRef=None, + fillRef=None, + effectRef=None, + fontRef=None, + ): + self.lnRef = lnRef + self.fillRef = fillRef + self.effectRef = effectRef + self.fontRef = fontRef diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/graphic.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/graphic.py new file mode 100755 index 0000000..2c34087 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/graphic.py @@ -0,0 +1,177 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.xml.constants import CHART_NS, DRAWING_NS +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Bool, + String, + Alias, +) +from openpyxl.descriptors.excel import ExtensionList as OfficeArtExtensionList + +from .effect import ( + EffectList, + EffectContainer, +) +from .fill import ( + Blip, + GradientFillProperties, + BlipFillProperties, +) +from .picture import PictureFrame +from .properties import ( + NonVisualDrawingProps, + NonVisualGroupShape, + GroupShapeProperties, +) +from .relation import ChartRelation +from .xdr import XDRTransform2D + + +class GraphicFrameLocking(Serialisable): + + noGrp = Bool(allow_none=True) + noDrilldown = Bool(allow_none=True) + noSelect = Bool(allow_none=True) + noChangeAspect = Bool(allow_none=True) + noMove = Bool(allow_none=True) + noResize = Bool(allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + def __init__(self, + noGrp=None, + noDrilldown=None, + noSelect=None, + noChangeAspect=None, + noMove=None, + noResize=None, + extLst=None, + ): + self.noGrp = noGrp + self.noDrilldown = noDrilldown + self.noSelect = noSelect + self.noChangeAspect = noChangeAspect + self.noMove = noMove + self.noResize = noResize + self.extLst = extLst + + +class NonVisualGraphicFrameProperties(Serialisable): + + tagname = "cNvGraphicFramePr" + + graphicFrameLocks = Typed(expected_type=GraphicFrameLocking, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + def __init__(self, + graphicFrameLocks=None, + extLst=None, + ): + self.graphicFrameLocks = graphicFrameLocks + self.extLst = extLst + + +class NonVisualGraphicFrame(Serialisable): + + tagname = "nvGraphicFramePr" + + cNvPr = Typed(expected_type=NonVisualDrawingProps) + cNvGraphicFramePr = Typed(expected_type=NonVisualGraphicFrameProperties) + + __elements__ = ('cNvPr', 'cNvGraphicFramePr') + + def __init__(self, + cNvPr=None, + cNvGraphicFramePr=None, + ): + if cNvPr is None: + cNvPr = NonVisualDrawingProps(id=0, name="Chart 0") + self.cNvPr = cNvPr + if cNvGraphicFramePr is None: + cNvGraphicFramePr = NonVisualGraphicFrameProperties() + self.cNvGraphicFramePr = cNvGraphicFramePr + + +class GraphicData(Serialisable): + + tagname = "graphicData" + namespace = DRAWING_NS + + uri = String() + chart = Typed(expected_type=ChartRelation, allow_none=True) + + + def __init__(self, + uri=CHART_NS, + chart=None, + ): + self.uri = uri + self.chart = chart + + +class GraphicObject(Serialisable): + + tagname = "graphic" + namespace = DRAWING_NS + + graphicData = Typed(expected_type=GraphicData) + + def __init__(self, + graphicData=None, + ): + if graphicData is None: + graphicData = GraphicData() + self.graphicData = graphicData + + +class GraphicFrame(Serialisable): + + tagname = "graphicFrame" + + nvGraphicFramePr = Typed(expected_type=NonVisualGraphicFrame) + xfrm = Typed(expected_type=XDRTransform2D) + graphic = Typed(expected_type=GraphicObject) + macro = String(allow_none=True) + fPublished = Bool(allow_none=True) + + __elements__ = ('nvGraphicFramePr', 'xfrm', 'graphic', 'macro', 'fPublished') + + def __init__(self, + nvGraphicFramePr=None, + xfrm=None, + graphic=None, + macro=None, + fPublished=None, + ): + if nvGraphicFramePr is None: + nvGraphicFramePr = NonVisualGraphicFrame() + self.nvGraphicFramePr = nvGraphicFramePr + if xfrm is None: + xfrm = XDRTransform2D() + self.xfrm = xfrm + if graphic is None: + graphic = GraphicObject() + self.graphic = graphic + self.macro = macro + self.fPublished = fPublished + + +class GroupShape(Serialisable): + + nvGrpSpPr = Typed(expected_type=NonVisualGroupShape) + nonVisualProperties = Alias("nvGrpSpPr") + grpSpPr = Typed(expected_type=GroupShapeProperties) + visualProperties = Alias("grpSpPr") + pic = Typed(expected_type=PictureFrame, allow_none=True) + + __elements__ = ["nvGrpSpPr", "grpSpPr", "pic"] + + def __init__(self, + nvGrpSpPr=None, + grpSpPr=None, + pic=None, + ): + self.nvGrpSpPr = nvGrpSpPr + self.grpSpPr = grpSpPr + self.pic = pic diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/image.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/image.py new file mode 100755 index 0000000..9d0446f --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/image.py @@ -0,0 +1,65 @@ +# Copyright (c) 2010-2024 openpyxl + +from io import BytesIO + +try: + from PIL import Image as PILImage +except ImportError: + PILImage = False + + +def _import_image(img): + if not PILImage: + raise ImportError('You must install Pillow to fetch image objects') + + if not isinstance(img, PILImage.Image): + img = PILImage.open(img) + + return img + + +class Image: + """Image in a spreadsheet""" + + _id = 1 + _path = "/xl/media/image{0}.{1}" + anchor = "A1" + + def __init__(self, img): + + self.ref = img + mark_to_close = isinstance(img, str) + image = _import_image(img) + self.width, self.height = image.size + + try: + self.format = image.format.lower() + except AttributeError: + self.format = "png" + if mark_to_close: + # PIL instances created for metadata should be closed. + image.close() + + + def _data(self): + """ + Return image data, convert to supported types if necessary + """ + img = _import_image(self.ref) + # don't convert these file formats + if self.format in ['gif', 'jpeg', 'png']: + img.fp.seek(0) + fp = img.fp + else: + fp = BytesIO() + img.save(fp, format="png") + fp.seek(0) + + data = fp.read() + fp.close() + return data + + + @property + def path(self): + return self._path.format(self._id, self.format) diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/line.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/line.py new file mode 100755 index 0000000..43388e6 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/line.py @@ -0,0 +1,144 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Integer, + MinMax, + NoneSet, + Alias, + Sequence +) + +from openpyxl.descriptors.nested import ( + NestedInteger, + NestedNoneSet, + EmptyTag, +) +from openpyxl.xml.constants import DRAWING_NS + +from .colors import ColorChoiceDescriptor +from .fill import GradientFillProperties, PatternFillProperties +from openpyxl.descriptors.excel import ExtensionList as OfficeArtExtensionList + +""" +Line elements from drawing main schema +""" + + +class LineEndProperties(Serialisable): + + tagname = "end" + namespace = DRAWING_NS + + type = NoneSet(values=(['none', 'triangle', 'stealth', 'diamond', 'oval', 'arrow'])) + w = NoneSet(values=(['sm', 'med', 'lg'])) + len = NoneSet(values=(['sm', 'med', 'lg'])) + + def __init__(self, + type=None, + w=None, + len=None, + ): + self.type = type + self.w = w + self.len = len + + +class DashStop(Serialisable): + + tagname = "ds" + namespace = DRAWING_NS + + d = Integer() + length = Alias('d') + sp = Integer() + space = Alias('sp') + + def __init__(self, + d=0, + sp=0, + ): + self.d = d + self.sp = sp + + +class DashStopList(Serialisable): + + ds = Sequence(expected_type=DashStop, allow_none=True) + + def __init__(self, + ds=None, + ): + self.ds = ds + + +class LineProperties(Serialisable): + + tagname = "ln" + namespace = DRAWING_NS + + w = MinMax(min=0, max=20116800, allow_none=True) # EMU + width = Alias('w') + cap = NoneSet(values=(['rnd', 'sq', 'flat'])) + cmpd = NoneSet(values=(['sng', 'dbl', 'thickThin', 'thinThick', 'tri'])) + algn = NoneSet(values=(['ctr', 'in'])) + + noFill = EmptyTag() + solidFill = ColorChoiceDescriptor() + gradFill = Typed(expected_type=GradientFillProperties, allow_none=True) + pattFill = Typed(expected_type=PatternFillProperties, allow_none=True) + + prstDash = NestedNoneSet(values=(['solid', 'dot', 'dash', 'lgDash', 'dashDot', + 'lgDashDot', 'lgDashDotDot', 'sysDash', 'sysDot', 'sysDashDot', + 'sysDashDotDot']), namespace=namespace) + dashStyle = Alias('prstDash') + + custDash = Typed(expected_type=DashStop, allow_none=True) + + round = EmptyTag() + bevel = EmptyTag() + miter = NestedInteger(allow_none=True, attribute="lim") + + headEnd = Typed(expected_type=LineEndProperties, allow_none=True) + tailEnd = Typed(expected_type=LineEndProperties, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + __elements__ = ('noFill', 'solidFill', 'gradFill', 'pattFill', + 'prstDash', 'custDash', 'round', 'bevel', 'miter', 'headEnd', 'tailEnd') + + def __init__(self, + w=None, + cap=None, + cmpd=None, + algn=None, + noFill=None, + solidFill=None, + gradFill=None, + pattFill=None, + prstDash=None, + custDash=None, + round=None, + bevel=None, + miter=None, + headEnd=None, + tailEnd=None, + extLst=None, + ): + self.w = w + self.cap = cap + self.cmpd = cmpd + self.algn = algn + self.noFill = noFill + self.solidFill = solidFill + self.gradFill = gradFill + self.pattFill = pattFill + if prstDash is None: + prstDash = "solid" + self.prstDash = prstDash + self.custDash = custDash + self.round = round + self.bevel = bevel + self.miter = miter + self.headEnd = headEnd + self.tailEnd = tailEnd diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/picture.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/picture.py new file mode 100755 index 0000000..9a83fac --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/picture.py @@ -0,0 +1,144 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.xml.constants import DRAWING_NS + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Bool, + String, + Alias, +) +from openpyxl.descriptors.excel import ExtensionList as OfficeArtExtensionList + +from openpyxl.chart.shapes import GraphicalProperties + +from .fill import BlipFillProperties +from .properties import NonVisualDrawingProps +from .geometry import ShapeStyle + + +class PictureLocking(Serialisable): + + tagname = "picLocks" + namespace = DRAWING_NS + + # Using attribute group AG_Locking + noCrop = Bool(allow_none=True) + noGrp = Bool(allow_none=True) + noSelect = Bool(allow_none=True) + noRot = Bool(allow_none=True) + noChangeAspect = Bool(allow_none=True) + noMove = Bool(allow_none=True) + noResize = Bool(allow_none=True) + noEditPoints = Bool(allow_none=True) + noAdjustHandles = Bool(allow_none=True) + noChangeArrowheads = Bool(allow_none=True) + noChangeShapeType = Bool(allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + __elements__ = () + + def __init__(self, + noCrop=None, + noGrp=None, + noSelect=None, + noRot=None, + noChangeAspect=None, + noMove=None, + noResize=None, + noEditPoints=None, + noAdjustHandles=None, + noChangeArrowheads=None, + noChangeShapeType=None, + extLst=None, + ): + self.noCrop = noCrop + self.noGrp = noGrp + self.noSelect = noSelect + self.noRot = noRot + self.noChangeAspect = noChangeAspect + self.noMove = noMove + self.noResize = noResize + self.noEditPoints = noEditPoints + self.noAdjustHandles = noAdjustHandles + self.noChangeArrowheads = noChangeArrowheads + self.noChangeShapeType = noChangeShapeType + + +class NonVisualPictureProperties(Serialisable): + + tagname = "cNvPicPr" + + preferRelativeResize = Bool(allow_none=True) + picLocks = Typed(expected_type=PictureLocking, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + __elements__ = ("picLocks",) + + def __init__(self, + preferRelativeResize=None, + picLocks=None, + extLst=None, + ): + self.preferRelativeResize = preferRelativeResize + self.picLocks = picLocks + + +class PictureNonVisual(Serialisable): + + tagname = "nvPicPr" + + cNvPr = Typed(expected_type=NonVisualDrawingProps, ) + cNvPicPr = Typed(expected_type=NonVisualPictureProperties, ) + + __elements__ = ("cNvPr", "cNvPicPr") + + def __init__(self, + cNvPr=None, + cNvPicPr=None, + ): + if cNvPr is None: + cNvPr = NonVisualDrawingProps(id=0, name="Image 1", descr="Name of file") + self.cNvPr = cNvPr + if cNvPicPr is None: + cNvPicPr = NonVisualPictureProperties() + self.cNvPicPr = cNvPicPr + + + + +class PictureFrame(Serialisable): + + tagname = "pic" + + macro = String(allow_none=True) + fPublished = Bool(allow_none=True) + nvPicPr = Typed(expected_type=PictureNonVisual, ) + blipFill = Typed(expected_type=BlipFillProperties, ) + spPr = Typed(expected_type=GraphicalProperties, ) + graphicalProperties = Alias('spPr') + style = Typed(expected_type=ShapeStyle, allow_none=True) + + __elements__ = ("nvPicPr", "blipFill", "spPr", "style") + + def __init__(self, + macro=None, + fPublished=None, + nvPicPr=None, + blipFill=None, + spPr=None, + style=None, + ): + self.macro = macro + self.fPublished = fPublished + if nvPicPr is None: + nvPicPr = PictureNonVisual() + self.nvPicPr = nvPicPr + if blipFill is None: + blipFill = BlipFillProperties() + self.blipFill = blipFill + if spPr is None: + spPr = GraphicalProperties() + self.spPr = spPr + self.style = style diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/properties.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/properties.py new file mode 100755 index 0000000..77b0072 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/properties.py @@ -0,0 +1,174 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.xml.constants import DRAWING_NS +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Bool, + Integer, + Set, + String, + Alias, + NoneSet, +) +from openpyxl.descriptors.excel import ExtensionList as OfficeArtExtensionList + +from .geometry import GroupTransform2D, Scene3D +from .text import Hyperlink + + +class GroupShapeProperties(Serialisable): + + tagname = "grpSpPr" + + bwMode = NoneSet(values=(['clr', 'auto', 'gray', 'ltGray', 'invGray', + 'grayWhite', 'blackGray', 'blackWhite', 'black', 'white', 'hidden'])) + xfrm = Typed(expected_type=GroupTransform2D, allow_none=True) + scene3d = Typed(expected_type=Scene3D, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + def __init__(self, + bwMode=None, + xfrm=None, + scene3d=None, + extLst=None, + ): + self.bwMode = bwMode + self.xfrm = xfrm + self.scene3d = scene3d + self.extLst = extLst + + +class GroupLocking(Serialisable): + + tagname = "grpSpLocks" + namespace = DRAWING_NS + + noGrp = Bool(allow_none=True) + noUngrp = Bool(allow_none=True) + noSelect = Bool(allow_none=True) + noRot = Bool(allow_none=True) + noChangeAspect = Bool(allow_none=True) + noMove = Bool(allow_none=True) + noResize = Bool(allow_none=True) + noChangeArrowheads = Bool(allow_none=True) + noEditPoints = Bool(allow_none=True) + noAdjustHandles = Bool(allow_none=True) + noChangeArrowheads = Bool(allow_none=True) + noChangeShapeType = Bool(allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + __elements__ = () + + def __init__(self, + noGrp=None, + noUngrp=None, + noSelect=None, + noRot=None, + noChangeAspect=None, + noChangeArrowheads=None, + noMove=None, + noResize=None, + noEditPoints=None, + noAdjustHandles=None, + noChangeShapeType=None, + extLst=None, + ): + self.noGrp = noGrp + self.noUngrp = noUngrp + self.noSelect = noSelect + self.noRot = noRot + self.noChangeAspect = noChangeAspect + self.noChangeArrowheads = noChangeArrowheads + self.noMove = noMove + self.noResize = noResize + self.noEditPoints = noEditPoints + self.noAdjustHandles = noAdjustHandles + self.noChangeShapeType = noChangeShapeType + + +class NonVisualGroupDrawingShapeProps(Serialisable): + + tagname = "cNvGrpSpPr" + + grpSpLocks = Typed(expected_type=GroupLocking, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + __elements__ = ("grpSpLocks",) + + def __init__(self, + grpSpLocks=None, + extLst=None, + ): + self.grpSpLocks = grpSpLocks + + +class NonVisualDrawingShapeProps(Serialisable): + + tagname = "cNvSpPr" + + spLocks = Typed(expected_type=GroupLocking, allow_none=True) + txBax = Bool(allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + __elements__ = ("spLocks", "txBax") + + def __init__(self, + spLocks=None, + txBox=None, + extLst=None, + ): + self.spLocks = spLocks + self.txBox = txBox + + +class NonVisualDrawingProps(Serialisable): + + tagname = "cNvPr" + + id = Integer() + name = String() + descr = String(allow_none=True) + hidden = Bool(allow_none=True) + title = String(allow_none=True) + hlinkClick = Typed(expected_type=Hyperlink, allow_none=True) + hlinkHover = Typed(expected_type=Hyperlink, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + __elements__ = ["hlinkClick", "hlinkHover"] + + def __init__(self, + id=None, + name=None, + descr=None, + hidden=None, + title=None, + hlinkClick=None, + hlinkHover=None, + extLst=None, + ): + self.id = id + self.name = name + self.descr = descr + self.hidden = hidden + self.title = title + self.hlinkClick = hlinkClick + self.hlinkHover = hlinkHover + self.extLst = extLst + +class NonVisualGroupShape(Serialisable): + + tagname = "nvGrpSpPr" + + cNvPr = Typed(expected_type=NonVisualDrawingProps) + cNvGrpSpPr = Typed(expected_type=NonVisualGroupDrawingShapeProps) + + __elements__ = ("cNvPr", "cNvGrpSpPr") + + def __init__(self, + cNvPr=None, + cNvGrpSpPr=None, + ): + self.cNvPr = cNvPr + self.cNvGrpSpPr = cNvGrpSpPr + diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/relation.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/relation.py new file mode 100755 index 0000000..0163293 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/relation.py @@ -0,0 +1,17 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.xml.constants import CHART_NS + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors.excel import Relation + + +class ChartRelation(Serialisable): + + tagname = "chart" + namespace = CHART_NS + + id = Relation() + + def __init__(self, id): + self.id = id diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/spreadsheet_drawing.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/spreadsheet_drawing.py new file mode 100755 index 0000000..4f378ca --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/spreadsheet_drawing.py @@ -0,0 +1,382 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + Bool, + NoneSet, + Integer, + Sequence, + Alias, +) +from openpyxl.descriptors.nested import ( + NestedText, + NestedNoneSet, +) +from openpyxl.descriptors.excel import Relation + +from openpyxl.packaging.relationship import ( + Relationship, + RelationshipList, +) +from openpyxl.utils import coordinate_to_tuple +from openpyxl.utils.units import ( + cm_to_EMU, + pixels_to_EMU, +) +from openpyxl.drawing.image import Image + +from openpyxl.xml.constants import SHEET_DRAWING_NS + +from openpyxl.chart._chart import ChartBase +from .xdr import ( + XDRPoint2D, + XDRPositiveSize2D, +) +from .fill import Blip +from .connector import Shape +from .graphic import ( + GroupShape, + GraphicFrame, + ) +from .geometry import PresetGeometry2D +from .picture import PictureFrame +from .relation import ChartRelation + + +class AnchorClientData(Serialisable): + + fLocksWithSheet = Bool(allow_none=True) + fPrintsWithSheet = Bool(allow_none=True) + + def __init__(self, + fLocksWithSheet=None, + fPrintsWithSheet=None, + ): + self.fLocksWithSheet = fLocksWithSheet + self.fPrintsWithSheet = fPrintsWithSheet + + +class AnchorMarker(Serialisable): + + tagname = "marker" + + col = NestedText(expected_type=int) + colOff = NestedText(expected_type=int) + row = NestedText(expected_type=int) + rowOff = NestedText(expected_type=int) + + def __init__(self, + col=0, + colOff=0, + row=0, + rowOff=0, + ): + self.col = col + self.colOff = colOff + self.row = row + self.rowOff = rowOff + + +class _AnchorBase(Serialisable): + + #one of + sp = Typed(expected_type=Shape, allow_none=True) + shape = Alias("sp") + grpSp = Typed(expected_type=GroupShape, allow_none=True) + groupShape = Alias("grpSp") + graphicFrame = Typed(expected_type=GraphicFrame, allow_none=True) + cxnSp = Typed(expected_type=Shape, allow_none=True) + connectionShape = Alias("cxnSp") + pic = Typed(expected_type=PictureFrame, allow_none=True) + contentPart = Relation() + + clientData = Typed(expected_type=AnchorClientData) + + __elements__ = ('sp', 'grpSp', 'graphicFrame', + 'cxnSp', 'pic', 'contentPart', 'clientData') + + def __init__(self, + clientData=None, + sp=None, + grpSp=None, + graphicFrame=None, + cxnSp=None, + pic=None, + contentPart=None + ): + if clientData is None: + clientData = AnchorClientData() + self.clientData = clientData + self.sp = sp + self.grpSp = grpSp + self.graphicFrame = graphicFrame + self.cxnSp = cxnSp + self.pic = pic + self.contentPart = contentPart + + +class AbsoluteAnchor(_AnchorBase): + + tagname = "absoluteAnchor" + + pos = Typed(expected_type=XDRPoint2D) + ext = Typed(expected_type=XDRPositiveSize2D) + + sp = _AnchorBase.sp + grpSp = _AnchorBase.grpSp + graphicFrame = _AnchorBase.graphicFrame + cxnSp = _AnchorBase.cxnSp + pic = _AnchorBase.pic + contentPart = _AnchorBase.contentPart + clientData = _AnchorBase.clientData + + __elements__ = ('pos', 'ext') + _AnchorBase.__elements__ + + def __init__(self, + pos=None, + ext=None, + **kw + ): + if pos is None: + pos = XDRPoint2D(0, 0) + self.pos = pos + if ext is None: + ext = XDRPositiveSize2D(0, 0) + self.ext = ext + super().__init__(**kw) + + +class OneCellAnchor(_AnchorBase): + + tagname = "oneCellAnchor" + + _from = Typed(expected_type=AnchorMarker) + ext = Typed(expected_type=XDRPositiveSize2D) + + sp = _AnchorBase.sp + grpSp = _AnchorBase.grpSp + graphicFrame = _AnchorBase.graphicFrame + cxnSp = _AnchorBase.cxnSp + pic = _AnchorBase.pic + contentPart = _AnchorBase.contentPart + clientData = _AnchorBase.clientData + + __elements__ = ('_from', 'ext') + _AnchorBase.__elements__ + + + def __init__(self, + _from=None, + ext=None, + **kw + ): + if _from is None: + _from = AnchorMarker() + self._from = _from + if ext is None: + ext = XDRPositiveSize2D(0, 0) + self.ext = ext + super().__init__(**kw) + + +class TwoCellAnchor(_AnchorBase): + + tagname = "twoCellAnchor" + + editAs = NoneSet(values=(['twoCell', 'oneCell', 'absolute'])) + _from = Typed(expected_type=AnchorMarker) + to = Typed(expected_type=AnchorMarker) + + sp = _AnchorBase.sp + grpSp = _AnchorBase.grpSp + graphicFrame = _AnchorBase.graphicFrame + cxnSp = _AnchorBase.cxnSp + pic = _AnchorBase.pic + contentPart = _AnchorBase.contentPart + clientData = _AnchorBase.clientData + + __elements__ = ('_from', 'to') + _AnchorBase.__elements__ + + def __init__(self, + editAs=None, + _from=None, + to=None, + **kw + ): + self.editAs = editAs + if _from is None: + _from = AnchorMarker() + self._from = _from + if to is None: + to = AnchorMarker() + self.to = to + super().__init__(**kw) + + +def _check_anchor(obj): + """ + Check whether an object has an existing Anchor object + If not create a OneCellAnchor using the provided coordinate + """ + anchor = obj.anchor + if not isinstance(anchor, _AnchorBase): + row, col = coordinate_to_tuple(anchor.upper()) + anchor = OneCellAnchor() + anchor._from.row = row -1 + anchor._from.col = col -1 + if isinstance(obj, ChartBase): + anchor.ext.width = cm_to_EMU(obj.width) + anchor.ext.height = cm_to_EMU(obj.height) + elif isinstance(obj, Image): + anchor.ext.width = pixels_to_EMU(obj.width) + anchor.ext.height = pixels_to_EMU(obj.height) + return anchor + + +class SpreadsheetDrawing(Serialisable): + + tagname = "wsDr" + mime_type = "application/vnd.openxmlformats-officedocument.drawing+xml" + _rel_type = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing" + _path = PartName="/xl/drawings/drawing{0}.xml" + _id = None + + twoCellAnchor = Sequence(expected_type=TwoCellAnchor, allow_none=True) + oneCellAnchor = Sequence(expected_type=OneCellAnchor, allow_none=True) + absoluteAnchor = Sequence(expected_type=AbsoluteAnchor, allow_none=True) + + __elements__ = ("twoCellAnchor", "oneCellAnchor", "absoluteAnchor") + + def __init__(self, + twoCellAnchor=(), + oneCellAnchor=(), + absoluteAnchor=(), + ): + self.twoCellAnchor = twoCellAnchor + self.oneCellAnchor = oneCellAnchor + self.absoluteAnchor = absoluteAnchor + self.charts = [] + self.images = [] + self._rels = [] + + + def __hash__(self): + """ + Just need to check for identity + """ + return id(self) + + + def __bool__(self): + return bool(self.charts) or bool(self.images) + + + + def _write(self): + """ + create required structure and the serialise + """ + anchors = [] + for idx, obj in enumerate(self.charts + self.images, 1): + anchor = _check_anchor(obj) + if isinstance(obj, ChartBase): + rel = Relationship(type="chart", Target=obj.path) + anchor.graphicFrame = self._chart_frame(idx) + elif isinstance(obj, Image): + rel = Relationship(type="image", Target=obj.path) + child = anchor.pic or anchor.groupShape and anchor.groupShape.pic + if not child: + anchor.pic = self._picture_frame(idx) + else: + child.blipFill.blip.embed = "rId{0}".format(idx) + + anchors.append(anchor) + self._rels.append(rel) + + for a in anchors: + if isinstance(a, OneCellAnchor): + self.oneCellAnchor.append(a) + elif isinstance(a, TwoCellAnchor): + self.twoCellAnchor.append(a) + else: + self.absoluteAnchor.append(a) + + tree = self.to_tree() + tree.set('xmlns', SHEET_DRAWING_NS) + return tree + + + def _chart_frame(self, idx): + chart_rel = ChartRelation(f"rId{idx}") + frame = GraphicFrame() + nv = frame.nvGraphicFramePr.cNvPr + nv.id = idx + nv.name = "Chart {0}".format(idx) + frame.graphic.graphicData.chart = chart_rel + return frame + + + def _picture_frame(self, idx): + pic = PictureFrame() + pic.nvPicPr.cNvPr.descr = "Picture" + pic.nvPicPr.cNvPr.id = idx + pic.nvPicPr.cNvPr.name = "Image {0}".format(idx) + + pic.blipFill.blip = Blip() + pic.blipFill.blip.embed = "rId{0}".format(idx) + pic.blipFill.blip.cstate = "print" + + pic.spPr.prstGeom = PresetGeometry2D(prst="rect") + pic.spPr.ln = None + return pic + + + def _write_rels(self): + rels = RelationshipList() + for r in self._rels: + rels.append(r) + return rels.to_tree() + + + @property + def path(self): + return self._path.format(self._id) + + + @property + def _chart_rels(self): + """ + Get relationship information for each chart and bind anchor to it + """ + rels = [] + anchors = self.absoluteAnchor + self.oneCellAnchor + self.twoCellAnchor + for anchor in anchors: + if anchor.graphicFrame is not None: + graphic = anchor.graphicFrame.graphic + rel = graphic.graphicData.chart + if rel is not None: + rel.anchor = anchor + rel.anchor.graphicFrame = None + rels.append(rel) + return rels + + + @property + def _blip_rels(self): + """ + Get relationship information for each blip and bind anchor to it + + Images that are not part of the XLSX package will be ignored. + """ + rels = [] + anchors = self.absoluteAnchor + self.oneCellAnchor + self.twoCellAnchor + + for anchor in anchors: + child = anchor.pic or anchor.groupShape and anchor.groupShape.pic + if child and child.blipFill: + rel = child.blipFill.blip + if rel is not None and rel.embed: + rel.anchor = anchor + rels.append(rel) + + return rels diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/text.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/text.py new file mode 100755 index 0000000..5bdc771 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/text.py @@ -0,0 +1,717 @@ +# Copyright (c) 2010-2024 openpyxl + + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Alias, + Typed, + Set, + NoneSet, + Sequence, + String, + Bool, + MinMax, + Integer +) +from openpyxl.descriptors.excel import ( + HexBinary, + Coordinate, + Relation, +) +from openpyxl.descriptors.nested import ( + NestedInteger, + NestedText, + NestedValue, + EmptyTag +) +from openpyxl.xml.constants import DRAWING_NS + + +from .colors import ColorChoiceDescriptor +from .effect import ( + EffectList, + EffectContainer, +) +from .fill import( + GradientFillProperties, + BlipFillProperties, + PatternFillProperties, + Blip +) +from .geometry import ( + LineProperties, + Color, + Scene3D +) + +from openpyxl.descriptors.excel import ExtensionList as OfficeArtExtensionList +from openpyxl.descriptors.nested import NestedBool + + +class EmbeddedWAVAudioFile(Serialisable): + + name = String(allow_none=True) + + def __init__(self, + name=None, + ): + self.name = name + + +class Hyperlink(Serialisable): + + tagname = "hlinkClick" + namespace = DRAWING_NS + + invalidUrl = String(allow_none=True) + action = String(allow_none=True) + tgtFrame = String(allow_none=True) + tooltip = String(allow_none=True) + history = Bool(allow_none=True) + highlightClick = Bool(allow_none=True) + endSnd = Bool(allow_none=True) + snd = Typed(expected_type=EmbeddedWAVAudioFile, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + id = Relation(allow_none=True) + + __elements__ = ('snd',) + + def __init__(self, + invalidUrl=None, + action=None, + tgtFrame=None, + tooltip=None, + history=None, + highlightClick=None, + endSnd=None, + snd=None, + extLst=None, + id=None, + ): + self.invalidUrl = invalidUrl + self.action = action + self.tgtFrame = tgtFrame + self.tooltip = tooltip + self.history = history + self.highlightClick = highlightClick + self.endSnd = endSnd + self.snd = snd + self.id = id + + +class Font(Serialisable): + + tagname = "latin" + namespace = DRAWING_NS + + typeface = String() + panose = HexBinary(allow_none=True) + pitchFamily = MinMax(min=0, max=52, allow_none=True) + charset = Integer(allow_none=True) + + def __init__(self, + typeface=None, + panose=None, + pitchFamily=None, + charset=None, + ): + self.typeface = typeface + self.panose = panose + self.pitchFamily = pitchFamily + self.charset = charset + + +class CharacterProperties(Serialisable): + + tagname = "defRPr" + namespace = DRAWING_NS + + kumimoji = Bool(allow_none=True) + lang = String(allow_none=True) + altLang = String(allow_none=True) + sz = MinMax(allow_none=True, min=100, max=400000) # 100ths of a point + b = Bool(allow_none=True) + i = Bool(allow_none=True) + u = NoneSet(values=(['words', 'sng', 'dbl', 'heavy', 'dotted', + 'dottedHeavy', 'dash', 'dashHeavy', 'dashLong', 'dashLongHeavy', + 'dotDash', 'dotDashHeavy', 'dotDotDash', 'dotDotDashHeavy', 'wavy', + 'wavyHeavy', 'wavyDbl'])) + strike = NoneSet(values=(['noStrike', 'sngStrike', 'dblStrike'])) + kern = Integer(allow_none=True) + cap = NoneSet(values=(['small', 'all'])) + spc = Integer(allow_none=True) + normalizeH = Bool(allow_none=True) + baseline = Integer(allow_none=True) + noProof = Bool(allow_none=True) + dirty = Bool(allow_none=True) + err = Bool(allow_none=True) + smtClean = Bool(allow_none=True) + smtId = Integer(allow_none=True) + bmk = String(allow_none=True) + ln = Typed(expected_type=LineProperties, allow_none=True) + highlight = Typed(expected_type=Color, allow_none=True) + latin = Typed(expected_type=Font, allow_none=True) + ea = Typed(expected_type=Font, allow_none=True) + cs = Typed(expected_type=Font, allow_none=True) + sym = Typed(expected_type=Font, allow_none=True) + hlinkClick = Typed(expected_type=Hyperlink, allow_none=True) + hlinkMouseOver = Typed(expected_type=Hyperlink, allow_none=True) + rtl = NestedBool(allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + # uses element group EG_FillProperties + noFill = EmptyTag(namespace=DRAWING_NS) + solidFill = ColorChoiceDescriptor() + gradFill = Typed(expected_type=GradientFillProperties, allow_none=True) + blipFill = Typed(expected_type=BlipFillProperties, allow_none=True) + pattFill = Typed(expected_type=PatternFillProperties, allow_none=True) + grpFill = EmptyTag(namespace=DRAWING_NS) + # uses element group EG_EffectProperties + effectLst = Typed(expected_type=EffectList, allow_none=True) + effectDag = Typed(expected_type=EffectContainer, allow_none=True) + # uses element group EG_TextUnderlineLine + uLnTx = EmptyTag() + uLn = Typed(expected_type=LineProperties, allow_none=True) + # uses element group EG_TextUnderlineFill + uFillTx = EmptyTag() + uFill = EmptyTag() + + __elements__ = ('ln', 'noFill', 'solidFill', 'gradFill', 'blipFill', + 'pattFill', 'grpFill', 'effectLst', 'effectDag', 'highlight','uLnTx', + 'uLn', 'uFillTx', 'uFill', 'latin', 'ea', 'cs', 'sym', 'hlinkClick', + 'hlinkMouseOver', 'rtl', ) + + def __init__(self, + kumimoji=None, + lang=None, + altLang=None, + sz=None, + b=None, + i=None, + u=None, + strike=None, + kern=None, + cap=None, + spc=None, + normalizeH=None, + baseline=None, + noProof=None, + dirty=None, + err=None, + smtClean=None, + smtId=None, + bmk=None, + ln=None, + highlight=None, + latin=None, + ea=None, + cs=None, + sym=None, + hlinkClick=None, + hlinkMouseOver=None, + rtl=None, + extLst=None, + noFill=None, + solidFill=None, + gradFill=None, + blipFill=None, + pattFill=None, + grpFill=None, + effectLst=None, + effectDag=None, + uLnTx=None, + uLn=None, + uFillTx=None, + uFill=None, + ): + self.kumimoji = kumimoji + self.lang = lang + self.altLang = altLang + self.sz = sz + self.b = b + self.i = i + self.u = u + self.strike = strike + self.kern = kern + self.cap = cap + self.spc = spc + self.normalizeH = normalizeH + self.baseline = baseline + self.noProof = noProof + self.dirty = dirty + self.err = err + self.smtClean = smtClean + self.smtId = smtId + self.bmk = bmk + self.ln = ln + self.highlight = highlight + self.latin = latin + self.ea = ea + self.cs = cs + self.sym = sym + self.hlinkClick = hlinkClick + self.hlinkMouseOver = hlinkMouseOver + self.rtl = rtl + self.noFill = noFill + self.solidFill = solidFill + self.gradFill = gradFill + self.blipFill = blipFill + self.pattFill = pattFill + self.grpFill = grpFill + self.effectLst = effectLst + self.effectDag = effectDag + self.uLnTx = uLnTx + self.uLn = uLn + self.uFillTx = uFillTx + self.uFill = uFill + + +class TabStop(Serialisable): + + pos = Typed(expected_type=Coordinate, allow_none=True) + algn = Typed(expected_type=Set(values=(['l', 'ctr', 'r', 'dec']))) + + def __init__(self, + pos=None, + algn=None, + ): + self.pos = pos + self.algn = algn + + +class TabStopList(Serialisable): + + tab = Typed(expected_type=TabStop, allow_none=True) + + def __init__(self, + tab=None, + ): + self.tab = tab + + +class Spacing(Serialisable): + + spcPct = NestedInteger(allow_none=True) + spcPts = NestedInteger(allow_none=True) + + __elements__ = ('spcPct', 'spcPts') + + def __init__(self, + spcPct=None, + spcPts=None, + ): + self.spcPct = spcPct + self.spcPts = spcPts + + +class AutonumberBullet(Serialisable): + + type = Set(values=(['alphaLcParenBoth', 'alphaUcParenBoth', + 'alphaLcParenR', 'alphaUcParenR', 'alphaLcPeriod', 'alphaUcPeriod', + 'arabicParenBoth', 'arabicParenR', 'arabicPeriod', 'arabicPlain', + 'romanLcParenBoth', 'romanUcParenBoth', 'romanLcParenR', 'romanUcParenR', + 'romanLcPeriod', 'romanUcPeriod', 'circleNumDbPlain', + 'circleNumWdBlackPlain', 'circleNumWdWhitePlain', 'arabicDbPeriod', + 'arabicDbPlain', 'ea1ChsPeriod', 'ea1ChsPlain', 'ea1ChtPeriod', + 'ea1ChtPlain', 'ea1JpnChsDbPeriod', 'ea1JpnKorPlain', 'ea1JpnKorPeriod', + 'arabic1Minus', 'arabic2Minus', 'hebrew2Minus', 'thaiAlphaPeriod', + 'thaiAlphaParenR', 'thaiAlphaParenBoth', 'thaiNumPeriod', + 'thaiNumParenR', 'thaiNumParenBoth', 'hindiAlphaPeriod', + 'hindiNumPeriod', 'hindiNumParenR', 'hindiAlpha1Period'])) + startAt = Integer() + + def __init__(self, + type=None, + startAt=None, + ): + self.type = type + self.startAt = startAt + + +class ParagraphProperties(Serialisable): + + tagname = "pPr" + namespace = DRAWING_NS + + marL = Integer(allow_none=True) + marR = Integer(allow_none=True) + lvl = Integer(allow_none=True) + indent = Integer(allow_none=True) + algn = NoneSet(values=(['l', 'ctr', 'r', 'just', 'justLow', 'dist', 'thaiDist'])) + defTabSz = Integer(allow_none=True) + rtl = Bool(allow_none=True) + eaLnBrk = Bool(allow_none=True) + fontAlgn = NoneSet(values=(['auto', 't', 'ctr', 'base', 'b'])) + latinLnBrk = Bool(allow_none=True) + hangingPunct = Bool(allow_none=True) + + # uses element group EG_TextBulletColor + # uses element group EG_TextBulletSize + # uses element group EG_TextBulletTypeface + # uses element group EG_TextBullet + lnSpc = Typed(expected_type=Spacing, allow_none=True) + spcBef = Typed(expected_type=Spacing, allow_none=True) + spcAft = Typed(expected_type=Spacing, allow_none=True) + tabLst = Typed(expected_type=TabStopList, allow_none=True) + defRPr = Typed(expected_type=CharacterProperties, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + buClrTx = EmptyTag() + buClr = Typed(expected_type=Color, allow_none=True) + buSzTx = EmptyTag() + buSzPct = NestedInteger(allow_none=True) + buSzPts = NestedInteger(allow_none=True) + buFontTx = EmptyTag() + buFont = Typed(expected_type=Font, allow_none=True) + buNone = EmptyTag() + buAutoNum = EmptyTag() + buChar = NestedValue(expected_type=str, attribute="char", allow_none=True) + buBlip = NestedValue(expected_type=Blip, attribute="blip", allow_none=True) + + __elements__ = ('lnSpc', 'spcBef', 'spcAft', 'tabLst', 'defRPr', + 'buClrTx', 'buClr', 'buSzTx', 'buSzPct', 'buSzPts', 'buFontTx', 'buFont', + 'buNone', 'buAutoNum', 'buChar', 'buBlip') + + def __init__(self, + marL=None, + marR=None, + lvl=None, + indent=None, + algn=None, + defTabSz=None, + rtl=None, + eaLnBrk=None, + fontAlgn=None, + latinLnBrk=None, + hangingPunct=None, + lnSpc=None, + spcBef=None, + spcAft=None, + tabLst=None, + defRPr=None, + extLst=None, + buClrTx=None, + buClr=None, + buSzTx=None, + buSzPct=None, + buSzPts=None, + buFontTx=None, + buFont=None, + buNone=None, + buAutoNum=None, + buChar=None, + buBlip=None, + ): + self.marL = marL + self.marR = marR + self.lvl = lvl + self.indent = indent + self.algn = algn + self.defTabSz = defTabSz + self.rtl = rtl + self.eaLnBrk = eaLnBrk + self.fontAlgn = fontAlgn + self.latinLnBrk = latinLnBrk + self.hangingPunct = hangingPunct + self.lnSpc = lnSpc + self.spcBef = spcBef + self.spcAft = spcAft + self.tabLst = tabLst + self.defRPr = defRPr + self.buClrTx = buClrTx + self.buClr = buClr + self.buSzTx = buSzTx + self.buSzPct = buSzPct + self.buSzPts = buSzPts + self.buFontTx = buFontTx + self.buFont = buFont + self.buNone = buNone + self.buAutoNum = buAutoNum + self.buChar = buChar + self.buBlip = buBlip + self.defRPr = defRPr + + +class ListStyle(Serialisable): + + tagname = "lstStyle" + namespace = DRAWING_NS + + defPPr = Typed(expected_type=ParagraphProperties, allow_none=True) + lvl1pPr = Typed(expected_type=ParagraphProperties, allow_none=True) + lvl2pPr = Typed(expected_type=ParagraphProperties, allow_none=True) + lvl3pPr = Typed(expected_type=ParagraphProperties, allow_none=True) + lvl4pPr = Typed(expected_type=ParagraphProperties, allow_none=True) + lvl5pPr = Typed(expected_type=ParagraphProperties, allow_none=True) + lvl6pPr = Typed(expected_type=ParagraphProperties, allow_none=True) + lvl7pPr = Typed(expected_type=ParagraphProperties, allow_none=True) + lvl8pPr = Typed(expected_type=ParagraphProperties, allow_none=True) + lvl9pPr = Typed(expected_type=ParagraphProperties, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + + __elements__ = ("defPPr", "lvl1pPr", "lvl2pPr", "lvl3pPr", "lvl4pPr", + "lvl5pPr", "lvl6pPr", "lvl7pPr", "lvl8pPr", "lvl9pPr") + + def __init__(self, + defPPr=None, + lvl1pPr=None, + lvl2pPr=None, + lvl3pPr=None, + lvl4pPr=None, + lvl5pPr=None, + lvl6pPr=None, + lvl7pPr=None, + lvl8pPr=None, + lvl9pPr=None, + extLst=None, + ): + self.defPPr = defPPr + self.lvl1pPr = lvl1pPr + self.lvl2pPr = lvl2pPr + self.lvl3pPr = lvl3pPr + self.lvl4pPr = lvl4pPr + self.lvl5pPr = lvl5pPr + self.lvl6pPr = lvl6pPr + self.lvl7pPr = lvl7pPr + self.lvl8pPr = lvl8pPr + self.lvl9pPr = lvl9pPr + + +class RegularTextRun(Serialisable): + + tagname = "r" + namespace = DRAWING_NS + + rPr = Typed(expected_type=CharacterProperties, allow_none=True) + properties = Alias("rPr") + t = NestedText(expected_type=str) + value = Alias("t") + + __elements__ = ('rPr', 't') + + def __init__(self, + rPr=None, + t="", + ): + self.rPr = rPr + self.t = t + + +class LineBreak(Serialisable): + + tagname = "br" + namespace = DRAWING_NS + + rPr = Typed(expected_type=CharacterProperties, allow_none=True) + + __elements__ = ('rPr',) + + def __init__(self, + rPr=None, + ): + self.rPr = rPr + + +class TextField(Serialisable): + + id = String() + type = String(allow_none=True) + rPr = Typed(expected_type=CharacterProperties, allow_none=True) + pPr = Typed(expected_type=ParagraphProperties, allow_none=True) + t = String(allow_none=True) + + __elements__ = ('rPr', 'pPr') + + def __init__(self, + id=None, + type=None, + rPr=None, + pPr=None, + t=None, + ): + self.id = id + self.type = type + self.rPr = rPr + self.pPr = pPr + self.t = t + + +class Paragraph(Serialisable): + + tagname = "p" + namespace = DRAWING_NS + + # uses element group EG_TextRun + pPr = Typed(expected_type=ParagraphProperties, allow_none=True) + properties = Alias("pPr") + endParaRPr = Typed(expected_type=CharacterProperties, allow_none=True) + r = Sequence(expected_type=RegularTextRun) + text = Alias('r') + br = Typed(expected_type=LineBreak, allow_none=True) + fld = Typed(expected_type=TextField, allow_none=True) + + __elements__ = ('pPr', 'r', 'br', 'fld', 'endParaRPr') + + def __init__(self, + pPr=None, + endParaRPr=None, + r=None, + br=None, + fld=None, + ): + self.pPr = pPr + self.endParaRPr = endParaRPr + if r is None: + r = [RegularTextRun()] + self.r = r + self.br = br + self.fld = fld + + +class GeomGuide(Serialisable): + + name = String(()) + fmla = String(()) + + def __init__(self, + name=None, + fmla=None, + ): + self.name = name + self.fmla = fmla + + +class GeomGuideList(Serialisable): + + gd = Sequence(expected_type=GeomGuide, allow_none=True) + + def __init__(self, + gd=None, + ): + self.gd = gd + + +class PresetTextShape(Serialisable): + + prst = Typed(expected_type=Set(values=( + ['textNoShape', 'textPlain','textStop', 'textTriangle', 'textTriangleInverted', 'textChevron', + 'textChevronInverted', 'textRingInside', 'textRingOutside', 'textArchUp', + 'textArchDown', 'textCircle', 'textButton', 'textArchUpPour', + 'textArchDownPour', 'textCirclePour', 'textButtonPour', 'textCurveUp', + 'textCurveDown', 'textCanUp', 'textCanDown', 'textWave1', 'textWave2', + 'textDoubleWave1', 'textWave4', 'textInflate', 'textDeflate', + 'textInflateBottom', 'textDeflateBottom', 'textInflateTop', + 'textDeflateTop', 'textDeflateInflate', 'textDeflateInflateDeflate', + 'textFadeRight', 'textFadeLeft', 'textFadeUp', 'textFadeDown', + 'textSlantUp', 'textSlantDown', 'textCascadeUp', 'textCascadeDown' + ] + ))) + avLst = Typed(expected_type=GeomGuideList, allow_none=True) + + def __init__(self, + prst=None, + avLst=None, + ): + self.prst = prst + self.avLst = avLst + + +class TextNormalAutofit(Serialisable): + + fontScale = Integer() + lnSpcReduction = Integer() + + def __init__(self, + fontScale=None, + lnSpcReduction=None, + ): + self.fontScale = fontScale + self.lnSpcReduction = lnSpcReduction + + +class RichTextProperties(Serialisable): + + tagname = "bodyPr" + namespace = DRAWING_NS + + rot = Integer(allow_none=True) + spcFirstLastPara = Bool(allow_none=True) + vertOverflow = NoneSet(values=(['overflow', 'ellipsis', 'clip'])) + horzOverflow = NoneSet(values=(['overflow', 'clip'])) + vert = NoneSet(values=(['horz', 'vert', 'vert270', 'wordArtVert', + 'eaVert', 'mongolianVert', 'wordArtVertRtl'])) + wrap = NoneSet(values=(['none', 'square'])) + lIns = Integer(allow_none=True) + tIns = Integer(allow_none=True) + rIns = Integer(allow_none=True) + bIns = Integer(allow_none=True) + numCol = Integer(allow_none=True) + spcCol = Integer(allow_none=True) + rtlCol = Bool(allow_none=True) + fromWordArt = Bool(allow_none=True) + anchor = NoneSet(values=(['t', 'ctr', 'b', 'just', 'dist'])) + anchorCtr = Bool(allow_none=True) + forceAA = Bool(allow_none=True) + upright = Bool(allow_none=True) + compatLnSpc = Bool(allow_none=True) + prstTxWarp = Typed(expected_type=PresetTextShape, allow_none=True) + scene3d = Typed(expected_type=Scene3D, allow_none=True) + extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True) + noAutofit = EmptyTag() + normAutofit = EmptyTag() + spAutoFit = EmptyTag() + flatTx = NestedInteger(attribute="z", allow_none=True) + + __elements__ = ('prstTxWarp', 'scene3d', 'noAutofit', 'normAutofit', 'spAutoFit') + + def __init__(self, + rot=None, + spcFirstLastPara=None, + vertOverflow=None, + horzOverflow=None, + vert=None, + wrap=None, + lIns=None, + tIns=None, + rIns=None, + bIns=None, + numCol=None, + spcCol=None, + rtlCol=None, + fromWordArt=None, + anchor=None, + anchorCtr=None, + forceAA=None, + upright=None, + compatLnSpc=None, + prstTxWarp=None, + scene3d=None, + extLst=None, + noAutofit=None, + normAutofit=None, + spAutoFit=None, + flatTx=None, + ): + self.rot = rot + self.spcFirstLastPara = spcFirstLastPara + self.vertOverflow = vertOverflow + self.horzOverflow = horzOverflow + self.vert = vert + self.wrap = wrap + self.lIns = lIns + self.tIns = tIns + self.rIns = rIns + self.bIns = bIns + self.numCol = numCol + self.spcCol = spcCol + self.rtlCol = rtlCol + self.fromWordArt = fromWordArt + self.anchor = anchor + self.anchorCtr = anchorCtr + self.forceAA = forceAA + self.upright = upright + self.compatLnSpc = compatLnSpc + self.prstTxWarp = prstTxWarp + self.scene3d = scene3d + self.noAutofit = noAutofit + self.normAutofit = normAutofit + self.spAutoFit = spAutoFit + self.flatTx = flatTx diff --git a/venv/lib/python3.11/site-packages/openpyxl/drawing/xdr.py b/venv/lib/python3.11/site-packages/openpyxl/drawing/xdr.py new file mode 100755 index 0000000..335480c --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/drawing/xdr.py @@ -0,0 +1,33 @@ +# Copyright (c) 2010-2024 openpyxl + +""" +Spreadsheet Drawing has some copies of Drawing ML elements +""" + +from .geometry import Point2D, PositiveSize2D, Transform2D + + +class XDRPoint2D(Point2D): + + namespace = None + x = Point2D.x + y = Point2D.y + + +class XDRPositiveSize2D(PositiveSize2D): + + namespace = None + cx = PositiveSize2D.cx + cy = PositiveSize2D.cy + + +class XDRTransform2D(Transform2D): + + namespace = None + rot = Transform2D.rot + flipH = Transform2D.flipH + flipV = Transform2D.flipV + off = Transform2D.off + ext = Transform2D.ext + chOff = Transform2D.chOff + chExt = Transform2D.chExt diff --git a/venv/lib/python3.11/site-packages/openpyxl/formatting/__init__.py b/venv/lib/python3.11/site-packages/openpyxl/formatting/__init__.py new file mode 100755 index 0000000..bedc2bc --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/formatting/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2010-2024 openpyxl + +from .rule import Rule diff --git a/venv/lib/python3.11/site-packages/openpyxl/formatting/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/formatting/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..3d8fd99a8cf03b252143282a29a37ce6e5809f51 GIT binary patch literal 257 zcmZ3^%ge<81R`3~v#f#iV-N=hn4pZ$LO{lJh7^Vr#vF!R#wbQch7_h?22JLdj6exZ z##<~wr8%j7noPG?ihztFW}xUwhR-0~zmoOC@^eaaQ;YSB6Z29si?a=lEcDZI5{t9- z3o6rcQd3Lx%Tn{o^m8(kfC42M`FX~AhKBmZnI);Z1&PVoiRnPC`30$Y1(g*!`f2$^ zxrrqunR)5@@$s2?nI-Y@dIgogIBatBQ-C(x6>$LV1Uaf$9!Pv(W@Kdiz{bERet|&@ K6BV%m)c^oIgG7b^ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/formatting/__pycache__/formatting.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/formatting/__pycache__/formatting.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..e53a10ce0995eb1b4ee53023bd6f2e1dd713c5a4 GIT binary patch literal 5643 zcmb_g-EZ606~7cog_dYDcI;$s?1Z+{Iw}%5pKX_RT@pJ@KN6*jJFigFaSTbtj49E% zq?6c{2V=;CGI*FV6o?08fPt-9gXUp>!2W_G|y#2^qLz+Topsc`qwr=4?YQ6F}K zV%rsYc<;HFhxdHk-#u487C$xGCpiB=q^(NQz=0oXm8rS?G|+B9hc^H z-?t0bf<9wAHkhZ=x;<+dzGZ6u{4CheyFsnoN6?Yb9ml<;72JXq#El#p>>%~!Lytk z>!7=V!`MOGy6s=^d=EdbV)@P*n{u7GyycB~I%w?896k2NSkBSCnX%dVoMT!3*iEZ& zbIh@?0>htn3&+z(kB)h^Zylc1jT!wKyz0(ch1vPr&R8xoRZ}%RJ0D1zW*2N<(-!t^ zYuR+Ye*k9Y?FF(#*85&63CoH4WA^~Gk|p?UKsPZWGeARto0;%KsN5rdWH7?ac|B^k zt_%;taFP_s^+;BcYt&~L7s4Tyc_+mO3EQ&^p0DE?>CiL-Y~*Pgvv4X#_rQk((efw8;O8b!&*EH(}s6FsJwXt^?MtZLTSt3uB{?(V)djGVqq8zCzM{0!Y=wILUgO!u( z%C6;w)t}z~Gg11|tZa%=G1TEIV% zo(=B+7qw*t7C+d$fq39EKC_^_^_k&#i|S_v0F$@)HYmvhBM?~|kS`vFE8Pb|FhUD@ z-rDpi9RXgO1*kPkUu1!>{}8^24ut?#)F;a5V`cQqiAS00q4B?+`1`4{GFnlls>)PZ znhGs~(NZs1XFlwON(cql>wV-VEcX<*a3R4~E|BqQ%a~DbO0B+&i-R@NN@QM4A#an&oTvf_)QQB2KjW|+ zQArR-YGf-36+?9lxT8{ENgHQ@)w&&tnh_imhp!?9nzus}w@Q4I72FO1 zt0^*IPsDWuKyBnS_PIdL>$kO8YP;0-=iApe3zFwVH>witPj7N^?MWJ<;kPGwRV_{+bjA^PmizC&WGp1GDQ^#G$rIUv4SeRrT zQZa3tb98K|E>$r*eb2*IB0@j)BS6J^NT|1LfX%Cxs+*<-(&u~^(mopmI`ir1m4&x1 z6`Xmso(XuWn^WuQPr3oHX^gov`*vQRkEBvmGm}ctL3jqd=hF~%5VL~BlCk-|KIi=r2tas(biGuHJx%tlIA4rck_W5FgP4?@eA@lWTCvi7qS}3; zbQZIgSH3tFkQQzGt9xcKO})p5D^C;jbpvM}*#O0(26=e-6ITmYTl^`ggWM|D!h0UWDzh zkpvexJaB{sH^PM@5on#ae3k$*IKYiq#bgoCj=@GWjAHHz`5A%}{UH*T5+V3J+&tm% zGuC`ddYII-YnG2r0Ykt1q8N*Y{Q~59$AK)7e@jH(y<+^~cqO^Nn%s{taQtb{=$A&h z=UAoZSheR^X&eFKm#ao|AU4|;eUA4APP5&%+gdCN%_8?B_%kL<8kp*_hQjm$h-=r> zw4CpwX*A468N)!}G}JZnhZF?KfGR$Ghk@r>RN;6)&hSQ zw4HunmxNO-1i<0QvrXIObG@HQar6wxuP>{MP^YJXv@R=fIP62;#|+W10t&%H7CRAi zbpBTQwY0Kp#jHqstJ2A#miI3pHJ;-CJhQEt6z!UzXG*-BO~e1qI?8(kN;H#zXlR`Lz7xAV1 z5kD(ClYvxMq>JIMWOphU3G$qcJIg8VPdPv@A7uKlMBDSe;vks+ch!%9E! zVP!QkB`$p6-|5A}yeVH&wL~nL&|}L9uh>2nB91(FosT&2c6QVMUM#t;HlDZnnHa*c zaD7dU8>$jA@RlJ(T~pJF9$H_^q%BI!z-uqB8)_)C5?YH<=R&U@pA^~6Z)J2Nbd}oG zL;97>dQu53tD*FI3L_W~&Axj%WL!}i0q`YHbK!fHq8LDrUs5m=2Pe=~b&DjIyG0g%r
+ +# Werkzeug + +*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") + +Werkzeug is a comprehensive [WSGI][] web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +- An interactive debugger that allows inspecting stack traces and + source code in the browser with an interactive interpreter for any + frame in the stack. +- A full-featured request object with objects to interact with + headers, query args, form data, files, and cookies. +- A response object that can wrap other WSGI applications and handle + streaming data. +- A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables + from URLs. +- HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +- A threaded WSGI server for use while developing applications + locally. +- A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug doesn't enforce any dependencies. It is up to the developer to +choose a template engine, database adapter, and even how to handle +requests. It can be used to build all sorts of end user applications +such as blogs, wikis, or bulletin boards. + +[Flask][] wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + +[WSGI]: https://wsgi.readthedocs.io/en/latest/ +[Flask]: https://www.palletsprojects.com/p/flask/ + + +## A Simple Example + +```python +# save this as app.py +from werkzeug.wrappers import Request, Response + +@Request.application +def application(request: Request) -> Response: + return Response("Hello, World!") + +if __name__ == "__main__": + from werkzeug.serving import run_simple + run_simple("127.0.0.1", 5000, application) +``` + +``` +$ python -m app + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) +``` + + +## Donate + +The Pallets organization develops and supports Werkzeug and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +[please donate today][]. + +[please donate today]: https://palletsprojects.com/donate + +## Contributing + +See our [detailed contributing documentation][contrib] for many ways to +contribute, including reporting issues, requesting features, asking or answering +questions, and making PRs. + +[contrib]: https://palletsprojects.com/contributing/ + diff --git a/venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/RECORD b/venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/RECORD new file mode 100755 index 0000000..7f1f5ee --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/RECORD @@ -0,0 +1,116 @@ +werkzeug-3.1.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +werkzeug-3.1.8.dist-info/METADATA,sha256=9X0phk-wTGy_K06ETBCNYjMfRiH9Fjy87SiPkN_W05I,4029 +werkzeug-3.1.8.dist-info/RECORD,, +werkzeug-3.1.8.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 +werkzeug-3.1.8.dist-info/licenses/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +werkzeug/__init__.py,sha256=CejNWfCZKDaJ_FmshZFw8dFgjNAlu6q15ec7DwWJlM8,165 +werkzeug/__pycache__/__init__.cpython-311.pyc,, +werkzeug/__pycache__/_internal.cpython-311.pyc,, +werkzeug/__pycache__/_reloader.cpython-311.pyc,, +werkzeug/__pycache__/exceptions.cpython-311.pyc,, +werkzeug/__pycache__/formparser.cpython-311.pyc,, +werkzeug/__pycache__/http.cpython-311.pyc,, +werkzeug/__pycache__/local.cpython-311.pyc,, +werkzeug/__pycache__/security.cpython-311.pyc,, +werkzeug/__pycache__/serving.cpython-311.pyc,, +werkzeug/__pycache__/test.cpython-311.pyc,, +werkzeug/__pycache__/testapp.cpython-311.pyc,, +werkzeug/__pycache__/urls.cpython-311.pyc,, +werkzeug/__pycache__/user_agent.cpython-311.pyc,, +werkzeug/__pycache__/utils.cpython-311.pyc,, +werkzeug/__pycache__/wsgi.cpython-311.pyc,, +werkzeug/_internal.py,sha256=QRynfUEOngEAmm4qzhlufbhk1K-n901Q1KQWKznsaNU,5547 +werkzeug/_reloader.py,sha256=IppO3kX_GxQwaV6h8SPWe0lSTSw6kd_HJXqLiUhR7AU,15100 +werkzeug/datastructures/__init__.py,sha256=0Vt8Lt8KUYSoAe8ADt1jIE-w3Ib9tkrk0HEhBOktqUw,2615 +werkzeug/datastructures/__pycache__/__init__.cpython-311.pyc,, +werkzeug/datastructures/__pycache__/accept.cpython-311.pyc,, +werkzeug/datastructures/__pycache__/auth.cpython-311.pyc,, +werkzeug/datastructures/__pycache__/cache_control.cpython-311.pyc,, +werkzeug/datastructures/__pycache__/csp.cpython-311.pyc,, +werkzeug/datastructures/__pycache__/etag.cpython-311.pyc,, +werkzeug/datastructures/__pycache__/file_storage.cpython-311.pyc,, +werkzeug/datastructures/__pycache__/headers.cpython-311.pyc,, +werkzeug/datastructures/__pycache__/mixins.cpython-311.pyc,, +werkzeug/datastructures/__pycache__/range.cpython-311.pyc,, +werkzeug/datastructures/__pycache__/structures.cpython-311.pyc,, +werkzeug/datastructures/accept.py,sha256=xoDD4qwZeTjew_1Ze0gyyKWkbhtowwR5tHTWnobPeGI,12177 +werkzeug/datastructures/auth.py,sha256=iAhDYwIBjE6LDJw_iceE-GlJlLUvJRCMKtokzVKP1J4,10125 +werkzeug/datastructures/cache_control.py,sha256=omtSmmAh3KgQRJYzaW05LtEt5HoJlLkJTxjil-Q3cuM,9711 +werkzeug/datastructures/csp.py,sha256=jWl1dxhkbc6_eE9qGnTGBJSimWNQljKKYwmlys4dFOA,3816 +werkzeug/datastructures/etag.py,sha256=N2dFqhFsLR0k5hgjol3QTGpcSltJhpgLWeyz6Va80G8,3278 +werkzeug/datastructures/file_storage.py,sha256=J57paAQGxBnq2yjY0yfsEuN1wPRkDXLkWH3wk_pQvTs,6715 +werkzeug/datastructures/headers.py,sha256=J3WQKnQGmt9hUDn-d_YI62PtrjW7U7sJTDNTFtjWgRA,21540 +werkzeug/datastructures/mixins.py,sha256=h8K_A0Sw47s2cO2ZNFf60ENbmVDsi3rgHr_f77VFwJE,9039 +werkzeug/datastructures/range.py,sha256=KAWLRDyL8bzSBDm_OirxwA17xkFM_vdedZINmyDfNUI,7034 +werkzeug/datastructures/structures.py,sha256=dQ3n8KP5UHyad1TMsWmQBK3K9pNPByK5Nd0AV09oOAo,41385 +werkzeug/debug/__init__.py,sha256=8QoMJ1iGA7NGp3wxw6Sa3fPJHlrCggrRH30bQg9ei2o,20319 +werkzeug/debug/__pycache__/__init__.cpython-311.pyc,, +werkzeug/debug/__pycache__/console.cpython-311.pyc,, +werkzeug/debug/__pycache__/repr.cpython-311.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-311.pyc,, +werkzeug/debug/console.py,sha256=t4hZ0Qg1p6Uu2MWimqoMDi7S3WYZvLMjnc8v_dPaxAo,6089 +werkzeug/debug/repr.py,sha256=iHMYny8whiiMDasvUqj0nm4-1VHVvwe697KleiZVK1s,9303 +werkzeug/debug/shared/ICON_LICENSE.md,sha256=DhA6Y1gUl5Jwfg0NFN9Rj4VWITt8tUx0IvdGf0ux9-s,222 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=SRL9YZ9FTVngaYD-INQNincEVdZ-kBHa_-VJx0U7-rg,10068 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/style.css,sha256=-xSxzUEZGw_IqlDR5iZxitNl8LQUjBM-_Y4UAvXVH8g,6078 +werkzeug/debug/tbtools.py,sha256=L_CD1ha5WmyWrKVZ3zxovJ4gI1CATsc4Yc1Zms41EvE,13645 +werkzeug/exceptions.py,sha256=7XNgddMV3UQR6UPr7lWlzSFxO8Ur8bSJgLdvJuauEX0,26888 +werkzeug/formparser.py,sha256=v0-F9OcmNHuPLqXePW_b0asWzpH-Z_ZlGj8ao0CMmuo,15847 +werkzeug/http.py,sha256=4HIKX--fVLTUePdvH4jsDmuiUZc38XziDPBghUJFb0o,45732 +werkzeug/local.py,sha256=o4Zz1ZAuNRBn8r-laGIxCdKXjxx1i0uJq3eNyKPy4cg,22184 +werkzeug/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/middleware/__pycache__/__init__.cpython-311.pyc,, +werkzeug/middleware/__pycache__/dispatcher.cpython-311.pyc,, +werkzeug/middleware/__pycache__/http_proxy.cpython-311.pyc,, +werkzeug/middleware/__pycache__/lint.cpython-311.pyc,, +werkzeug/middleware/__pycache__/profiler.cpython-311.pyc,, +werkzeug/middleware/__pycache__/proxy_fix.cpython-311.pyc,, +werkzeug/middleware/__pycache__/shared_data.cpython-311.pyc,, +werkzeug/middleware/dispatcher.py,sha256=zWN5_lqJr_sc9UDv-PPoSlDHN_zR33z6B74F_4Cxpo8,2602 +werkzeug/middleware/http_proxy.py,sha256=sdk-V6GoZ6aMny-D0QNKNf5MWD2OTO3AGbBg6upp4Hc,7834 +werkzeug/middleware/lint.py,sha256=jVdyljRxpkz18MiMR8N7YdiElna8DJVvO4CCjZsnSQI,14476 +werkzeug/middleware/profiler.py,sha256=1ZAHlDeYNdhgp8THOXkV5lgmcLl307phAr2Ufy30-lY,5562 +werkzeug/middleware/proxy_fix.py,sha256=n-HW-MRWJquCIhmqiZKoGdbbEeHuWJqPRHhFpuj4pzY,6755 +werkzeug/middleware/shared_data.py,sha256=gsjmgeEFLzDdKsgd19pMhI7BfU_TbL6AyEyZPG2ykfQ,9542 +werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/routing/__init__.py,sha256=d8TRxsk24IWu2BdoOYUfL--deolHwiGVCBJqLoEe3YM,4820 +werkzeug/routing/__pycache__/__init__.cpython-311.pyc,, +werkzeug/routing/__pycache__/converters.cpython-311.pyc,, +werkzeug/routing/__pycache__/exceptions.cpython-311.pyc,, +werkzeug/routing/__pycache__/map.cpython-311.pyc,, +werkzeug/routing/__pycache__/matcher.cpython-311.pyc,, +werkzeug/routing/__pycache__/rules.cpython-311.pyc,, +werkzeug/routing/converters.py,sha256=iqpee_mAjr1oGbq0etujYF9PiDv5U7DgNkARHXnMId0,7297 +werkzeug/routing/exceptions.py,sha256=wNBiUmUk4OtFOpbdDSr7KKKUjH7yn84JqwBicUup8p8,4846 +werkzeug/routing/map.py,sha256=a7PSRAELyNyoPFP_uhyNDAsmPjEbrcyewPnEZIl-0ZI,35863 +werkzeug/routing/matcher.py,sha256=Q_EazWPuLuQjJfd1vYO9AkCtLzx04bGj2YUJqULAfs0,7848 +werkzeug/routing/rules.py,sha256=AkozsbaVGcSEh1O_9FI_ZLWb8BNOjdzrvEFu-qa8VKQ,32536 +werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/sansio/__pycache__/__init__.cpython-311.pyc,, +werkzeug/sansio/__pycache__/http.cpython-311.pyc,, +werkzeug/sansio/__pycache__/multipart.cpython-311.pyc,, +werkzeug/sansio/__pycache__/request.cpython-311.pyc,, +werkzeug/sansio/__pycache__/response.cpython-311.pyc,, +werkzeug/sansio/__pycache__/utils.cpython-311.pyc,, +werkzeug/sansio/http.py,sha256=l-N1ktc7WVgfDA9t1MhyeVFNJGvnRTC8mJViZDQYVGA,5351 +werkzeug/sansio/multipart.py,sha256=gqzwp6YgyE_DepTlnoiuFN743Q3WPa6p7ki1xn5ixlo,11963 +werkzeug/sansio/request.py,sha256=-t8CJrvjWPMu2DCQ4W0ltCHQ4nOWg_ztXJLkyN6-Q_U,19891 +werkzeug/sansio/response.py,sha256=159j3TC2AbDvqppcegVmpLftot70UWtm5qZO0kqQpFk,27930 +werkzeug/sansio/utils.py,sha256=ZUkFKNtMDhTRQf9bkyMzoGOQAntyaTTvHB_6en2grgg,7477 +werkzeug/security.py,sha256=WHb2oiwyOie5XI8WNnKYd4YVjSwBhGf3nPyKBSGGlI0,6654 +werkzeug/serving.py,sha256=mcc9Vfn1dMXzvm87PE5hUtyY6dQB0e98lcxqDkpWiz8,39859 +werkzeug/test.py,sha256=Xf8bCYkjKJLtTXWTvw4E5AlYrK7CYjnmIolxSHkkKsc,52779 +werkzeug/testapp.py,sha256=5_IS5Dh_WfWfNcTLmbydj01lomgcKA_4l9PPCNZnmdI,6332 +werkzeug/urls.py,sha256=XyNKwHvK5IC37-wuIDMYWkiCJ3yLTLGv7wn2GF3ndqI,6430 +werkzeug/user_agent.py,sha256=lSlLYKCcbzCUSkbdAoO8zPk2UR-8Mdn6iu_iA2kYPBA,1416 +werkzeug/utils.py,sha256=1BirLZmTvJP9v6dxjMXpSrKCsfhqzaJPzUHC7dl5MYs,24615 +werkzeug/wrappers/__init__.py,sha256=b78jCM8x96kJUGLZ5FYFR3zlK-3pnFAmP9RJIGU0ses,138 +werkzeug/wrappers/__pycache__/__init__.cpython-311.pyc,, +werkzeug/wrappers/__pycache__/request.cpython-311.pyc,, +werkzeug/wrappers/__pycache__/response.cpython-311.pyc,, +werkzeug/wrappers/request.py,sha256=f9Jpe9zqs_v0n-DTZj7FfMyU_y3LhBBBX4YCYsrqGUs,24730 +werkzeug/wrappers/response.py,sha256=y0OOpH58zGngrrzAdG50JPyiRW4JxZeEXLoYuBu1Qo0,32707 +werkzeug/wsgi.py,sha256=DvYEIcatqemE4qtcv33D9T-yvjAiTgri65Ol-ejmrbI,21676 diff --git a/venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/WHEEL b/venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/WHEEL new file mode 100755 index 0000000..d8b9936 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.12.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/licenses/LICENSE.txt b/venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/licenses/LICENSE.txt new file mode 100755 index 0000000..c37cae4 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug-3.1.8.dist-info/licenses/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.11/site-packages/werkzeug/__init__.py b/venv/lib/python3.11/site-packages/werkzeug/__init__.py new file mode 100755 index 0000000..0b248fd --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/__init__.py @@ -0,0 +1,4 @@ +from .serving import run_simple as run_simple +from .test import Client as Client +from .wrappers import Request as Request +from .wrappers import Response as Response diff --git a/venv/lib/python3.11/site-packages/werkzeug/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..18b1566ae9e772ddab1b60ac665f822ec3072841 GIT binary patch literal 407 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/__pycache__/http.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/__pycache__/http.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..4b1d0eadd90ff2040e5af6b6577e875f79863fa7 GIT binary patch literal 55587 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/__pycache__/security.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/__pycache__/security.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..09904c086dbc5f8f5703d969c75ef197970aeabe GIT binary patch literal 9479 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 YkRhg-83tx6XwQD;M@8}-gs#v30B=@&U;qFB literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/__pycache__/serving.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/__pycache__/serving.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..77876088df5c2c5afbdc483c72838f752cd5fd57 GIT binary patch literal 50407 zcmeFaYjj)Joga$#n*>OL?-%%zM3DqvdQ!4%ilii37Nv-kJ)z@(5DzFp0zu{gltc_^ zD;`e`>8fKoql}q}e1l}k8G7tYH0`9-+|IOilJ=&Zxw8PSlS>pGt!P&2Y2AJ(eVwej zy6s)}_uuD%b3n>bX1;W-dk?{V_St8j{eJx4`wxnW96DTOyWhI>kH4wY{hS`;%PM;G zpEjFxy0>)abewKd$LTpkL_ceoH0a51j2I`4>~5MgvAcQF%} z@Rv`P!|&u=k&4;M$x7xgg1>6AiusEp)w4B|HO%jh)XvsT)-k^)Qa{@;*`U|i#TqqE zHimp5>!l{SAwrFpnq~itak7Og3AJ*ihY=L*Xwik*T6KJjUT4r9*KuX9={WCq4LaR> z_!qCq9R^)!$9M7Yo*bkr%wfhb+44nQ)O1yM&G<##RXtZexie(Gv`hYgtGLY4<7@25 zC)CbWepiq5@Go9^U9?Cli5YdOn%t>Q4PWdInYrqMa&?3{cw5MJsZ&m6vNKx5YEgq) z)E3094S%2P=jucKp*@> zk2rhf7hFR=e8!mf=Y5m=5P!cMpRdB`YK$D1Jvey~<pw&b@&A&&Y4K-nj+t3O9qeU*L@6y7sHVEC%GD?}hQ>qrPC2^PQNOIOB_j_$wja zH#5ik7Gfda?%mu1AC6w|aiJ@r$lUyFC>r<8MI(#5cl&)47sD}!^g%f0o1Tka2}Q#c zBR)r8clypR#C>=Zor@!ZSolIT#L>I+A>VwEkB6rhB0)Z~=!nIG=Oc(73r#QZxFhq> z%uINi((?Pxp&UVc&xNOh@sLTd(F<&HnIphmR;~_qXcvnLB{`|s)3-moDKRw5Vd_3wNM#nwp|)Py-&-z8I1k(C<5gs>jhlNE)SQU-;)25j!@`hv(x14u{{*67M=6 znVY^mFyNbCj9;9KIvhS+GyL4FZ+0;_Kkq{>b4YudM}b2DgybV!4e^%~p@j=_oP4Pq zAJbTB*XNwUC|W;A4GT{+*WbOi9cmr2s7s7#1 z6b*?63~<5dG<{GuN=+UOM#R)ccz%vD@L*uXLV;K)9=I3^a$=?!f`Ry4Ak2powebZs z`it?!`Ou3a*QP`BRI`^leSW|HrCc?JU^K*fJHYXC^YbAt5Tb-*)8f<;U1_b?e_Da( zw{#)hq#k>vfwOXE%pfCY!R)Z*?1AxEWO!kAb}?s)24_P#V=T_+EPM#VCi=)6_YX!F zrU*y`gX%u;@tT7b2L2`qQNV{aD?Unrp9!TCLS9) zXV{4Fp47kx;id*ZoqUu$I!Ro*yY~71Kl%`VC-`D{NhX`6pD9aE??=6gwG>@ z#$~_1x3@bMj)%JDgVUFT7x1Y({JLp2(&U(5%sB&r3n7fRI3EZk%9SSctAc53iP1)I zUH720Vbh>5>HEZJEGzzn4$h{|SXBHeUh2l)HL)V|)JuFNIaP4lO*va2KpheYeO>w6G??tj`7w@|2z@`1GeqM# z+w@#yjt|ZTkL65QCogNpmelF`Pm2*>HMaB^Q-+-D7~-R)PKB?HM#tKXybrPXCUTm| zX(1=sI^h%hYi_)@=poX*KgJ<~g6)X`aLyIq9bYXIagOPAT{>V8L!n%#6 z8BsL#R^}A-uDafsPj1eFd1c}}oDFv~SHd}Pw{WFg5$;y57;RIQD;^F_UtEY@4soN= z`Gt7mz+e<>Cwy33vG&bkN(AG+i)<;1`6l>aG&U3ByGEpi#kW)XdS}ke&tQ5ya>o6m zr(Zn37!So>V&f-g8pHagnX^=EHfMWSv6u8qx&VCQ#nF>8i#Y?Hq-tVD>riOp*fE|$ z+Ko9&fMuF92RP(Gt6wPEZs2S2mS+Q=;`w}REYbiDN5gT zs@Zg^}&C7Q-U7Z4NRi1-e}=>isef~10x$lTQs*KXzaA(5Pox+xOIptEox zf>!t=6l}(<3D4&o&j%w5A+{0Ztf$At9l^u~LC!>9@dqfjJ`|&71mq!&iegGN!1AV{ zoTx7tsM^;Nd>i{6IM;QwmLANORo*_dQMPlvY-gsdT_|hcDC=1->$z8zDH{;V29m=M z$|_dkZzaB#cysCYQtE7`Y?n~BD>!p@7mtCeW&r;jaWNwEv^pUd^!2@rbSoZv{Bc+Ue}$e>lNyHS4_9<4>j)_ni1v@ z!+LKnCzpR|)0J1fZCoAthV70m)q1x*ytq-{yI$X$sqYu+`&S&$ z{sEPrb}__e{eM!4%|dMjaC6QY0N6Dh2=E6f;#1_%=;F_j(?U)js3!QICnt#i7_I5o zmA|a%Xxemi(_}PP01?qR4!zlnJxSwOZ1kvgygMlDF^*Ua%6uCC%4HLM`cHRbbiS?v zpFzac1AsP!FuQ5(16go40n^&q4^X;;f!0>8lY!PYt~05d(R0q%T$6T?uevxtR|3M1 zgX?DDUW7Z5QaQkH7uUm8;$9RgP7#K&<>IPd(_J7krUxWRlrK-l{EnW5))W#SzoQ>6 z*vGWrO_p$Vp%Q#s%GGP%P#w8mu8(U*Y0J2Nt_>yg;=Tj-a&8aTj(bHCJHTWm;Hka2 zQo?JrREk9ZAm}xWZXsa{yofq5at&cRF_DG@w0AxjpT0<#Yp$3`9+a3!j>uUErv>eR z4N<~CHJ~n>39dWDGdKm++KxgQP(T2JjyP0>)ES)nItB_I;vh zYt8)HD0e9Z0$8u>XzKo^;NG3K?G}ev7lJhVp z7|Ql^NdZ`{8#sLwoCUUhnUFHOVm8hQfJJ$Z?ut9*ceHI^Qr^T}`EV_u!56FJai$qU zx|Hvh^p}*)FjkExY2si)mvUzH^EZJQS^eT|qEnwXCr6^L2+#4)P?=o0B< z%cWhykS2k|M55Yq6~@%GqS6bTDbHI_qhgPVU6YTkZ3o1sInOSx_Kxu#J%B6SCBh`w zmCAo82jQ+QbW}YOj$NB zSsoL&fh#MBYgsaLjQ|fTINy>Pv%!F`%}XYft7yrzWX@OVn>wy($-?G~WywPCXq~!s zk!y}0%ol3Olp^}tmWylAwx#w7xz%&6094y3%{cAS(uFX4z6{#0=pDt!+*Rg2U!tDt zyhHtj_&X>*BR?p!Db*>T#DM5M;~6wR5|*{iN4{E9Z`%$VWw5Mi#2@8kbDi_&UaNri=0Te9la6 ztljX)dKg@UVB`n`(wXx}-<@y~?cFbJIoOJ5Jr?N;ZuSO5`#@~^VhEIf2Mb^Xw}g}V zvHJncPI%bE>_Q|CdLY5*iIRK>*eTPYSS(S*f{6bx2lD>0gj=Q!`(t2kgyK2(_{iDk zN6rSuPam6jVesrouK4W87tW20PXtblOq@79oO6y3ogF}LiiP6S5B zj-AfA5bx|41LG5CN5_umobq?)&W`4+X9r&hkO!fsPEU*k28V~wDi3E)pPgV;27S&c z<XQ3upK%*HZd|b5t#Vm8I)OmdTwOw_{52v znYbZ{-I=pW#K&9(3z|4PI5vI^)g2idIz5bHPbA7&3$gYM$XHB>%h_4{6Q{=~K!0_f z2hzkZ20&GwMY+bG3k*FsO1Te>prB^fA&DJBjHLqx7GM{m{`=-b;Mh&)39}%Z&djy9 z@w8v%On`ANiZF;1)ZqYFB#bm%JRKqSS|G@A;DW_+jxg{yu(8m6jN%Rmhz*RKB^ruj zZ1F@yV6ZzFA&W7*j)T<1=bWmMk#n&JX;9=Gd3FpxMP;#qb1@47E>C-3&I}lhU(6Lt zB?u6~DtaO3A}$8Vpz+X!5TBF5BDt7u3AB^psGL=#n#FQv@Fr$)0~-Y2S$S{)gQyE_ zpgALW5)9_gIpL%BqUJ(HVv(G882v<##9}%#a*Fx+5%w8aSh?asFf+p7WQtU@cAH2% zbIJw59LhQJ6Den>21og4=5kiBP>8&qGhPlY=FFh=ErjqM*|SVy1imm7R>5Ljv%$+D zFw59yiN{J`z%p=BDjHVfcNQ}h?LtL+(wS{+x$~PsnjC#t)gn~wN{)Wytz8|> zcy|ci9ZCD9sj}6Pb=9mM+cd)W&{e;h*fhfjB)h13we`;KO)EXwbVW69_um=Vw9}JA zSJap?-E|7S{hLk-aOsMCDev7{q3Pge5d{?Mit1L+ZMwIpC)1TNgwF5%!z-A)_H|vTjep=bFHvIl*rgEQ9xo@+Df?Fw@ zJsY+D^;&)-TlhH+NF_E?u4P&LN?8@4cW0Gbr%+&aW8vmxwVMnjQx$$gr zXr(;sE?t>UCX$J)r|My8`CIK@Yk#xjcE?6(+j?nRYI?0dQ`#+*b|;6j-s-nbeeG0g z$69m7+a-9rk|X#wU2{0?reC(AWp#RG7JtTUS;gwkl_M)hvW+`Zu{%rYy1n?Vg~a>H zNVe9OJian?51rnhR_$7={C@2p)~5HK%CwIO?PHm$(?Zqhw3B|>?*8QQw6`PU z>U_}JcW?jw!$SXwOzWu7I*K%&%ea~_I9!#2vz~_OzEp?MyodR+Eq6@olkEh#CWn5!|Yb-7Q9=K5&19DUxL{AQHnh{2X zYMahenJi|c=zrb6=h!ppu8D;S%ltMwyQbds3auw1b z^(guFG+}KX*Yr1Z0R`Z@Y2kD?o%pxm-+_Oy>TjAkZ_=E!B&|tXQkQfjoikQYKU_Cm zTsaGKCS5Zo&_L`r?OcTvQwPSGYsSJAzvf!jlW^7&^2wu-mlR657Sx025%_%o^Hit| zK(nT018So}a`V++GTg9i1@6EH_`8&%syqt%$m?I#-Ee%> ze#6XLIXBuyK_Bf1zivXCu=b%E#Z|zrwp9yj74@J_+7c9in_$|OkU-xu!jU%k0NONC zrTIGNecD`?P3k(O6a+LMA5hAUT`tZg_d~teHc{wBefJG9z#C7S48=B_C^#>VcpcIXk{?x#7&uH_maH)du2-&YRZ9)s1s;MTMjE zv2lwz_cn2rb>{K)MK7qxAxk`1*VihxlEE?|;IsE(uq@FXK7#SS? zn1lD@pTIdnQ}g2<4C9ag623<^c~P54lxz`%;TI7l=fF}YiNfW~(~-GYC{YjDL0SGM z=9^uJ#eJ-hKDGdUOnLBQaN0{DJV2s+3<(mY35sH&D5n%3h!aqHCkqqNubdGGTFy*@ z2|Q%@___ETq@)xi%}HNNh#LPYW%Lde(tMQ!b#SA$${8<)uJLCm+`^;<@nR;j5WCo3 z%-^L@$X#)e41^G#aW-}#XQIcPQ%p4g1S`h>uaxq)C~mPRxuCT7+Z5=MN&r$k#JHp{ zV*h^_yPssH3_AP5Ahi7wGy6oUA#n@vOh(5V)r&k8WBPmzAsW`Vn_U}iYD}6 z>_s&6XCT>wn^x9Nzm8``8438aWew@F-Sq1`nJL>XFn`uvlW{j^8+NS#t=qlg+B6tT z_GDYTH(K|ux9+{ifz8)?L})$o=BbqvtJAB~pFOAq%&#vY&{%R1`(7y^_7n66(TS2h zfJ{HCtXVzq=JM_36;syZ-S9N8dzw>w*2*%TF2U24_H;dHX!=IzP6*jH1Cub606B#7 z=Cj}@mV;}!;cZ>_wx-6{+Q5etygg}ePuAP`*6FXEP7VFR=yyiHee&)}Dn&*9#+)} zRbBUL)~gPss}4PEYhM{tN|SCoa3B2EVZl3`_6`GAEGggc_|`qXRNdOujAy^#*`N08 zXVs<9jHg-fG^ahyAC&=?>L}7_eydY=}9kF#Am%(NSXT-QYILevc zFA(eFpGPi)s$1Vw4 z>7x}-Ue%#vLe*TXzU)qcK`?#?MIA@1~0&sY+n{w{q&`c1_rg15R^_g~N>+dBxi5@AEyKI9F=8oCBurg$jP`9wR16#FD?88317&!_)3oksg5+BF z4-N|b$1|Q2g6Blqb0S;c04cDB#uX=snw5=j&3$cdja!+^RP+lK{hK;_Ny9@Bpa;J7 z^zT2tHXx;k5;nZklH$JIPI7P^D2=x<)tm9QuAD?7bySb?hSb2lhV_=G(=AVba47wS zbL&Ir(nII6RrQ-?+h+sXeM$9O#a}DVczlA#m-hHRDyvD?cC5XSDcdWQ?WM-)%6eNj zyt~)EyG8N4w6|0I5%}B1Vtn??_Wv){omCuge~gCg8wZCwbwBPLYB}LHN=#BcsbE0$ z4H%^eRPiq(Vxp7*R8abprK$!T5X-wu6W|?k6d^wT%Xq{qnr;l#$iHg$GBAuMkdyxb zIm6^A3jqIZdSr9#OXOoo5M?n}3iP-@r7LGw6u)w%^TAjQ{LQ(A3l}9-ubhXWyTs^} zKIBOZAXmgu<^1vUaVSj0_#B0m^FU0&jZ@%Aux78t`Bl8b`ow1XzlEPaK@NSv|8sH* zRs;r3vK8US^!8tp!`23(woK9D@Qidx>K`(Cn5g}n)#1P4-7|0joR-Nu!hc}$H z>(1KM6RGnVXS?8R-*9%XJG(Q^UcuSB;oQIO+@EnC6r2a|e|g<`GVMH>&EpE``lm9k zBZ7-0L4Z zetYAl?(gRCdY2u7{ZHuBwb?O6e{E+>Uu8e4&$`OM2^zkA^7iSBt5tBdrsW^FJG(IR z?LB!1jkDouS$DOh22)ovu5Q8Ao!;(8eel3twW;$W2enJW!VtZq6{V;m>nVTeu1ULh ztQ~=q-PO5b5#2nw*6su;aDn70 zETZCF&Yh<#vV8$C7!&Z}{|d$B{~bAhO%7Yeufvyfg+Wn+;0a4TXNO3I=!NzpTVQEz zg|cm68rr9^Kp=(zp#v^1QrP}I9un2ttde4JZV|xruMr10HfEW<;(@E=#_?On-x#|& zmT}byt~$U?;_tHup2l}7?lz>|Z1(S@B|vmkOF+i8LvZa#Z}+1)!4?3M9kSuFBhCID zX?NcbmOdE#<5&LV6?idO2|7tP?!RA>@f;F7gr4K~&{Mu?)|DI2t3)%MhsDj!`rPb+M z@-d}HYE}6{qlwdwW`?XFn3x)ZVi}Z*!!r<+Dmumvl!)ZwBU2OB|&wrx5*UmjVtdzCt$ zs&JkCiGt6>GGThc8Z}Rv_H3bv!$S)VFdz7~UWL>P-U>NBYA<$;YiJT`HAL+)R5)ot z(=v?ZjNDuR+RH>(=HoGBD$IHU}8S~C|ADOEL@npill5sHi%$P9&AOj0evizb7{5rYV$$d>2G0Wd@j zv`K#U>Z{~C3`ZqN&)>rHw&L?zL9;)gW*S6X2v0dnSN5z{r-ns2~NY1yEwgGZ|*peD1j!6Aw%>iKOe^be^*+sT5d zCFSl>b%+JWlyo8Kr74}JU^Hh`1q-7SUb18BLRaEn|4q}|hTk>Za!|n%hA&;q8GHJ! ziF4PGGx&RQ`f16G09&IUIS#`zN1Tij97)t~Gc@zBe?VnyW@Svy~e) z3v#td=@fox-}2=#eCc>hZ0DBP-39r$q%TVgYX@#T`Z;g*2lXo~i-{{PjPqES%MHZ~ z6KR}&7ybC2(w7o%w`A;*-p5v=oW7T|?;~8!*w@pOGxqoF0aJ1@7|rSXbLIQr{9w^0+;)%=5(~#$HlJf>R-++^o z1x}f&w;dR3GzMMrP_B%L^zz`gPG1ZHl_gbvQG(YQK%6i*ri%z+IIW~pNppw)ALOu% z2&XMnr*smWCW*LiyWyzb|0zxDQ*cQ8+iY)nK+Lo|VOgm=TV8$pOX<=<{8Gc>eQl4> z@wDho4kd>GSTPwo@I?%E(Ro-}A(S@L%j6J=(zOtb=t;M8?l)?44_ODFeJd!-}ptOE6t z-J2YGXmh<`yJ=ggSglLN)`su3W^DTf+y1otV`Q3FcXjCAD|y=Z&-G8k#stZQ2je+Y zkiQVy0^eY{(|_8Et`xaAd43BPF#QE6D1S$PR`)wPX&4(s7!vj%Xkff6!Q!ygrsK<~ zJ29bj0Omv}{6FF$QMb*~t^o7@Cw)ViWB0K^xAvB8rE+yg+O`WkUE8jLp9o^m_9$N_ zcz*5jyQr|RA*bUj3QL@0!x!dlVwh=<9lp~0f4jBp6{{6#+s;%goPr-Kd(K4mhcJ)D z3^corU9QR+JhbblaNl}q0mkid+pQ9u%O*8b3~Ll5=1A!-McuXK(&mAfrX>Sh^V=2- z2cu>WM|<0>HJpextf`y}C0~?H8*38`b;PtM}cD z-5<_W4+_Ik#7tLdLecE*zztn`9<1U7Ma9q5@CG?8q%!^Amt>gm&x2?mv7m6~9 z+NbRALaE-B!uL>PFk+{LA!7W0q5uYv{%7*#DWZ+^_yQax!=M&&+AR!t;r~0mWUDaq zDPQ3|n}?*@#wH`fXY#4OYvWlvv-hmA9~ZN|iuX|>P2>>V#s3Bz=%Qj{P^^N%bdn7M zJ3#W|i%d;JB*y*?MgRBYFr>bod~7HXG%D^dcG5*)8xc(I1fx*bfCWe>Tg>qs5BrZg zp4JT>)*N-L*KK^BKtn^mvl)3R)4d3ee{jRJCCbx{F&ZW++ z?fLeLcVA4mjNIFMZ|{BY{dlH-Sm+-{0Kn#q?U-OY_KDF@Yx#u^PTEw7@xG%2_f;eQ zhQDFIW6zkHH%+x>sBdiJ4Cu}6R1URc(VK~4s&On~(bl6m4y~#wfWThekMq+F* zYj6?**4Ym5JUl=$;mTJGI>1D7lUU-QtqTy{ zw5+>TLO#y%wgK1-c$dVu{+P|m&&bzAP767$a4_-o7;`*;cpYyc$3~8m91`717;0b4 z>1PwB+829f!Rag}6L$e%l_H3RwUWjyzY9?za|h`(Xd^M;OKV$)_fUf5{4M@tv{4fZ zN@j1&(9rNEUFf)y(yY5ATT+%S^=8Y;v!2q;B5RR_gh(vcN1)hJ3R1M*+|8V%IqUJm zNJQw4OQavC7Q{P*-pvn-%hJv|>1V1F_b3Z8f5Y(Bv=gEjc*xxtSOiLt@_T{Fj6eTJP#_z!Y}>YW`qUGM zrfx5&zhu)QoGC~HZN0X{@@|a-4PEP#XnGgqM|7?&7ut%pv@MsmUkg%FjgS0?@!q`u zQnl=l?~#3A2@nyQUE1`tPbs3|Y`OmKsmBlH6XS~BFV^Okz)NjNsv#dg??XG$TDIka zKD18`yimYw;N0(fw4>~?X*bDfsPD*=Ac-wkq0sf?;&E(6hMEV~zW4AiUWFrln^Mv; zz2#bhh<}RK?k$>Uwt7>ywH^U|+H?S!ZZhC>0GGVLdlp+uL&xceg~+4v=Ia7{mwy z`y+NS6ob#m$H-i&bqp3LPmc~K4xeLokAhqmEG??FaAS=35+)O~jGoRf&d292@WJ_u zi?BI+o`<5ZKdc8n7S@4=1QliX{K9$2X9q&pAR|s9$TkQyi}EN|sU$i5?nDW*N$OLr z)!|vRBgzDQmc`gHcx*5+3+uYUNW!q&-`$K`27^6 zVY?{ve0UaVU%?)JfFiYjek6Y|wm3TrATd16AEfx@n)uY<{<$#6!_YG*9HY$Ct;koh zPXNUdyEf}IX<3fBo=gvn8&X6P$(U@{Y1V}*o06Y^& zvF1D@e z@e_l6d-t_F_&&5U>web3tOHrEu;%AUU=`}(R9CCiB%o&jB#1dsJ`e+>i^1x-N~Ken zjZwzpn-7M0{ydWTZ}^Xq$u&@fEOxUuYa`Zz`j@pmlh*#Swu5QyFKZi2Ykyf=Z+gq` zvj>X#f{gGXPw0x z&X#p&3uKPgO!qEq8g;JLPjm(sfzmF^^w-RY>_8vcvxKeM)+nJN}e08hILoN z>Q$lfKzcw@3uVkiIk@lM(Tr=q;M%`wHrgGZ7|m`Z2RxV`h4T8PlXLj$++LaeF_Ikly|1*2p&6<^A60*;D+XQc0#=b+a@A#R$ z;%5Cye50~wy|O1$*(X%?W$gWez5i$S>UDed+s$`&yi;|zPE-oc*t-RL_s{HAHyhtB zy;Jdy?XD|R-6d3a{lI=dmhKtK^b84btA{f7VZlDEq}{n**}29E{-f!xp-knlP&xdQ zg=BrkeonBTW06?hcdom3u6e&-_lI@&&S%;W3hf8)@A(&p|F^?GvH#>O{_UAVXN5y& z)4Rqqt_i_40kfuHi8?Aj(HR}+D>(nvrgIeE^d`BLW2A!o=IPs~A^2|Z5+D*%t25i7 zf9>+Dc#{KZQ#q4yezl=V_wCxlM%Z!$KQut<_ppvJ7mGh~i(oAPUDy_n^Dk{7)G(O! z|G{7-j^I~;Q7jwO0ticn_Y3wZruN3@Z2h&$Y)WAZ+j?zZW`q*Hz^=Sar6u!|NEN?t)9&MczZ%2BjR*tSgFnP#H3WH2 z7z>8kcV<=t3n88?EX_~Lu2gwsj1z5`m}p!>?yiWO~H~rZ3VDp?VF{niHkvmX>41lM94QVvk;vg zP}|6tzJSGh$rcUvI!Krd_E#l^Hz1D#Ypx^ZHaA+KD9Olo{qntFrFE z;UDs*$%-X!Q~5heJk6urWNV#e%$l(v%}#WgA8E2^k4Z@TF%^JCl*&$xBNjUfm;{4? z6`MlkVKa@9C65`{a>r9JzjbfT6RpaUn3|5F&8a?8PSa5_pQ)j-De0^Q@jWd3i<>+~ zGa2ERU>3=Kcfv&N02d|C8Lpmx*9g6sCaoEMJ-DxxO?!N>(j48@9czsO;9+Txn}1SVKv}gOXiqN7E(UnUZdyr2DJSULQ`j zJ~SOpYkv>R>YzI&{;rQgGC=k8k-aDxUiFH5IFV_dPBmq1_BX6Itt+MtQNp@QXg(k` zAI^B55K#IL zw@}@mt!xG8AXJWI+xj-zo?dTzI@2~Nv<+@rVTI)rov8>$`r&+HwAis(!vUoej!{Dl z{Df$OzxdSzLRMhSmm*cMROc#R38$TnX;UNPDc$cM+;9AFziIH0^}{22xIZi%EFJ1G z{;0<^w8#3R{d&05;(j8!3OVZc(7hz!M8v3N@eY!dnunrA6WR7|07;P@l{9N2(i9Nc zZ8zj?zJ$5AUn8~^K)_>cVZ>GBrMwg&$S|nSdo;J%MWDy_8ugF)ev3waTrrRaLWr^{ zLwDb>y*%QQ=@L;;*_GES*KWdvWqeE?gt%`{T-!De-@I=s z02&HfQBy*Nl(tl$>;(Wx-CFs01;j|iYs;4fAVxv2Erav`vV%D>a9l!b#hrjoYG7~& zB;7~~UD>2m@P`B=_?i5{7=M9QLK08I@d*}yF4w{!8o&zHJS~ZZi?((4GN6>%c|L>E zhbM!;{1Ybv{bn*Kg2*_A2TEtKqj?Al%5wo%`;Uf-3e?-uI2!A!b-a-}-EeW=Ot`sr6s zfBop~(bdI_sa-I&r%mnIZ9_jYSzbGld~vmPqo!lMrep1t(0NqoJeH|BF4P>)m`(_$ z6KT_l2NWx7E5j)s8@8HtTTQmSSt#!i${}~=gUp#wHkfVlZ!{fRZ#tA|dP-<|3QMrP z7E3TKyl_4-Tg^Zw;n1RK`DLljY^8iNrfR`doim2YM+s#y5~2SJJV2TZ*IjB>OeEG)A0y|UBTguil;FVyf}DfR0i?~<`)N;$nwAxfC@i=mmzW9 z%HXjKtH~hBfbR@J@Df-^<&>dW0JuOSG!UKw&1k<;S4{efAbHS}L>Ru4!Ha-|wgQt3 z6k_l_Akew<@gQunbNQO7%R^13EsZoR27H5nl4V1QQ&S`)3~5%#;IZ?nsD%b_9uI4g zDc}ZlGLM)LQYT55^8<~%AIsBmBe1-2M|nyehZgpyLK<(sN)@iLVt5p|N^aRb;h{sHKPG(sU4Xn7>A)`QIkz-;nbv zIjo~?=u<}W1sX$5sg~;f4-|`>8`NDS-i&46>bk!Cz*BPD^7X}cTJCm!+ke-8uS96> z&v^C-o;^wP184b4=iNyrTYse^9i8c`P^^j%d#U zQPwc>m;Y!MxIsjW8US3t0`!O(^=+$MF0s^h{uf~FgIZAw%gc0n8+@#HJ7?v8FV zCC;5?2bE#I4jzLY)scxkQ&WWFN>BUf3Ejs6&W(-!24*u3&I84nWcP6l9nDyp(1gFT z<&zyQmcWs3;cElk-H-GGIh&jo80Y^5#o+%IPR@!@N{|;Q=yx&fSr8QgQZNjcdjo-L z5#n6AsD(?sbTUR7m|?xZ{~qG4PA+*NQ1wo2-4i@|}vcnoRW`p?XiUmR`S-wlzF(mfSjmeNkk9Tf`h5m8&R(*z#Ty zg^8!t8xo`v#JNfsC~bM_4NnqDJ)r3brBhPsbdZdA0ccmcP!6Me;Q-RiW#s)H{>5vY z6r~hE9H6^JenXokN=O8I>B`S-O{hYz(+au5N_sW8@9OUrv;YcDFg!*%%owH(UxZAC z%yWk+EtUL5p%{PSd1)vHeKQLYY^roj8}>eIKjPdYq6~FA#v4xfl87Xv*oheNIg#)o zl9Z&m3NyLfl>ddC<2kEv1H9XV@oCP0IfUq*W|0apZ_CsY3y$u=vtT_QP% zW0kDIQs&HBt8@JH&`B~gJTiC+yr?s5*9lAvoyplQ1jB4G!^WZvV4lbZB+whvZY(($ z5)DvEDP{gHV*Ngi;cudN7{lNs6o0*P-CC8lR(<3yxpno8S8l$t8voYIzyI=DDATw{ zXxww}3qs@mjQfD#K9IH@fJm*m=0UMnDE0wiUuj*nykil3eLpxR>>+U8)Y77a7DZ4o_)Rzmeu$ZuNGq>v8@&}+6fBq3e}Un`SFyY_)pZh-L- z!(*lr@bsAi586EIOW!}a$L%pC0LAJ`i_ zzjvS)2_=eqd;EQSaWv%Kz5c%5gWtYGJn{~`~#r1nLj*KhwvY^nvU+W{;)$2cUqdj>?ZAG`cE(7 zQGIlccyJ9)eKbs(Ll&I!Xq>dkXA*O*TpK%xru?-coG-qEtHH4@4sIv6i-k5I)XB9o ze>0A%ap9<%7Q`rG2fq{pyy@UyM0SY<>GWcWbHcU{%_)%pNEHoOY%M__$t+8Q{2WeM zl{gh5X_&EJ7(HD)YZuX_gk{6%A}(`mVoclxNJfb#ScXB8dAkQ>dxRaB`>2tfQ@d4g zp5P3^t@#I(1fd7~bvTbI0uy<(W{|%iMavmxIR3XOBNB2FtpzI^I6{D1*Q{%zs+@%{OCOO8u*@>86KzjR$v#N1$NOEWr9PRAuh*e!lU z{sL|4ll@XZpHb(;S(wg)^=;#m=A((%B&Q7nTqqAF9~sHBOa59-P7ckNpHmaH@ZTk6 zY;n%Q5dkfK-Lm6lM|4@d!`{F#xjanUu!8m86Se-Ud0_oX`)f3x*CmCb4S_qG`hb#4 zJLFhe8aw84tNaFQiQ-S~lta~b?O4ILyX3b8GnuVPd?`{?VsOs<(ts~5%9oa}ekndK zKS4az5}(LFX-60Dh`*43w`BPp-LfU>h2Vy)b66bzV*b6hwBY$zQluWT#8o}x0A*dId)W!SMCYX*IaW#~+A4 z<3GVC{QGc7Ua*9~Md*a!ABU%tgdGA+Ledg0#7kB0RQQEHHOmq%L)#%`y(Xn&mBTxo{S}6&15+RkskboZsSvkyOD9kGh9HnE1(_O!pa~`%Kz)h5~C>qYtXv zQr!23?wQ^leSh@c%bDt9LiI72U$W_3HE+ML?rcpvTh~h0Y97=#+-B{Frcf zEK_q@s5zY+zI77zpzd~TG#^}VKA34fBs3pl$L>6IR?Gd(Y#w*44GL9$#2(Q{iDHHf3Ee*_kfc`JmxIreQ#67+7&WtZCb*>0Phs zz1R9D9Y5KVuIbIxoDpiyuu|+Bq&cntQ=6z^uO3S~8jpJ(vg^s5-I!4wzMn1Td z>G*=s@r88bIDRyA>(cDUPF?u1Y1gn{2U}1lii|%#aJ1|AZsY&Hy9E!T>SA6+lt51n zxs?z~kX-ejHp5e3Z3H+&q2?;n!{kZ32edg-AvgeH{LVA^N;lX#(!*t z=R;S;V6%}9AY*6H@?S-CeiilFGR#pE{inZy*9>J>9q2=cy{OT3Z6~DE!wX-F7c*Fa zH}5HL$0a3Yqqt?VPI8Hq3CRMNG-K9LII)-?BQ1HxNIfFpWumsAN7ShdP=^rwOC16N zv`27)?4`GtW?dy8xxF{8-nzQsZdrG?q>itBIpaPo-~=h#VK$F6#AO?jU@bzdG7{Q? zpce9$FER!K#u#F#w0Ov}0c5rTXe%+*lR`q%8XiYJhC;l`Bpf?@2I=Gp3z%kqffx#@ z16qL=5Q(i2T2Ot*&IeVdB4-0@@3$VCBb_6w#ATYP1t+!=N|%qpIi)((ajs>v`driP zMZC1YKMbMNaz&r>oxFgT$zkU}G)Z=6UUy-vlT*(8$wzfL~l2a7aQg3NQKOLGv{ zut?``pxFXfgFICv2h4z3?}+igMG-x8S~t+T0P&-VJ3y8Mq2Wf4%m|za;ES@p%=!oG ztcCeRO~KklI@{8_qed)UBLCn~9ZcER*xH!Ig^vJ2J-;&X))&9_#no$>@?Aptu8gf+u(hY?mQ@%fbx|_hf)5PtXoe z8!Z1f(6DY z+tQ|rY)u2%fGF1OIgoAHmG$>!tLryQLVEKA_*YMS8w0bLj;qi(7K<4`)#o}Mi}@*v zvc2Q+nRjpMex<`k39CFUX3B*YqD%iNQ9j?&g>;j!TsH}J^P~~nCdP3h(}J+ISUSN@ zEDmvbEI;uNwqY8H@Jx*4*<@KJsW%zbD;6U8z<9_(iww**l3Dn_FBfTI41>^z3h+(j zG?PQHARAw~VlD{T+-N|`j9K3kTceKR{4I?XazeC%wIWC!5d;*QXiSjf(v?+WOq5q& zAEQ4p0s2hSoF;sZOaCb`1h-@1$!t3u?o!27GqzkMSafE_j-vxxYH}se>9~w#Th-2Q z{N3A`$aW5j*Q z%>O5pnQcy`pFdo9RypEE{raP&-Ma1kXEf!5l;XDg!N=5^rCwt0_stQa{i z7y|{Bk&{wwk4x_gH+UB}>taGn3deBpz}vmIsFwM&jWvu_ah5hyhYd z$SBskdIk*w->PKD5^k`v)S#W(*8O~HSP z#Ift{g5)^CNng;fjHdKoJGFA^L2*^O`gErFj8II}{fAaJL28Z%?j})=&$t>$`=9xs zBYk#a(`fKGU~s?#nhK>YO}6}tg8|xqBcwH z^d+2Mkb_fL><%o6AnF4K=WtSAV|w@D`A#z!UTpCgsu^2)OZ6$4346XBWj}lW5C^DFgY(UA} zI0*BQsDFr;#@2QU#l1c3lU&IQBWF)ej+{FlID2j^aB6UL3}zeo1rjS`T(-ASL-9b8 z7V;6lUc?@&V6a{)SAeDxz;`iI{=cHn@1u!g6d79&aYt?qym92_k#tR0#_1QF{(C#t zod?pU11vpQ>RgD=cmPQAHkV(5mF$hEk3a$N?=DX=b(2XtOTKJIVVK@_#o45 zjXkP}`$s`fB_ppdl1T$uLdb&y?jj2~9}{w}Bp4XWmB>lw$jjR&HGZ%`GAf_QN4gDC41qF7O zAeICEvwUgkurVWNSuTw>sy86@0pWR7NwpxTb_-iB)d)6;8;fJfx#U_ZUUDy$!rlSk z$oCYua=C1&>=IE<*tNYCGH$DAks>&Q&8zH5R3^2hd|a&#qZFUhK7GhbQInL4%x>Ct zL>nvOB^U>e_|AM>&RJ+jO*@7F+Zy?k=>4LIceZ@ls|VPP{`aDlh@Z|baZ6va!^#%M zo7$i=%10!DEmvXrNEjC^k|&Ih11eBc{|i9Sz{yj(#XgI*8DNY7z1K zo)7ZjxrG>8^AruY85puyAj?yL+sWcUC`ta+Bx; z%HPRK7rGXlosTe+9STViW;^mV0xUu$K)1}zLc6TfH+tsE9+IWTeV4aIwdi`9RNs9u(FmnjxE- z!h@1$9EMg&t0Lq(J z@?JxOgfMvaU5K>{E0PEVC}ovnF+#hfv zobrV&v{N#vN0rXF2Nd1(U0@PVbvHZUA zIRv9=;()!0O%N6*IyDADuRvajoykI&SC~z$pzqA+mJEiM2RP>S_zcmAWiTg znBh6ht1IDH7_&(RsMU?G0z$-bq4Y0n;j3VKU!>Bb@5SDus)@aqFEepHIML<@4F{=> zL`Bhmus2&O}-86wPf0U1`gzBq3)2b3RftXv!!znF5gw_)dWHGzTMaV$aJFFa*L_ zz0pKS2y+%~spKKG>GlZ|Tvt$YB!UU!XX_uV5@7_ z&|2h0SCOJr@{pC(UnVx#iHV6bmnNrSirT5B8?{* zhamlM!XhB6IX_Pz0#u4n!_Z9lnmC$8y?U4xVvkDtY%8EG6Di572PyNju2NztHIW4} z{j*_?i-Z8ng#6<;`y#{*L#zCh5~wwrwDqLO0l+-bokS9$wQIZO-v^};j6bCa65<*m z_HL&yBI#yHq0>BUgkttETVQ}_W-xx#Ta{{K#!!$zGErk+*+j(MDo$pNSG3zOO` zXm%Jf!iq?SLI!+8($X06L5H3Oo7kXa+r!7YoDD7p!$g(3$jw<`y+9%K1X285OsAga zcqbWCV3=aNsvZnQqzn~}87x3#c$8)ym5o6~G=qUb(tuE#MN7jNFW9FE7A^Rr?`m*UsQO&Hccp!PiU=s!m21` zltE!sE|`bouY$G%aS8z3@LUB%O7|d&!}$D+ahsM<)3o zE2fc##SMm3*^pBbQegw1)4j+$UmsY=1=vTRD=MZy3nT&0s-WiGh`<+>hvG`6eU-ei ztU;bX)6{{>>_1e5hic+W8P{Go}n&vgvZat~}H&JIUFA|;r* z0a{8GS|$kaWK)#~B?e3)SvZzA;1MU1yb5xQr~q*sk#ZHPO+3anaXMWl$Xn=RGus$> zEBTACoMUU{m;_La|96xF5oA@=T%yS{StC-5AoXDAsDxDqVp(V`;2hMyp?E|^W8zCV zd{iF)yaPFjVi`@Latz81Fzi)^G(I$f4E-6(05bFx)DJ3FxVMKgPM_c; zaaVIcEFh<=dNaj+LUCW(*7wj_M$Cs}`mJ`CA6D#6SL|Lpbl;V!7!fK)l1>)cV(!n{ z{Aum)VMTkoqJ6F7{-t!qXr^LRs2EK;A@phY!fNq`ZP&VO*IHG^)+g8~(~q1j8E2c| zY@@9EnO()C;iDqY*Gq5Lr0aTwlHN>FpHS3?Ku0-_jRMPpnZ$ypBx|e8!YURlWI2mA z%N$OyF5vuvoa;k4|J`hR?b!`e!@8+qHJ&lG3Z~YysrA9m-D~~dANa$8cMrdRIJ5JB zu=BugAARlFw7UgSRHZSPhtUwuH{3Vf8C$i;{3WsP=fD19x@rIYs!aLO|F^JfiEX0@ z!!v$v{EA~IArHrHLV(6eowh-QkSc+=Nh#z}MG=n*5rG;Ymx4B>?QsP;7!(N~A{0*a z$f1WEIB?)ln&b+b$`T`=EF`!fBuDZg;sW3Qk7IiiBecIhjpv`&?#}+R-uWMej+sLv zTQIV=k>%?V@g|gU(RNbV)6$YsA;ci+Q_*-K+OHDNss2l@M32}I^1KBYTSD&{A>l@k3wWvsKH@o3HSy$@~>NY$F zD{<}l$fT#VItmP9Xh6%9Q)kT5g?81oh~a)%&Txu_4X0S*{6l9>($(Y?%O1XNEP%LW zmO@f)%Q|3GV0HC_Pw9j5>Z%F3Bg{u=v*=p?Sj*mD zDC-XZTnFA_B_oe8cU&jkMOhsBxnfe#QD{tSJUCq8an|&SH#0V}#?_vl# zaVv9gP=ZldQ)&#+QURb|>9nN*AG;h80 zlFZ9Aty-t_*#0)I=x={h<`B53BsTUjGhmz{W!V*yu==V&Ldd6WG0;dQ5wiGDqQ&B) zArZAjm6Qlud?*pOPe_S?#fK6x`-GH07Y zQc3jMPEumnc2ct($2H-;61H$q*%Om9QhDI>kq%n1yOa^xieMGoYK1M_6yk;Tk|y#S7Ss(ust{Q#qicJoapsm+C5Z&D&y##zWOZ@+Uy`IR~oq1L<-$|cRw?jAj2R;97PVjwCp zrJQhHboP|p8Hsz>1hCXkXQ6~YB=Hj41m2Rp5=t~qm=dqaMO2Crs|ln%67d0>K*TR$ z_vwW8h{Sz$!a%EpL6Z{(*IY6UHR`6Azj?%*N+bV<*P!ms!cGEy>UM7*5vx+?cXmnW z>79k0&;yi3ex=Tw5}m!Oqf?Dfs??xLXQ1(0j;AFiL=(6veR6^(RwML?o)n%R^;9oa zA01PDN!6V~aE@xTS6Q%_v0}M-17#rZDOy@ apY3(;^+@2p%YQW>_5=Q_?e6`!1pW(Tyfg3s literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/__pycache__/test.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/__pycache__/test.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..ff1a405504f983f23c3a90085503d90b464dda0a GIT binary patch literal 64259 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/__pycache__/testapp.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/__pycache__/testapp.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..b338fdd4c1606306b4425674ca102e91f350193f GIT binary patch literal 9551 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 s-JK;*U*35?_B5IXzo?yuWdHyG literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/__pycache__/urls.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/__pycache__/urls.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..03489e6e18f4de3ac948ac05da9a728a98285998 GIT binary patch literal 9040 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/__pycache__/user_agent.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/__pycache__/user_agent.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..b22201c39ba039898ec939a3625a9e61f8392e87 GIT binary patch literal 2331 zcmb7F%}*Og6rZuz_VN`cIK2c4LsYeKKGq@ap|a9Q^ovxgI6&#am-XTqV8eRXnc0Ox zIdI4!ha6fd6_u)9)1veb=%Igvk#ayQRf^P8Z?4FRQ{S60#wO{Z!}6Q=-h90Ge)DGh z%h=d3fmXV{|KM?skiSqlZI%(}@l6o+2`8Keq)BU(k_?$AJoAX~?6V9Z&*9&+T83Lo zq@4R3)iO;-yfBPnFZQEQHM(?o^ETs(ACHJ=p(B(#7le(`eEoVKtIAS^NY}rf_@45F`j`~-%5v;m5_65 zB81gZ9f&oqgR_{ERJv}L3xBSq=ARX;#VP_b^WxH%43Poyzw-|X!3oA0(0w-yq8)9k) zUbvQk(==}qOta9Zc`4#VhN*=cG|$`@s*c6xkSSNbm9B`!#&ak4}X=)wV&cn!;$ z)KVf?)r!J}jGfdfUq?aG6sn@Uko#(5_RfcuRVay#N^5&H5F)N@ig2?M_$y$D*Q4-# zXLh!t{8-#-d5sMSRaH)pwsLloPHQ{0UDpr&*mZZtmm$kJEO6)4#=yTS0_>5aiJ8aN zlaV9)THC&M3?|Zmi_&WakaUWRAizUGBTm)gC zKqAnawnQZIC~-ti0`$jMa9t=M2=7w=5optUI28*6qboi6wryY0ep72Dih=>}NSgM3 z9fW-{cmQXV4<1D~u5v~)SY=o|A0E($&d$?kZ0JlO%X{R{V(Gh2pMH5*oOw~4Y1=dZ zlb|x)x$;RA!YzZ>EMnf^Gy7)dhT_OI56e#JjJuxk76xb7d)d!k+0yq*j$qEC2x9<1 zf|k*GDl?QX$O-7uVb?VejO(VOuKO_Y0#ke`93YPxP-S_XS9IOJ-@N|XltVBsO9*cx zOe0)Hz$!c-nlW9o5`Kw^1`7n00_^qubuwc)yF(DB$Ryjl-?paBcW6x?Ss%T;GPO6~ zwx-N?XiXhiAHTu&*~^LP^J_ovSeab8Lk7X7x%;$3Uc)@iO`y3Sz;+dF{gBV#l>Y#e zHfFp~&LYjL3B06utFfjH6=jt0#%X#^?7QYD?#UZq!;7cB0O({XrAOpyd+_VzZ%}am OI{bsSS8o{5uKoq-omyfYS}? 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≻#$U3QdLgj(b1@UE|tEX;$h(mby=SozievO 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 X(M5a|3S2K-3Vh0MK7Y)6Ue^B)s7zPu literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/__pycache__/wsgi.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/__pycache__/wsgi.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..cac9b48591c7dcd04e8c754f96f9455dc5e446a2 GIT binary patch literal 27647 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/_internal.py b/venv/lib/python3.11/site-packages/werkzeug/_internal.py new file mode 100755 index 0000000..75e4335 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/_internal.py @@ -0,0 +1,211 @@ +from __future__ import annotations + +import logging +import re +import sys +import typing as t +from datetime import datetime +from datetime import timezone + +if t.TYPE_CHECKING: + from _typeshed.wsgi import WSGIEnvironment + + from .wrappers.request import Request + +_logger: logging.Logger | None = None + + +class _Missing: + def __repr__(self) -> str: + return "no value" + + def __reduce__(self) -> str: + return "_missing" + + +_missing = _Missing() + + +def _wsgi_decoding_dance(s: str) -> str: + return s.encode("latin1").decode(errors="replace") + + +def _wsgi_encoding_dance(s: str) -> str: + return s.encode().decode("latin1") + + +def _get_environ(obj: WSGIEnvironment | Request) -> WSGIEnvironment: + env = getattr(obj, "environ", obj) + assert isinstance(env, dict), ( + f"{type(obj).__name__!r} is not a WSGI environment (has to be a dict)" + ) + return env + + +def _has_level_handler(logger: logging.Logger) -> bool: + """Check if there is a handler in the logging chain that will handle + the given logger's effective level. + """ + level = logger.getEffectiveLevel() + current = logger + + while current: + if any(handler.level <= level for handler in current.handlers): + return True + + if not current.propagate: + break + + current = current.parent # type: ignore + + return False + + +class _ColorStreamHandler(logging.StreamHandler): # type: ignore[type-arg] + """On Windows, wrap stream with Colorama for ANSI style support.""" + + def __init__(self) -> None: + try: + import colorama + except ImportError: + stream = None + else: + stream = colorama.AnsiToWin32(sys.stderr) + + super().__init__(stream) + + +def _log(type: str, message: str, *args: t.Any, **kwargs: t.Any) -> None: + """Log a message to the 'werkzeug' logger. + + The logger is created the first time it is needed. If there is no + level set, it is set to :data:`logging.INFO`. If there is no handler + for the logger's effective level, a :class:`logging.StreamHandler` + is added. + """ + global _logger + + if _logger is None: + _logger = logging.getLogger("werkzeug") + + if _logger.level == logging.NOTSET: + _logger.setLevel(logging.INFO) + + if not _has_level_handler(_logger): + _logger.addHandler(_ColorStreamHandler()) + + getattr(_logger, type)(message.rstrip(), *args, **kwargs) + + +@t.overload +def _dt_as_utc(dt: None) -> None: ... + + +@t.overload +def _dt_as_utc(dt: datetime) -> datetime: ... + + +def _dt_as_utc(dt: datetime | None) -> datetime | None: + if dt is None: + return dt + + if dt.tzinfo is None: + return dt.replace(tzinfo=timezone.utc) + elif dt.tzinfo != timezone.utc: + return dt.astimezone(timezone.utc) + + return dt + + +_TAccessorValue = t.TypeVar("_TAccessorValue") + + +class _DictAccessorProperty(t.Generic[_TAccessorValue]): + """Baseclass for `environ_property` and `header_property`.""" + + read_only = False + + def __init__( + self, + name: str, + default: _TAccessorValue | None = None, + load_func: t.Callable[[str], _TAccessorValue] | None = None, + dump_func: t.Callable[[_TAccessorValue], str] | None = None, + read_only: bool | None = None, + doc: str | None = None, + ) -> None: + self.name = name + self.default = default + self.load_func = load_func + self.dump_func = dump_func + if read_only is not None: + self.read_only = read_only + self.__doc__ = doc + + def lookup(self, instance: t.Any) -> t.MutableMapping[str, t.Any]: + raise NotImplementedError + + @t.overload + def __get__( + self, instance: None, owner: type + ) -> _DictAccessorProperty[_TAccessorValue]: ... + + @t.overload + def __get__(self, instance: t.Any, owner: type) -> _TAccessorValue: ... + + def __get__( + self, instance: t.Any | None, owner: type + ) -> _TAccessorValue | _DictAccessorProperty[_TAccessorValue]: + if instance is None: + return self + + storage = self.lookup(instance) + + if self.name not in storage: + return self.default # type: ignore + + value = storage[self.name] + + if self.load_func is not None: + try: + return self.load_func(value) + except (ValueError, TypeError): + return self.default # type: ignore + + return value # type: ignore + + def __set__(self, instance: t.Any, value: _TAccessorValue) -> None: + if self.read_only: + raise AttributeError("read only property") + + if self.dump_func is not None: + self.lookup(instance)[self.name] = self.dump_func(value) + else: + self.lookup(instance)[self.name] = value + + def __delete__(self, instance: t.Any) -> None: + if self.read_only: + raise AttributeError("read only property") + + self.lookup(instance).pop(self.name, None) + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.name}>" + + +_plain_int_re = re.compile(r"-?\d+", re.ASCII) + + +def _plain_int(value: str) -> int: + """Parse an int only if it is only ASCII digits and ``-``. + + This disallows ``+``, ``_``, and non-ASCII digits, which are accepted by ``int`` but + are not allowed in HTTP header values. + + Any leading or trailing whitespace is stripped + """ + value = value.strip() + if _plain_int_re.fullmatch(value) is None: + raise ValueError + + return int(value) diff --git a/venv/lib/python3.11/site-packages/werkzeug/_reloader.py b/venv/lib/python3.11/site-packages/werkzeug/_reloader.py new file mode 100755 index 0000000..5eb64bc --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/_reloader.py @@ -0,0 +1,465 @@ +from __future__ import annotations + +import fnmatch +import os +import subprocess +import sys +import threading +import time +import typing as t +from itertools import chain +from pathlib import PurePath + +from ._internal import _log + +# The various system prefixes where imports are found. Base values are +# different when running in a virtualenv. All reloaders will ignore the +# base paths (usually the system installation). The stat reloader won't +# scan the virtualenv paths, it will only include modules that are +# already imported. +_ignore_always = tuple({sys.base_prefix, sys.base_exec_prefix}) +prefix = {*_ignore_always, sys.prefix, sys.exec_prefix} + +if hasattr(sys, "real_prefix"): + # virtualenv < 20 + prefix.add(sys.real_prefix) + +_stat_ignore_scan = tuple(prefix) +del prefix +# Ignore __pycache__ since a change there will always have a change to +# the source file (or initial pyc file) as well. Ignore common version control +# internals. Ignore common tool caches. +_ignore_common_dirs = { + "__pycache__", + ".git", + ".hg", + ".tox", + ".nox", + ".pytest_cache", + ".mypy_cache", +} + + +def _iter_module_paths() -> t.Iterator[str]: + """Find the filesystem paths associated with imported modules.""" + # List is in case the value is modified by the app while updating. + for module in list(sys.modules.values()): + name = getattr(module, "__file__", None) + + if name is None or name.startswith(_ignore_always): + continue + + while not os.path.isfile(name): + # Zip file, find the base file without the module path. + old = name + name = os.path.dirname(name) + + if name == old: # skip if it was all directories somehow + break + else: + yield name + + +def _remove_by_pattern(paths: set[str], exclude_patterns: set[str]) -> None: + for pattern in exclude_patterns: + paths.difference_update(fnmatch.filter(paths, pattern)) + + +def _find_stat_paths( + extra_files: set[str], exclude_patterns: set[str] +) -> t.Iterable[str]: + """Find paths for the stat reloader to watch. Returns imported + module files, Python files under non-system paths. Extra files and + Python files under extra directories can also be scanned. + + System paths have to be excluded for efficiency. Non-system paths, + such as a project root or ``sys.path.insert``, should be the paths + of interest to the user anyway. + """ + paths = set() + + for path in chain(list(sys.path), extra_files): + path = os.path.abspath(path) + + if os.path.isfile(path): + # zip file on sys.path, or extra file + paths.add(path) + continue + + parent_has_py = {os.path.dirname(path): True} + + for root, dirs, files in os.walk(path): + if ( + root.startswith(_stat_ignore_scan) + or os.path.basename(root) in _ignore_common_dirs + ): + dirs.clear() + continue + + has_py = False + + for name in files: + if name.endswith((".py", ".pyc")): + has_py = True + paths.add(os.path.join(root, name)) + + # Optimization: stop scanning a directory if neither it nor + # its parent contained Python files. + if not (has_py or parent_has_py[os.path.dirname(root)]): + dirs.clear() + continue + + parent_has_py[root] = has_py + + paths.update(_iter_module_paths()) + _remove_by_pattern(paths, exclude_patterns) + return paths + + +def _find_watchdog_paths( + extra_files: set[str], exclude_patterns: set[str] +) -> t.Iterable[str]: + """Find paths for the stat reloader to watch. Looks at the same + sources as the stat reloader, but watches everything under + directories instead of individual files. + """ + dirs = set() + + for name in chain(list(sys.path), extra_files): + name = os.path.abspath(name) + + if os.path.isfile(name): + name = os.path.dirname(name) + + dirs.add(name) + + for name in _iter_module_paths(): + dirs.add(os.path.dirname(name)) + + _remove_by_pattern(dirs, exclude_patterns) + return _find_common_roots(dirs) + + +def _find_common_roots(paths: t.Iterable[str]) -> t.Iterable[str]: + root: dict[str, dict[str, t.Any]] = {} + + for chunks in sorted((PurePath(x).parts for x in paths), key=len, reverse=True): + node = root + + for chunk in chunks: + node = node.setdefault(chunk, {}) + + node.clear() + + rv = set() + + def _walk(node: t.Mapping[str, dict[str, t.Any]], path: tuple[str, ...]) -> None: + for prefix, child in node.items(): + _walk(child, path + (prefix,)) + + # If there are no more nodes, and a path has been accumulated, add it. + # Path may be empty if the "" entry is in sys.path. + if not node and path: + rv.add(os.path.join(*path)) + + _walk(root, ()) + return rv + + +def _get_args_for_reloading() -> list[str]: + """Determine how the script was executed, and return the args needed + to execute it again in a new process. + """ + if sys.version_info >= (3, 10): + # sys.orig_argv, added in Python 3.10, contains the exact args used to invoke + # Python. Still replace argv[0] with sys.executable for accuracy. + return [sys.executable, *sys.orig_argv[1:]] + + rv = [sys.executable] + py_script = sys.argv[0] + args = sys.argv[1:] + # Need to look at main module to determine how it was executed. + __main__ = sys.modules["__main__"] + + # The value of __package__ indicates how Python was called. It may + # not exist if a setuptools script is installed as an egg. It may be + # set incorrectly for entry points created with pip on Windows. + if getattr(__main__, "__package__", None) is None or ( + os.name == "nt" + and __main__.__package__ == "" + and not os.path.exists(py_script) + and os.path.exists(f"{py_script}.exe") + ): + # Executed a file, like "python app.py". + py_script = os.path.abspath(py_script) + + if os.name == "nt": + # Windows entry points have ".exe" extension and should be + # called directly. + if not os.path.exists(py_script) and os.path.exists(f"{py_script}.exe"): + py_script += ".exe" + + if ( + os.path.splitext(sys.executable)[1] == ".exe" + and os.path.splitext(py_script)[1] == ".exe" + ): + rv.pop(0) + + rv.append(py_script) + else: + # Executed a module, like "python -m werkzeug.serving". + if os.path.isfile(py_script): + # Rewritten by Python from "-m script" to "/path/to/script.py". + py_module = t.cast(str, __main__.__package__) + name = os.path.splitext(os.path.basename(py_script))[0] + + if name != "__main__": + py_module += f".{name}" + else: + # Incorrectly rewritten by pydevd debugger from "-m script" to "script". + py_module = py_script + + rv.extend(("-m", py_module.lstrip("."))) + + rv.extend(args) + return rv + + +class ReloaderLoop: + name = "" + + def __init__( + self, + extra_files: t.Iterable[str] | None = None, + exclude_patterns: t.Iterable[str] | None = None, + interval: int | float = 1, + ) -> None: + self.extra_files: set[str] = {os.path.abspath(x) for x in extra_files or ()} + self.exclude_patterns: set[str] = set(exclude_patterns or ()) + self.interval = interval + + def __enter__(self) -> ReloaderLoop: + """Do any setup, then run one step of the watch to populate the + initial filesystem state. + """ + self.run_step() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): # type: ignore + """Clean up any resources associated with the reloader.""" + pass + + def run(self) -> None: + """Continually run the watch step, sleeping for the configured + interval after each step. + """ + while True: + self.run_step() + time.sleep(self.interval) + + def run_step(self) -> None: + """Run one step for watching the filesystem. Called once to set + up initial state, then repeatedly to update it. + """ + pass + + def restart_with_reloader(self) -> int: + """Spawn a new Python interpreter with the same arguments as the + current one, but running the reloader thread. + """ + while True: + _log("info", f" * Restarting with {self.name}") + args = _get_args_for_reloading() + new_environ = os.environ.copy() + new_environ["WERKZEUG_RUN_MAIN"] = "true" + exit_code = subprocess.call(args, env=new_environ, close_fds=False) + + if exit_code != 3: + return exit_code + + def trigger_reload(self, filename: str) -> None: + self.log_reload(filename) + sys.exit(3) + + def log_reload(self, filename: str | bytes) -> None: + filename = os.path.abspath(filename) + _log("info", f" * Detected change in {filename!r}, reloading") + + +class StatReloaderLoop(ReloaderLoop): + name = "stat" + + def __enter__(self) -> ReloaderLoop: + self.mtimes: dict[str, float] = {} + return super().__enter__() + + def run_step(self) -> None: + for name in _find_stat_paths(self.extra_files, self.exclude_patterns): + try: + mtime = os.stat(name).st_mtime + except OSError: + continue + + old_time = self.mtimes.get(name) + + if old_time is None: + self.mtimes[name] = mtime + continue + + if mtime > old_time: + self.trigger_reload(name) + + +class WatchdogReloaderLoop(ReloaderLoop): + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + from watchdog.events import EVENT_TYPE_CLOSED + from watchdog.events import EVENT_TYPE_CREATED + from watchdog.events import EVENT_TYPE_DELETED + from watchdog.events import EVENT_TYPE_MODIFIED + from watchdog.events import EVENT_TYPE_MOVED + from watchdog.events import FileModifiedEvent + from watchdog.events import PatternMatchingEventHandler + from watchdog.observers import Observer + + super().__init__(*args, **kwargs) + trigger_reload = self.trigger_reload + + class EventHandler(PatternMatchingEventHandler): + def on_any_event(self, event: FileModifiedEvent) -> None: # type: ignore[override] + if event.event_type not in { + EVENT_TYPE_CLOSED, + EVENT_TYPE_CREATED, + EVENT_TYPE_DELETED, + EVENT_TYPE_MODIFIED, + EVENT_TYPE_MOVED, + }: + # skip events that don't involve changes to the file + return + + trigger_reload(event.src_path) + + reloader_name = Observer.__name__.lower() # type: ignore[attr-defined] + + if reloader_name.endswith("observer"): + reloader_name = reloader_name[:-8] + + self.name = f"watchdog ({reloader_name})" + self.observer = Observer() + extra_patterns = (p for p in self.extra_files if not os.path.isdir(p)) + self.event_handler = EventHandler( + patterns=["*.py", "*.pyc", "*.zip", *extra_patterns], + ignore_patterns=[ + *[f"*/{d}/*" for d in _ignore_common_dirs], + *self.exclude_patterns, + ], + ) + self.should_reload = threading.Event() + + def trigger_reload(self, filename: str | bytes) -> None: + # This is called inside an event handler, which means throwing + # SystemExit has no effect. + # https://github.com/gorakhargosh/watchdog/issues/294 + self.should_reload.set() + self.log_reload(filename) + + def __enter__(self) -> ReloaderLoop: + self.watches: dict[str, t.Any] = {} + self.observer.start() + return super().__enter__() + + def __exit__(self, exc_type, exc_val, exc_tb): # type: ignore + self.observer.stop() + self.observer.join() + + def run(self) -> None: + while not self.should_reload.wait(timeout=self.interval): + self.run_step() + + sys.exit(3) + + def run_step(self) -> None: + to_delete = set(self.watches) + + for path in _find_watchdog_paths(self.extra_files, self.exclude_patterns): + if path not in self.watches: + try: + self.watches[path] = self.observer.schedule( + self.event_handler, path, recursive=True + ) + except OSError: + # Clear this path from list of watches. We don't want + # the same error message showing again in the next + # iteration. + self.watches[path] = None + + to_delete.discard(path) + + for path in to_delete: + watch = self.watches.pop(path, None) + + if watch is not None: + self.observer.unschedule(watch) + + +reloader_loops: dict[str, type[ReloaderLoop]] = { + "stat": StatReloaderLoop, + "watchdog": WatchdogReloaderLoop, +} + +try: + __import__("watchdog.observers") +except ImportError: + reloader_loops["auto"] = reloader_loops["stat"] +else: + reloader_loops["auto"] = reloader_loops["watchdog"] + + +def ensure_echo_on() -> None: + """Ensure that echo mode is enabled. Some tools such as PDB disable + it which causes usability issues after a reload.""" + # tcgetattr will fail if stdin isn't a tty + if sys.stdin is None or not sys.stdin.isatty(): + return + + try: + import termios + except ImportError: + return + + attributes = termios.tcgetattr(sys.stdin) + + if not attributes[3] & termios.ECHO: + attributes[3] |= termios.ECHO + termios.tcsetattr(sys.stdin, termios.TCSANOW, attributes) + + +def run_with_reloader( + main_func: t.Callable[[], None], + extra_files: t.Iterable[str] | None = None, + exclude_patterns: t.Iterable[str] | None = None, + interval: int | float = 1, + reloader_type: str = "auto", +) -> None: + """Run the given function in an independent Python interpreter.""" + import signal + + signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) + reloader = reloader_loops[reloader_type]( + extra_files=extra_files, exclude_patterns=exclude_patterns, interval=interval + ) + + try: + if os.environ.get("WERKZEUG_RUN_MAIN") == "true": + ensure_echo_on() + t = threading.Thread(target=main_func, args=()) + t.daemon = True + + # Enter the reloader to set up initial state, then start + # the app thread and reloader update loop. + with reloader: + t.start() + reloader.run() + else: + sys.exit(reloader.restart_with_reloader()) + except KeyboardInterrupt: + pass diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/__init__.py b/venv/lib/python3.11/site-packages/werkzeug/datastructures/__init__.py new file mode 100755 index 0000000..6582de0 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/datastructures/__init__.py @@ -0,0 +1,64 @@ +from __future__ import annotations + +import typing as t + +from .accept import Accept as Accept +from .accept import CharsetAccept as CharsetAccept +from .accept import LanguageAccept as LanguageAccept +from .accept import MIMEAccept as MIMEAccept +from .auth import Authorization as Authorization +from .auth import WWWAuthenticate as WWWAuthenticate +from .cache_control import RequestCacheControl as RequestCacheControl +from .cache_control import ResponseCacheControl as ResponseCacheControl +from .csp import ContentSecurityPolicy as ContentSecurityPolicy +from .etag import ETags as ETags +from .file_storage import FileMultiDict as FileMultiDict +from .file_storage import FileStorage as FileStorage +from .headers import EnvironHeaders as EnvironHeaders +from .headers import Headers as Headers +from .mixins import ImmutableDictMixin as ImmutableDictMixin +from .mixins import ImmutableHeadersMixin as ImmutableHeadersMixin +from .mixins import ImmutableListMixin as ImmutableListMixin +from .mixins import ImmutableMultiDictMixin as ImmutableMultiDictMixin +from .mixins import UpdateDictMixin as UpdateDictMixin +from .range import ContentRange as ContentRange +from .range import IfRange as IfRange +from .range import Range as Range +from .structures import CallbackDict as CallbackDict +from .structures import CombinedMultiDict as CombinedMultiDict +from .structures import HeaderSet as HeaderSet +from .structures import ImmutableDict as ImmutableDict +from .structures import ImmutableList as ImmutableList +from .structures import ImmutableMultiDict as ImmutableMultiDict +from .structures import ImmutableTypeConversionDict as ImmutableTypeConversionDict +from .structures import iter_multi_items as iter_multi_items +from .structures import MultiDict as MultiDict +from .structures import TypeConversionDict as TypeConversionDict + + +def __getattr__(name: str) -> t.Any: + import warnings + + if name == "OrderedMultiDict": + from .structures import _OrderedMultiDict + + warnings.warn( + "'OrderedMultiDict' is deprecated and will be removed in Werkzeug" + " 3.2. Use 'MultiDict' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _OrderedMultiDict + + if name == "ImmutableOrderedMultiDict": + from .structures import _ImmutableOrderedMultiDict + + warnings.warn( + "'OrderedMultiDict' is deprecated and will be removed in Werkzeug" + " 3.2. Use 'ImmutableMultiDict' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _ImmutableOrderedMultiDict + + raise AttributeError(name) diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..814853d5cefb7c5218759789067ebdcb7a4bd913 GIT binary patch literal 3064 zcmb`J&rjS&6vxNx?_aR|{=Ik!1eOFgB+U<1QCdn!8!03eBt@D-EwdgL7u&lXdr3iw zlvX|U(qnq8dPr5Jm;NWyCYRG|)m5Os@aEuZ*#qUxFA5<~i9rm-BDO*m1-Zp)p%EiuM6IYDqcQMBj2Lj7#wEvr z6Eq^#j&&ROkt2knsDYIWLO zv`caua5wFioVR-HUfL_U9k`G7N$#-v?EyL2%yMc%4u;d=#0xd}H zwMJ}}s*?MFi?k@YA9$3GN*=Jz*kg1|@*way9hW==e3qV-JPbTRCnOhuC+Vc*5#SOn zNmhZU=#=Cl@Hu);@+k0mdS3Dw;AuJyTrwuVkJ1^VWto(wUgLt5lpv!!PR-Ljv*x&W zU&G>|Gd@?Tu(}77n_t(t%eSJv5l&GC560(aLEbL&tBJLd1k5NN*4Dh+OWTc6h~v$6#Z zVhi{6stb_2Wm;^pVR`0Fvw~%3(6Q{*I1~!Etqabk$!pGMOg9+E7KuabxNX}FPhYhd zHeNKpF&zl#ZhH444;~zb-!a{0cyBYjS;j$wwg+_s#(gw-c7H@mFqc?g;`Z7B#ttAm zuUpotUfI|mQu}<(UNs$NG&_KXslDQsnOv)84f{=UO$U|=;fJ*!O)}UFyT4V(_1J_t zg8i_cC2x9+Yc|fV2595-rH;1mIN2<|PlkM*R20Gl+ZMjD?o4 z=OJtINY<34*s;fv_he1~XV%Cv@p6YfKO)aybkCb3{7xxl?s6PRkiW-a=N(x*9tAhd zWV?3!$@Z5M$6XVu>8b{+bB1q_q3VvIJ~S;$U1cg~c5M@UrlYPfzOl_3RrS)$#ToU1 z%hZYHIzbA@^vx5HS7C7ED1P*BLe7arzA8T#)a!S#qM38)_ zbH{Y5E>_MP71&hF<>zpAqxdN3xVb+=uyMI zg!s|UC-?AgCy^0t#TSX9NEH3#tO#o-ng22OLvFW4$xXk?7X046-4sdn{7qu1^gn2J zrOA?fQ6yEFYwAT}N+hQImWtu=7HV4V0?261nz4oev*UJ%#iw}#_cz~g8VXz+y&qB?vycna_FUymSH z!7qkZ+52Sh3_i%>gGj}#b9@tnC`@RTw<2cO;3J^9dtU+GhQWFCC)W2q1H2tw9q5YN zc-$SI3Cr!4;}qz2GGo+8ALOLW*AKY%?KJ5O%cr~nlos|(BM-4 zM)+0a%V6FnuiG`FVX+&00dDd9aKDAObT^_XicdyGSUaRc9B7A(iLiWfQH14_4@6i# zIWNNU$psPCX{{Cn3CSm)im-h0kqFBtstC&`*F;#S^>ta0kbE*B!t%*=5tdIr5n-Jc zb4!qrd~!vE<&&}q%O~R^ET0rbSf`ERh9DvNWJZK_TJI<8`B;#Ue6l3MI&GvU`wAt2 QoV)RUWn`DU!^kcAFE9Uc$^ZZW literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..4adbc621f66dae2ebf7c4f2dd84fb2add68e1227 GIT binary patch literal 18309 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 JYm_tA`hPj{u~Gm4 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..2177ecee964ddbb96cb6b57f38c4073302234d99 GIT binary patch literal 15711 zcmeHOZ)_V^a^K}YQ6eSMA|=_fBGIxWi-|+o@t?$w?Obd*PVN%fXD63fmw=?WE1Nb& z%DXE&=E-+XVYG7UB8uy)g*3HZMFCP^VPR1ND%wMF1qvwD z6)@bQ=x^TJUG7qpqx5p~Lf+XgI32{^uDecO+MqTXb9(A*)XTm$`Gs+r9{gPYqDNRjGCeO-gNmlT>VKS|#a#G4> zv}$JSg{guj8}G@B>D-k33z0Vu9!ckNW9iKKVYJB5hs?{(6XHq{iQ9rKjEa%~LW!g9 zMxjxV9+SGIz%}ovN9vK9uX#qjc(&l_lVZ{qX#+|cq+Th49KWP1igh zqsLFo?+Bv-sbA_uc@WRdcsAqNg=Y&J{(#>6{FHXKpk#||=;^-%W+&xIMONj!rpC0h zatwn;sxTf)=VPgqqk1Y8Q{)R%vZ}>6krGW!F{3=c%Nl8f!2V1wt*ZFwkz5wI zS23HAF+fS(2IL8kREnX9QKeBLD>1ErZ{;P&=kqbvr!hFyKx9~+M8$0WOss$kAPw~w zQ!{7f33+==20G}@7`xTKnu-;yT&-|k&ZmHRE{9<-L};9`SJ7E2bvUhNGoUH&aT~}_ z)rlCAoGC~cayAca>C34UNTB2~1k_Ih`&4QY!@pEeq}l^mwVr`x}h;8kcEt~0*05)WMq|d0&;-?ecwLI_L0)k*d9yg3ZN029{!EQ8Ce@- z--%n_VXxF3pA>_{iA3z8tf*LpnX~Eq8ClxDKlW5&7yBM@7AF)ZV~SYQm_#B0Fz(-B>RsKAPBI{cN|Pj~6H}dK^l3rBU(BW6H{7xEGNgPp9HHoqBjyb zliKA;S$C_NqI;yYmVVepRlbRLj6_pn)3K34UVh7X>Rv|AhfUQY-N)Cc?xBhqL&h_y zLZT5uLR>k3#BE_(oEDOnxM>uoT~}RM;fib8g?y5O>_Wa9@0MJagj2#@aU|~6Jq*>R zDy@|;TEsoNN0oEqN)Rtf3jxYj2@zt0hnb;o6mnA&vO1(<>a*(koliY8G!6-HerWRY zcutnJAu#&Ip77{J*UNw zk^hNRc1lp%kbT#sbl{=8vHp)8fHEH`NZ*DmsF?E7ZeP zVKEfB@tu32-i1)_{O)pSuo4<9`3IHFDEzeyL+M7(N(`V5;+WBiH4x`TFHqxN0)(LM zh7{8qBzZhNmD4grY4alHVpM+yiS+0HD&xz`Ts?N)KL& z8=T|@v0p;=N+*Dm%)9P1ltVizp&cdv4n7XgSfP+}keeoz;U7hUugognT*QjwJRvfk zFxi2yb5J#yOk$VN(%6|n)=npa_Oh4Ja)op;!nAc(x>YEJ`b++Pj-D5Lhpgy6F0veW zT6F$^;i*|%OMI-^)`63@YJ)~Cjq4QZp0j2TE5u5lXFU{pP;S*nxs^7`Ln!x}y`kJn z^Kye)ai89lRZT5L37~=AGE&f9nwZRC*UxLRq_iWGi6;kPcOch6SYI+JUjRv?wIrq7 z<5c?uz*XUXXwzK(M~{_5LzU3bvLH70-j8f41-C5wgyz;8U!CjwFuoAnx-7VwcQ1z9 zZUyGF4~q-o__7-rOX0RkI5t20!{ZC#UCRxg#wKGnm|ps@MUxY!AXW{*@0b-IKF+x3 zUojuVJu1{uqVhZnR$r3KDRJIJ+bgas?kk>YSA7}fR7|l$c;;<$UHw8$J@hBJ`J5={ z8wIVQTC+N*(;g=_^VV!uYYT$2=XraPm6mFHV&n2+T)zBcTLq2wBjY+}VWQFAWL)E} zK0)z_!fDt+r-Vzw+wRlCCD8>LjvdiE?UTG8u96v&5431Bd$2zxpL1Ln1*MbsrICC$ zuG-N{;>VbcPplPjO5klI5jAT{;tj>0oglNOzIt!yQ!+SMqABM-%x?j0iy z`k}Z#?$Z6Hf~@;Z&G?~sFdonw(Xo~#Lr?eS3eW*`FZTZIr0zp&dGBt$acu8yu5jx< zo7KHX6{Vo)!PoLxQpx$7PhmYMw1(mhx;v9o6;cayA6MmdF{yi?S!l{Z zK~=}cS?&G=@;+1-m9I&OE}?0UcZR`-k#Tlag#cZ=7jZ%og4mI51QUtb7xl>%MM zE_ZX+{lP?K@R=V+%Y%n1gNN=79$gqbS{^)B89a7x@aqeMUoV|}tvvXR%HTK3;r?0w z+?KgF=H7U4KiYL`Jn zhPxbjxe|G~6nuFp&@$V1`-z)R%w@{0y_MG9Qh@HININz7`<@-2M$0{WD?NLE>?ubM zRw4&W!Gq{89GOvP_s;E}kCsCNmC!)RKcKdPJb&GM@Nhu*X`uaZzx$_sB4Eb0#|R`F zunNSLaW3g>+La_4lI9i7T0Mer&XQC1edc@cZrJyg?+M>`uSf1USM)sb%&JRrJ8NAL zCC{{oFTiJkZ(5S)ovnDYTF?8fq%Gl;dcfLe?}4ypeOfKn+lv;lnh;J+=9?39-an*F z_JmT9rZVf1Gm7beAX8gAOZG1m^v@9mJ1k2{c^0TBWS;0=wrGn!W?9EZl>Nwz2l$SC zgeuTlhc%3qTwR*F&&WAS{g7;jg_PBDvO=8W*yL%EJ2v@7tza(U4(C2^6}(Mt{u}@c zxJd|xZ|s|ESP1l#0zLPmot0=G*7B``rSMa@=Xd|mNZkwXTL|wfho7y4pZ(13YHRtW z0Prs@(RasZU%y_sQCRjuJD@ezH+QrY*-CeCD-4kv`%8f>i|w7avbPI23+480mG*6= z$X?uc`hN5{PnCjums;Cz#cvPY94fbNt+Z|}g@$o|bpF%6KN~6!9Igx;<~b$*FjFWT z>xoteTThQ8L3;B%o~th>A6B)|*HHDY$aH0umZ>2Q86ZM zp?C-u0O^KgN0Nz`Oe!>1W_f_Kicn(4T0Y-!OHC8l0scKV7p=q_8H6?aHE-AvwP6GB^S~<2J$mD`a!fMbL;vpr4 zhu)M-PC#trKs+6m$%UzOj+0Uce@KN4NJqw!vV}k&0kW$UB9=nNvmRh>LGA-oMkt%j z0qvqn8sIKB3%N~3>OIr(X+WwUjBwTZTXuDL{mTM@XN1I4i(Rqh#&$34_&Q*R=#66| zbO4|8m6alocFolQ1p`!I2R^^IX<2ZBsNmbM?CSDvTNX_4nHzc6zR7bBw0Mt-%fc!c z6TLC&-wyE2gOpbnFkWJ$$$&K0Wo(k-$|z{{J6Kw)JlT&+Prxxxp6u;X5PoN`?311( zpSDvRj5f#(=dA5ZN=TtPHGI+#eBZS#8|6k@%N^tuuj#uH-`puhSLHX!O}3U#No}iZ zNV}vCU>%TlOB?YFN_)u14lnv%=1p&ro}LlLMR?SMqao=T=`oarrF~Klo*Sh7QZJsZ z(zDV5sSh-W$WiH_G_dL`ZJ@|D)NIFd5YG-g<9KeI5#AO@H{qD#kRE#d_18%d!sN_m z(r{7!18Bddrylw^>OX030LLpd&`BI`$WCYdDH+al%VE!JBraXLluX+`mm*K9-Cqy? zXf6x4JD#R>O#W(e+p~?BDfVh?9JT@5!A-|LcbuD;Bx0`=r0n=*Yoj;&;x2M5eH2;_ zXS;=9XairGOI|%&n950?>y+nsas2>9Hf;>ct8JPZ$Y2HzoiH%Eq#0G1qt!tDf9;P4 z(K!`YA2qO#7*2S2#Oam4;Qu9nS&`%%kh5W#z<6lNS2^ohr>Rtp!#)N#I6VC- z3^k>2F$-tAF|Mke_Wv&YdWRQH7U+* z+u@eCRGi<2a3)E-mgB}L8?W1(^cwYHT+=Ql*TidnrxOnK4Ve#Tof~f+vxOw!&FX<1 z{BhSv2HS#lk)8-8LtNR8#COHp!gX=pDzqn@C|a7L-kOA+eg>x}NsETi8ORUGwMY6u z>?+&JANmjE(i3A+`cU!l8p&yS?-K`dg$y|O5E8uZpP&Pk^q>b~AF zE8S0DI(P>g%HADCQ6$^`;sQm~_plxh4k zC8oG>EllrHgRcPqFB~+q_uNk2OqSaQDs2OFpm6`GLyN)IQuJx-hKaDN2`0j>rWsGg zzY%spM;B@a7GHV=kI)SM_>RsLE*i08rf7=sFRmO$f;9T7jrmT;TKfHTjUG*B{HNGI z^E<~yh0I?$*7)^n5VBlA=I83K(Bm}Lq9_x5FmpxC%uFS)fO3~@5l*J(u4)6>I z*qC`Rh>?x_^h}%t~3kEs{nRumRT?LG5#y6x&`2>u+-K`Ot|O|-t+e?_nM6P0SrH|7s0cGga7RVMt5 zNJTacv-iVMo00mk#X*+0920Fx^c32XM0Xgi;+pc=Vu0(ydQ4Z&3}3FSRy3fjTm<0k z#AUK_2^q!hYg1~qK>j=G!Vt(mj^5jMVqxEj^1hRmeJ8IP0@=-kFrOJG6GPvn^Ucql zpTDJV&@zK?{rTo?cf6&clh$3{e5$hf6ceJ4WbpNKvhof-1zsu=ZneBbVyW0xOCiR% zB@~%5qKRb0w@Us_F5yTdnAevh9&mIKcNPEOc_S!-Yw_z^WL3UL91GW}`3kcZ96u7E zE^AksRi&yz)^+vAU7UK(`8NFMY+ZDJ}>5E5ZJfdBag0#No;ou3mJZi~7SS&5-ze zS|lmTFBADZUX>VtgLk(eV-4Qr(Ix**Ex4M4bEw(js+yCr^Q#Bd@Gh>5AwhP+v?z(7 ze4l*-bZRtfExp?K48GYBXLEiw%#=g)Nv;SnvCI@z+U#+T=tcY(&Imbo@^P3NJrR$e z^EDzcg2E5M!qgSC1!K#b#alg^fSGw;|A7iBEv*MkuPsH6lmc|$4{o@A?8dQs!JdU+ z&%9?|E(f<)g4;{xy|k%&W_UJw{i`$hd&D+C@IMLZ zW&q$E49`Xh2LlV`ab(x$s3=FJM)a6GwH>9a76fzT7Q0rD6m9?I_L;2=_!YH zRzl=<{t^O9SX@*6#rq79BF3u<&-E@+lOtHv*B}j+qyyFz*XLN^RHSya@NES!R3(n8 zoD&EE2NU>^!Q=`#_DQPzrbM_%Zp44sB_I&xSM52lE&hXi561N?#eaB;e{+Jzf54;# zRcoEbcBkuab_57Jc2k}MQQ}_ZD|j$pjdGY$FA*RHK+#tzP5OsIE*0)SdIc$!EH1E_ z$!K(1v|0?>LNV}j1VO!lT2Lo{ImBy6Z6)ji?8! zb1Qzp;$L+W7X26Mlf@rcEv#s-x6cSyXtS_-o+mNB>T+rV!@^s`Z$gKoSTsbAd9Y$y zH9FTbu4(+nDA9B`lo(Q8Sv3{J!v+KqA=F6+SiD~;9(Sqjbi?gBoiw(o9lUUKUJr-}|n;hHj zPN7$3I_O?fhgF5>sQc2B^b-u-bFPrhvv3Sk7n`U0{REh0L7Y-u$*W49&gzgVP_Jo}Vf| z_GAV1B13cshyJfZJ(SmJc4|Eyr)g?BYNy5s@;HDwQAVj5>2?kui{%}A6D7aSkPd}D zpd<;@;+{rkJ*Pd7+IWtTCliLNBN?P{d_ej*kD*{k0nQU0I5sSYypp8`9==hLu3arM zt9{2-PAc$WZe(L6$A zmQue@AVGi>XC5#zK`GksYr;eHX2Y_}$hllH3BTR@sKlaozQWZ}rlu2kj|xVx^}v!d z{~SRhJ9e|6k$`suAsK7HPM5bAq1_JP7kn-F1&Ozl3OJx3kCtn1@LZHPQNV|zl@$g; zxx5Dtg?pI5>VYzXf-hY0w%6&R!^$@M*i3zJVC!Qu^%1!C=CZ4Sa5n+fXf<EY2;4e^LTp*nff3odON6v9jrU7rcOu>y4s1u8H%@wQoM}` zEJ9Pp_BIx8vkE4hp*H9%w*1I=8^W9i;&ACf3>J@4IMnzQ{YVLMPox$pM+m$CpocPr zTn;}oqaUy)(qkFjO~8{O=))lsLM(Jq(>-T3ZITBvl3vKSRr=+Z@#80crrG@J=@Unj zM_xR7;YAI2Ub3y-n$ZGt!JNxF%n>TM}e)DGicP%YV9IkNx?Q8$Jm*f789-J#+-SA)e zd5*iy$(+omxHLb(^K|b?dD7kq!M^uR_>t#LHKYR*0ptm?FV&cCnrLG8{#0{1I1$9X zM{f9#m$%C8xBL?=9_}0`ciiISuo6^S75}w1r)s6O$GPREJZtx#cscGf{Ijl!5R=de z30+Fl<4I6Lp9qkFf3}QvCZiiNp1`|W`5p2WxhEA)cTRMY?qghJ+m}=}A zJ(Cxvhv!Jh!{R^IJ9;ZrZ*YJ^dedz`M?Ve4`2Nw8Wd*sHA zr8X_mv|hg4yzJP|QH1@@t!wvNUY$C?zUKLPZr(HHm4mke?9L;%(A^X-x84fq%?=+2 z+t=3k_ieSl2>%L6zkv~6Wt}NXVn&$}b80rHsQRp!oxG+bba5)H;!Q$IOe^BFBFTyx z6<^boseDRIPKmSGe3OW4M#|`-o)slo7PWjXmsM*^DmQf{qrrQ{WCr52{A3~}XXCF^O-|-@Ma)QP1u7|;0{JMa<1LsqMYdELOk^{Xyko+>&}jO63(&GOsD5JIO+oVp6NtFq71$vw0mFGUggdG%hSbbVqVf_YIhe3Buq= zX0BSr=v^|S>9CfVoucNlmr?Qj6jO~1W|d_YQKh7&Xkd%SFO!OAR5h!{;{!~tHPFyp zOMB=VkJFfp$7__sxVCh|jjalG95a{Qp;WzyNkqJwyrEqdXOk$DvI;ZWXt?x?br+ z(F4`euPW5#vN)w?(-6S?F6Q{8)98x@|2UIhXo2{uw?qrOpF^3+Y&J#aQ_z{DyzMbgu1bG9>Sf(E+Y=Z>H_{2uGv{|F8yqKs?R2YIj z{0q}$cnCKicrg)j%edQkEqE6A1#j&_Fvfk#(dIgaYlL(aMQ0TCdO^uw9g-zof|c?KO!UaNw6I58G&j2%IG&Qyld^QO@Knva zYG*}{r?LqtrJcl$#d(m_rPcMDBDc8f_Z@w|>*!k^yR-LhXQ|_8x#MV&`wB0)M0H-q zL#-icMcLGlb9D@JxZn@;BC-61G&g;FU_6K7QkcZE{d)8($Gi=4U@EHz%@MF#VdC~iLBAJI6zb}Ap^)*2=&sTv>gu!gZ#X=F+9 zPioF#l+?(0HGNg;h?F}bc2iVZ@gsgypaEz4rCd(Q$YvlGqY)g7nZmVfGGhju!K;#^ zMtqjJnGciuGHhY`FvIAYMx7nU7!+9tnBDaqOWg-HTIaN847qQF+deole|-LUCD{J{g?BF)Jts=RljYz^gQW*;;rY2rsOxs{7r~`B zOQHU9sNZ1eft6`&Ke{~f@k{uzQYmz-96Dx%jy-7WG}=VFsImRr@?H=tl|rNC(5Mj_ zec;r2v=ls64jwat#~!q{zd!x%^kRM?`(Ae5`^V;RC2-WJO_jjYhAUM95yMG;2zD-x zExh#JODm1Op#LEU@->ka&gb)64hF+iFES`D{wohG^$t+A!cFipH{p2==z7BI;S>QF z*{k?!Cm^6}L1~bE$5EE?_`wrc$I~b`fG1GpX{;lsiOFfI@-)|x)6C=qiKh{N@@{z# zLo*$>S|);WpS<;!Fwr9KmAB)!Ro*A>z;B!Uq`VWqA^eK?ZO88}{B}Uwu(A$6O?1w4 zH~EP!;GL(;me^^6GN&!rAl-vgj@e+uTB`{`VD*x8tlC-3eAeu***J(59<)nW@sN04 zXA9W0gk?ODP&6&8+9gscwiGf?u7VXgsRCMI8P-HCrzDb7NvwE4H?N*OEgm|0@Tj%4 z(-Ox}k|<}vNz09#oSITpV4))CEiU!n@k#Vo(ut!k9>eOMcyw58M ziI5Mi%$urXL#)y9@mCy3MP+13n}!M~%GznI9-^#h2{oC6nKXu}@)@8*Ey1j2p$`dQ zjFlMA0%;JgvLGaxn)DcE?Hi7}`y}olPwA=zb$~FTZpHyyOd1un;b}4huqD|DOT-F| zCC4)Pa9Yu)hvRxSX4M%NDI+UKMFK)3HkXnzmb`2gkrFH-I}(ruk1A$ofLV1Vt%=jp z4M0;dmCarU=3x43;7BNmtgMiK*t+4J8{F1IJZ`*1TQkSWBo#HJW~5nyd02hz{T6VK zIHu@2AxwKZO`AkEm0q*=h#s+4&AES7AbOTvb5 zt0Y7b^oA@fpiBW62u}_Wii+p#d_u)*C~}>e@Jre-R*MmS+5mxFT3oIH!T_j* z(IZYXoQmV|Ox9YVQ3b=0ITd!*sYYhWaW!A99aeVNoJ{9Z$plPpX%LU^?%(a8;6fmi z9b}W#MODP?Y2rD?o(m0V(;(Wk+C;6kcJU@CZ1x|r$VcyqsIr6 zQ-ca^Lrm*AmYj;Q=TAA)&s5P?pHE1WiRepM_TiRqpi8h}p*R9X4cM#mI(8NaNW7uv zbD%B`C$L~PW;3yT4p38B-OtKUyn>Z^qh_AIGQa{6PPqgDC+8wqfoJ}!KgSJ$DBT6b zKSADS4kuSX&M?Q%c|HMB`mBmOd2SA?WS*bnV%0pEb3m8Z^kIvus04MAnWPS=Lm=ly z68jz?bU{;6Q|b^ZRSEE#jj2Q z8s2O8ePGM)0$Y~4mwQTq{pG-ZBe1`+Wyi8?Z0VmD-fNl1AAJ9@?njJ))PGX+I zwC^mhuAv;g81YyGplNN|0MI;!)~rLDrq6O-!bLQ$Eug7(C#u|U`1V@RqJ!N zAtI>Hg5~1b@rc)Q32!c&Q)wvR)tW<))m*#hsw4Cwe}f}nN_KCsX27HUHAt-^v~{j< z-j=>fuec~Ij{UrG5q}RtowozO2rPw{qZFoL|Z;Wh%kY`=jrU zE{-krm4Z9V!JUSazy_zfGJgdQGe5EzUN}FGKWtizww*OT^v5mRmd^aD>BFWqE^9a7 z8f_Sq_Do6JTQ~(9)vAvSc!IeAb*nmzmnv;YF{-K-vv!j9aM_8M8?3Z$8~QGIwCx~8 zjz&h`{Im1VRzldkkX;rVSG-*CiTP*iZ;9D#-jA}ibNMw_m)E)gkUd{G3RLb2#{q@f zK{Jh}5dw(}_0sz8iWo*C9#fds^_1%@X2623Tjt3P!^1&y37gg$wMAdKbK)iuZ>1U#IwquxM&Rvujz>%F!}2$ zxwl45cjk}P#^V%Ey_r)_79#6=Kvi<+8CO)yVZBXa4uJeS{)(K@Gm7--kvj+PNK2QN z29^ev+lgBFZp!*>l|R19pTu&v2NFy_cAg04nm)E=u@?Q^cwvua(|`R2d5C*B6O6HR z+XzOi{J$av$3co*rM>g^mS1eKwD`xP_xk>&|DXH+Y2dd5rNigShtDCu)H7NJZ67VS zkIwrmZHGQMvLyU`_?N@w@IIsM5YnA)>z8QY5Nia~qZ#KSCTRwo$QleisT5X=1Rev? zsDyHAIN2m$2m7ceiBoXNBt&H8dKfyg7L0C{EN3>wV(F}$PfoThFQx1N7e*Tb z+_2t0DlZa=P>Hr!%ynFcVqQ!@>VA4ZKxB{zp+5#ZR9bXYnp3SYJxX_EZ8Hcgt|t@L zw$*H9(^oaTib#fqD-%j86^li9^%<05lfjRz_~lb1hzNTzfl=^H5nbr~t$4Qj0xKMm zXSnVGqig@27w!r7^{wI9pxic#be&7BT?vW%E_I0grwWPn@w`YZ`CHuU-tyq?8NR!96Z-uKR z0p2G9d({xX$9I_c+$6wt?_PY<*!@hY>qq6T9~Cb;f6R-Su@f+O^{U3-K1SB}h`u${ ziM|Dt2Dy>I8;j62)rqV%$<5$lku}ECQYS*!%p!EHBuDmQo@+D1uUg?GcT7fV@pIgB z>lRQ7@z|j!4MCOhX@m?YIS0`!jzWh`PEd?(jAd& zf>cN8`hg^-gcW*VJMHfoNMhogU=j;LP;WYI%6jLt~`7@Pd^}!V8sc2Mwe{&)*;UqOY{=JORh-d4cwrq+Kn{SXp~{1k zzzuR5nH)D>*(j%p$!V_23D&8rnent#d0N2}T&GWq+y;F@Ri5@ba$1?3_9{gpmM8Ij9Kx7q0ouhZ^>#vPjiDC@kA5Y%g#RPy@Tp;$dg!^W^~BQ5)b zzYRExV2E=LxCyvoa;$T)#|BuIqV87xfUtfzs$2KX+IK#xdlcMRLpR@wIvCohu5i_J zGM4l0C~NIN?z>@~?@{aj71j~m-{+B=U+rBP`_AAy9J&5KfK>KW{T%?6{gsCO zp#UK&HHI~0{9>UO@i_pb`jAPDgUR&g@{>3gW+5lD!FJw48}%mUd#A@tmf`BcLI^!{ zbJopb<+ynQ+Mv}T77hzI{bM#(H}-Z-Ykp(bw3bomX3jCloXB0DmA}EcBJG=FIBKy4 z-$c5bB65|;G?63`hU>1;-E|@^H)ZJ5Svmxz|?;pDKq>6%iggWu=mEsxt7rG4OmP z(7t$NsT1M`N!*~ncy3J+yK}@bC}tW*+2?`lLbvn{yc#0H!nO1^(nZnPsXTq6iZCppRu zmxw@L7npv0qk@kWOkOt|uwllhS33JD(e$V3KTK#UKpFzR7=ZR?uPPloSX&7?Lo@>~ z=SZ-WVxc~3vp@|oIo5`C{)TU4t;q37wE!l#8>huUaj47l6>hgtn;vjGjM`M;It(XO zxL%_+J>d2kwW-4O8MO&v)eHP9{ED}qhtFWSn2S`CsrJrh2&g)Yv+3XYB5-&-?FA8_C Xop?yOU$4EI<2k<5;KCad^RNE~%W6pM literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..c70ae6e4d6cc2c8eac3574f2ab58c4efc4db8253 GIT binary patch literal 7220 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 IicE$70kCyZ1JHA7|>jn{TwGKCgtTaHXB zmy}Zra$yvGaDxDGfei7`7BGgPZO|3S!yfjyhdmF{AYcN400D+R^v#947eDPgml93M z%GzQSb?y((y*&5)eD_>_(cT^raK(?`U-(B<5dKY#`W194;`W=U+!s_q6|=&kI4z1) zm$K5LZ`v;klJE;b^?fL)e$BrSs1MeHJ@u;axla(j!r!^3_o>nqArbhNnhDWvQ*_<1 z6f0xs=0v*2#EaSxar;v=?+cnREvmw_q>9tNus}a`Ks~00KMYL!)j@SgZAUGjKBIPg z=${UvJb-c^%1)FalyQ_{lwBwz>ag04vdx|8S+xh_qiRBZ8vX5f-iva-dR#q%GNztT z`%rdZyo~Yyp7*2dY})V9Few;+aeIR+xaczv z6-CxS@pH7ka(jwG%B|~hFX!hN^p!i%%je}PN;y&8JEv41SoC3J&F}*J44xuQ zJP;CoJ3Pybf~G^g_P&&(2|JLYm9j8KgTrrX*;z(z%R)q`+obi9Hh0paZyVYCqGpbo zimqnN8>gNh8=cK6=8e(Z@@!VqtkES+UmDG3X3$~H8~O{$Q>RAFjHNx7Q_?q-ISjp} zu^R;~KR2o>mI5L2X)6yCj*>}|xn(<)N@etnl}Z)%bB9RQ+ifJv1jwqe6%{(3+7f)> z;f>3@c+@+%d9~d8e5LpKwedTb*Din4JNSo}KYf`R-*g|{D3tm}zkI9QeX`Pha?O7y zQhiEB(Y}V?Hf9v;Xhu(G^Qy+RVF#H8q4b>)RK?vQ?P?dyuFYrBxGyx=Mp$rd+i3L_ z34ZZ(QQGv*M6c#oQCM&-);LZSiWKW&!MI@POB$od(B$h}HP>ZhW&!RF-$!&PvZHef zpQJ3msWDmAW|e%_l9gp;P}=z+wROp+XvvIEo+RLm5H6{3#uoE8C@c^YI@_)k#Se_*}q-r;il z(MtQ#HL2QmXiE^o1J&sMyO(ZXT37Eal%xHXXn!f%UyU7D3$r-Q>nHz!L>6nX1!)uS z7q>~8`$AEKCQ);)CGvf-&~u@V8-SBKY>*0)36Zbpf#j^{Fou~lV|_9EGA4J3Lc6n? zTC<<{NENHX<5+y%x>qR0`b(jHF6mDeueX(WPIQuhq<_{&Z}dtQhA0kCA?C{FbPP31 zS1iSjl|sk%N=Js{%6l6XC{Nf#x%X-Yuv`~7T{rjgH*<3JUud4|7dOVsvHl8- z7aQB0`r_IjuRT0n9vZ6*jg>-U|3hErFbC;t*VP#I)GMUHAFCIs@ZOKo%bad7S1nu@ zZWLca;G2kT(~xt9X=bp8(JqPI(!q%98T~pSB8TnGGMKXmB2MKgXp?}Q4G?K|EjEbW zI`-Dp_Z<3an%fEq(T+Q>P|QA6jUQS+U5&->zJL4u4YeFQR{0@M`v4Om5fYL7AQ4)T zDETP@8XH0HDqMXE@2n9qC%1lw&$2tQj24SVm$-TmuVHwVkz!_g|t`9-XX!Mkl}XNga{z1&}R43P-qz zI}x}<{Vd_9Om`A-H>63Q9H%a#^5pzK*Y3rn zTo5hS5{u zr~Y&m#lxw;OqXNlE3xyX(D}U)Pch3EL9wHijW zkPy$j67uHtT?rq>I@eF%J6n#)m6%)#$xdi@?tV2uTIC!MT`@5D{}kAd(=u~Vtyy9^ z8snkY_D(zPm6>dRxt7+pI+M8ajbPN1t-UvEs@r=I!85=F%XzyJ=z@{o$ge0}A*tD~M0^Iy8fDP9_u_K<{5#=56 zT*7DjEua>Cd(f3dEtO(NFno_s<1y264f=Q58E~8ApR}|yzdya<|M;bQF9Bsru`{^8 zj(<7zpy$s$PK#*h4ELpkZ(`zNBItZ@*+;MBUtM^OXXu0o3GpJZfx{#DTlyOfzN!2>Tx!O!j7a;i-wxdLQiD% zn|UScXboSLQmT=LmMFqmFAT5|Hdypv-A##V=JblB1-3eRl*zQ+Y zGl?&(wvULPVAGCVaKF$xe#`CIXycvGS;xQ5vEN}n!d6oU+46~^SQQ3JjrU{WXsPku c3aX+A!CO;&6P(<*P>IUlafa`oz{c13UwnI6Pyhe` literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..cbc6c5bc9136f1b6f764a772e1fe0e367be309a0 GIT binary patch literal 9723 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 b4=1agBR{Y{9X%; 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 a = CharsetAccept([('ISO-8859-1', 1), ('utf-8', 0.7)]) + >>> a.best + 'ISO-8859-1' + >>> 'iso-8859-1' in a + True + >>> 'UTF8' in a + True + >>> 'utf7' in a + False + + To get the quality for an item you can use normal item lookup: + + >>> print a['utf-8'] + 0.7 + >>> a['utf7'] + 0 + + .. versionchanged:: 0.5 + :class:`Accept` objects are forced immutable now. + + .. versionchanged:: 1.0.0 + :class:`Accept` internal values are no longer ordered + alphabetically for equal quality tags. Instead the initial + order is preserved. + + """ + + def __init__( + self, values: Accept | cabc.Iterable[tuple[str, float]] | None = () + ) -> None: + if values is None: + super().__init__() + self.provided = False + elif isinstance(values, Accept): + self.provided = values.provided + super().__init__(values) + else: + self.provided = True + values = sorted( + values, key=lambda x: (self._specificity(x[0]), x[1]), reverse=True + ) + super().__init__(values) + + def _specificity(self, value: str) -> tuple[bool, ...]: + """Returns a tuple describing the value's specificity.""" + return (value != "*",) + + def _value_matches(self, value: str, item: str) -> bool: + """Check if a value matches a given accept item.""" + return item == "*" or item.lower() == value.lower() + + @t.overload + def __getitem__(self, key: str) -> float: ... + @t.overload + def __getitem__(self, key: t.SupportsIndex) -> tuple[str, float]: ... + @t.overload + def __getitem__(self, key: slice) -> list[tuple[str, float]]: ... + def __getitem__( + self, key: str | t.SupportsIndex | slice + ) -> float | tuple[str, float] | list[tuple[str, float]]: + """Besides index lookup (getting item n) you can also pass it a string + to get the quality for the item. If the item is not in the list, the + returned quality is ``0``. + """ + if isinstance(key, str): + return self.quality(key) + return list.__getitem__(self, key) + + def quality(self, key: str) -> float: + """Returns the quality of the key. + + .. versionadded:: 0.6 + In previous versions you had to use the item-lookup syntax + (eg: ``obj[key]`` instead of ``obj.quality(key)``) + """ + for item, quality in self: + if self._value_matches(key, item): + return quality + return 0 + + def __contains__(self, value: str) -> bool: # type: ignore[override] + for item, _quality in self: + if self._value_matches(value, item): + return True + return False + + def __repr__(self) -> str: + pairs_str = ", ".join(f"({x!r}, {y})" for x, y in self) + return f"{type(self).__name__}([{pairs_str}])" + + def index(self, key: str | tuple[str, float]) -> int: # type: ignore[override] + """Get the position of an entry or raise :exc:`ValueError`. + + :param key: The key to be looked up. + + .. versionchanged:: 0.5 + This used to raise :exc:`IndexError`, which was inconsistent + with the list API. + """ + if isinstance(key, str): + for idx, (item, _quality) in enumerate(self): + if self._value_matches(key, item): + return idx + raise ValueError(key) + return list.index(self, key) + + def find(self, key: str | tuple[str, float]) -> int: + """Get the position of an entry or return -1. + + :param key: The key to be looked up. + """ + try: + return self.index(key) + except ValueError: + return -1 + + def values(self) -> cabc.Iterator[str]: + """Iterate over all values.""" + for item in self: + yield item[0] + + def to_header(self) -> str: + """Convert the header set into an HTTP header string.""" + result = [] + for value, quality in self: + if quality != 1: + value = f"{value};q={quality}" + result.append(value) + return ",".join(result) + + def __str__(self) -> str: + return self.to_header() + + def _best_single_match(self, match: str) -> tuple[str, float] | None: + for client_item, quality in self: + if self._value_matches(match, client_item): + # self is sorted by specificity descending, we can exit + return client_item, quality + return None + + @t.overload + def best_match(self, matches: cabc.Iterable[str]) -> str | None: ... + @t.overload + def best_match(self, matches: cabc.Iterable[str], default: str = ...) -> str: ... + def best_match( + self, matches: cabc.Iterable[str], default: str | None = None + ) -> str | None: + """Returns the best match from a list of possible matches based + on the specificity and quality of the client. If two items have the + same quality and specificity, the one is returned that comes first. + + :param matches: a list of matches to check for + :param default: the value that is returned if none match + """ + result = default + best_quality: float = -1 + best_specificity: tuple[float, ...] = (-1,) + for server_item in matches: + match = self._best_single_match(server_item) + if not match: + continue + client_item, quality = match + specificity = self._specificity(client_item) + if quality <= 0 or quality < best_quality: + continue + # better quality or same quality but more specific => better match + if quality > best_quality or specificity > best_specificity: + result = server_item + best_quality = quality + best_specificity = specificity + return result + + @property + def best(self) -> str | None: + """The best match as value.""" + if self: + return self[0][0] + + return None + + +_mime_split_re = re.compile(r"/|(?:\s*;\s*)") + + +def _normalize_mime(value: str) -> list[str]: + return _mime_split_re.split(value.lower()) + + +class MIMEAccept(Accept): + """Like :class:`Accept` but with special methods and behavior for + mimetypes. + """ + + def _specificity(self, value: str) -> tuple[bool, ...]: + return tuple(x != "*" for x in _mime_split_re.split(value)) + + def _value_matches(self, value: str, item: str) -> bool: + # item comes from the client, can't match if it's invalid. + if "/" not in item: + return False + + # value comes from the application, tell the developer when it + # doesn't look valid. + if "/" not in value: + raise ValueError(f"invalid mimetype {value!r}") + + # Split the match value into type, subtype, and a sorted list of parameters. + normalized_value = _normalize_mime(value) + value_type, value_subtype = normalized_value[:2] + value_params = sorted(normalized_value[2:]) + + # "*/*" is the only valid value that can start with "*". + if value_type == "*" and value_subtype != "*": + raise ValueError(f"invalid mimetype {value!r}") + + # Split the accept item into type, subtype, and parameters. + normalized_item = _normalize_mime(item) + item_type, item_subtype = normalized_item[:2] + item_params = sorted(normalized_item[2:]) + + # "*/not-*" from the client is invalid, can't match. + if item_type == "*" and item_subtype != "*": + return False + + return ( + (item_type == "*" and item_subtype == "*") + or (value_type == "*" and value_subtype == "*") + ) or ( + item_type == value_type + and ( + item_subtype == "*" + or value_subtype == "*" + or (item_subtype == value_subtype and item_params == value_params) + ) + ) + + @property + def accept_html(self) -> bool: + """True if this object accepts HTML.""" + return "text/html" in self or self.accept_xhtml # type: ignore[comparison-overlap] + + @property + def accept_xhtml(self) -> bool: + """True if this object accepts XHTML.""" + return "application/xhtml+xml" in self or "application/xml" in self # type: ignore[comparison-overlap] + + @property + def accept_json(self) -> bool: + """True if this object accepts JSON.""" + return "application/json" in self # type: ignore[comparison-overlap] + + +_locale_delim_re = re.compile(r"[_-]") + + +def _normalize_lang(value: str) -> list[str]: + """Process a language tag for matching.""" + return _locale_delim_re.split(value.lower()) + + +class LanguageAccept(Accept): + """Like :class:`Accept` but with normalization for language tags.""" + + def _value_matches(self, value: str, item: str) -> bool: + return item == "*" or _normalize_lang(value) == _normalize_lang(item) + + @t.overload + def best_match(self, matches: cabc.Iterable[str]) -> str | None: ... + @t.overload + def best_match(self, matches: cabc.Iterable[str], default: str = ...) -> str: ... + def best_match( + self, matches: cabc.Iterable[str], default: str | None = None + ) -> str | None: + """Given a list of supported values, finds the best match from + the list of accepted values. + + Language tags are normalized for the purpose of matching, but + are returned unchanged. + + If no exact match is found, this will fall back to matching + the first subtag (primary language only), first with the + accepted values then with the match values. This partial is not + applied to any other language subtags. + + The default is returned if no exact or fallback match is found. + + :param matches: A list of supported languages to find a match. + :param default: The value that is returned if none match. + """ + # Look for an exact match first. If a client accepts "en-US", + # "en-US" is a valid match at this point. + result = super().best_match(matches) + + if result is not None: + return result + + # Fall back to accepting primary tags. If a client accepts + # "en-US", "en" is a valid match at this point. Need to use + # re.split to account for 2 or 3 letter codes. + fallback = Accept( + [(_locale_delim_re.split(item[0], 1)[0], item[1]) for item in self] + ) + result = fallback.best_match(matches) + + if result is not None: + return result + + # Fall back to matching primary tags. If the client accepts + # "en", "en-US" is a valid match at this point. + fallback_matches = [_locale_delim_re.split(item, 1)[0] for item in matches] + result = super().best_match(fallback_matches) + + # Return a value from the original match list. Find the first + # original value that starts with the matched primary tag. + if result is not None: + return next(item for item in matches if item.startswith(result)) + + return default + + +class CharsetAccept(Accept): + """Like :class:`Accept` but with normalization for charsets.""" + + def _value_matches(self, value: str, item: str) -> bool: + def _normalize(name: str) -> str: + try: + return codecs.lookup(name).name + except LookupError: + return name.lower() + + return item == "*" or _normalize(value) == _normalize(item) diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/auth.py b/venv/lib/python3.11/site-packages/werkzeug/datastructures/auth.py new file mode 100755 index 0000000..0a3141e --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/datastructures/auth.py @@ -0,0 +1,320 @@ +from __future__ import annotations + +import base64 +import binascii +import collections.abc as cabc +import typing as t + +from ..http import dump_header +from ..http import parse_dict_header +from ..http import quote_header_value +from .structures import CallbackDict + +if t.TYPE_CHECKING: + import typing_extensions as te + + +class Authorization: + """Represents the parts of an ``Authorization`` request header. + + :attr:`.Request.authorization` returns an instance if the header is set. + + An instance can be used with the test :class:`.Client` request methods' ``auth`` + parameter to send the header in test requests. + + Depending on the auth scheme, either :attr:`parameters` or :attr:`token` will be + set. The ``Basic`` scheme's token is decoded into the ``username`` and ``password`` + parameters. + + For convenience, ``auth["key"]`` and ``auth.key`` both access the key in the + :attr:`parameters` dict, along with ``auth.get("key")`` and ``"key" in auth``. + + .. versionchanged:: 2.3 + The ``token`` parameter and attribute was added to support auth schemes that use + a token instead of parameters, such as ``Bearer``. + + .. versionchanged:: 2.3 + The object is no longer a ``dict``. + + .. versionchanged:: 0.5 + The object is an immutable dict. + """ + + def __init__( + self, + auth_type: str, + data: dict[str, str | None] | None = None, + token: str | None = None, + ) -> None: + self.type = auth_type + """The authorization scheme, like ``basic``, ``digest``, or ``bearer``.""" + + if data is None: + data = {} + + self.parameters = data + """A dict of parameters parsed from the header. Either this or :attr:`token` + will have a value for a given scheme. + """ + + self.token = token + """A token parsed from the header. Either this or :attr:`parameters` will have a + value for a given scheme. + + .. versionadded:: 2.3 + """ + + def __getattr__(self, name: str) -> str | None: + return self.parameters.get(name) + + def __getitem__(self, name: str) -> str | None: + return self.parameters.get(name) + + def get(self, key: str, default: str | None = None) -> str | None: + return self.parameters.get(key, default) + + def __contains__(self, key: str) -> bool: + return key in self.parameters + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Authorization): + return NotImplemented + + return ( + other.type == self.type + and other.token == self.token + and other.parameters == self.parameters + ) + + @classmethod + def from_header(cls, value: str | None) -> te.Self | None: + """Parse an ``Authorization`` header value and return an instance, or ``None`` + if the value is empty. + + :param value: The header value to parse. + + .. versionadded:: 2.3 + """ + if not value: + return None + + scheme, _, rest = value.partition(" ") + scheme = scheme.lower() + rest = rest.strip() + + if scheme == "basic": + try: + username, _, password = base64.b64decode(rest).decode().partition(":") + except (binascii.Error, UnicodeError): + return None + + return cls(scheme, {"username": username, "password": password}) + + if "=" in rest.rstrip("="): + # = that is not trailing, this is parameters. + return cls(scheme, parse_dict_header(rest), None) + + # No = or only trailing =, this is a token. + return cls(scheme, None, rest) + + def to_header(self) -> str: + """Produce an ``Authorization`` header value representing this data. + + .. versionadded:: 2.0 + """ + if self.type == "basic": + value = base64.b64encode( + f"{self.username}:{self.password}".encode() + ).decode("ascii") + return f"Basic {value}" + + if self.token is not None: + return f"{self.type.title()} {self.token}" + + return f"{self.type.title()} {dump_header(self.parameters)}" + + def __str__(self) -> str: + return self.to_header() + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.to_header()}>" + + +class WWWAuthenticate: + """Represents the parts of a ``WWW-Authenticate`` response header. + + Set :attr:`.Response.www_authenticate` to an instance of list of instances to set + values for this header in the response. Modifying this instance will modify the + header value. + + Depending on the auth scheme, either :attr:`parameters` or :attr:`token` should be + set. The ``Basic`` scheme will encode ``username`` and ``password`` parameters to a + token. + + For convenience, ``auth["key"]`` and ``auth.key`` both act on the :attr:`parameters` + dict, and can be used to get, set, or delete parameters. ``auth.get("key")`` and + ``"key" in auth`` are also provided. + + .. versionchanged:: 2.3 + The ``token`` parameter and attribute was added to support auth schemes that use + a token instead of parameters, such as ``Bearer``. + + .. versionchanged:: 2.3 + The object is no longer a ``dict``. + + .. versionchanged:: 2.3 + The ``on_update`` parameter was removed. + """ + + def __init__( + self, + auth_type: str, + values: dict[str, str | None] | None = None, + token: str | None = None, + ): + self._type = auth_type.lower() + self._parameters: dict[str, str | None] = CallbackDict( + values, lambda _: self._trigger_on_update() + ) + self._token = token + self._on_update: cabc.Callable[[WWWAuthenticate], None] | None = None + + def _trigger_on_update(self) -> None: + if self._on_update is not None: + self._on_update(self) + + @property + def type(self) -> str: + """The authorization scheme, like ``basic``, ``digest``, or ``bearer``.""" + return self._type + + @type.setter + def type(self, value: str) -> None: + self._type = value + self._trigger_on_update() + + @property + def parameters(self) -> dict[str, str | None]: + """A dict of parameters for the header. Only one of this or :attr:`token` should + have a value for a given scheme. + """ + return self._parameters + + @parameters.setter + def parameters(self, value: dict[str, str]) -> None: + self._parameters = CallbackDict(value, lambda _: self._trigger_on_update()) + self._trigger_on_update() + + @property + def token(self) -> str | None: + """A dict of parameters for the header. Only one of this or :attr:`token` should + have a value for a given scheme. + """ + return self._token + + @token.setter + def token(self, value: str | None) -> None: + """A token for the header. Only one of this or :attr:`parameters` should have a + value for a given scheme. + + .. versionadded:: 2.3 + """ + self._token = value + self._trigger_on_update() + + def __getitem__(self, key: str) -> str | None: + return self.parameters.get(key) + + def __setitem__(self, key: str, value: str | None) -> None: + if value is None: + if key in self.parameters: + del self.parameters[key] + else: + self.parameters[key] = value + + self._trigger_on_update() + + def __delitem__(self, key: str) -> None: + if key in self.parameters: + del self.parameters[key] + self._trigger_on_update() + + def __getattr__(self, name: str) -> str | None: + return self[name] + + def __setattr__(self, name: str, value: str | None) -> None: + if name in {"_type", "_parameters", "_token", "_on_update"}: + super().__setattr__(name, value) + else: + self[name] = value + + def __delattr__(self, name: str) -> None: + del self[name] + + def __contains__(self, key: str) -> bool: + return key in self.parameters + + def __eq__(self, other: object) -> bool: + if not isinstance(other, WWWAuthenticate): + return NotImplemented + + return ( + other.type == self.type + and other.token == self.token + and other.parameters == self.parameters + ) + + def get(self, key: str, default: str | None = None) -> str | None: + return self.parameters.get(key, default) + + @classmethod + def from_header(cls, value: str | None) -> te.Self | None: + """Parse a ``WWW-Authenticate`` header value and return an instance, or ``None`` + if the value is empty. + + :param value: The header value to parse. + + .. versionadded:: 2.3 + """ + if not value: + return None + + scheme, _, rest = value.partition(" ") + scheme = scheme.lower() + rest = rest.strip() + + if "=" in rest.rstrip("="): + # = that is not trailing, this is parameters. + return cls(scheme, parse_dict_header(rest), None) + + # No = or only trailing =, this is a token. + return cls(scheme, None, rest) + + def to_header(self) -> str: + """Produce a ``WWW-Authenticate`` header value representing this data.""" + if self.token is not None: + return f"{self.type.title()} {self.token}" + + if not self.parameters: + return self.type.title() + + if self.type == "digest": + items = [] + + for key, value in self.parameters.items(): + if key in {"realm", "domain", "nonce", "opaque", "qop"}: + value = quote_header_value(value, allow_token=False) + else: + value = quote_header_value(value) + + items.append(f"{key}={value}") + + return f"Digest {', '.join(items)}" + + return f"{self.type.title()} {dump_header(self.parameters)}" + + def __str__(self) -> str: + return self.to_header() + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.to_header()}>" diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/cache_control.py b/venv/lib/python3.11/site-packages/werkzeug/datastructures/cache_control.py new file mode 100755 index 0000000..3d96310 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/datastructures/cache_control.py @@ -0,0 +1,273 @@ +from __future__ import annotations + +import collections.abc as cabc +import typing as t +from inspect import cleandoc + +from .mixins import ImmutableDictMixin +from .structures import CallbackDict + + +def cache_control_property( + key: str, empty: t.Any, type: type[t.Any] | None, *, doc: str | None = None +) -> t.Any: + """Return a new property object for a cache header. Useful if you + want to add support for a cache extension in a subclass. + + :param key: The attribute name present in the parsed cache-control header dict. + :param empty: The value to use if the key is present without a value. + :param type: The type to convert the string value to instead of a string. If + conversion raises a ``ValueError``, the returned value is ``None``. + :param doc: The docstring for the property. If not given, it is generated + based on the other params. + + .. versionchanged:: 3.1 + Added the ``doc`` param. + + .. versionchanged:: 2.0 + Renamed from ``cache_property``. + """ + if doc is None: + parts = [f"The ``{key}`` attribute."] + + if type is bool: + parts.append("A ``bool``, either present or not.") + else: + if type is None: + parts.append("A ``str``,") + else: + parts.append(f"A ``{type.__name__}``,") + + if empty is not None: + parts.append(f"``{empty!r}`` if present with no value,") + + parts.append("or ``None`` if not present.") + + doc = " ".join(parts) + + return property( + lambda x: x._get_cache_value(key, empty, type), + lambda x, v: x._set_cache_value(key, v, type), + lambda x: x._del_cache_value(key), + doc=cleandoc(doc), + ) + + +class _CacheControl(CallbackDict[str, t.Optional[str]]): + """Subclass of a dict that stores values for a Cache-Control header. It + has accessors for all the cache-control directives specified in RFC 2616. + The class does not differentiate between request and response directives. + + Because the cache-control directives in the HTTP header use dashes the + python descriptors use underscores for that. + + To get a header of the :class:`CacheControl` object again you can convert + the object into a string or call the :meth:`to_header` method. If you plan + to subclass it and add your own items have a look at the sourcecode for + that class. + + .. versionchanged:: 3.1 + Dict values are always ``str | None``. Setting properties will + convert the value to a string. Setting a non-bool property to + ``False`` is equivalent to setting it to ``None``. Getting typed + properties will return ``None`` if conversion raises + ``ValueError``, rather than the string. + + .. versionchanged:: 2.1 + Setting int properties such as ``max_age`` will convert the + value to an int. + + .. versionchanged:: 0.4 + Setting ``no_cache`` or ``private`` to ``True`` will set the + implicit value ``"*"``. + """ + + no_store: bool = cache_control_property("no-store", None, bool) + max_age: int | None = cache_control_property("max-age", None, int) + no_transform: bool = cache_control_property("no-transform", None, bool) + stale_if_error: int | None = cache_control_property("stale-if-error", None, int) + + def __init__( + self, + values: cabc.Mapping[str, t.Any] | cabc.Iterable[tuple[str, t.Any]] | None = (), + on_update: cabc.Callable[[_CacheControl], None] | None = None, + ): + super().__init__(values, on_update) + self.provided = values is not None + + def _get_cache_value( + self, key: str, empty: t.Any, type: type[t.Any] | None + ) -> t.Any: + """Used internally by the accessor properties.""" + if type is bool: + return key in self + + if key not in self: + return None + + if (value := self[key]) is None: + return empty + + if type is not None: + try: + value = type(value) + except ValueError: + return None + + return value + + def _set_cache_value( + self, key: str, value: t.Any, type: type[t.Any] | None + ) -> None: + """Used internally by the accessor properties.""" + if type is bool: + if value: + self[key] = None + else: + self.pop(key, None) + elif value is None or value is False: + self.pop(key, None) + elif value is True: + self[key] = None + else: + if type is not None: + value = type(value) + + self[key] = str(value) + + def _del_cache_value(self, key: str) -> None: + """Used internally by the accessor properties.""" + if key in self: + del self[key] + + def to_header(self) -> str: + """Convert the stored values into a cache control header.""" + return http.dump_header(self) + + def __str__(self) -> str: + return self.to_header() + + def __repr__(self) -> str: + kv_str = " ".join(f"{k}={v!r}" for k, v in sorted(self.items())) + return f"<{type(self).__name__} {kv_str}>" + + cache_property = staticmethod(cache_control_property) + + +class RequestCacheControl(ImmutableDictMixin[str, t.Optional[str]], _CacheControl): # type: ignore[misc] + """A cache control for requests. This is immutable and gives access + to all the request-relevant cache control headers. + + To get a header of the :class:`RequestCacheControl` object again you can + convert the object into a string or call the :meth:`to_header` method. If + you plan to subclass it and add your own items have a look at the sourcecode + for that class. + + .. versionchanged:: 3.1 + Dict values are always ``str | None``. Setting properties will + convert the value to a string. Setting a non-bool property to + ``False`` is equivalent to setting it to ``None``. Getting typed + properties will return ``None`` if conversion raises + ``ValueError``, rather than the string. + + .. versionchanged:: 3.1 + ``max_age`` is ``None`` if present without a value, rather + than ``-1``. + + .. versionchanged:: 3.1 + ``no_cache`` is a boolean, it is ``True`` instead of ``"*"`` + when present. + + .. versionchanged:: 3.1 + ``max_stale`` is ``True`` if present without a value, rather + than ``"*"``. + + .. versionchanged:: 3.1 + ``no_transform`` is a boolean. Previously it was mistakenly + always ``None``. + + .. versionchanged:: 3.1 + ``min_fresh`` is ``None`` if present without a value, rather + than ``"*"``. + + .. versionchanged:: 2.1 + Setting int properties such as ``max_age`` will convert the + value to an int. + + .. versionadded:: 0.5 + Response-only properties are not present on this request class. + """ + + no_cache: bool = cache_control_property("no-cache", None, bool) + max_stale: int | t.Literal[True] | None = cache_control_property( + "max-stale", + True, + int, + ) + min_fresh: int | None = cache_control_property("min-fresh", None, int) + only_if_cached: bool = cache_control_property("only-if-cached", None, bool) + + +class ResponseCacheControl(_CacheControl): + """A cache control for responses. Unlike :class:`RequestCacheControl` + this is mutable and gives access to response-relevant cache control + headers. + + To get a header of the :class:`ResponseCacheControl` object again you can + convert the object into a string or call the :meth:`to_header` method. If + you plan to subclass it and add your own items have a look at the sourcecode + for that class. + + .. versionchanged:: 3.1 + Dict values are always ``str | None``. Setting properties will + convert the value to a string. Setting a non-bool property to + ``False`` is equivalent to setting it to ``None``. Getting typed + properties will return ``None`` if conversion raises + ``ValueError``, rather than the string. + + .. versionchanged:: 3.1 + ``no_cache`` is ``True`` if present without a value, rather than + ``"*"``. + + .. versionchanged:: 3.1 + ``private`` is ``True`` if present without a value, rather than + ``"*"``. + + .. versionchanged:: 3.1 + ``no_transform`` is a boolean. Previously it was mistakenly + always ``None``. + + .. versionchanged:: 3.1 + Added the ``must_understand``, ``stale_while_revalidate``, and + ``stale_if_error`` properties. + + .. versionchanged:: 2.1.1 + ``s_maxage`` converts the value to an int. + + .. versionchanged:: 2.1 + Setting int properties such as ``max_age`` will convert the + value to an int. + + .. versionadded:: 0.5 + Request-only properties are not present on this response class. + """ + + no_cache: str | t.Literal[True] | None = cache_control_property( + "no-cache", True, None + ) + public: bool = cache_control_property("public", None, bool) + private: str | t.Literal[True] | None = cache_control_property( + "private", True, None + ) + must_revalidate: bool = cache_control_property("must-revalidate", None, bool) + proxy_revalidate: bool = cache_control_property("proxy-revalidate", None, bool) + s_maxage: int | None = cache_control_property("s-maxage", None, int) + immutable: bool = cache_control_property("immutable", None, bool) + must_understand: bool = cache_control_property("must-understand", None, bool) + stale_while_revalidate: int | None = cache_control_property( + "stale-while-revalidate", None, int + ) + + +# circular dependencies +from .. import http # noqa: E402 diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/csp.py b/venv/lib/python3.11/site-packages/werkzeug/datastructures/csp.py new file mode 100755 index 0000000..206c1e3 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/datastructures/csp.py @@ -0,0 +1,100 @@ +from __future__ import annotations + +import collections.abc as cabc +import typing as t + +from .structures import CallbackDict + + +def csp_property(key: str) -> t.Any: + """Return a new property object for a content security policy header. + Useful if you want to add support for a csp extension in a + subclass. + """ + return property( + lambda x: x._get_value(key), + lambda x, v: x._set_value(key, v), + lambda x: x._del_value(key), + f"accessor for {key!r}", + ) + + +class ContentSecurityPolicy(CallbackDict[str, str]): + """Subclass of a dict that stores values for a Content Security Policy + header. It has accessors for all the level 3 policies. + + Because the csp directives in the HTTP header use dashes the + python descriptors use underscores for that. + + To get a header of the :class:`ContentSecurityPolicy` object again + you can convert the object into a string or call the + :meth:`to_header` method. If you plan to subclass it and add your + own items have a look at the sourcecode for that class. + + .. versionadded:: 1.0.0 + Support for Content Security Policy headers was added. + + """ + + base_uri: str | None = csp_property("base-uri") + child_src: str | None = csp_property("child-src") + connect_src: str | None = csp_property("connect-src") + default_src: str | None = csp_property("default-src") + font_src: str | None = csp_property("font-src") + form_action: str | None = csp_property("form-action") + frame_ancestors: str | None = csp_property("frame-ancestors") + frame_src: str | None = csp_property("frame-src") + img_src: str | None = csp_property("img-src") + manifest_src: str | None = csp_property("manifest-src") + media_src: str | None = csp_property("media-src") + navigate_to: str | None = csp_property("navigate-to") + object_src: str | None = csp_property("object-src") + prefetch_src: str | None = csp_property("prefetch-src") + plugin_types: str | None = csp_property("plugin-types") + report_to: str | None = csp_property("report-to") + report_uri: str | None = csp_property("report-uri") + sandbox: str | None = csp_property("sandbox") + script_src: str | None = csp_property("script-src") + script_src_attr: str | None = csp_property("script-src-attr") + script_src_elem: str | None = csp_property("script-src-elem") + style_src: str | None = csp_property("style-src") + style_src_attr: str | None = csp_property("style-src-attr") + style_src_elem: str | None = csp_property("style-src-elem") + worker_src: str | None = csp_property("worker-src") + + def __init__( + self, + values: cabc.Mapping[str, str] | cabc.Iterable[tuple[str, str]] | None = (), + on_update: cabc.Callable[[ContentSecurityPolicy], None] | None = None, + ) -> None: + super().__init__(values, on_update) + self.provided = values is not None + + def _get_value(self, key: str) -> str | None: + """Used internally by the accessor properties.""" + return self.get(key) + + def _set_value(self, key: str, value: str | None) -> None: + """Used internally by the accessor properties.""" + if value is None: + self.pop(key, None) + else: + self[key] = value + + def _del_value(self, key: str) -> None: + """Used internally by the accessor properties.""" + if key in self: + del self[key] + + def to_header(self) -> str: + """Convert the stored values into a cache control header.""" + from ..http import dump_csp_header + + return dump_csp_header(self) + + def __str__(self) -> str: + return self.to_header() + + def __repr__(self) -> str: + kv_str = " ".join(f"{k}={v!r}" for k, v in sorted(self.items())) + return f"<{type(self).__name__} {kv_str}>" diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/etag.py b/venv/lib/python3.11/site-packages/werkzeug/datastructures/etag.py new file mode 100755 index 0000000..a4ef342 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/datastructures/etag.py @@ -0,0 +1,106 @@ +from __future__ import annotations + +import collections.abc as cabc + + +class ETags(cabc.Collection[str]): + """A set that can be used to check if one etag is present in a collection + of etags. + """ + + def __init__( + self, + strong_etags: cabc.Iterable[str] | None = None, + weak_etags: cabc.Iterable[str] | None = None, + star_tag: bool = False, + ): + if not star_tag and strong_etags: + self._strong = frozenset(strong_etags) + else: + self._strong = frozenset() + + self._weak = frozenset(weak_etags or ()) + self.star_tag = star_tag + + def as_set(self, include_weak: bool = False) -> set[str]: + """Convert the `ETags` object into a python set. Per default all the + weak etags are not part of this set.""" + rv = set(self._strong) + if include_weak: + rv.update(self._weak) + return rv + + def is_weak(self, etag: str) -> bool: + """Check if an etag is weak.""" + return etag in self._weak + + def is_strong(self, etag: str) -> bool: + """Check if an etag is strong.""" + return etag in self._strong + + def contains_weak(self, etag: str) -> bool: + """Check if an etag is part of the set including weak and strong tags.""" + return self.is_weak(etag) or self.contains(etag) + + def contains(self, etag: str) -> bool: + """Check if an etag is part of the set ignoring weak tags. + It is also possible to use the ``in`` operator. + """ + if self.star_tag: + return True + return self.is_strong(etag) + + def contains_raw(self, etag: str) -> bool: + """When passed a quoted tag it will check if this tag is part of the + set. If the tag is weak it is checked against weak and strong tags, + otherwise strong only.""" + from ..http import unquote_etag + + etag, weak = unquote_etag(etag) + if weak: + return self.contains_weak(etag) + return self.contains(etag) + + def to_header(self) -> str: + """Convert the etags set into a HTTP header string.""" + if self.star_tag: + return "*" + return ", ".join( + [f'"{x}"' for x in self._strong] + [f'W/"{x}"' for x in self._weak] + ) + + def __call__( + self, + etag: str | None = None, + data: bytes | None = None, + include_weak: bool = False, + ) -> bool: + if etag is None: + if data is None: + raise TypeError("'data' is required when 'etag' is not given.") + + from ..http import generate_etag + + etag = generate_etag(data) + if include_weak: + if etag in self._weak: + return True + return etag in self._strong + + def __bool__(self) -> bool: + return bool(self.star_tag or self._strong or self._weak) + + def __str__(self) -> str: + return self.to_header() + + def __len__(self) -> int: + return len(self._strong) + + def __iter__(self) -> cabc.Iterator[str]: + return iter(self._strong) + + def __contains__(self, etag: str) -> bool: # type: ignore[override] + return self.contains(etag) + + def __repr__(self) -> str: + return f"<{type(self).__name__} {str(self)!r}>" diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/file_storage.py b/venv/lib/python3.11/site-packages/werkzeug/datastructures/file_storage.py new file mode 100755 index 0000000..3a17f51 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/datastructures/file_storage.py @@ -0,0 +1,209 @@ +from __future__ import annotations + +import collections.abc as cabc +import mimetypes +import os +import typing as t +from io import BytesIO +from os import fsdecode +from os import fspath + +from .._internal import _plain_int +from .headers import Headers +from .structures import MultiDict + + +class FileStorage: + """The :class:`FileStorage` class is a thin wrapper over incoming files. + It is used by the request object to represent uploaded files. All the + attributes of the wrapper stream are proxied by the file storage so + it's possible to do ``storage.read()`` instead of the long form + ``storage.stream.read()``. + """ + + def __init__( + self, + stream: t.IO[bytes] | None = None, + filename: str | None = None, + name: str | None = None, + content_type: str | None = None, + content_length: int | None = None, + headers: Headers | None = None, + ): + self.name = name + self.stream = stream or BytesIO() + + # If no filename is provided, attempt to get the filename from + # the stream object. Python names special streams like + # ```` with angular brackets, skip these streams. + if filename is None: + filename = getattr(stream, "name", None) + + if filename is not None: + filename = fsdecode(filename) + + if filename and filename[0] == "<" and filename[-1] == ">": + filename = None + else: + filename = fsdecode(filename) + + self.filename = filename + + if headers is None: + headers = Headers() + self.headers = headers + if content_type is not None: + headers["Content-Type"] = content_type + if content_length is not None: + headers["Content-Length"] = str(content_length) + + def _parse_content_type(self) -> None: + if not hasattr(self, "_parsed_content_type"): + self._parsed_content_type = http.parse_options_header(self.content_type) + + @property + def content_type(self) -> str | None: + """The content-type sent in the header. Usually not available""" + return self.headers.get("content-type") + + @property + def content_length(self) -> int: + """The content-length sent in the header. Usually not available""" + if "content-length" in self.headers: + try: + return _plain_int(self.headers["content-length"]) + except ValueError: + pass + + return 0 + + @property + def mimetype(self) -> str: + """Like :attr:`content_type`, but without parameters (eg, without + charset, type etc.) and always lowercase. For example if the content + type is ``text/HTML; charset=utf-8`` the mimetype would be + ``'text/html'``. + + .. versionadded:: 0.7 + """ + self._parse_content_type() + return self._parsed_content_type[0].lower() + + @property + def mimetype_params(self) -> dict[str, str]: + """The mimetype parameters as dict. For example if the content + type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + + .. versionadded:: 0.7 + """ + self._parse_content_type() + return self._parsed_content_type[1] + + def save( + self, dst: str | os.PathLike[str] | t.IO[bytes], buffer_size: int = 16384 + ) -> None: + """Save the file to a destination path or file object. If the + destination is a file object you have to close it yourself after the + call. The buffer size is the number of bytes held in memory during + the copy process. It defaults to 16KB. + + For secure file saving also have a look at :func:`secure_filename`. + + :param dst: a filename, :class:`os.PathLike`, or open file + object to write to. + :param buffer_size: Passed as the ``length`` parameter of + :func:`shutil.copyfileobj`. + + .. versionchanged:: 1.0 + Supports :mod:`pathlib`. + """ + from shutil import copyfileobj + + close_dst = False + + if hasattr(dst, "__fspath__"): + dst = fspath(dst) + + if isinstance(dst, str): + dst = open(dst, "wb") + close_dst = True + + try: + copyfileobj(self.stream, dst, buffer_size) + finally: + if close_dst: + dst.close() + + def close(self) -> None: + """Close the underlying file if possible.""" + try: + self.stream.close() + except Exception: + pass + + def __bool__(self) -> bool: + return bool(self.filename) + + def __getattr__(self, name: str) -> t.Any: + try: + return getattr(self.stream, name) + except AttributeError: + # SpooledTemporaryFile on Python < 3.11 doesn't implement IOBase, + # get the attribute from its backing file instead. + if hasattr(self.stream, "_file"): + return getattr(self.stream._file, name) + raise + + def __iter__(self) -> cabc.Iterator[bytes]: + return iter(self.stream) + + def __repr__(self) -> str: + return f"<{type(self).__name__}: {self.filename!r} ({self.content_type!r})>" + + +class FileMultiDict(MultiDict[str, FileStorage]): + """A special :class:`MultiDict` that has convenience methods to add + files to it. This is used for :class:`EnvironBuilder` and generally + useful for unittesting. + + .. versionadded:: 0.5 + """ + + def add_file( + self, + name: str, + file: str | os.PathLike[str] | t.IO[bytes] | FileStorage, + filename: str | None = None, + content_type: str | None = None, + ) -> None: + """Adds a new file to the dict. `file` can be a file name or + a :class:`file`-like or a :class:`FileStorage` object. + + :param name: the name of the field. + :param file: a filename or :class:`file`-like object + :param filename: an optional filename + :param content_type: an optional content type + """ + if isinstance(file, FileStorage): + self.add(name, file) + return + + if isinstance(file, (str, os.PathLike)): + if filename is None: + filename = os.fspath(file) + + file_obj: t.IO[bytes] = open(file, "rb") + else: + file_obj = file # type: ignore[assignment] + + if filename and content_type is None: + content_type = ( + mimetypes.guess_type(filename)[0] or "application/octet-stream" + ) + + self.add(name, FileStorage(file_obj, filename, name, content_type)) + + +# circular dependencies +from .. import http # noqa: E402 diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/headers.py b/venv/lib/python3.11/site-packages/werkzeug/datastructures/headers.py new file mode 100755 index 0000000..b898362 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/datastructures/headers.py @@ -0,0 +1,662 @@ +from __future__ import annotations + +import collections.abc as cabc +import re +import typing as t + +from .._internal import _missing +from ..exceptions import BadRequestKeyError +from .mixins import ImmutableHeadersMixin +from .structures import iter_multi_items +from .structures import MultiDict + +if t.TYPE_CHECKING: + import typing_extensions as te + from _typeshed.wsgi import WSGIEnvironment + +T = t.TypeVar("T") + + +class Headers: + """An object that stores some headers. It has a dict-like interface, + but is ordered, can store the same key multiple times, and iterating + yields ``(key, value)`` pairs instead of only keys. + + This data structure is useful if you want a nicer way to handle WSGI + headers which are stored as tuples in a list. + + From Werkzeug 0.3 onwards, the :exc:`KeyError` raised by this class is + also a subclass of the :class:`~exceptions.BadRequest` HTTP exception + and will render a page for a ``400 BAD REQUEST`` if caught in a + catch-all for HTTP exceptions. + + Headers is mostly compatible with the Python :class:`wsgiref.headers.Headers` + class, with the exception of `__getitem__`. :mod:`wsgiref` will return + `None` for ``headers['missing']``, whereas :class:`Headers` will raise + a :class:`KeyError`. + + To create a new ``Headers`` object, pass it a list, dict, or + other ``Headers`` object with default values. These values are + validated the same way values added later are. + + :param defaults: The list of default values for the :class:`Headers`. + + .. versionchanged:: 3.1 + Implement ``|`` and ``|=`` operators. + + .. versionchanged:: 2.1.0 + Default values are validated the same as values added later. + + .. versionchanged:: 0.9 + This data structure now stores unicode values similar to how the + multi dicts do it. The main difference is that bytes can be set as + well which will automatically be latin1 decoded. + + .. versionchanged:: 0.9 + The :meth:`linked` function was removed without replacement as it + was an API that does not support the changes to the encoding model. + """ + + def __init__( + self, + defaults: ( + Headers + | MultiDict[str, t.Any] + | cabc.Mapping[str, t.Any | list[t.Any] | tuple[t.Any, ...] | set[t.Any]] + | cabc.Iterable[tuple[str, t.Any]] + | None + ) = None, + ) -> None: + self._list: list[tuple[str, str]] = [] + + if defaults is not None: + self.extend(defaults) + + @t.overload + def __getitem__(self, key: str) -> str: ... + @t.overload + def __getitem__(self, key: int) -> tuple[str, str]: ... + @t.overload + def __getitem__(self, key: slice) -> te.Self: ... + def __getitem__(self, key: str | int | slice) -> str | tuple[str, str] | te.Self: + if isinstance(key, str): + return self._get_key(key) + + if isinstance(key, int): + return self._list[key] + + return self.__class__(self._list[key]) + + def _get_key(self, key: str) -> str: + ikey = key.lower() + + for k, v in self._list: + if k.lower() == ikey: + return v + + raise BadRequestKeyError(key) + + def __eq__(self, other: object) -> bool: + if other.__class__ is not self.__class__: + return NotImplemented + + def lowered(item: tuple[str, ...]) -> tuple[str, ...]: + return item[0].lower(), *item[1:] + + return set(map(lowered, other._list)) == set(map(lowered, self._list)) # type: ignore[attr-defined] + + __hash__ = None # type: ignore[assignment] + + @t.overload + def get(self, key: str) -> str | None: ... + @t.overload + def get(self, key: str, default: str) -> str: ... + @t.overload + def get(self, key: str, default: T) -> str | T: ... + @t.overload + def get(self, key: str, type: cabc.Callable[[str], T]) -> T | None: ... + @t.overload + def get(self, key: str, default: T, type: cabc.Callable[[str], T]) -> T: ... + def get( # type: ignore[misc] + self, + key: str, + default: str | T | None = None, + type: cabc.Callable[[str], T] | None = None, + ) -> str | T | None: + """Return the default value if the requested data doesn't exist. + If `type` is provided and is a callable it should convert the value, + return it or raise a :exc:`ValueError` if that is not possible. In + this case the function will return the default as if the value was not + found: + + >>> d = Headers([('Content-Length', '42')]) + >>> d.get('Content-Length', type=int) + 42 + + :param key: The key to be looked up. + :param default: The default value to be returned if the key can't + be looked up. If not further specified `None` is + returned. + :param type: A callable that is used to cast the value in the + :class:`Headers`. If a :exc:`ValueError` is raised + by this callable the default value is returned. + + .. versionchanged:: 3.0 + The ``as_bytes`` parameter was removed. + + .. versionchanged:: 0.9 + The ``as_bytes`` parameter was added. + """ + try: + rv = self._get_key(key) + except KeyError: + return default + + if type is None: + return rv + + try: + return type(rv) + except ValueError: + return default + + @t.overload + def getlist(self, key: str) -> list[str]: ... + @t.overload + def getlist(self, key: str, type: cabc.Callable[[str], T]) -> list[T]: ... + def getlist( + self, key: str, type: cabc.Callable[[str], T] | None = None + ) -> list[str] | list[T]: + """Return the list of items for a given key. If that key is not in the + :class:`Headers`, the return value will be an empty list. Just like + :meth:`get`, :meth:`getlist` accepts a `type` parameter. All items will + be converted with the callable defined there. + + :param key: The key to be looked up. + :param type: A callable that is used to cast the value in the + :class:`Headers`. If a :exc:`ValueError` is raised + by this callable the value will be removed from the list. + :return: a :class:`list` of all the values for the key. + + .. versionchanged:: 3.0 + The ``as_bytes`` parameter was removed. + + .. versionchanged:: 0.9 + The ``as_bytes`` parameter was added. + """ + ikey = key.lower() + + if type is not None: + result = [] + + for k, v in self: + if k.lower() == ikey: + try: + result.append(type(v)) + except ValueError: + continue + + return result + + return [v for k, v in self if k.lower() == ikey] + + def get_all(self, name: str) -> list[str]: + """Return a list of all the values for the named field. + + This method is compatible with the :mod:`wsgiref` + :meth:`~wsgiref.headers.Headers.get_all` method. + """ + return self.getlist(name) + + def items(self, lower: bool = False) -> t.Iterable[tuple[str, str]]: + for key, value in self: + if lower: + key = key.lower() + yield key, value + + def keys(self, lower: bool = False) -> t.Iterable[str]: + for key, _ in self.items(lower): + yield key + + def values(self) -> t.Iterable[str]: + for _, value in self.items(): + yield value + + def extend( + self, + arg: ( + Headers + | MultiDict[str, t.Any] + | cabc.Mapping[str, t.Any | list[t.Any] | tuple[t.Any, ...] | set[t.Any]] + | cabc.Iterable[tuple[str, t.Any]] + | None + ) = None, + /, + **kwargs: str, + ) -> None: + """Extend headers in this object with items from another object + containing header items as well as keyword arguments. + + To replace existing keys instead of extending, use + :meth:`update` instead. + + If provided, the first argument can be another :class:`Headers` + object, a :class:`MultiDict`, :class:`dict`, or iterable of + pairs. + + .. versionchanged:: 1.0 + Support :class:`MultiDict`. Allow passing ``kwargs``. + """ + if arg is not None: + for key, value in iter_multi_items(arg): + self.add(key, value) + + for key, value in iter_multi_items(kwargs): + self.add(key, value) + + def __delitem__(self, key: str | int | slice) -> None: + if isinstance(key, str): + self._del_key(key) + return + + del self._list[key] + + def _del_key(self, key: str) -> None: + key = key.lower() + new = [] + + for k, v in self._list: + if k.lower() != key: + new.append((k, v)) + + self._list[:] = new + + def remove(self, key: str) -> None: + """Remove a key. + + :param key: The key to be removed. + """ + return self._del_key(key) + + @t.overload + def pop(self) -> tuple[str, str]: ... + @t.overload + def pop(self, key: str) -> str: ... + @t.overload + def pop(self, key: int | None = ...) -> tuple[str, str]: ... + @t.overload + def pop(self, key: str, default: str) -> str: ... + @t.overload + def pop(self, key: str, default: T) -> str | T: ... + def pop( + self, + key: str | int | None = None, + default: str | T = _missing, # type: ignore[assignment] + ) -> str | tuple[str, str] | T: + """Removes and returns a key or index. + + :param key: The key to be popped. If this is an integer the item at + that position is removed, if it's a string the value for + that key is. If the key is omitted or `None` the last + item is removed. + :return: an item. + """ + if key is None: + return self._list.pop() + + if isinstance(key, int): + return self._list.pop(key) + + try: + rv = self._get_key(key) + except KeyError: + if default is not _missing: + return default + + raise + + self.remove(key) + return rv + + def popitem(self) -> tuple[str, str]: + """Removes a key or index and returns a (key, value) item.""" + return self._list.pop() + + def __contains__(self, key: str) -> bool: + """Check if a key is present.""" + try: + self._get_key(key) + except KeyError: + return False + + return True + + def __iter__(self) -> t.Iterator[tuple[str, str]]: + """Yield ``(key, value)`` tuples.""" + return iter(self._list) + + def __len__(self) -> int: + return len(self._list) + + def add(self, key: str, value: t.Any, /, **kwargs: t.Any) -> None: + """Add a new header tuple to the list. + + Keyword arguments can specify additional parameters for the header + value, with underscores converted to dashes:: + + >>> d = Headers() + >>> d.add('Content-Type', 'text/plain') + >>> d.add('Content-Disposition', 'attachment', filename='foo.png') + + The keyword argument dumping uses :func:`dump_options_header` + behind the scenes. + + .. versionchanged:: 0.4.1 + keyword arguments were added for :mod:`wsgiref` compatibility. + """ + if kwargs: + value = _options_header_vkw(value, kwargs) + + value_str = _str_header_value(value) + self._list.append((key, value_str)) + + def add_header(self, key: str, value: t.Any, /, **kwargs: t.Any) -> None: + """Add a new header tuple to the list. + + An alias for :meth:`add` for compatibility with the :mod:`wsgiref` + :meth:`~wsgiref.headers.Headers.add_header` method. + """ + self.add(key, value, **kwargs) + + def clear(self) -> None: + """Clears all headers.""" + self._list.clear() + + def set(self, key: str, value: t.Any, /, **kwargs: t.Any) -> None: + """Remove all header tuples for `key` and add a new one. The newly + added key either appears at the end of the list if there was no + entry or replaces the first one. + + Keyword arguments can specify additional parameters for the header + value, with underscores converted to dashes. See :meth:`add` for + more information. + + .. versionchanged:: 0.6.1 + :meth:`set` now accepts the same arguments as :meth:`add`. + + :param key: The key to be inserted. + :param value: The value to be inserted. + """ + if kwargs: + value = _options_header_vkw(value, kwargs) + + value_str = _str_header_value(value) + + if not self._list: + self._list.append((key, value_str)) + return + + iter_list = iter(self._list) + ikey = key.lower() + + for idx, (old_key, _) in enumerate(iter_list): + if old_key.lower() == ikey: + # replace first occurrence + self._list[idx] = (key, value_str) + break + else: + # no existing occurrences + self._list.append((key, value_str)) + return + + # remove remaining occurrences + self._list[idx + 1 :] = [t for t in iter_list if t[0].lower() != ikey] + + def setlist(self, key: str, values: cabc.Iterable[t.Any]) -> None: + """Remove any existing values for a header and add new ones. + + :param key: The header key to set. + :param values: An iterable of values to set for the key. + + .. versionadded:: 1.0 + """ + if values: + values_iter = iter(values) + self.set(key, next(values_iter)) + + for value in values_iter: + self.add(key, value) + else: + self.remove(key) + + def setdefault(self, key: str, default: t.Any) -> str: + """Return the first value for the key if it is in the headers, + otherwise set the header to the value given by ``default`` and + return that. + + :param key: The header key to get. + :param default: The value to set for the key if it is not in the + headers. + """ + try: + return self._get_key(key) + except KeyError: + pass + + self.set(key, default) + return self._get_key(key) + + def setlistdefault(self, key: str, default: cabc.Iterable[t.Any]) -> list[str]: + """Return the list of values for the key if it is in the + headers, otherwise set the header to the list of values given + by ``default`` and return that. + + Unlike :meth:`MultiDict.setlistdefault`, modifying the returned + list will not affect the headers. + + :param key: The header key to get. + :param default: An iterable of values to set for the key if it + is not in the headers. + + .. versionadded:: 1.0 + """ + if key not in self: + self.setlist(key, default) + + return self.getlist(key) + + @t.overload + def __setitem__(self, key: str, value: t.Any) -> None: ... + @t.overload + def __setitem__(self, key: int, value: tuple[str, t.Any]) -> None: ... + @t.overload + def __setitem__( + self, key: slice, value: cabc.Iterable[tuple[str, t.Any]] + ) -> None: ... + def __setitem__( + self, + key: str | int | slice, + value: t.Any | tuple[str, t.Any] | cabc.Iterable[tuple[str, t.Any]], + ) -> None: + """Like :meth:`set` but also supports index/slice based setting.""" + if isinstance(key, str): + self.set(key, value) + elif isinstance(key, int): + self._list[key] = value[0], _str_header_value(value[1]) # type: ignore[index] + else: + self._list[key] = [(k, _str_header_value(v)) for k, v in value] # type: ignore[misc] + + def update( + self, + arg: ( + Headers + | MultiDict[str, t.Any] + | cabc.Mapping[ + str, t.Any | list[t.Any] | tuple[t.Any, ...] | cabc.Set[t.Any] + ] + | cabc.Iterable[tuple[str, t.Any]] + | None + ) = None, + /, + **kwargs: t.Any | list[t.Any] | tuple[t.Any, ...] | cabc.Set[t.Any], + ) -> None: + """Replace headers in this object with items from another + headers object and keyword arguments. + + To extend existing keys instead of replacing, use :meth:`extend` + instead. + + If provided, the first argument can be another :class:`Headers` + object, a :class:`MultiDict`, :class:`dict`, or iterable of + pairs. + + .. versionadded:: 1.0 + """ + if arg is not None: + if isinstance(arg, (Headers, MultiDict)): + for key in arg.keys(): + self.setlist(key, arg.getlist(key)) + elif isinstance(arg, cabc.Mapping): + for key, value in arg.items(): + if isinstance(value, (list, tuple, set)): + self.setlist(key, value) + else: + self.set(key, value) + else: + for key, value in arg: + self.set(key, value) + + for key, value in kwargs.items(): + if isinstance(value, (list, tuple, set)): + self.setlist(key, value) + else: + self.set(key, value) + + def __or__( + self, + other: cabc.Mapping[ + str, t.Any | list[t.Any] | tuple[t.Any, ...] | cabc.Set[t.Any] + ], + ) -> te.Self: + if not isinstance(other, cabc.Mapping): + return NotImplemented + + rv = self.copy() + rv.update(other) + return rv + + def __ior__( + self, + other: ( + cabc.Mapping[str, t.Any | list[t.Any] | tuple[t.Any, ...] | cabc.Set[t.Any]] + | cabc.Iterable[tuple[str, t.Any]] + ), + ) -> te.Self: + if not isinstance(other, (cabc.Mapping, cabc.Iterable)): + return NotImplemented + + self.update(other) + return self + + def to_wsgi_list(self) -> list[tuple[str, str]]: + """Convert the headers into a list suitable for WSGI. + + :return: list + """ + return list(self) + + def copy(self) -> te.Self: + return self.__class__(self._list) + + def __copy__(self) -> te.Self: + return self.copy() + + def __str__(self) -> str: + """Returns formatted headers suitable for HTTP transmission.""" + strs = [] + for key, value in self.to_wsgi_list(): + strs.append(f"{key}: {value}") + strs.append("\r\n") + return "\r\n".join(strs) + + def __repr__(self) -> str: + return f"{type(self).__name__}({list(self)!r})" + + +def _options_header_vkw(value: str, kw: dict[str, t.Any]) -> str: + return http.dump_options_header( + value, {k.replace("_", "-"): v for k, v in kw.items()} + ) + + +_newline_re = re.compile(r"[\r\n]") + + +def _str_header_value(value: t.Any) -> str: + if not isinstance(value, str): + value = str(value) + + if _newline_re.search(value) is not None: + raise ValueError("Header values must not contain newline characters.") + + return value # type: ignore[no-any-return] + + +class EnvironHeaders(ImmutableHeadersMixin, Headers): # type: ignore[misc] + """Read only version of the headers from a WSGI environment. This + provides the same interface as `Headers` and is constructed from + a WSGI environment. + From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a + subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will + render a page for a ``400 BAD REQUEST`` if caught in a catch-all for + HTTP exceptions. + """ + + def __init__(self, environ: WSGIEnvironment) -> None: + super().__init__() + self.environ = environ + + def __eq__(self, other: object) -> bool: + if not isinstance(other, EnvironHeaders): + return NotImplemented + + return self.environ is other.environ + + __hash__ = None + + def __getitem__(self, key: str) -> str: # type: ignore[override] + return self._get_key(key) + + def _get_key(self, key: str) -> str: + if not isinstance(key, str): + raise BadRequestKeyError(key) + + key = key.upper().replace("-", "_") + + if key in {"CONTENT_TYPE", "CONTENT_LENGTH"}: + return self.environ[key] # type: ignore[no-any-return] + + return self.environ[f"HTTP_{key}"] # type: ignore[no-any-return] + + def __len__(self) -> int: + return sum(1 for _ in self) + + def __iter__(self) -> cabc.Iterator[tuple[str, str]]: + for key, value in self.environ.items(): + if key.startswith("HTTP_") and key not in { + "HTTP_CONTENT_TYPE", + "HTTP_CONTENT_LENGTH", + }: + yield key[5:].replace("_", "-").title(), value + elif key in {"CONTENT_TYPE", "CONTENT_LENGTH"} and value: + yield key.replace("_", "-").title(), value + + def copy(self) -> t.NoReturn: + raise TypeError(f"cannot create {type(self).__name__!r} copies") + + def __or__(self, other: t.Any) -> t.NoReturn: + raise TypeError(f"cannot create {type(self).__name__!r} copies") + + +# circular dependencies +from .. import http # noqa: E402 diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/mixins.py b/venv/lib/python3.11/site-packages/werkzeug/datastructures/mixins.py new file mode 100755 index 0000000..8e00bda --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/datastructures/mixins.py @@ -0,0 +1,317 @@ +from __future__ import annotations + +import collections.abc as cabc +import typing as t +from functools import update_wrapper +from itertools import repeat + +from .._internal import _missing + +if t.TYPE_CHECKING: + import typing_extensions as te + +K = t.TypeVar("K") +V = t.TypeVar("V") +T = t.TypeVar("T") +F = t.TypeVar("F", bound=cabc.Callable[..., t.Any]) + + +def _immutable_error(self: t.Any) -> t.NoReturn: + raise TypeError(f"{type(self).__name__!r} objects are immutable") + + +class ImmutableListMixin: + """Makes a :class:`list` immutable. + + .. versionadded:: 0.5 + + :private: + """ + + _hash_cache: int | None = None + + def __hash__(self) -> int: + if self._hash_cache is not None: + return self._hash_cache + rv = self._hash_cache = hash(tuple(self)) # type: ignore[arg-type] + return rv + + def __reduce_ex__(self, protocol: t.SupportsIndex) -> t.Any: + return type(self), (list(self),) # type: ignore[call-overload] + + def __delitem__(self, key: t.Any) -> t.NoReturn: + _immutable_error(self) + + def __iadd__(self, other: t.Any) -> t.NoReturn: + _immutable_error(self) + + def __imul__(self, other: t.Any) -> t.NoReturn: + _immutable_error(self) + + def __setitem__(self, key: t.Any, value: t.Any) -> t.NoReturn: + _immutable_error(self) + + def append(self, item: t.Any) -> t.NoReturn: + _immutable_error(self) + + def remove(self, item: t.Any) -> t.NoReturn: + _immutable_error(self) + + def extend(self, iterable: t.Any) -> t.NoReturn: + _immutable_error(self) + + def insert(self, pos: t.Any, value: t.Any) -> t.NoReturn: + _immutable_error(self) + + def pop(self, index: t.Any = -1) -> t.NoReturn: + _immutable_error(self) + + def reverse(self: t.Any) -> t.NoReturn: + _immutable_error(self) + + def sort(self, key: t.Any = None, reverse: t.Any = False) -> t.NoReturn: + _immutable_error(self) + + +class ImmutableDictMixin(t.Generic[K, V]): + """Makes a :class:`dict` immutable. + + .. versionchanged:: 3.1 + Disallow ``|=`` operator. + + .. versionadded:: 0.5 + + :private: + """ + + _hash_cache: int | None = None + + @classmethod + @t.overload + def fromkeys( + cls, keys: cabc.Iterable[K], value: None + ) -> ImmutableDictMixin[K, t.Any | None]: ... + @classmethod + @t.overload + def fromkeys(cls, keys: cabc.Iterable[K], value: V) -> ImmutableDictMixin[K, V]: ... + @classmethod + def fromkeys( + cls, keys: cabc.Iterable[K], value: V | None = None + ) -> ImmutableDictMixin[K, t.Any | None] | ImmutableDictMixin[K, V]: + instance = super().__new__(cls) + instance.__init__(zip(keys, repeat(value))) # type: ignore[misc] + return instance + + def __reduce_ex__(self, protocol: t.SupportsIndex) -> t.Any: + return type(self), (dict(self),) # type: ignore[call-overload] + + def _iter_hashitems(self) -> t.Iterable[t.Any]: + return self.items() # type: ignore[attr-defined,no-any-return] + + def __hash__(self) -> int: + if self._hash_cache is not None: + return self._hash_cache + rv = self._hash_cache = hash(frozenset(self._iter_hashitems())) + return rv + + def setdefault(self, key: t.Any, default: t.Any = None) -> t.NoReturn: + _immutable_error(self) + + def update(self, arg: t.Any, /, **kwargs: t.Any) -> t.NoReturn: + _immutable_error(self) + + def __ior__(self, other: t.Any) -> t.NoReturn: + _immutable_error(self) + + def pop(self, key: t.Any, default: t.Any = None) -> t.NoReturn: + _immutable_error(self) + + def popitem(self) -> t.NoReturn: + _immutable_error(self) + + def __setitem__(self, key: t.Any, value: t.Any) -> t.NoReturn: + _immutable_error(self) + + def __delitem__(self, key: t.Any) -> t.NoReturn: + _immutable_error(self) + + def clear(self) -> t.NoReturn: + _immutable_error(self) + + +class ImmutableMultiDictMixin(ImmutableDictMixin[K, V]): + """Makes a :class:`MultiDict` immutable. + + .. versionadded:: 0.5 + + :private: + """ + + def __reduce_ex__(self, protocol: t.SupportsIndex) -> t.Any: + return type(self), (list(self.items(multi=True)),) # type: ignore[attr-defined] + + def _iter_hashitems(self) -> t.Iterable[t.Any]: + return self.items(multi=True) # type: ignore[attr-defined,no-any-return] + + def add(self, key: t.Any, value: t.Any) -> t.NoReturn: + _immutable_error(self) + + def popitemlist(self) -> t.NoReturn: + _immutable_error(self) + + def poplist(self, key: t.Any) -> t.NoReturn: + _immutable_error(self) + + def setlist(self, key: t.Any, new_list: t.Any) -> t.NoReturn: + _immutable_error(self) + + def setlistdefault(self, key: t.Any, default_list: t.Any = None) -> t.NoReturn: + _immutable_error(self) + + +class ImmutableHeadersMixin: + """Makes a :class:`Headers` immutable. We do not mark them as + hashable though since the only usecase for this datastructure + in Werkzeug is a view on a mutable structure. + + .. versionchanged:: 3.1 + Disallow ``|=`` operator. + + .. versionadded:: 0.5 + + :private: + """ + + def __delitem__(self, key: t.Any, **kwargs: t.Any) -> t.NoReturn: + _immutable_error(self) + + def __setitem__(self, key: t.Any, value: t.Any) -> t.NoReturn: + _immutable_error(self) + + def set(self, key: t.Any, value: t.Any, /, **kwargs: t.Any) -> t.NoReturn: + _immutable_error(self) + + def setlist(self, key: t.Any, values: t.Any) -> t.NoReturn: + _immutable_error(self) + + def add(self, key: t.Any, value: t.Any, /, **kwargs: t.Any) -> t.NoReturn: + _immutable_error(self) + + def add_header(self, key: t.Any, value: t.Any, /, **kwargs: t.Any) -> t.NoReturn: + _immutable_error(self) + + def remove(self, key: t.Any) -> t.NoReturn: + _immutable_error(self) + + def extend(self, arg: t.Any, /, **kwargs: t.Any) -> t.NoReturn: + _immutable_error(self) + + def update(self, arg: t.Any, /, **kwargs: t.Any) -> t.NoReturn: + _immutable_error(self) + + def __ior__(self, other: t.Any) -> t.NoReturn: + _immutable_error(self) + + def insert(self, pos: t.Any, value: t.Any) -> t.NoReturn: + _immutable_error(self) + + def pop(self, key: t.Any = None, default: t.Any = _missing) -> t.NoReturn: + _immutable_error(self) + + def popitem(self) -> t.NoReturn: + _immutable_error(self) + + def setdefault(self, key: t.Any, default: t.Any) -> t.NoReturn: + _immutable_error(self) + + def setlistdefault(self, key: t.Any, default: t.Any) -> t.NoReturn: + _immutable_error(self) + + +def _always_update(f: F) -> F: + def wrapper( + self: UpdateDictMixin[t.Any, t.Any], /, *args: t.Any, **kwargs: t.Any + ) -> t.Any: + rv = f(self, *args, **kwargs) + + if self.on_update is not None: + self.on_update(self) + + return rv + + return update_wrapper(wrapper, f) # type: ignore[return-value] + + +class UpdateDictMixin(dict[K, V]): + """Makes dicts call `self.on_update` on modifications. + + .. versionchanged:: 3.1 + Implement ``|=`` operator. + + .. versionadded:: 0.5 + + :private: + """ + + on_update: cabc.Callable[[te.Self], None] | None = None + + def setdefault(self: te.Self, key: K, default: V | None = None) -> V: + modified = key not in self + rv = super().setdefault(key, default) # type: ignore[arg-type] + if modified and self.on_update is not None: + self.on_update(self) + return rv + + @t.overload + def pop(self: te.Self, key: K) -> V: ... + @t.overload + def pop(self: te.Self, key: K, default: V) -> V: ... + @t.overload + def pop(self: te.Self, key: K, default: T) -> T: ... + def pop( + self: te.Self, + key: K, + default: V | T = _missing, # type: ignore[assignment] + ) -> V | T: + modified = key in self + if default is _missing: + rv: V | T = super().pop(key) + else: + rv = super().pop(key, default) + if modified and self.on_update is not None: + self.on_update(self) + return rv + + @_always_update + def __setitem__(self, key: K, value: V) -> None: + super().__setitem__(key, value) + + @_always_update + def __delitem__(self, key: K) -> None: + super().__delitem__(key) + + @_always_update + def clear(self) -> None: + super().clear() + + @_always_update + def popitem(self) -> tuple[K, V]: + return super().popitem() + + @_always_update + def update( # type: ignore[override] + self, + arg: cabc.Mapping[K, V] | cabc.Iterable[tuple[K, V]] | None = None, + /, + **kwargs: V, + ) -> None: + if arg is None: + super().update(**kwargs) # type: ignore[call-overload] + else: + super().update(arg, **kwargs) + + @_always_update + def __ior__( # type: ignore[override] + self, other: cabc.Mapping[K, V] | cabc.Iterable[tuple[K, V]] + ) -> te.Self: + return super().__ior__(other) diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/range.py b/venv/lib/python3.11/site-packages/werkzeug/datastructures/range.py new file mode 100755 index 0000000..72f863d --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/datastructures/range.py @@ -0,0 +1,214 @@ +from __future__ import annotations + +import collections.abc as cabc +import typing as t +from datetime import datetime + +if t.TYPE_CHECKING: + import typing_extensions as te + +T = t.TypeVar("T") + + +class IfRange: + """Very simple object that represents the `If-Range` header in parsed + form. It will either have neither a etag or date or one of either but + never both. + + .. versionadded:: 0.7 + """ + + def __init__(self, etag: str | None = None, date: datetime | None = None): + #: The etag parsed and unquoted. Ranges always operate on strong + #: etags so the weakness information is not necessary. + self.etag = etag + #: The date in parsed format or `None`. + self.date = date + + def to_header(self) -> str: + """Converts the object back into an HTTP header.""" + if self.date is not None: + return http.http_date(self.date) + if self.etag is not None: + return http.quote_etag(self.etag) + return "" + + def __str__(self) -> str: + return self.to_header() + + def __repr__(self) -> str: + return f"<{type(self).__name__} {str(self)!r}>" + + +class Range: + """Represents a ``Range`` header. All methods only support only + bytes as the unit. Stores a list of ranges if given, but the methods + only work if only one range is provided. + + :raise ValueError: If the ranges provided are invalid. + + .. versionchanged:: 0.15 + The ranges passed in are validated. + + .. versionadded:: 0.7 + """ + + def __init__( + self, units: str, ranges: cabc.Sequence[tuple[int, int | None]] + ) -> None: + #: The units of this range. Usually "bytes". + self.units = units + #: A list of ``(begin, end)`` tuples for the range header provided. + #: The ranges are non-inclusive. + self.ranges = ranges + + for start, end in ranges: + if start is None or (end is not None and (start < 0 or start >= end)): + raise ValueError(f"{(start, end)} is not a valid range.") + + def range_for_length(self, length: int | None) -> tuple[int, int] | None: + """If the range is for bytes, the length is not None and there is + exactly one range and it is satisfiable it returns a ``(start, stop)`` + tuple, otherwise `None`. + """ + if self.units != "bytes" or length is None or len(self.ranges) != 1: + return None + start, end = self.ranges[0] + if end is None: + end = length + if start < 0: + start += length + if http.is_byte_range_valid(start, end, length): + return start, min(end, length) + return None + + def make_content_range(self, length: int | None) -> ContentRange | None: + """Creates a :class:`~werkzeug.datastructures.ContentRange` object + from the current range and given content length. + """ + rng = self.range_for_length(length) + if rng is not None: + return ContentRange(self.units, rng[0], rng[1], length) + return None + + def to_header(self) -> str: + """Converts the object back into an HTTP header.""" + ranges = [] + for begin, end in self.ranges: + if end is None: + ranges.append(f"{begin}-" if begin >= 0 else str(begin)) + else: + ranges.append(f"{begin}-{end - 1}") + return f"{self.units}={','.join(ranges)}" + + def to_content_range_header(self, length: int | None) -> str | None: + """Converts the object into `Content-Range` HTTP header, + based on given length + """ + range = self.range_for_length(length) + if range is not None: + return f"{self.units} {range[0]}-{range[1] - 1}/{length}" + return None + + def __str__(self) -> str: + return self.to_header() + + def __repr__(self) -> str: + return f"<{type(self).__name__} {str(self)!r}>" + + +class _CallbackProperty(t.Generic[T]): + def __set_name__(self, owner: type[ContentRange], name: str) -> None: + self.attr = f"_{name}" + + @t.overload + def __get__(self, instance: None, owner: None) -> te.Self: ... + @t.overload + def __get__(self, instance: ContentRange, owner: type[ContentRange]) -> T: ... + def __get__( + self, instance: ContentRange | None, owner: type[ContentRange] | None + ) -> te.Self | T: + if instance is None: + return self + + return instance.__dict__[self.attr] # type: ignore[no-any-return] + + def __set__(self, instance: ContentRange, value: T) -> None: + instance.__dict__[self.attr] = value + + if instance.on_update is not None: + instance.on_update(instance) + + +class ContentRange: + """Represents the content range header. + + .. versionadded:: 0.7 + """ + + def __init__( + self, + units: str | None, + start: int | None, + stop: int | None, + length: int | None = None, + on_update: cabc.Callable[[ContentRange], None] | None = None, + ) -> None: + self.on_update = on_update + self.set(start, stop, length, units) + + #: The units to use, usually "bytes" + units: str | None = _CallbackProperty() # type: ignore[assignment] + #: The start point of the range or `None`. + start: int | None = _CallbackProperty() # type: ignore[assignment] + #: The stop point of the range (non-inclusive) or `None`. Can only be + #: `None` if also start is `None`. + stop: int | None = _CallbackProperty() # type: ignore[assignment] + #: The length of the range or `None`. + length: int | None = _CallbackProperty() # type: ignore[assignment] + + def set( + self, + start: int | None, + stop: int | None, + length: int | None = None, + units: str | None = "bytes", + ) -> None: + """Simple method to update the ranges.""" + assert http.is_byte_range_valid(start, stop, length), "Bad range provided" + self._units: str | None = units + self._start: int | None = start + self._stop: int | None = stop + self._length: int | None = length + if self.on_update is not None: + self.on_update(self) + + def unset(self) -> None: + """Sets the units to `None` which indicates that the header should + no longer be used. + """ + self.set(None, None, units=None) + + def to_header(self) -> str: + if self._units is None: + return "" + if self._length is None: + length: str | int = "*" + else: + length = self._length + if self._start is None: + return f"{self._units} */{length}" + return f"{self._units} {self._start}-{self._stop - 1}/{length}" # type: ignore[operator] + + def __bool__(self) -> bool: + return self._units is not None + + def __str__(self) -> str: + return self.to_header() + + def __repr__(self) -> str: + return f"<{type(self).__name__} {str(self)!r}>" + + +# circular dependencies +from .. import http # noqa: E402 diff --git a/venv/lib/python3.11/site-packages/werkzeug/datastructures/structures.py b/venv/lib/python3.11/site-packages/werkzeug/datastructures/structures.py new file mode 100755 index 0000000..8dc6437 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/datastructures/structures.py @@ -0,0 +1,1239 @@ +from __future__ import annotations + +import collections.abc as cabc +import typing as t +from copy import deepcopy + +from .. import exceptions +from .._internal import _missing +from .mixins import ImmutableDictMixin +from .mixins import ImmutableListMixin +from .mixins import ImmutableMultiDictMixin +from .mixins import UpdateDictMixin + +if t.TYPE_CHECKING: + import typing_extensions as te + +K = t.TypeVar("K") +V = t.TypeVar("V") +T = t.TypeVar("T") + + +def iter_multi_items( + mapping: ( + MultiDict[K, V] + | cabc.Mapping[K, V | list[V] | tuple[V, ...] | set[V]] + | cabc.Iterable[tuple[K, V]] + ), +) -> cabc.Iterator[tuple[K, V]]: + """Iterates over the items of a mapping yielding keys and values + without dropping any from more complex structures. + """ + if isinstance(mapping, MultiDict): + yield from mapping.items(multi=True) + elif isinstance(mapping, cabc.Mapping): + for key, value in mapping.items(): + if isinstance(value, (list, tuple, set)): + for v in value: + yield key, v + else: + yield key, value + else: + yield from mapping + + +class ImmutableList(ImmutableListMixin, list[V]): # type: ignore[misc] + """An immutable :class:`list`. + + .. versionadded:: 0.5 + + :private: + """ + + def __repr__(self) -> str: + return f"{type(self).__name__}({list.__repr__(self)})" + + +class TypeConversionDict(dict[K, V]): + """Works like a regular dict but the :meth:`get` method can perform + type conversions. :class:`MultiDict` and :class:`CombinedMultiDict` + are subclasses of this class and provide the same feature. + + .. versionadded:: 0.5 + """ + + @t.overload # type: ignore[override] + def get(self, key: K) -> V | None: ... + @t.overload + def get(self, key: K, default: V) -> V: ... + @t.overload + def get(self, key: K, default: T) -> V | T: ... + @t.overload + def get(self, key: str, type: cabc.Callable[[V], T]) -> T | None: ... + @t.overload + def get(self, key: str, default: T, type: cabc.Callable[[V], T]) -> T: ... + def get( # type: ignore[misc] + self, + key: K, + default: V | T | None = None, + type: cabc.Callable[[V], T] | None = None, + ) -> V | T | None: + """Return the default value if the requested data doesn't exist. + If `type` is provided and is a callable it should convert the value, + return it or raise a :exc:`ValueError` if that is not possible. In + this case the function will return the default as if the value was not + found: + + >>> d = TypeConversionDict(foo='42', bar='blub') + >>> d.get('foo', type=int) + 42 + >>> d.get('bar', -1, type=int) + -1 + + :param key: The key to be looked up. + :param default: The default value to be returned if the key can't + be looked up. If not further specified `None` is + returned. + :param type: A callable that is used to cast the value in the + :class:`MultiDict`. If a :exc:`ValueError` or a + :exc:`TypeError` is raised by this callable the default + value is returned. + + .. versionchanged:: 3.0.2 + Returns the default value on :exc:`TypeError`, too. + """ + try: + rv = self[key] + except KeyError: + return default + + if type is None: + return rv + + try: + return type(rv) + except (ValueError, TypeError): + return default + + +class ImmutableTypeConversionDict(ImmutableDictMixin[K, V], TypeConversionDict[K, V]): # type: ignore[misc] + """Works like a :class:`TypeConversionDict` but does not support + modifications. + + .. versionadded:: 0.5 + """ + + def copy(self) -> TypeConversionDict[K, V]: + """Return a shallow mutable copy of this object. Keep in mind that + the standard library's :func:`copy` function is a no-op for this class + like for any other python immutable type (eg: :class:`tuple`). + """ + return TypeConversionDict(self) + + def __copy__(self) -> te.Self: + return self + + +class MultiDict(TypeConversionDict[K, V]): + """A :class:`MultiDict` is a dictionary subclass customized to deal with + multiple values for the same key which is for example used by the parsing + functions in the wrappers. This is necessary because some HTML form + elements pass multiple values for the same key. + + :class:`MultiDict` implements all standard dictionary methods. + Internally, it saves all values for a key as a list, but the standard dict + access methods will only return the first value for a key. If you want to + gain access to the other values, too, you have to use the `list` methods as + explained below. + + Basic Usage: + + >>> d = MultiDict([('a', 'b'), ('a', 'c')]) + >>> d + MultiDict([('a', 'b'), ('a', 'c')]) + >>> d['a'] + 'b' + >>> d.getlist('a') + ['b', 'c'] + >>> 'a' in d + True + + It behaves like a normal dict thus all dict functions will only return the + first value when multiple values for one key are found. + + From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a + subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will + render a page for a ``400 BAD REQUEST`` if caught in a catch-all for HTTP + exceptions. + + A :class:`MultiDict` can be constructed from an iterable of + ``(key, value)`` tuples, a dict, a :class:`MultiDict` or from Werkzeug 0.2 + onwards some keyword parameters. + + :param mapping: the initial value for the :class:`MultiDict`. Either a + regular dict, an iterable of ``(key, value)`` tuples + or `None`. + + .. versionchanged:: 3.1 + Implement ``|`` and ``|=`` operators. + """ + + def __init__( + self, + mapping: ( + MultiDict[K, V] + | cabc.Mapping[K, V | list[V] | tuple[V, ...] | set[V]] + | cabc.Iterable[tuple[K, V]] + | None + ) = None, + ) -> None: + if mapping is None: + super().__init__() + elif isinstance(mapping, MultiDict): + super().__init__((k, vs[:]) for k, vs in mapping.lists()) # type: ignore[misc] + elif isinstance(mapping, cabc.Mapping): + tmp = {} + for key, value in mapping.items(): + if isinstance(value, (list, tuple, set)): + value = list(value) + + if not value: + continue + else: + value = [value] + tmp[key] = value + super().__init__(tmp) # type: ignore[arg-type] + else: + tmp = {} + for key, value in mapping: + tmp.setdefault(key, []).append(value) + super().__init__(tmp) # type: ignore[arg-type] + + def __getstate__(self) -> t.Any: + return dict(self.lists()) + + def __setstate__(self, value: t.Any) -> None: + super().clear() + super().update(value) + + def __iter__(self) -> cabc.Iterator[K]: + # https://github.com/python/cpython/issues/87412 + # If __iter__ is not overridden, Python uses a fast path for dict(md), + # taking the data directly and getting lists of values, rather than + # calling __getitem__ and getting only the first value. + return super().__iter__() + + def __getitem__(self, key: K) -> V: + """Return the first data value for this key; + raises KeyError if not found. + + :param key: The key to be looked up. + :raise KeyError: if the key does not exist. + """ + + if key in self: + lst = super().__getitem__(key) + if len(lst) > 0: # type: ignore[arg-type] + return lst[0] # type: ignore[index,no-any-return] + raise exceptions.BadRequestKeyError(key) + + def __setitem__(self, key: K, value: V) -> None: + """Like :meth:`add` but removes an existing key first. + + :param key: the key for the value. + :param value: the value to set. + """ + super().__setitem__(key, [value]) # type: ignore[assignment] + + def add(self, key: K, value: V) -> None: + """Adds a new value for the key. + + .. versionadded:: 0.6 + + :param key: the key for the value. + :param value: the value to add. + """ + super().setdefault(key, []).append(value) # type: ignore[arg-type,attr-defined] + + @t.overload + def getlist(self, key: K) -> list[V]: ... + @t.overload + def getlist(self, key: K, type: cabc.Callable[[V], T]) -> list[T]: ... + def getlist( + self, key: K, type: cabc.Callable[[V], T] | None = None + ) -> list[V] | list[T]: + """Return the list of items for a given key. If that key is not in the + `MultiDict`, the return value will be an empty list. Just like `get`, + `getlist` accepts a `type` parameter. All items will be converted + with the callable defined there. + + :param key: The key to be looked up. + :param type: Callable to convert each value. If a ``ValueError`` or + ``TypeError`` is raised, the value is omitted. + :return: a :class:`list` of all the values for the key. + + .. versionchanged:: 3.1 + Catches ``TypeError`` in addition to ``ValueError``. + """ + try: + rv: list[V] = super().__getitem__(key) # type: ignore[assignment] + except KeyError: + return [] + if type is None: + return list(rv) + result = [] + for item in rv: + try: + result.append(type(item)) + except (ValueError, TypeError): + pass + return result + + def setlist(self, key: K, new_list: cabc.Iterable[V]) -> None: + """Remove the old values for a key and add new ones. Note that the list + you pass the values in will be shallow-copied before it is inserted in + the dictionary. + + >>> d = MultiDict() + >>> d.setlist('foo', ['1', '2']) + >>> d['foo'] + '1' + >>> d.getlist('foo') + ['1', '2'] + + :param key: The key for which the values are set. + :param new_list: An iterable with the new values for the key. Old values + are removed first. + """ + super().__setitem__(key, list(new_list)) # type: ignore[assignment] + + @t.overload + def setdefault(self, key: K) -> None: ... + @t.overload + def setdefault(self, key: K, default: V) -> V: ... + def setdefault(self, key: K, default: V | None = None) -> V | None: + """Returns the value for the key if it is in the dict, otherwise it + returns `default` and sets that value for `key`. + + :param key: The key to be looked up. + :param default: The default value to be returned if the key is not + in the dict. If not further specified it's `None`. + """ + if key not in self: + self[key] = default # type: ignore[assignment] + + return self[key] + + def setlistdefault( + self, key: K, default_list: cabc.Iterable[V] | None = None + ) -> list[V]: + """Like `setdefault` but sets multiple values. The list returned + is not a copy, but the list that is actually used internally. This + means that you can put new values into the dict by appending items + to the list: + + >>> d = MultiDict({"foo": 1}) + >>> d.setlistdefault("foo").extend([2, 3]) + >>> d.getlist("foo") + [1, 2, 3] + + :param key: The key to be looked up. + :param default_list: An iterable of default values. It is either copied + (in case it was a list) or converted into a list + before returned. + :return: a :class:`list` + """ + if key not in self: + super().__setitem__(key, list(default_list or ())) # type: ignore[assignment] + + return super().__getitem__(key) # type: ignore[return-value] + + def items(self, multi: bool = False) -> cabc.Iterable[tuple[K, V]]: # type: ignore[override] + """Return an iterator of ``(key, value)`` pairs. + + :param multi: If set to `True` the iterator returned will have a pair + for each value of each key. Otherwise it will only + contain pairs for the first value of each key. + """ + values: list[V] + + for key, values in super().items(): # type: ignore[assignment] + if multi: + for value in values: + yield key, value + else: + yield key, values[0] + + def lists(self) -> cabc.Iterable[tuple[K, list[V]]]: + """Return a iterator of ``(key, values)`` pairs, where values is the list + of all values associated with the key.""" + values: list[V] + + for key, values in super().items(): # type: ignore[assignment] + yield key, list(values) + + def values(self) -> cabc.Iterable[V]: # type: ignore[override] + """Returns an iterator of the first value on every key's value list.""" + values: list[V] + + for values in super().values(): # type: ignore[assignment] + yield values[0] + + def listvalues(self) -> cabc.Iterable[list[V]]: + """Return an iterator of all values associated with a key. Zipping + :meth:`keys` and this is the same as calling :meth:`lists`: + + >>> d = MultiDict({"foo": [1, 2, 3]}) + >>> zip(d.keys(), d.listvalues()) == d.lists() + True + """ + return super().values() # type: ignore[return-value] + + def copy(self) -> te.Self: + """Return a shallow copy of this object.""" + return self.__class__(self) + + def deepcopy(self, memo: t.Any = None) -> te.Self: + """Return a deep copy of this object.""" + return self.__class__(deepcopy(self.to_dict(flat=False), memo)) + + @t.overload + def to_dict(self, flat: t.Literal[True] = ...) -> dict[K, V]: ... + @t.overload + def to_dict(self, flat: t.Literal[False]) -> dict[K, list[V]]: ... + def to_dict(self, flat: bool = True) -> dict[K, V] | dict[K, list[V]]: + """Return the contents as regular dict. If `flat` is `True` the + returned dict will only have the first item present, if `flat` is + `False` all values will be returned as lists. + + :param flat: If set to `False` the dict returned will have lists + with all the values in it. Otherwise it will only + contain the first value for each key. + :return: a :class:`dict` + """ + if flat: + return dict(self.items()) + return dict(self.lists()) + + def update( # type: ignore[override] + self, + mapping: ( + MultiDict[K, V] + | cabc.Mapping[K, V | list[V] | tuple[V, ...] | set[V]] + | cabc.Iterable[tuple[K, V]] + ), + ) -> None: + """update() extends rather than replaces existing key lists: + + >>> a = MultiDict({'x': 1}) + >>> b = MultiDict({'x': 2, 'y': 3}) + >>> a.update(b) + >>> a + MultiDict([('y', 3), ('x', 1), ('x', 2)]) + + If the value list for a key in ``other_dict`` is empty, no new values + will be added to the dict and the key will not be created: + + >>> x = {'empty_list': []} + >>> y = MultiDict() + >>> y.update(x) + >>> y + MultiDict([]) + """ + for key, value in iter_multi_items(mapping): + self.add(key, value) + + def __or__( # type: ignore[override] + self, other: cabc.Mapping[K, V | list[V] | tuple[V, ...] | set[V]] + ) -> MultiDict[K, V]: + if not isinstance(other, cabc.Mapping): + return NotImplemented + + rv = self.copy() + rv.update(other) + return rv + + def __ior__( # type: ignore[override] + self, + other: ( + cabc.Mapping[K, V | list[V] | tuple[V, ...] | set[V]] + | cabc.Iterable[tuple[K, V]] + ), + ) -> te.Self: + if not isinstance(other, (cabc.Mapping, cabc.Iterable)): + return NotImplemented + + self.update(other) + return self + + @t.overload + def pop(self, key: K) -> V: ... + @t.overload + def pop(self, key: K, default: V) -> V: ... + @t.overload + def pop(self, key: K, default: T) -> V | T: ... + def pop( + self, + key: K, + default: V | T = _missing, # type: ignore[assignment] + ) -> V | T: + """Pop the first item for a list on the dict. Afterwards the + key is removed from the dict, so additional values are discarded: + + >>> d = MultiDict({"foo": [1, 2, 3]}) + >>> d.pop("foo") + 1 + >>> "foo" in d + False + + :param key: the key to pop. + :param default: if provided the value to return if the key was + not in the dictionary. + """ + lst: list[V] + + try: + lst = super().pop(key) # type: ignore[assignment] + + if len(lst) == 0: + raise exceptions.BadRequestKeyError(key) + + return lst[0] + except KeyError: + if default is not _missing: + return default + + raise exceptions.BadRequestKeyError(key) from None + + def popitem(self) -> tuple[K, V]: + """Pop an item from the dict.""" + item: tuple[K, list[V]] + + try: + item = super().popitem() # type: ignore[assignment] + + if len(item[1]) == 0: + raise exceptions.BadRequestKeyError(item[0]) + + return item[0], item[1][0] + except KeyError as e: + raise exceptions.BadRequestKeyError(e.args[0]) from None + + def poplist(self, key: K) -> list[V]: + """Pop the list for a key from the dict. If the key is not in the dict + an empty list is returned. + + .. versionchanged:: 0.5 + If the key does no longer exist a list is returned instead of + raising an error. + """ + return super().pop(key, []) # type: ignore[return-value] + + def popitemlist(self) -> tuple[K, list[V]]: + """Pop a ``(key, list)`` tuple from the dict.""" + try: + return super().popitem() # type: ignore[return-value] + except KeyError as e: + raise exceptions.BadRequestKeyError(e.args[0]) from None + + def __copy__(self) -> te.Self: + return self.copy() + + def __deepcopy__(self, memo: t.Any) -> te.Self: + return self.deepcopy(memo=memo) + + def __repr__(self) -> str: + return f"{type(self).__name__}({list(self.items(multi=True))!r})" + + +class _omd_bucket(t.Generic[K, V]): + """Wraps values in the :class:`OrderedMultiDict`. This makes it + possible to keep an order over multiple different keys. It requires + a lot of extra memory and slows down access a lot, but makes it + possible to access elements in O(1) and iterate in O(n). + """ + + __slots__ = ("prev", "key", "value", "next") + + def __init__(self, omd: _OrderedMultiDict[K, V], key: K, value: V) -> None: + self.prev: _omd_bucket[K, V] | None = omd._last_bucket + self.key: K = key + self.value: V = value + self.next: _omd_bucket[K, V] | None = None + + if omd._first_bucket is None: + omd._first_bucket = self + if omd._last_bucket is not None: + omd._last_bucket.next = self + omd._last_bucket = self + + def unlink(self, omd: _OrderedMultiDict[K, V]) -> None: + if self.prev: + self.prev.next = self.next + if self.next: + self.next.prev = self.prev + if omd._first_bucket is self: + omd._first_bucket = self.next + if omd._last_bucket is self: + omd._last_bucket = self.prev + + +class _OrderedMultiDict(MultiDict[K, V]): + """Works like a regular :class:`MultiDict` but preserves the + order of the fields. To convert the ordered multi dict into a + list you can use the :meth:`items` method and pass it ``multi=True``. + + In general an :class:`OrderedMultiDict` is an order of magnitude + slower than a :class:`MultiDict`. + + .. admonition:: note + + Due to a limitation in Python you cannot convert an ordered + multi dict into a regular dict by using ``dict(multidict)``. + Instead you have to use the :meth:`to_dict` method, otherwise + the internal bucket objects are exposed. + + .. deprecated:: 3.1 + Will be removed in Werkzeug 3.2. Use ``MultiDict`` instead. + """ + + def __init__( + self, + mapping: ( + MultiDict[K, V] + | cabc.Mapping[K, V | list[V] | tuple[V, ...] | set[V]] + | cabc.Iterable[tuple[K, V]] + | None + ) = None, + ) -> None: + import warnings + + warnings.warn( + "'OrderedMultiDict' is deprecated and will be removed in Werkzeug" + " 3.2. Use 'MultiDict' instead.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__() + self._first_bucket: _omd_bucket[K, V] | None = None + self._last_bucket: _omd_bucket[K, V] | None = None + if mapping is not None: + self.update(mapping) + + def __eq__(self, other: object) -> bool: + if not isinstance(other, MultiDict): + return NotImplemented + if isinstance(other, _OrderedMultiDict): + iter1 = iter(self.items(multi=True)) + iter2 = iter(other.items(multi=True)) + try: + for k1, v1 in iter1: + k2, v2 = next(iter2) + if k1 != k2 or v1 != v2: + return False + except StopIteration: + return False + try: + next(iter2) + except StopIteration: + return True + return False + if len(self) != len(other): + return False + for key, values in self.lists(): + if other.getlist(key) != values: + return False + return True + + __hash__ = None # type: ignore[assignment] + + def __reduce_ex__(self, protocol: t.SupportsIndex) -> t.Any: + return type(self), (list(self.items(multi=True)),) + + def __getstate__(self) -> t.Any: + return list(self.items(multi=True)) + + def __setstate__(self, values: t.Any) -> None: + self.clear() + + for key, value in values: + self.add(key, value) + + def __getitem__(self, key: K) -> V: + if key in self: + return dict.__getitem__(self, key)[0].value # type: ignore[index,no-any-return] + raise exceptions.BadRequestKeyError(key) + + def __setitem__(self, key: K, value: V) -> None: + self.poplist(key) + self.add(key, value) + + def __delitem__(self, key: K) -> None: + self.pop(key) + + def keys(self) -> cabc.Iterable[K]: # type: ignore[override] + return (key for key, _ in self.items()) + + def __iter__(self) -> cabc.Iterator[K]: + return iter(self.keys()) + + def values(self) -> cabc.Iterable[V]: # type: ignore[override] + return (value for key, value in self.items()) + + def items(self, multi: bool = False) -> cabc.Iterable[tuple[K, V]]: # type: ignore[override] + ptr = self._first_bucket + if multi: + while ptr is not None: + yield ptr.key, ptr.value + ptr = ptr.next + else: + returned_keys = set() + while ptr is not None: + if ptr.key not in returned_keys: + returned_keys.add(ptr.key) + yield ptr.key, ptr.value + ptr = ptr.next + + def lists(self) -> cabc.Iterable[tuple[K, list[V]]]: + returned_keys = set() + ptr = self._first_bucket + while ptr is not None: + if ptr.key not in returned_keys: + yield ptr.key, self.getlist(ptr.key) + returned_keys.add(ptr.key) + ptr = ptr.next + + def listvalues(self) -> cabc.Iterable[list[V]]: + for _key, values in self.lists(): + yield values + + def add(self, key: K, value: V) -> None: + dict.setdefault(self, key, []).append(_omd_bucket(self, key, value)) # type: ignore[misc] + + @t.overload + def getlist(self, key: K) -> list[V]: ... + @t.overload + def getlist(self, key: K, type: cabc.Callable[[V], T]) -> list[T]: ... + def getlist( + self, key: K, type: cabc.Callable[[V], T] | None = None + ) -> list[V] | list[T]: + rv: list[_omd_bucket[K, V]] + + try: + rv = dict.__getitem__(self, key) # type: ignore[index] + except KeyError: + return [] + if type is None: + return [x.value for x in rv] + result = [] + for item in rv: + try: + result.append(type(item.value)) + except (ValueError, TypeError): + pass + return result + + def setlist(self, key: K, new_list: cabc.Iterable[V]) -> None: + self.poplist(key) + for value in new_list: + self.add(key, value) + + def setlistdefault(self, key: t.Any, default_list: t.Any = None) -> t.NoReturn: + raise TypeError("setlistdefault is unsupported for ordered multi dicts") + + def update( # type: ignore[override] + self, + mapping: ( + MultiDict[K, V] + | cabc.Mapping[K, V | list[V] | tuple[V, ...] | set[V]] + | cabc.Iterable[tuple[K, V]] + ), + ) -> None: + for key, value in iter_multi_items(mapping): + self.add(key, value) + + def poplist(self, key: K) -> list[V]: + buckets: cabc.Iterable[_omd_bucket[K, V]] = dict.pop(self, key, ()) # type: ignore[arg-type] + for bucket in buckets: + bucket.unlink(self) + return [x.value for x in buckets] + + @t.overload + def pop(self, key: K) -> V: ... + @t.overload + def pop(self, key: K, default: V) -> V: ... + @t.overload + def pop(self, key: K, default: T) -> V | T: ... + def pop( + self, + key: K, + default: V | T = _missing, # type: ignore[assignment] + ) -> V | T: + buckets: list[_omd_bucket[K, V]] + + try: + buckets = dict.pop(self, key) # type: ignore[arg-type] + except KeyError: + if default is not _missing: + return default + + raise exceptions.BadRequestKeyError(key) from None + + for bucket in buckets: + bucket.unlink(self) + + return buckets[0].value + + def popitem(self) -> tuple[K, V]: + key: K + buckets: list[_omd_bucket[K, V]] + + try: + key, buckets = dict.popitem(self) # type: ignore[arg-type] + except KeyError as e: + raise exceptions.BadRequestKeyError(e.args[0]) from None + + for bucket in buckets: + bucket.unlink(self) + + return key, buckets[0].value + + def popitemlist(self) -> tuple[K, list[V]]: + key: K + buckets: list[_omd_bucket[K, V]] + + try: + key, buckets = dict.popitem(self) # type: ignore[arg-type] + except KeyError as e: + raise exceptions.BadRequestKeyError(e.args[0]) from None + + for bucket in buckets: + bucket.unlink(self) + + return key, [x.value for x in buckets] + + +class CombinedMultiDict(ImmutableMultiDictMixin[K, V], MultiDict[K, V]): # type: ignore[misc] + """A read only :class:`MultiDict` that you can pass multiple :class:`MultiDict` + instances as sequence and it will combine the return values of all wrapped + dicts: + + >>> from werkzeug.datastructures import CombinedMultiDict, MultiDict + >>> post = MultiDict([('foo', 'bar')]) + >>> get = MultiDict([('blub', 'blah')]) + >>> combined = CombinedMultiDict([get, post]) + >>> combined['foo'] + 'bar' + >>> combined['blub'] + 'blah' + + This works for all read operations and will raise a `TypeError` for + methods that usually change data which isn't possible. + + From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a + subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will + render a page for a ``400 BAD REQUEST`` if caught in a catch-all for HTTP + exceptions. + """ + + def __reduce_ex__(self, protocol: t.SupportsIndex) -> t.Any: + return type(self), (self.dicts,) + + def __init__(self, dicts: cabc.Iterable[MultiDict[K, V]] | None = None) -> None: + super().__init__() + self.dicts: list[MultiDict[K, V]] = list(dicts or ()) + + @classmethod + def fromkeys(cls, keys: t.Any, value: t.Any = None) -> t.NoReturn: + raise TypeError(f"cannot create {cls.__name__!r} instances by fromkeys") + + def __getitem__(self, key: K) -> V: + for d in self.dicts: + if key in d: + return d[key] + raise exceptions.BadRequestKeyError(key) + + @t.overload # type: ignore[override] + def get(self, key: K) -> V | None: ... + @t.overload + def get(self, key: K, default: V) -> V: ... + @t.overload + def get(self, key: K, default: T) -> V | T: ... + @t.overload + def get(self, key: str, type: cabc.Callable[[V], T]) -> T | None: ... + @t.overload + def get(self, key: str, default: T, type: cabc.Callable[[V], T]) -> T: ... + def get( # type: ignore[misc] + self, + key: K, + default: V | T | None = None, + type: cabc.Callable[[V], T] | None = None, + ) -> V | T | None: + for d in self.dicts: + if key in d: + if type is not None: + try: + return type(d[key]) + except (ValueError, TypeError): + continue + return d[key] + return default + + @t.overload + def getlist(self, key: K) -> list[V]: ... + @t.overload + def getlist(self, key: K, type: cabc.Callable[[V], T]) -> list[T]: ... + def getlist( + self, key: K, type: cabc.Callable[[V], T] | None = None + ) -> list[V] | list[T]: + rv = [] + for d in self.dicts: + rv.extend(d.getlist(key, type)) # type: ignore[arg-type] + return rv + + def _keys_impl(self) -> set[K]: + """This function exists so __len__ can be implemented more efficiently, + saving one list creation from an iterator. + """ + return set(k for d in self.dicts for k in d) + + def keys(self) -> cabc.Iterable[K]: # type: ignore[override] + return self._keys_impl() + + def __iter__(self) -> cabc.Iterator[K]: + return iter(self._keys_impl()) + + @t.overload # type: ignore[override] + def items(self) -> cabc.Iterable[tuple[K, V]]: ... + @t.overload + def items(self, multi: t.Literal[True]) -> cabc.Iterable[tuple[K, list[V]]]: ... + def items( + self, multi: bool = False + ) -> cabc.Iterable[tuple[K, V]] | cabc.Iterable[tuple[K, list[V]]]: + found = set() + for d in self.dicts: + for key, value in d.items(multi): + if multi: + yield key, value + elif key not in found: + found.add(key) + yield key, value + + def values(self) -> cabc.Iterable[V]: # type: ignore[override] + for _, value in self.items(): + yield value + + def lists(self) -> cabc.Iterable[tuple[K, list[V]]]: + rv: dict[K, list[V]] = {} + for d in self.dicts: + for key, values in d.lists(): + rv.setdefault(key, []).extend(values) + return rv.items() + + def listvalues(self) -> cabc.Iterable[list[V]]: + return (x[1] for x in self.lists()) + + def copy(self) -> MultiDict[K, V]: # type: ignore[override] + """Return a shallow mutable copy of this object. + + This returns a :class:`MultiDict` representing the data at the + time of copying. The copy will no longer reflect changes to the + wrapped dicts. + + .. versionchanged:: 0.15 + Return a mutable :class:`MultiDict`. + """ + return MultiDict(self) + + def __len__(self) -> int: + return len(self._keys_impl()) + + def __contains__(self, key: K) -> bool: # type: ignore[override] + for d in self.dicts: + if key in d: + return True + return False + + def __repr__(self) -> str: + return f"{type(self).__name__}({self.dicts!r})" + + +class ImmutableDict(ImmutableDictMixin[K, V], dict[K, V]): # type: ignore[misc] + """An immutable :class:`dict`. + + .. versionadded:: 0.5 + """ + + def __repr__(self) -> str: + return f"{type(self).__name__}({dict.__repr__(self)})" + + def copy(self) -> dict[K, V]: + """Return a shallow mutable copy of this object. Keep in mind that + the standard library's :func:`copy` function is a no-op for this class + like for any other python immutable type (eg: :class:`tuple`). + """ + return dict(self) + + def __copy__(self) -> te.Self: + return self + + +class ImmutableMultiDict(ImmutableMultiDictMixin[K, V], MultiDict[K, V]): # type: ignore[misc] + """An immutable :class:`MultiDict`. + + .. versionadded:: 0.5 + """ + + def copy(self) -> MultiDict[K, V]: # type: ignore[override] + """Return a shallow mutable copy of this object. Keep in mind that + the standard library's :func:`copy` function is a no-op for this class + like for any other python immutable type (eg: :class:`tuple`). + """ + return MultiDict(self) + + def __copy__(self) -> te.Self: + return self + + +class _ImmutableOrderedMultiDict( # type: ignore[misc] + ImmutableMultiDictMixin[K, V], _OrderedMultiDict[K, V] +): + """An immutable :class:`OrderedMultiDict`. + + .. deprecated:: 3.1 + Will be removed in Werkzeug 3.2. Use ``ImmutableMultiDict`` instead. + + .. versionadded:: 0.6 + """ + + def __init__( + self, + mapping: ( + MultiDict[K, V] + | cabc.Mapping[K, V | list[V] | tuple[V, ...] | set[V]] + | cabc.Iterable[tuple[K, V]] + | None + ) = None, + ) -> None: + super().__init__() + + if mapping is not None: + for k, v in iter_multi_items(mapping): + _OrderedMultiDict.add(self, k, v) + + def _iter_hashitems(self) -> cabc.Iterable[t.Any]: + return enumerate(self.items(multi=True)) + + def copy(self) -> _OrderedMultiDict[K, V]: # type: ignore[override] + """Return a shallow mutable copy of this object. Keep in mind that + the standard library's :func:`copy` function is a no-op for this class + like for any other python immutable type (eg: :class:`tuple`). + """ + return _OrderedMultiDict(self) + + def __copy__(self) -> te.Self: + return self + + +class CallbackDict(UpdateDictMixin[K, V], dict[K, V]): + """A dict that calls a function passed every time something is changed. + The function is passed the dict instance. + """ + + def __init__( + self, + initial: cabc.Mapping[K, V] | cabc.Iterable[tuple[K, V]] | None = None, + on_update: cabc.Callable[[te.Self], None] | None = None, + ) -> None: + if initial is None: + super().__init__() + else: + super().__init__(initial) + + self.on_update = on_update + + def __repr__(self) -> str: + return f"<{type(self).__name__} {super().__repr__()}>" + + +class HeaderSet(cabc.MutableSet[str]): + """Similar to the :class:`ETags` class this implements a set-like structure. + Unlike :class:`ETags` this is case insensitive and used for vary, allow, and + content-language headers. + + If not constructed using the :func:`parse_set_header` function the + instantiation works like this: + + >>> hs = HeaderSet(['foo', 'bar', 'baz']) + >>> hs + HeaderSet(['foo', 'bar', 'baz']) + """ + + def __init__( + self, + headers: cabc.Iterable[str] | None = None, + on_update: cabc.Callable[[te.Self], None] | None = None, + ) -> None: + self._headers = list(headers or ()) + self._set = {x.lower() for x in self._headers} + self.on_update = on_update + + def add(self, header: str) -> None: + """Add a new header to the set.""" + self.update((header,)) + + def remove(self: te.Self, header: str) -> None: + """Remove a header from the set. This raises an :exc:`KeyError` if the + header is not in the set. + + .. versionchanged:: 0.5 + In older versions a :exc:`IndexError` was raised instead of a + :exc:`KeyError` if the object was missing. + + :param header: the header to be removed. + """ + key = header.lower() + if key not in self._set: + raise KeyError(header) + self._set.remove(key) + for idx, key in enumerate(self._headers): + if key.lower() == header: + del self._headers[idx] + break + if self.on_update is not None: + self.on_update(self) + + def update(self: te.Self, iterable: cabc.Iterable[str]) -> None: + """Add all the headers from the iterable to the set. + + :param iterable: updates the set with the items from the iterable. + """ + inserted_any = False + for header in iterable: + key = header.lower() + if key not in self._set: + self._headers.append(header) + self._set.add(key) + inserted_any = True + if inserted_any and self.on_update is not None: + self.on_update(self) + + def discard(self, header: str) -> None: + """Like :meth:`remove` but ignores errors. + + :param header: the header to be discarded. + """ + try: + self.remove(header) + except KeyError: + pass + + def find(self, header: str) -> int: + """Return the index of the header in the set or return -1 if not found. + + :param header: the header to be looked up. + """ + header = header.lower() + for idx, item in enumerate(self._headers): + if item.lower() == header: + return idx + return -1 + + def index(self, header: str) -> int: + """Return the index of the header in the set or raise an + :exc:`IndexError`. + + :param header: the header to be looked up. + """ + rv = self.find(header) + if rv < 0: + raise IndexError(header) + return rv + + def clear(self: te.Self) -> None: + """Clear the set.""" + self._set.clear() + self._headers.clear() + + if self.on_update is not None: + self.on_update(self) + + def as_set(self, preserve_casing: bool = False) -> set[str]: + """Return the set as real python set type. When calling this, all + the items are converted to lowercase and the ordering is lost. + + :param preserve_casing: if set to `True` the items in the set returned + will have the original case like in the + :class:`HeaderSet`, otherwise they will + be lowercase. + """ + if preserve_casing: + return set(self._headers) + return set(self._set) + + def to_header(self) -> str: + """Convert the header set into an HTTP header string.""" + return ", ".join(map(http.quote_header_value, self._headers)) + + def __getitem__(self, idx: t.SupportsIndex) -> str: + return self._headers[idx] + + def __delitem__(self: te.Self, idx: t.SupportsIndex) -> None: + rv = self._headers.pop(idx) + self._set.remove(rv.lower()) + if self.on_update is not None: + self.on_update(self) + + def __setitem__(self: te.Self, idx: t.SupportsIndex, value: str) -> None: + old = self._headers[idx] + self._set.remove(old.lower()) + self._headers[idx] = value + self._set.add(value.lower()) + if self.on_update is not None: + self.on_update(self) + + def __contains__(self, header: str) -> bool: # type: ignore[override] + return header.lower() in self._set + + def __len__(self) -> int: + return len(self._set) + + def __iter__(self) -> cabc.Iterator[str]: + return iter(self._headers) + + def __bool__(self) -> bool: + return bool(self._set) + + def __str__(self) -> str: + return self.to_header() + + def __repr__(self) -> str: + return f"{type(self).__name__}({self._headers!r})" + + +# circular dependencies +from .. import http # noqa: E402 + + +def __getattr__(name: str) -> t.Any: + import warnings + + if name == "OrderedMultiDict": + warnings.warn( + "'OrderedMultiDict' is deprecated and will be removed in Werkzeug" + " 3.2. Use 'MultiDict' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _OrderedMultiDict + + if name == "ImmutableOrderedMultiDict": + warnings.warn( + "'ImmutableOrderedMultiDict' is deprecated and will be removed in" + " Werkzeug 3.2. Use 'ImmutableMultiDict' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _ImmutableOrderedMultiDict + + raise AttributeError(name) diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/__init__.py b/venv/lib/python3.11/site-packages/werkzeug/debug/__init__.py new file mode 100755 index 0000000..17cd4b2 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/debug/__init__.py @@ -0,0 +1,574 @@ +from __future__ import annotations + +import getpass +import hashlib +import json +import os +import pkgutil +import re +import sys +import time +import typing as t +import uuid +from contextlib import ExitStack +from io import BytesIO +from itertools import chain +from multiprocessing import Value +from os.path import basename +from os.path import join +from zlib import adler32 + +from .._internal import _log +from ..exceptions import NotFound +from ..exceptions import SecurityError +from ..http import parse_cookie +from ..sansio.utils import host_is_trusted +from ..security import gen_salt +from ..utils import send_file +from ..wrappers.request import Request +from ..wrappers.response import Response +from .console import Console +from .tbtools import DebugFrameSummary +from .tbtools import DebugTraceback +from .tbtools import render_console_html + +if t.TYPE_CHECKING: + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + +# A week +PIN_TIME = 60 * 60 * 24 * 7 + + +def hash_pin(pin: str) -> str: + return hashlib.sha1(f"{pin} added salt".encode("utf-8", "replace")).hexdigest()[:12] + + +_machine_id: str | bytes | None = None + + +def get_machine_id() -> str | bytes | None: + global _machine_id + + if _machine_id is not None: + return _machine_id + + def _generate() -> str | bytes | None: + linux = b"" + + # machine-id is stable across boots, boot_id is not. + for filename in "/etc/machine-id", "/proc/sys/kernel/random/boot_id": + try: + with open(filename, "rb") as f: + value = f.readline().strip() + except OSError: + continue + + if value: + linux += value + break + + # Containers share the same machine id, add some cgroup + # information. This is used outside containers too but should be + # relatively stable across boots. + try: + with open("/proc/self/cgroup", "rb") as f: + linux += f.readline().strip().rpartition(b"/")[2] + except OSError: + pass + + if linux: + return linux + + # On OS X, use ioreg to get the computer's serial number. + try: + # subprocess may not be available, e.g. Google App Engine + # https://github.com/pallets/werkzeug/issues/925 + from subprocess import PIPE + from subprocess import Popen + + dump = Popen( + ["ioreg", "-c", "IOPlatformExpertDevice", "-d", "2"], stdout=PIPE + ).communicate()[0] + match = re.search(b'"serial-number" = <([^>]+)', dump) + + if match is not None: + return match.group(1) + except (OSError, ImportError): + pass + + # On Windows, use winreg to get the machine guid. + if sys.platform == "win32": + import winreg + + try: + with winreg.OpenKey( + winreg.HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Cryptography", + 0, + winreg.KEY_READ | winreg.KEY_WOW64_64KEY, + ) as rk: + guid: str | bytes + guid_type: int + guid, guid_type = winreg.QueryValueEx(rk, "MachineGuid") + + if guid_type == winreg.REG_SZ: + return guid.encode() + + return guid + except OSError: + pass + + return None + + _machine_id = _generate() + return _machine_id + + +class _ConsoleFrame: + """Helper class so that we can reuse the frame console code for the + standalone console. + """ + + def __init__(self, namespace: dict[str, t.Any]): + self.console = Console(namespace) + self.id = 0 + + def eval(self, code: str) -> t.Any: + return self.console.eval(code) + + +def get_pin_and_cookie_name( + app: WSGIApplication, +) -> tuple[str, str] | tuple[None, None]: + """Given an application object this returns a semi-stable 9 digit pin + code and a random key. The hope is that this is stable between + restarts to not make debugging particularly frustrating. If the pin + was forcefully disabled this returns `None`. + + Second item in the resulting tuple is the cookie name for remembering. + """ + pin = os.environ.get("WERKZEUG_DEBUG_PIN") + rv = None + num = None + + # Pin was explicitly disabled + if pin == "off": + return None, None + + # Pin was provided explicitly + if pin is not None and pin.replace("-", "").isdecimal(): + # If there are separators in the pin, return it directly + if "-" in pin: + rv = pin + else: + num = pin + + modname = getattr(app, "__module__", t.cast(object, app).__class__.__module__) + username: str | None + + try: + # getuser imports the pwd module, which does not exist in Google + # App Engine. It may also raise a KeyError if the UID does not + # have a username, such as in Docker. + username = getpass.getuser() + # Python >= 3.13 only raises OSError + except (ImportError, KeyError, OSError): + username = None + + mod = sys.modules.get(modname) + + # This information only exists to make the cookie unique on the + # computer, not as a security feature. + probably_public_bits = [ + username, + modname, + getattr(app, "__name__", type(app).__name__), + getattr(mod, "__file__", None), + ] + + # This information is here to make it harder for an attacker to + # guess the cookie name. They are unlikely to be contained anywhere + # within the unauthenticated debug page. + private_bits = [str(uuid.getnode()), get_machine_id()] + + h = hashlib.sha1() + for bit in chain(probably_public_bits, private_bits): + if not bit: + continue + if isinstance(bit, str): + bit = bit.encode() + h.update(bit) + h.update(b"cookiesalt") + + cookie_name = f"__wzd{h.hexdigest()[:20]}" + + # If we need to generate a pin we salt it a bit more so that we don't + # end up with the same value and generate out 9 digits + if num is None: + h.update(b"pinsalt") + num = f"{int(h.hexdigest(), 16):09d}"[:9] + + # Format the pincode in groups of digits for easier remembering if + # we don't have a result yet. + if rv is None: + for group_size in 5, 4, 3: + if len(num) % group_size == 0: + rv = "-".join( + num[x : x + group_size].rjust(group_size, "0") + for x in range(0, len(num), group_size) + ) + break + else: + rv = num + + return rv, cookie_name + + +class DebuggedApplication: + """Enables debugging support for a given application:: + + from werkzeug.debug import DebuggedApplication + from myapp import app + app = DebuggedApplication(app, evalex=True) + + The ``evalex`` argument allows evaluating expressions in any frame + of a traceback. This works by preserving each frame with its local + state. Some state, such as context globals, cannot be restored with + the frame by default. When ``evalex`` is enabled, + ``environ["werkzeug.debug.preserve_context"]`` will be a callable + that takes a context manager, and can be called multiple times. + Each context manager will be entered before evaluating code in the + frame, then exited again, so they can perform setup and cleanup for + each call. + + :param app: the WSGI application to run debugged. + :param evalex: enable exception evaluation feature (interactive + debugging). This requires a non-forking server. + :param request_key: The key that points to the request object in this + environment. This parameter is ignored in current + versions. + :param console_path: the URL for a general purpose console. + :param console_init_func: the function that is executed before starting + the general purpose console. The return value + is used as initial namespace. + :param show_hidden_frames: by default hidden traceback frames are skipped. + You can show them by setting this parameter + to `True`. + :param pin_security: can be used to disable the pin based security system. + :param pin_logging: enables the logging of the pin system. + + .. versionchanged:: 2.2 + Added the ``werkzeug.debug.preserve_context`` environ key. + """ + + _pin: str | None + _pin_cookie: str + + def __init__( + self, + app: WSGIApplication, + evalex: bool = False, + request_key: str = "werkzeug.request", + console_path: str = "/console", + console_init_func: t.Callable[[], dict[str, t.Any]] | None = None, + show_hidden_frames: bool = False, + pin_security: bool = True, + pin_logging: bool = True, + ) -> None: + if not console_init_func: + console_init_func = None + self.app = app + self.evalex = evalex + self.frames: dict[int, DebugFrameSummary | _ConsoleFrame] = {} + self.frame_contexts: dict[int, list[t.ContextManager[None]]] = {} + self.request_key = request_key + self.console_path = console_path + self.console_init_func = console_init_func + self.show_hidden_frames = show_hidden_frames + self.secret = gen_salt(20) + self._failed_pin_auth = Value("B") + + self.pin_logging = pin_logging + if pin_security: + # Print out the pin for the debugger on standard out. + if os.environ.get("WERKZEUG_RUN_MAIN") == "true" and pin_logging: + _log("warning", " * Debugger is active!") + if self.pin is None: + _log("warning", " * Debugger PIN disabled. DEBUGGER UNSECURED!") + else: + _log("info", " * Debugger PIN: %s", self.pin) + else: + self.pin = None + + self.trusted_hosts: list[str] = [".localhost", "127.0.0.1"] + """List of domains to allow requests to the debugger from. A leading dot + allows all subdomains. This only allows ``".localhost"`` domains by + default. + + .. versionadded:: 3.0.3 + """ + + @property + def pin(self) -> str | None: + if not hasattr(self, "_pin"): + pin_cookie = get_pin_and_cookie_name(self.app) + self._pin, self._pin_cookie = pin_cookie # type: ignore + return self._pin + + @pin.setter + def pin(self, value: str | None) -> None: + if value is None: + # Set _pin to None explicitly to prevent regeneration by the getter + self._pin = None + else: + self._pin = value + + @property + def pin_cookie_name(self) -> str: + """The name of the pin cookie.""" + if not hasattr(self, "_pin_cookie"): + pin_cookie = get_pin_and_cookie_name(self.app) + self._pin, self._pin_cookie = pin_cookie # type: ignore + return self._pin_cookie + + def debug_application( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> t.Iterator[bytes]: + """Run the application and conserve the traceback frames.""" + contexts: list[t.ContextManager[t.Any]] = [] + + if self.evalex: + environ["werkzeug.debug.preserve_context"] = contexts.append + + app_iter = None + try: + app_iter = self.app(environ, start_response) + yield from app_iter + if hasattr(app_iter, "close"): + app_iter.close() + except Exception as e: + if hasattr(app_iter, "close"): + app_iter.close() # type: ignore + + tb = DebugTraceback(e, skip=1, hide=not self.show_hidden_frames) + + for frame in tb.all_frames: + self.frames[id(frame)] = frame + self.frame_contexts[id(frame)] = contexts + + is_trusted = bool(self.check_pin_trust(environ)) + html = tb.render_debugger_html( + evalex=self.evalex and self.check_host_trust(environ), + secret=self.secret, + evalex_trusted=is_trusted, + ) + response = Response(html, status=500, mimetype="text/html") + + try: + yield from response(environ, start_response) + except Exception: + # if we end up here there has been output but an error + # occurred. in that situation we can do nothing fancy any + # more, better log something into the error log and fall + # back gracefully. + environ["wsgi.errors"].write( + "Debugging middleware caught exception in streamed " + "response at a point where response headers were already " + "sent.\n" + ) + + environ["wsgi.errors"].write("".join(tb.render_traceback_text())) + + def execute_command( + self, + request: Request, + command: str, + frame: DebugFrameSummary | _ConsoleFrame, + ) -> Response: + """Execute a command in a console.""" + if not self.check_host_trust(request.environ): + return SecurityError() # type: ignore[return-value] + + contexts = self.frame_contexts.get(id(frame), []) + + with ExitStack() as exit_stack: + for cm in contexts: + exit_stack.enter_context(cm) + + return Response(frame.eval(command), mimetype="text/html") + + def display_console(self, request: Request) -> Response: + """Display a standalone shell.""" + if not self.check_host_trust(request.environ): + return SecurityError() # type: ignore[return-value] + + if 0 not in self.frames: + if self.console_init_func is None: + ns = {} + else: + ns = dict(self.console_init_func()) + ns.setdefault("app", self.app) + self.frames[0] = _ConsoleFrame(ns) + is_trusted = bool(self.check_pin_trust(request.environ)) + return Response( + render_console_html(secret=self.secret, evalex_trusted=is_trusted), + mimetype="text/html", + ) + + def get_resource(self, request: Request, filename: str) -> Response: + """Return a static resource from the shared folder.""" + path = join("shared", basename(filename)) + + try: + data = pkgutil.get_data(__package__, path) + except OSError: + return NotFound() # type: ignore[return-value] + else: + if data is None: + return NotFound() # type: ignore[return-value] + + etag = str(adler32(data) & 0xFFFFFFFF) + return send_file( + BytesIO(data), request.environ, download_name=filename, etag=etag + ) + + def check_pin_trust(self, environ: WSGIEnvironment) -> bool | None: + """Checks if the request passed the pin test. This returns `True` if the + request is trusted on a pin/cookie basis and returns `False` if not. + Additionally if the cookie's stored pin hash is wrong it will return + `None` so that appropriate action can be taken. + """ + if self.pin is None: + return True + + # If we failed too many times, then we're locked out. + if self._failed_pin_auth.value >= 10: + return False + + val = parse_cookie(environ).get(self.pin_cookie_name) + if not val or "|" not in val: + return False + ts_str, pin_hash = val.split("|", 1) + + try: + ts = int(ts_str) + except ValueError: + return False + + if pin_hash != hash_pin(self.pin): + return None + return (time.time() - PIN_TIME) < ts + + def check_host_trust(self, environ: WSGIEnvironment) -> bool: + return host_is_trusted(environ.get("HTTP_HOST"), self.trusted_hosts) + + def _fail_pin_auth(self) -> None: + with self._failed_pin_auth.get_lock(): + count = self._failed_pin_auth.value + self._failed_pin_auth.value = count + 1 + + time.sleep(5.0 if count > 5 else 0.5) + + def pin_auth(self, request: Request) -> Response: + """Authenticates with the pin.""" + if not self.check_host_trust(request.environ): + return SecurityError() # type: ignore[return-value] + + exhausted = False + auth = False + trust = self.check_pin_trust(request.environ) + pin = t.cast(str, self.pin) + + # If the trust return value is `None` it means that the cookie is + # set but the stored pin hash value is bad. This means that the + # pin was changed. In this case we count a bad auth and unset the + # cookie. This way it becomes harder to guess the cookie name + # instead of the pin as we still count up failures. + bad_cookie = False + if trust is None: + self._fail_pin_auth() + bad_cookie = True + + # If we're trusted, we're authenticated. + elif trust: + auth = True + + # If we failed too many times, then we're locked out. + elif self._failed_pin_auth.value >= 10: + exhausted = True + + # Otherwise go through pin based authentication + else: + entered_pin = request.args["pin"] + + if entered_pin.strip().replace("-", "") == pin.replace("-", ""): + self._failed_pin_auth.value = 0 + auth = True + else: + self._fail_pin_auth() + + rv = Response( + json.dumps({"auth": auth, "exhausted": exhausted}), + mimetype="application/json", + ) + if auth: + rv.set_cookie( + self.pin_cookie_name, + f"{int(time.time())}|{hash_pin(pin)}", + httponly=True, + samesite="Strict", + secure=request.is_secure, + ) + elif bad_cookie: + rv.delete_cookie(self.pin_cookie_name) + return rv + + def log_pin_request(self, request: Request) -> Response: + """Log the pin if needed.""" + if not self.check_host_trust(request.environ): + return SecurityError() # type: ignore[return-value] + + if self.pin_logging and self.pin is not None: + _log( + "info", " * To enable the debugger you need to enter the security pin:" + ) + _log("info", " * Debugger pin code: %s", self.pin) + return Response("") + + def __call__( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> t.Iterable[bytes]: + """Dispatch the requests.""" + # important: don't ever access a function here that reads the incoming + # form data! Otherwise the application won't have access to that data + # any more! + request = Request(environ) + response = self.debug_application + if request.args.get("__debugger__") == "yes": + cmd = request.args.get("cmd") + arg = request.args.get("f") + secret = request.args.get("s") + frame = self.frames.get(request.args.get("frm", type=int)) # type: ignore + if cmd == "resource" and arg: + response = self.get_resource(request, arg) # type: ignore + elif cmd == "pinauth" and secret == self.secret: + response = self.pin_auth(request) # type: ignore + elif cmd == "printpin" and secret == self.secret: + response = self.log_pin_request(request) # type: ignore + elif ( + self.evalex + and cmd is not None + and frame is not None + and self.secret == secret + and self.check_pin_trust(environ) + ): + response = self.execute_command(request, cmd, frame) # type: ignore + elif ( + self.evalex + and self.console_path is not None + and request.path == self.console_path + ): + response = self.display_console(request) # type: ignore + return response(environ, start_response) diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/debug/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..08bfb12cc4ca8534cbe4ce3014eabeeba6aacadb GIT binary patch literal 26197 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/__pycache__/console.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/debug/__pycache__/console.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..124dece54b6c452861255f6b00e2359f35864b7d GIT binary patch literal 13467 zcmcgzeQ+Dcb-%+Mz{3Xth~PIV2@bC25fFEzAb|jL zca%hiOqfKeA(g4=lp4{tR3kH%BTbT4?euFpZDu<8qiO#FH0TI(Gn~;($J5Dw@X(pj z=#Nf+Zx1-!0hH>doi2{=_ICGn@4bER?R#&RKW%RIaY&IJ*U$Y+2gm(8Jyet1%ADHWJ#9%*KI3HjhikmbF|hekp?=i-zm+4l)X{u%zvG!mBm$~rl40FSJ`xvsuN z4x&C})_<9k!^q!E>&hklYjG7%(&3D(oSvRkkoPEBB0j17h6qIsWo2|~Jf

)KHYCCMK!TStT{8 zs59#?D(d+eWomqoH5*Kz`%Fq1)O1yePt0`GMtSSl=@YNNp{vRC_{lRyQ>@aW`!O9P zC#PpN+TM=6iqBQ!2|am1K`{+-#t>s@mM}?S!U|>hRTA!aQEOY;oc;7$=!1EW%r0A_sAiXcySNo?vr~l!{Ue^_XzF*dA;0*d$ZgQ z3U4s{Hq2(8J`}AW8NHyW8ps{h&&KsAwTYUP)uJf8s3vt~(D0~=KBcA&aX6D!5*Bab zB)HFe0&_Q zR;Ol&&FxTiZYQS=DHcnnlX@&R(`rM0uv*%VZ_t_n=DE`5{;aqV$l|w3-)@MbnM}%o zDSa`+)Pu}*Xa!K!HGK3ArxNNWLMnA>c#>LN*QaM%?1P$RUDUJ*07Hgavr{Tb%oB$J z3Dp)fQhNy059LmzGMX~8&OQ<=>P73-%0N;eEB>zs8cR)SXPpDFqK))f3=k?R@q@vq z4I!D<4RHeUny4^4D!?cBvlG#Q-GHEy!cjL9=m*f~)o3(ok`;`joSzBXQKb^r+WG)P zfW$foN`0^)O>$WQ9^7yzu(+y6nkPs3q%boOX*G!|0RPIEQ; zzGAS?!f$z<6Gwx;lwdPfLB&FI9}2G13|1;QE@#cTRfNne??jVU?~3SQ>SzWHPkeGx zNy~T4nN)Y9%z=?7#?+-#?#;4Y)OG^^aFPNGf%{U=J*j8;P(j*Ils4q6mpNT_Jjfnl z+4UG*nmC$L-hynNaZD3wD2Co7GG7cmaIBp`c+X5vMte;n4B|~Fof;8_ zP|!#TA48i&RGVqHtDjo=3wTi@#$@Ir3a`}=O}E3|Gcwr(v*+ltb*eDz|p zJq&gV(Xe3va2m^#iW%UU78&rUo2j~wK);o$Fn(qO&we%VRn| zp~PZ_FBXHUo=Q~f~l()&=hVmx49hRa9OR=M3DRx#Y#a4M8vlLsfT6G!0(`RY5QDm5e zWDdV{)2qgN4vZ~b_K0C@ zUx{^_NT0LvI%%d#a{3M09^G55;ka|uGfTQu&7stKTPHPBNlw~1d$oT>to9Yexs{Z& z^}!h8@FlfmTGQj{gaWH&S~EN*Y1PB%%HUx>CE}WHcuvFr zdG(~~r&0k+rYT8I=`zGgGS4E;nH;3TgLqFn0Wi;f8tS^)cVow`bRo2-7}^7l^&VL1 z>b}u_i~m^q#b9B_zT%F3g|7X@uKhncym0(eDa5qSZ!DDH_KV zizonN^Q+%S<~rx)blj_H?SR7+!~c3FbAD>_6;;isOly&sh-C?UZ#UuHV~UR0SJA^y@4#5yIqvs3{fRfN1#;hem5*X`uqA#D`*g)SFp0kU{ zEazM;6RtO53e{-;y;o*AyP$oMd98`4%u}dhmd|-`Ye+gRY?W019nP;Zg^7$bxM2n# z8<5yEtHXF(Jqdu73@+tlDn5M{bFLDR4G+_4nz>YwEMvuegI+iV;4pvuws&W`>-fM{ zN5g4<2w-xQQt; zCX=bIVH?$ZVZwD<=V4L2MeLi#Sm#%hK9pLw&rJ%ef#gA zQeElZ29Za!(Z0H#qfuCzgRrN?s<7*{>QvIK3nn&J#adjkN*7O^uZJkSRlZMV7C2{MA zxcwHIxMT6cvR(-F7eoDdslO&a?R$j3;`ay+_4|LuMby96uEYIX}A#TD~9^=QXk`?VU^UZ`Vs)#0;c0mQ-S3;z_DOL$(#j}FZCPF`id{| zO_ZXCT3glwwH*kkWL&6UBJeVSLjXnqHjSQ4Oel!g$?EG={uKgm5{MCy35*jUue{z- zI80>(_Tx|cHNd>}D~ZSR;_(OWb!C_6?kjUu@R`7QS}uRXEDa!Ec6r>a-$E@un{0^Bvfv{0wgh#S zQ4vtB=SAlE&2%_Nvtpm1M&=it6I!6n^aj_k z;+RIf&5$%XPhiwkiH{8FHD#Jv4G3yjG;~;HEm#C%CNITCr$KvJnb}mwnvG57(78s_ zXs#8VC6Mo>TP?XGKk59qvlt;G3RZgu=;rOL0km3tZt*!|`OsK1X6Osxvl$!3>W zn@w?J#HCix)a6CA#9MXhlEqYLqSbE`=pj%Gm`u{T~0DDy(Ebm9&jeV;i zw3G+?RJ1$Qgx#th>_^dlRWI9*@@Bb9{D==aY`qa#W54WCSWYIG4YxDOtkpB>A7DIK z5~<86V#qc{SNTxXa-8KEmGN+me}{WVbQ*e}pu84Lxx&RP0})D*zs1kGZt-@%({3JJ zv27H{{0-q2Kj*RsAe?>Y=vx}nY@Hd+bLf@SA4^w7*_RbTMi-QQU{077@P$^b?8TE6 z#2Ck$F)I+kJRtut3@nO>7$R+Xl69J5%L42O(m{+t4QVWi?Fe!QJlgccXePyI`6yJ~ zR;?<7db&o48NPvTuDPyb$M1?b3yJ|Bw5x6M(l>vv=ZgEk4YUjJ>l|hz&&>)|Q_@8) z8e7juE+8`O>wiEfTqZzrWrQ;v78;R@RP6k`xna~)shxRx4K}k@ zu)zbSPk0c!!mP7DK{whyfQL}Mk-mJSFL(6zvAbi1$V<9vuRX) z$Qf>J3XwN6^m>H~u%V`6^31(d5Qizr@6t;oA}X~}v((TVizTp)s=-Mis(cevdD*0j zxt#Yti6ZnB+ARQRJ$NYX{e||e#rCaOgZwb7T70EoTUo&UL9n&##vN94Th~f!cd2{B zji<_fl)x&gfUM`YLCzbz(zMWYU+TOkbuPCTq-ar!=A~$|4)B>x%@V}sA3s4;zl zqMD}o5K8Z+YmT=&ifivcINt+TbLT8cqK(8fFAH;mmy^Yu*f=U;BDO&0EI-cAppnxQ znG^Nq+MCYta!s|GT5eX9-Ll6isp@9A3ETA6x7o*CJHT1Lx56VzCrgj(L$2%zIw(fU zsUbNrm~*E$z-+LYBDpX0R@GUZ6+Yy25{XKx|LPC9SvSHN&@}_z;YYl0MjRX*jLwJ$ z4<3xNjmsI|0d|G}M({zXNSpylDW{JP_;LOLrc!c}c_pSt^G6s%9U`zm;3|OORi|*` zgW0(hXE41U4{`%drlc|^{bOqCnN*={bR$@?W%Nu;L4*b|zbSokN>_h`MjA~h1Q)3y zx}=$A)~_YH*2o{xiw^-vd9`+5Kk?%e@10yanP0cfyt1AZsomUtEJ*8%(t5-nNe*Ak zuX|>(eX;%a)~u)O@_Kic)^Ggi>mPhQclzVE?jF6nx3Fb@Vf}&P`UBbFl~C)IiwhU; zhobjF(cFf+y?+P0^H?!-47NveU#T|=yVF}ykDKp>H|L-ncND`r^6YxhyNT7eb}qe^ zUdwdlu#z=5R}oZoy}a-aiT~W#d#N%RD#1GZolU+vV4RC}G$LZ#H1fZy{l4_dL z?zGv%Pc>V~Nl*KM4ChSExm?Unk@=qsbv1%c3v6|4OLIO(`w3q}4>>ip8J!*whgIqv z$DV>m=z!Yk>P(_U)Xpa-@A!-+eN@L`BTfBNv{a7~coo2C{=K-SSe#%+9VO*b0%w}A z7x!gq_dK<0Q*kIkQDYXD#Lnsysj3@Fof-mOGhDjj^g`7SPzU#^@yyzwgX{hp%~n$Y zP$|+=dFS)u`Hey-U4TtV7Xl=kGS7hBecO|yx-Cx`Gpj;UP# z4@@P1sa&&yEc{%oV=D1~#8l$%%v5fZsnnYw%Wp`JsigJQp8yQF&6VZ{RKWO&ghl-+ zfJQ{4#iSB~2+R>qk3A^Z2?p&g9MVd!h%9Ir_~J0Qs5T#Y?_F> zYxO84r0OFI{<_$K5sJlZXJxAgG{{0wKO{i1t&$bXNMbZs9D;(OZ0k`{k3S8Jh z(D_)a4X$zi0)deFGa05^Kv*U4XC?3^C4O}~U@fviCvUxobjbl0ZFM825tRKb+Dhk> zLq=02*gDg3D81&HhhfGnk2>mu7Zsn{WFU)o95GN4pMvk=S6^n|H0zpoCAm55wy-;I z-;rZ(x5Igc5pEeOwHT$#oX-F{tnR#6ZlYrc&U6RE73?gh_+Rm&_A~%225d>TWDl0w zIt6E6viO-aXG~85;7|+}lD|fcQ!(T$1W;uq zSYTGZer>hKX=;|koXZ)i%+Z()sb0;@y6nBxydtvk9#>cOILr{Ho9!*DuVE;gnj%rG z(w<0S1T!f)hI1a3eM84I!1{yvKNG0V13mp4Uedk-K)NdMu5?veY+dRqNIgZVColD^ zboJio&IW1oYdZxrU%VgLdM~myrxzkSi;9~fN<{^5Y1vdYNa&wrQ+`I5i#8n&_(c(D2?x9|i1SA6Fp0ZGl zxdHlT^hh#i9?>~WIkxNdb;?Zu80|J=i)ANq9vJH{Q@@NlPKrH}4wxtN4yyl%_eoN; z0w9cUo-c8m^9|Pn&Ogt7CC)d`ekHCYU%eV%DRJF-=k3H(c7j`?fFt?8(CRQ^oD4=EXdB%Df8Psj_Da zj~Q+RpHbQ8wTe^x5RZkZ5qw5vpVunJcrF}S`0jk5)DkVW?3@=ahsvH14`-(ld`4xT p*DCs7=6NhGYs2OKV)vfUSmo#TCP!VZghC_ujLJS=qk=K+e*s`@ym$Zr literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/__pycache__/repr.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/debug/__pycache__/repr.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..3d1c5da4b31d21567bcd25c5bb7ef8410404c6d9 GIT binary patch literal 16145 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 Z%g#b`?_*Z@TO&x?WamNT&xsh}|3CAPTxS3P literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/console.py b/venv/lib/python3.11/site-packages/werkzeug/debug/console.py new file mode 100755 index 0000000..4e40475 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/debug/console.py @@ -0,0 +1,219 @@ +from __future__ import annotations + +import code +import sys +import typing as t +from contextvars import ContextVar +from types import CodeType + +from markupsafe import escape + +from .repr import debug_repr +from .repr import dump +from .repr import helper + +_stream: ContextVar[HTMLStringO] = ContextVar("werkzeug.debug.console.stream") +_ipy: ContextVar[_InteractiveConsole] = ContextVar("werkzeug.debug.console.ipy") + + +class HTMLStringO: + """A StringO version that HTML escapes on write.""" + + def __init__(self) -> None: + self._buffer: list[str] = [] + + def isatty(self) -> bool: + return False + + def close(self) -> None: + pass + + def flush(self) -> None: + pass + + def seek(self, n: int, mode: int = 0) -> None: + pass + + def readline(self) -> str: + if len(self._buffer) == 0: + return "" + ret = self._buffer[0] + del self._buffer[0] + return ret + + def reset(self) -> str: + val = "".join(self._buffer) + del self._buffer[:] + return val + + def _write(self, x: str) -> None: + self._buffer.append(x) + + def write(self, x: str) -> None: + self._write(escape(x)) + + def writelines(self, x: t.Iterable[str]) -> None: + self._write(escape("".join(x))) + + +class ThreadedStream: + """Thread-local wrapper for sys.stdout for the interactive console.""" + + @staticmethod + def push() -> None: + if not isinstance(sys.stdout, ThreadedStream): + sys.stdout = t.cast(t.TextIO, ThreadedStream()) + + _stream.set(HTMLStringO()) + + @staticmethod + def fetch() -> str: + try: + stream = _stream.get() + except LookupError: + return "" + + return stream.reset() + + @staticmethod + def displayhook(obj: object) -> None: + try: + stream = _stream.get() + except LookupError: + return _displayhook(obj) # type: ignore + + # stream._write bypasses escaping as debug_repr is + # already generating HTML for us. + if obj is not None: + _ipy.get().locals["_"] = obj + stream._write(debug_repr(obj)) + + def __setattr__(self, name: str, value: t.Any) -> None: + raise AttributeError(f"read only attribute {name}") + + def __dir__(self) -> list[str]: + return dir(sys.__stdout__) + + def __getattribute__(self, name: str) -> t.Any: + try: + stream = _stream.get() + except LookupError: + stream = sys.__stdout__ # type: ignore[assignment] + + return getattr(stream, name) + + def __repr__(self) -> str: + return repr(sys.__stdout__) + + +# add the threaded stream as display hook +_displayhook = sys.displayhook +sys.displayhook = ThreadedStream.displayhook + + +class _ConsoleLoader: + def __init__(self) -> None: + self._storage: dict[int, str] = {} + + def register(self, code: CodeType, source: str) -> None: + self._storage[id(code)] = source + # register code objects of wrapped functions too. + for var in code.co_consts: + if isinstance(var, CodeType): + self._storage[id(var)] = source + + def get_source_by_code(self, code: CodeType) -> str | None: + try: + return self._storage[id(code)] + except KeyError: + return None + + +class _InteractiveConsole(code.InteractiveInterpreter): + locals: dict[str, t.Any] + + def __init__(self, globals: dict[str, t.Any], locals: dict[str, t.Any]) -> None: + self.loader = _ConsoleLoader() + locals = { + **globals, + **locals, + "dump": dump, + "help": helper, + "__loader__": self.loader, + } + super().__init__(locals) + original_compile = self.compile + + def compile(source: str, filename: str, symbol: str) -> CodeType | None: + code = original_compile(source, filename, symbol) + + if code is not None: + self.loader.register(code, source) + + return code + + self.compile = compile # type: ignore[assignment] + self.more = False + self.buffer: list[str] = [] + + def runsource(self, source: str, **kwargs: t.Any) -> str: # type: ignore + source = f"{source.rstrip()}\n" + ThreadedStream.push() + prompt = "... " if self.more else ">>> " + try: + source_to_eval = "".join(self.buffer + [source]) + if super().runsource(source_to_eval, "", "single"): + self.more = True + self.buffer.append(source) + else: + self.more = False + del self.buffer[:] + finally: + output = ThreadedStream.fetch() + return f"{prompt}{escape(source)}{output}" + + def runcode(self, code: CodeType) -> None: + try: + exec(code, self.locals) + except Exception: + self.showtraceback() + + def showtraceback(self) -> None: + from .tbtools import DebugTraceback + + exc = t.cast(BaseException, sys.exc_info()[1]) + te = DebugTraceback(exc, skip=1) + sys.stdout._write(te.render_traceback_html()) # type: ignore + + def showsyntaxerror(self, filename: str | None = None) -> None: + from .tbtools import DebugTraceback + + exc = t.cast(BaseException, sys.exc_info()[1]) + te = DebugTraceback(exc, skip=4) + sys.stdout._write(te.render_traceback_html()) # type: ignore + + def write(self, data: str) -> None: + sys.stdout.write(data) + + +class Console: + """An interactive console.""" + + def __init__( + self, + globals: dict[str, t.Any] | None = None, + locals: dict[str, t.Any] | None = None, + ) -> None: + if locals is None: + locals = {} + if globals is None: + globals = {} + self._ipy = _InteractiveConsole(globals, locals) + + def eval(self, code: str) -> str: + _ipy.set(self._ipy) + old_sys_stdout = sys.stdout + try: + return self._ipy.runsource(code) + finally: + sys.stdout = old_sys_stdout diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/repr.py b/venv/lib/python3.11/site-packages/werkzeug/debug/repr.py new file mode 100755 index 0000000..2bbd9d5 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/debug/repr.py @@ -0,0 +1,282 @@ +"""Object representations for debugging purposes. Unlike the default +repr, these expose more information and produce HTML instead of ASCII. + +Together with the CSS and JavaScript of the debugger this gives a +colorful and more compact output. +""" + +from __future__ import annotations + +import codecs +import re +import sys +import typing as t +from collections import deque +from traceback import format_exception_only + +from markupsafe import escape + +missing = object() +_paragraph_re = re.compile(r"(?:\r\n|\r|\n){2,}") +RegexType = type(_paragraph_re) + +HELP_HTML = """\ +

\ +""" +OBJECT_DUMP_HTML = """\ +
+

%(title)s

+ %(repr)s + %(items)s
+
\ +""" + + +def debug_repr(obj: object) -> str: + """Creates a debug repr of an object as HTML string.""" + return DebugReprGenerator().repr(obj) + + +def dump(obj: object = missing) -> None: + """Print the object details to stdout._write (for the interactive + console of the web debugger. + """ + gen = DebugReprGenerator() + if obj is missing: + rv = gen.dump_locals(sys._getframe(1).f_locals) + else: + rv = gen.dump_object(obj) + sys.stdout._write(rv) # type: ignore + + +class _Helper: + """Displays an HTML version of the normal help, for the interactive + debugger only because it requires a patched sys.stdout. + """ + + def __repr__(self) -> str: + return "Type help(object) for help about object." + + def __call__(self, topic: t.Any | None = None) -> None: + if topic is None: + sys.stdout._write(f"{self!r}") # type: ignore + return + import pydoc + + pydoc.help(topic) + rv = sys.stdout.reset() # type: ignore + paragraphs = _paragraph_re.split(rv) + if len(paragraphs) > 1: + title = paragraphs[0] + text = "\n\n".join(paragraphs[1:]) + else: + title = "Help" + text = paragraphs[0] + sys.stdout._write(HELP_HTML % {"title": title, "text": text}) # type: ignore + + +helper = _Helper() + + +def _add_subclass_info(inner: str, obj: object, base: type | tuple[type, ...]) -> str: + if isinstance(base, tuple): + for cls in base: + if type(obj) is cls: + return inner + elif type(obj) is base: + return inner + module = "" + if obj.__class__.__module__ not in ("__builtin__", "exceptions"): + module = f'{obj.__class__.__module__}.' + return f"{module}{type(obj).__name__}({inner})" + + +def _sequence_repr_maker( + left: str, right: str, base: type, limit: int = 8 +) -> t.Callable[[DebugReprGenerator, t.Iterable[t.Any], bool], str]: + def proxy(self: DebugReprGenerator, obj: t.Iterable[t.Any], recursive: bool) -> str: + if recursive: + return _add_subclass_info(f"{left}...{right}", obj, base) + buf = [left] + have_extended_section = False + for idx, item in enumerate(obj): + if idx: + buf.append(", ") + if idx == limit: + buf.append('') + have_extended_section = True + buf.append(self.repr(item)) + if have_extended_section: + buf.append("") + buf.append(right) + return _add_subclass_info("".join(buf), obj, base) + + return proxy + + +class DebugReprGenerator: + def __init__(self) -> None: + self._stack: list[t.Any] = [] + + list_repr = _sequence_repr_maker("[", "]", list) + tuple_repr = _sequence_repr_maker("(", ")", tuple) + set_repr = _sequence_repr_maker("set([", "])", set) + frozenset_repr = _sequence_repr_maker("frozenset([", "])", frozenset) + deque_repr = _sequence_repr_maker( + 'collections.deque([', "])", deque + ) + + def regex_repr(self, obj: t.Pattern[t.AnyStr]) -> str: + pattern = repr(obj.pattern) + pattern = codecs.decode(pattern, "unicode-escape", "ignore") + pattern = f"r{pattern}" + return f're.compile({pattern})' + + def string_repr(self, obj: str | bytes, limit: int = 70) -> str: + buf = [''] + r = repr(obj) + + # shorten the repr when the hidden part would be at least 3 chars + if len(r) - limit > 2: + buf.extend( + ( + escape(r[:limit]), + '', + escape(r[limit:]), + "", + ) + ) + else: + buf.append(escape(r)) + + buf.append("") + out = "".join(buf) + + # if the repr looks like a standard string, add subclass info if needed + if r[0] in "'\"" or (r[0] == "b" and r[1] in "'\""): + return _add_subclass_info(out, obj, (bytes, str)) + + # otherwise, assume the repr distinguishes the subclass already + return out + + def dict_repr( + self, + d: dict[int, None] | dict[str, int] | dict[str | int, int], + recursive: bool, + limit: int = 5, + ) -> str: + if recursive: + return _add_subclass_info("{...}", d, dict) + buf = ["{"] + have_extended_section = False + for idx, (key, value) in enumerate(d.items()): + if idx: + buf.append(", ") + if idx == limit - 1: + buf.append('') + have_extended_section = True + buf.append( + f'{self.repr(key)}:' + f' {self.repr(value)}' + ) + if have_extended_section: + buf.append("") + buf.append("}") + return _add_subclass_info("".join(buf), d, dict) + + def object_repr(self, obj: t.Any) -> str: + r = repr(obj) + return f'{escape(r)}' + + def dispatch_repr(self, obj: t.Any, recursive: bool) -> str: + if obj is helper: + return f'{helper!r}' + if isinstance(obj, (int, float, complex)): + return f'{obj!r}' + if isinstance(obj, str) or isinstance(obj, bytes): + return self.string_repr(obj) + if isinstance(obj, RegexType): + return self.regex_repr(obj) + if isinstance(obj, list): + return self.list_repr(obj, recursive) + if isinstance(obj, tuple): + return self.tuple_repr(obj, recursive) + if isinstance(obj, set): + return self.set_repr(obj, recursive) + if isinstance(obj, frozenset): + return self.frozenset_repr(obj, recursive) + if isinstance(obj, dict): + return self.dict_repr(obj, recursive) + if isinstance(obj, deque): + return self.deque_repr(obj, recursive) + return self.object_repr(obj) + + def fallback_repr(self) -> str: + try: + info = "".join(format_exception_only(*sys.exc_info()[:2])) + except Exception: + info = "?" + return ( + '' + f"<broken repr ({escape(info.strip())})>" + ) + + def repr(self, obj: object) -> str: + recursive = False + for item in self._stack: + if item is obj: + recursive = True + break + self._stack.append(obj) + try: + try: + return self.dispatch_repr(obj, recursive) + except Exception: + return self.fallback_repr() + finally: + self._stack.pop() + + def dump_object(self, obj: object) -> str: + repr = None + items: list[tuple[str, str]] | None = None + + if isinstance(obj, dict): + title = "Contents of" + items = [] + for key, value in obj.items(): + if not isinstance(key, str): + items = None + break + items.append((key, self.repr(value))) + if items is None: + items = [] + repr = self.repr(obj) + for key in dir(obj): + try: + items.append((key, self.repr(getattr(obj, key)))) + except Exception: + pass + title = "Details for" + title += f" {object.__repr__(obj)[1:-1]}" + return self.render_object_dump(items, title, repr) + + def dump_locals(self, d: dict[str, t.Any]) -> str: + items = [(key, self.repr(value)) for key, value in d.items()] + return self.render_object_dump(items, "Local variables in frame") + + def render_object_dump( + self, items: list[tuple[str, str]], title: str, repr: str | None = None + ) -> str: + html_items = [] + for key, value in items: + html_items.append(f"{escape(key)}
{value}
") + if not html_items: + html_items.append("Nothing") + return OBJECT_DUMP_HTML % { + "title": escape(title), + "repr": f"
{repr if repr else ''}
", + "items": "\n".join(html_items), + } diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/shared/ICON_LICENSE.md b/venv/lib/python3.11/site-packages/werkzeug/debug/shared/ICON_LICENSE.md new file mode 100755 index 0000000..3bdbfc7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/debug/shared/ICON_LICENSE.md @@ -0,0 +1,6 @@ +Silk icon set 1.3 by Mark James + +http://www.famfamfam.com/lab/icons/silk/ + +License: [CC-BY-2.5](https://creativecommons.org/licenses/by/2.5/) +or [CC-BY-3.0](https://creativecommons.org/licenses/by/3.0/) diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/shared/console.png b/venv/lib/python3.11/site-packages/werkzeug/debug/shared/console.png new file mode 100755 index 0000000000000000000000000000000000000000..c28dd63812d80e416682f835652f8e5824bdccb2 GIT binary patch literal 507 zcmVM#v1#3=Jvuyn6YS$$CoGDq?9U@APAh~ZOF>jp#TVKsZ^rDVDQJO z=z(unDix`Pp@6(DbUGbswOaq~fE^0}P{J^D(r7fOTCGyOUUzmBMUy*UwAN0eHX3ch z0VGKh>h*fm?RK3*p0=MB(nc}0O&K6sv)ObGuro)jd=1C!>krB`s44?r3Yg)uiG7!8OBL$a-Fo@&0(0LjNH2#KGJZi@q2YVKu xMc5!EfO4vTMwnf`nA&W_@!!aPwbiWO`5Vn?>V~$MffN7$002ovPDHLkV1l0g-PQmA literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/shared/debugger.js b/venv/lib/python3.11/site-packages/werkzeug/debug/shared/debugger.js new file mode 100755 index 0000000..809b14a --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/debug/shared/debugger.js @@ -0,0 +1,344 @@ +docReady(() => { + if (!EVALEX_TRUSTED) { + initPinBox(); + } + // if we are in console mode, show the console. + if (CONSOLE_MODE && EVALEX) { + createInteractiveConsole(); + } + + const frames = document.querySelectorAll("div.traceback div.frame"); + if (EVALEX) { + addConsoleIconToFrames(frames); + } + addEventListenersToElements(document.querySelectorAll("div.detail"), "click", () => + document.querySelector("div.traceback").scrollIntoView(false) + ); + addToggleFrameTraceback(frames); + addToggleTraceTypesOnClick(document.querySelectorAll("h2.traceback")); + addInfoPrompt(document.querySelectorAll("span.nojavascript")); + wrapPlainTraceback(); +}); + +function addToggleFrameTraceback(frames) { + frames.forEach((frame) => { + frame.addEventListener("click", () => { + frame.getElementsByTagName("pre")[0].parentElement.classList.toggle("expanded"); + }); + }) +} + + +function wrapPlainTraceback() { + const plainTraceback = document.querySelector("div.plain textarea"); + const wrapper = document.createElement("pre"); + const textNode = document.createTextNode(plainTraceback.textContent); + wrapper.appendChild(textNode); + plainTraceback.replaceWith(wrapper); +} + +function makeDebugURL(args) { + const params = new URLSearchParams(args) + params.set("s", SECRET) + return `?__debugger__=yes&${params}` +} + +function initPinBox() { + document.querySelector(".pin-prompt form").addEventListener( + "submit", + function (event) { + event.preventDefault(); + const btn = this.btn; + btn.disabled = true; + + fetch( + makeDebugURL({cmd: "pinauth", pin: this.pin.value}) + ) + .then((res) => res.json()) + .then(({auth, exhausted}) => { + if (auth) { + EVALEX_TRUSTED = true; + fadeOut(document.getElementsByClassName("pin-prompt")[0]); + } else { + alert( + `Error: ${ + exhausted + ? "too many attempts. Restart server to retry." + : "incorrect pin" + }` + ); + } + }) + .catch((err) => { + alert("Error: Could not verify PIN. Network error?"); + console.error(err); + }) + .finally(() => (btn.disabled = false)); + }, + false + ); +} + +function promptForPin() { + if (!EVALEX_TRUSTED) { + fetch(makeDebugURL({cmd: "printpin"})); + const pinPrompt = document.getElementsByClassName("pin-prompt")[0]; + fadeIn(pinPrompt); + document.querySelector('.pin-prompt input[name="pin"]').focus(); + } +} + +/** + * Helper function for shell initialization + */ +function openShell(consoleNode, target, frameID) { + promptForPin(); + if (consoleNode) { + slideToggle(consoleNode); + return consoleNode; + } + let historyPos = 0; + const history = [""]; + const consoleElement = createConsole(); + const output = createConsoleOutput(); + const form = createConsoleInputForm(); + const command = createConsoleInput(); + + target.parentNode.appendChild(consoleElement); + consoleElement.append(output); + consoleElement.append(form); + form.append(command); + command.focus(); + slideToggle(consoleElement); + + form.addEventListener("submit", (e) => { + handleConsoleSubmit(e, command, frameID).then((consoleOutput) => { + output.append(consoleOutput); + command.focus(); + consoleElement.scrollTo(0, consoleElement.scrollHeight); + const old = history.pop(); + history.push(command.value); + if (typeof old !== "undefined") { + history.push(old); + } + historyPos = history.length - 1; + command.value = ""; + }); + }); + + command.addEventListener("keydown", (e) => { + if (e.key === "l" && e.ctrlKey) { + output.innerText = "--- screen cleared ---"; + } else if (e.key === "ArrowUp" || e.key === "ArrowDown") { + // Handle up arrow and down arrow. + if (e.key === "ArrowUp" && historyPos > 0) { + e.preventDefault(); + historyPos--; + } else if (e.key === "ArrowDown" && historyPos < history.length - 1) { + historyPos++; + } + command.value = history[historyPos]; + } + return false; + }); + + return consoleElement; +} + +function addEventListenersToElements(elements, event, listener) { + elements.forEach((el) => el.addEventListener(event, listener)); +} + +/** + * Add extra info + */ +function addInfoPrompt(elements) { + for (let i = 0; i < elements.length; i++) { + elements[i].innerHTML = + "

To switch between the interactive traceback and the plaintext " + + 'one, you can click on the "Traceback" headline. From the text ' + + "traceback you can also create a paste of it. " + + (!EVALEX + ? "" + : "For code execution mouse-over the frame you want to debug and " + + "click on the console icon on the right side." + + "

You can execute arbitrary Python code in the stack frames and " + + "there are some extra helpers available for introspection:" + + "

  • dump() shows all variables in the frame" + + "
  • dump(obj) dumps all that's known about the object
"); + elements[i].classList.remove("nojavascript"); + } +} + +function addConsoleIconToFrames(frames) { + for (let i = 0; i < frames.length; i++) { + let consoleNode = null; + const target = frames[i]; + const frameID = frames[i].id.substring(6); + + for (let j = 0; j < target.getElementsByTagName("pre").length; j++) { + const img = createIconForConsole(); + img.addEventListener("click", (e) => { + e.stopPropagation(); + consoleNode = openShell(consoleNode, target, frameID); + return false; + }); + target.getElementsByTagName("pre")[j].append(img); + } + } +} + +function slideToggle(target) { + target.classList.toggle("active"); +} + +/** + * toggle traceback types on click. + */ +function addToggleTraceTypesOnClick(elements) { + for (let i = 0; i < elements.length; i++) { + elements[i].addEventListener("click", () => { + document.querySelector("div.traceback").classList.toggle("hidden"); + document.querySelector("div.plain").classList.toggle("hidden"); + }); + elements[i].style.cursor = "pointer"; + document.querySelector("div.plain").classList.toggle("hidden"); + } +} + +function createConsole() { + const consoleNode = document.createElement("pre"); + consoleNode.classList.add("console"); + consoleNode.classList.add("active"); + return consoleNode; +} + +function createConsoleOutput() { + const output = document.createElement("div"); + output.classList.add("output"); + output.innerHTML = "[console ready]"; + return output; +} + +function createConsoleInputForm() { + const form = document.createElement("form"); + form.innerHTML = ">>> "; + return form; +} + +function createConsoleInput() { + const command = document.createElement("input"); + command.type = "text"; + command.setAttribute("autocomplete", "off"); + command.setAttribute("spellcheck", false); + command.setAttribute("autocapitalize", "off"); + command.setAttribute("autocorrect", "off"); + return command; +} + +function createIconForConsole() { + const img = document.createElement("img"); + img.setAttribute("src", makeDebugURL({cmd: "resource", f: "console.png"})); + img.setAttribute("title", "Open an interactive python shell in this frame"); + return img; +} + +function createExpansionButtonForConsole() { + const expansionButton = document.createElement("a"); + expansionButton.setAttribute("href", "#"); + expansionButton.setAttribute("class", "toggle"); + expansionButton.innerHTML = "  "; + return expansionButton; +} + +function createInteractiveConsole() { + const target = document.querySelector("div.console div.inner"); + while (target.firstChild) { + target.removeChild(target.firstChild); + } + openShell(null, target, 0); +} + +function handleConsoleSubmit(e, command, frameID) { + // Prevent page from refreshing. + e.preventDefault(); + + return new Promise((resolve) => { + fetch(makeDebugURL({cmd: command.value, frm: frameID})) + .then((res) => { + return res.text(); + }) + .then((data) => { + const tmp = document.createElement("div"); + tmp.innerHTML = data; + resolve(tmp); + + // Handle expandable span for long list outputs. + // Example to test: list(range(13)) + let wrapperAdded = false; + const wrapperSpan = document.createElement("span"); + const expansionButton = createExpansionButtonForConsole(); + + tmp.querySelectorAll("span.extended").forEach((spanToWrap) => { + const parentDiv = spanToWrap.parentNode; + if (!wrapperAdded) { + parentDiv.insertBefore(wrapperSpan, spanToWrap); + wrapperAdded = true; + } + parentDiv.removeChild(spanToWrap); + wrapperSpan.append(spanToWrap); + spanToWrap.hidden = true; + + expansionButton.addEventListener("click", (event) => { + event.preventDefault(); + spanToWrap.hidden = !spanToWrap.hidden; + expansionButton.classList.toggle("open"); + return false; + }); + }); + + // Add expansion button at end of wrapper. + if (wrapperAdded) { + wrapperSpan.append(expansionButton); + } + }) + .catch((err) => { + console.error(err); + }); + return false; + }); +} + +function fadeOut(element) { + element.style.opacity = 1; + + (function fade() { + element.style.opacity -= 0.1; + if (element.style.opacity < 0) { + element.style.display = "none"; + } else { + requestAnimationFrame(fade); + } + })(); +} + +function fadeIn(element, display) { + element.style.opacity = 0; + element.style.display = display || "block"; + + (function fade() { + let val = parseFloat(element.style.opacity) + 0.1; + if (val <= 1) { + element.style.opacity = val; + requestAnimationFrame(fade); + } + })(); +} + +function docReady(fn) { + if (document.readyState === "complete" || document.readyState === "interactive") { + setTimeout(fn, 1); + } else { + document.addEventListener("DOMContentLoaded", fn); + } +} diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/shared/less.png b/venv/lib/python3.11/site-packages/werkzeug/debug/shared/less.png new file mode 100755 index 0000000000000000000000000000000000000000..5efefd62b43e4f11dd300be4355a4b413c7a70d2 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhjKx9jP7LeL$-D$|*pj^6T^Kq* zuw()wNEK&+M`STji!cZ?GR&GI0Tg5}@$_|NzriFWuEAp!-_8pZviEdx43W5;{N}}r zALkuZ5)u;<5;XMn)mLoTym@kCXCsS)^--M@GHz~eJgoo!|3AJ?BC=^;p4#2!xpU{b bXtFW%8S(l$O4%<58pYu0>gTe~DWM4fkj^!0 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/shared/more.png b/venv/lib/python3.11/site-packages/werkzeug/debug/shared/more.png new file mode 100755 index 0000000000000000000000000000000000000000..804fa226fe3ed9e6cc2bd044a848f33a2d7b4e4f GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=fm(z?n2}-D90{Nxdx@v7EBg&5DRB)3hmHb?jr_0{K>_1cC{J-%1r lr(<|}#G9!1a#KtW>0AF44oJ8ZkqR`E!PC{xWt~$(698mrJ|X}B literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/shared/style.css b/venv/lib/python3.11/site-packages/werkzeug/debug/shared/style.css new file mode 100755 index 0000000..e9397ca --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/debug/shared/style.css @@ -0,0 +1,150 @@ +body, input { font-family: sans-serif; color: #000; text-align: center; + margin: 1em; padding: 0; font-size: 15px; } +h1, h2, h3 { font-weight: normal; } + +input { background-color: #fff; margin: 0; text-align: left; + outline: none !important; } +input[type="submit"] { padding: 3px 6px; } +a { color: #11557C; } +a:hover { color: #177199; } +pre, code, +textarea { font-family: monospace; font-size: 14px; } + +div.debugger { text-align: left; padding: 12px; margin: auto; + background-color: white; } +h1 { font-size: 36px; margin: 0 0 0.3em 0; } +div.detail { cursor: pointer; } +div.detail p { margin: 0 0 8px 13px; font-size: 14px; white-space: pre-wrap; + font-family: monospace; } +div.explanation { margin: 20px 13px; font-size: 15px; color: #555; } +div.footer { font-size: 13px; text-align: right; margin: 30px 0; + color: #86989B; } + +h2 { font-size: 16px; margin: 1.3em 0 0.0 0; padding: 9px; + background-color: #11557C; color: white; } +h2 em, h3 em { font-style: normal; color: #A5D6D9; font-weight: normal; } + +div.traceback, div.plain { border: 1px solid #ddd; margin: 0 0 1em 0; padding: 10px; } +div.plain p { margin: 0; } +div.plain textarea, +div.plain pre { margin: 10px 0 0 0; padding: 4px; + background-color: #E8EFF0; border: 1px solid #D3E7E9; } +div.plain textarea { width: 99%; height: 300px; } +div.traceback h3 { font-size: 1em; margin: 0 0 0.8em 0; } +div.traceback ul { list-style: none; margin: 0; padding: 0 0 0 1em; } +div.traceback h4 { font-size: 13px; font-weight: normal; margin: 0.7em 0 0.1em 0; } +div.traceback pre { margin: 0; padding: 5px 0 3px 15px; + background-color: #E8EFF0; border: 1px solid #D3E7E9; } +div.traceback .library .current { background: white; color: #555; } +div.traceback .expanded .current { background: #E8EFF0; color: black; } +div.traceback pre:hover { background-color: #DDECEE; color: black; cursor: pointer; } +div.traceback div.source.expanded pre + pre { border-top: none; } + +div.traceback span.ws { display: none; } +div.traceback pre.before, div.traceback pre.after { display: none; background: white; } +div.traceback div.source.expanded pre.before, +div.traceback div.source.expanded pre.after { + display: block; +} + +div.traceback div.source.expanded span.ws { + display: inline; +} + +div.traceback blockquote { margin: 1em 0 0 0; padding: 0; white-space: pre-line; } +div.traceback img { float: right; padding: 2px; margin: -3px 2px 0 0; display: none; } +div.traceback img:hover { background-color: #ddd; cursor: pointer; + border-color: #BFDDE0; } +div.traceback pre:hover img { display: block; } +div.traceback cite.filename { font-style: normal; color: #3B666B; } + +pre.console { border: 1px solid #ccc; background: white!important; + color: black; padding: 5px!important; + margin: 3px 0 0 0!important; cursor: default!important; + max-height: 400px; overflow: auto; } +pre.console form { color: #555; } +pre.console input { background-color: transparent; color: #555; + width: 90%; font-family: monospace; font-size: 14px; + border: none!important; } + +span.string { color: #30799B; } +span.number { color: #9C1A1C; } +span.help { color: #3A7734; } +span.object { color: #485F6E; } +span.extended { opacity: 0.5; } +span.extended:hover { opacity: 1; } +a.toggle { text-decoration: none; background-repeat: no-repeat; + background-position: center center; + background-image: url(?__debugger__=yes&cmd=resource&f=more.png); } +a.toggle:hover { background-color: #444; } +a.open { background-image: url(?__debugger__=yes&cmd=resource&f=less.png); } + +pre.console div.traceback, +pre.console div.box { margin: 5px 10px; white-space: normal; + border: 1px solid #11557C; padding: 10px; + font-family: sans-serif; } +pre.console div.box h3, +pre.console div.traceback h3 { margin: -10px -10px 10px -10px; padding: 5px; + background: #11557C; color: white; } + +pre.console div.traceback pre:hover { cursor: default; background: #E8EFF0; } +pre.console div.traceback pre.syntaxerror { background: inherit; border: none; + margin: 20px -10px -10px -10px; + padding: 10px; border-top: 1px solid #BFDDE0; + background: #E8EFF0; } +pre.console div.noframe-traceback pre.syntaxerror { margin-top: -10px; border: none; } + +pre.console div.box pre.repr { padding: 0; margin: 0; background-color: white; border: none; } +pre.console div.box table { margin-top: 6px; } +pre.console div.box pre { border: none; } +pre.console div.box pre.help { background-color: white; } +pre.console div.box pre.help:hover { cursor: default; } +pre.console table tr { vertical-align: top; } +div.console { border: 1px solid #ccc; padding: 4px; background-color: #fafafa; } + +div.traceback pre, div.console pre { + white-space: pre-wrap; /* css-3 should we be so lucky... */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 ?? */ + white-space: -o-pre-wrap; /* Opera 7 ?? */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ + _white-space: pre; /* IE only hack to re-specify in + addition to word-wrap */ +} + + +div.pin-prompt { + position: absolute; + display: none; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(255, 255, 255, 0.8); +} + +div.pin-prompt .inner { + background: #eee; + padding: 10px 50px; + width: 350px; + margin: 10% auto 0 auto; + border: 1px solid #ccc; + border-radius: 2px; +} + +div.exc-divider { + margin: 0.7em 0 0 -1em; + padding: 0.5em; + background: #11557C; + color: #ddd; + border: 1px solid #ddd; +} + +.console.active { + max-height: 0!important; + display: none; +} + +.hidden { + display: none; +} diff --git a/venv/lib/python3.11/site-packages/werkzeug/debug/tbtools.py b/venv/lib/python3.11/site-packages/werkzeug/debug/tbtools.py new file mode 100755 index 0000000..ca4acf6 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/debug/tbtools.py @@ -0,0 +1,449 @@ +from __future__ import annotations + +import itertools +import linecache +import os +import re +import sys +import sysconfig +import traceback +import typing as t + +from markupsafe import escape + +from ..utils import cached_property +from .console import Console + +HEADER = """\ + + + + %(title)s // Werkzeug Debugger + + + + + + +
+""" + +FOOTER = """\ + +
+ +
+
+

Console Locked

+

+ The console is locked and needs to be unlocked by entering the PIN. + You can find the PIN printed out on the standard output of your + shell that runs the server. +

+

PIN: + + +

+
+
+ + +""" + +PAGE_HTML = ( + HEADER + + """\ +

%(exception_type)s

+
+

%(exception)s

+
+

Traceback (most recent call last)

+%(summary)s +
+

+ This is the Copy/Paste friendly version of the traceback. +

+ +
+
+ The debugger caught an exception in your WSGI application. You can now + look at the traceback which led to the error. + If you enable JavaScript you can also use additional features such as code + execution (if the evalex feature is enabled), automatic pasting of the + exceptions and much more. +
+""" + + FOOTER + + """ + +""" +) + +CONSOLE_HTML = ( + HEADER + + """\ +

Interactive Console

+
+In this console you can execute Python expressions in the context of the +application. The initial namespace was created by the debugger automatically. +
+
The Console requires JavaScript.
+""" + + FOOTER +) + +SUMMARY_HTML = """\ +
+ %(title)s +
    %(frames)s
+ %(description)s +
+""" + +FRAME_HTML = """\ +
+

File "%(filename)s", + line %(lineno)s, + in %(function_name)s

+
%(lines)s
+
+""" + + +def _process_traceback( + exc: BaseException, + te: traceback.TracebackException | None = None, + *, + skip: int = 0, + hide: bool = True, +) -> traceback.TracebackException: + if te is None: + te = traceback.TracebackException.from_exception(exc, lookup_lines=False) + + # Get the frames the same way StackSummary.extract did, in order + # to match each frame with the FrameSummary to augment. + frame_gen = traceback.walk_tb(exc.__traceback__) + limit = getattr(sys, "tracebacklimit", None) + + if limit is not None: + if limit < 0: + limit = 0 + + frame_gen = itertools.islice(frame_gen, limit) + + if skip: + frame_gen = itertools.islice(frame_gen, skip, None) + del te.stack[:skip] + + new_stack: list[DebugFrameSummary] = [] + hidden = False + + # Match each frame with the FrameSummary that was generated. + # Hide frames using Paste's __traceback_hide__ rules. Replace + # all visible FrameSummary with DebugFrameSummary. + for (f, _), fs in zip(frame_gen, te.stack): + if hide: + hide_value = f.f_locals.get("__traceback_hide__", False) + + if hide_value in {"before", "before_and_this"}: + new_stack = [] + hidden = False + + if hide_value == "before_and_this": + continue + elif hide_value in {"reset", "reset_and_this"}: + hidden = False + + if hide_value == "reset_and_this": + continue + elif hide_value in {"after", "after_and_this"}: + hidden = True + + if hide_value == "after_and_this": + continue + elif hide_value or hidden: + continue + + frame_args: dict[str, t.Any] = { + "filename": fs.filename, + "lineno": fs.lineno, + "name": fs.name, + "locals": f.f_locals, + "globals": f.f_globals, + } + + if sys.version_info >= (3, 11): + frame_args["colno"] = fs.colno + frame_args["end_colno"] = fs.end_colno + + new_stack.append(DebugFrameSummary(**frame_args)) + + # The codeop module is used to compile code from the interactive + # debugger. Hide any codeop frames from the bottom of the traceback. + while new_stack: + module = new_stack[0].global_ns.get("__name__") + + if module is None: + module = new_stack[0].local_ns.get("__name__") + + if module == "codeop": + del new_stack[0] + else: + break + + te.stack[:] = new_stack + + if te.__context__: + context_exc = t.cast(BaseException, exc.__context__) + te.__context__ = _process_traceback(context_exc, te.__context__, hide=hide) + + if te.__cause__: + cause_exc = t.cast(BaseException, exc.__cause__) + te.__cause__ = _process_traceback(cause_exc, te.__cause__, hide=hide) + + return te + + +class DebugTraceback: + __slots__ = ("_te", "_cache_all_tracebacks", "_cache_all_frames") + + def __init__( + self, + exc: BaseException, + te: traceback.TracebackException | None = None, + *, + skip: int = 0, + hide: bool = True, + ) -> None: + self._te = _process_traceback(exc, te, skip=skip, hide=hide) + + def __str__(self) -> str: + return f"<{type(self).__name__} {self._te}>" + + @cached_property + def all_tracebacks( + self, + ) -> list[tuple[str | None, traceback.TracebackException]]: + out: list[tuple[str | None, traceback.TracebackException]] = [] + current: traceback.TracebackException | None = self._te + + while current is not None: + if current.__cause__ is not None: + chained_msg = ( + "The above exception was the direct cause of the" + " following exception" + ) + chained_exc = current.__cause__ + elif current.__context__ is not None and not current.__suppress_context__: + chained_msg = ( + "During handling of the above exception, another exception occurred" + ) + chained_exc = current.__context__ + else: + chained_msg = None + chained_exc = None + + out.append((chained_msg, current)) + current = chained_exc + + return out + + @cached_property + def all_frames(self) -> list[DebugFrameSummary]: + return [ + f # type: ignore[misc] + for _, te in self.all_tracebacks + for f in te.stack + ] + + def render_traceback_text(self) -> str: + return "".join(self._te.format()) + + def render_traceback_html(self, include_title: bool = True) -> str: + library_frames = [f.is_library for f in self.all_frames] + mark_library = 0 < sum(library_frames) < len(library_frames) + rows = [] + + if not library_frames: + classes = "traceback noframe-traceback" + else: + classes = "traceback" + + for msg, current in reversed(self.all_tracebacks): + row_parts = [] + + if msg is not None: + row_parts.append(f'
  • {msg}:
    ') + + for frame in current.stack: + frame = t.cast(DebugFrameSummary, frame) + info = f' title="{escape(frame.info)}"' if frame.info else "" + row_parts.append(f"{frame.render_html(mark_library)}") + + rows.append("\n".join(row_parts)) + + if sys.version_info < (3, 13): + exc_type_str = self._te.exc_type.__name__ + else: + exc_type_str = self._te.exc_type_str + + is_syntax_error = exc_type_str == "SyntaxError" + + if include_title: + if is_syntax_error: + title = "Syntax Error" + else: + title = "Traceback (most recent call last):" + else: + title = "" + + exc_full = escape("".join(self._te.format_exception_only())) + + if is_syntax_error: + description = f"
    {exc_full}
    " + else: + description = f"
    {exc_full}
    " + + return SUMMARY_HTML % { + "classes": classes, + "title": f"

    {title}

    ", + "frames": "\n".join(rows), + "description": description, + } + + def render_debugger_html( + self, evalex: bool, secret: str, evalex_trusted: bool + ) -> str: + exc_lines = list(self._te.format_exception_only()) + plaintext = "".join(self._te.format()) + + if sys.version_info < (3, 13): + exc_type_str = self._te.exc_type.__name__ + else: + exc_type_str = self._te.exc_type_str + + return PAGE_HTML % { + "evalex": "true" if evalex else "false", + "evalex_trusted": "true" if evalex_trusted else "false", + "console": "false", + "title": escape(exc_lines[0]), + "exception": escape("".join(exc_lines)), + "exception_type": escape(exc_type_str), + "summary": self.render_traceback_html(include_title=False), + "plaintext": escape(plaintext), + "plaintext_cs": re.sub("-{2,}", "-", plaintext), + "secret": secret, + } + + +class DebugFrameSummary(traceback.FrameSummary): + """A :class:`traceback.FrameSummary` that can evaluate code in the + frame's namespace. + """ + + __slots__ = ( + "local_ns", + "global_ns", + "_cache_info", + "_cache_is_library", + "_cache_console", + ) + + def __init__( + self, + *, + locals: dict[str, t.Any], + globals: dict[str, t.Any], + **kwargs: t.Any, + ) -> None: + super().__init__(locals=None, **kwargs) + self.local_ns = locals + self.global_ns = globals + + @cached_property + def info(self) -> str | None: + return self.local_ns.get("__traceback_info__") + + @cached_property + def is_library(self) -> bool: + return any( + self.filename.startswith((path, os.path.realpath(path))) + for path in sysconfig.get_paths().values() + ) + + @cached_property + def console(self) -> Console: + return Console(self.global_ns, self.local_ns) + + def eval(self, code: str) -> t.Any: + return self.console.eval(code) + + def render_html(self, mark_library: bool) -> str: + context = 5 + lines = linecache.getlines(self.filename) + line_idx = self.lineno - 1 # type: ignore[operator] + start_idx = max(0, line_idx - context) + stop_idx = min(len(lines), line_idx + context + 1) + rendered_lines = [] + + def render_line(line: str, cls: str) -> None: + line = line.expandtabs().rstrip() + stripped_line = line.strip() + prefix = len(line) - len(stripped_line) + colno = getattr(self, "colno", 0) + end_colno = getattr(self, "end_colno", 0) + + if cls == "current" and colno and end_colno: + arrow = ( + f'\n{" " * prefix}' + f"{' ' * (colno - prefix)}{'^' * (end_colno - colno)}" + ) + else: + arrow = "" + + rendered_lines.append( + f'
    {" " * prefix}'
    +                f"{escape(stripped_line) if stripped_line else ' '}"
    +                f"{arrow if arrow else ''}
    " + ) + + if line_idx < len(lines): + for line in lines[start_idx:line_idx]: + render_line(line, "before") + + render_line(lines[line_idx], "current") + + for line in lines[line_idx + 1 : stop_idx]: + render_line(line, "after") + + return FRAME_HTML % { + "id": id(self), + "filename": escape(self.filename), + "lineno": self.lineno, + "function_name": escape(self.name), + "lines": "\n".join(rendered_lines), + "library": "library" if mark_library and self.is_library else "", + } + + +def render_console_html(secret: str, evalex_trusted: bool) -> str: + return CONSOLE_HTML % { + "evalex": "true", + "evalex_trusted": "true" if evalex_trusted else "false", + "console": "true", + "title": "Console", + "secret": secret, + } diff --git a/venv/lib/python3.11/site-packages/werkzeug/exceptions.py b/venv/lib/python3.11/site-packages/werkzeug/exceptions.py new file mode 100755 index 0000000..15f534e --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/exceptions.py @@ -0,0 +1,905 @@ +"""Implements a number of Python exceptions which can be raised from within +a view to trigger a standard HTTP non-200 response. + +Usage Example +------------- + +.. code-block:: python + + from werkzeug.wrappers.request import Request + from werkzeug.exceptions import HTTPException, NotFound + + def view(request): + raise NotFound() + + @Request.application + def application(request): + try: + return view(request) + except HTTPException as e: + return e + +As you can see from this example those exceptions are callable WSGI +applications. However, they are not Werkzeug response objects. You +can get a response object by calling ``get_response()`` on a HTTP +exception. + +Keep in mind that you may have to pass an environ (WSGI) or scope +(ASGI) to ``get_response()`` because some errors fetch additional +information relating to the request. + +If you want to hook in a different exception page to say, a 404 status +code, you can add a second except for a specific subclass of an error: + +.. code-block:: python + + @Request.application + def application(request): + try: + return view(request) + except NotFound as e: + return not_found(request) + except HTTPException as e: + return e + +""" + +from __future__ import annotations + +import typing as t +from datetime import datetime + +from markupsafe import escape +from markupsafe import Markup + +from ._internal import _get_environ + +if t.TYPE_CHECKING: + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIEnvironment + + from .datastructures import WWWAuthenticate + from .sansio.response import Response as SansIOResponse + from .wrappers.request import Request as WSGIRequest + from .wrappers.response import Response as WSGIResponse + + +class HTTPException(Exception): + """The base class for all HTTP exceptions. This exception can be called as a WSGI + application to render a default error page or you can catch the subclasses + of it independently and render nicer error messages. + + .. versionchanged:: 2.1 + Removed the ``wrap`` class method. + """ + + code: int | None = None + description: str | None = None + + def __init__( + self, + description: str | None = None, + response: SansIOResponse | None = None, + ) -> None: + super().__init__() + if description is not None: + self.description = description + self.response = response + + @property + def name(self) -> str: + """The status name.""" + from .http import HTTP_STATUS_CODES + + return HTTP_STATUS_CODES.get(self.code, "Unknown Error") # type: ignore + + def get_description( + self, + environ: WSGIEnvironment | None = None, + scope: dict[str, t.Any] | None = None, + ) -> str: + """Get the description.""" + if self.description is None: + description = "" + else: + description = self.description + + description = escape(description).replace("\n", Markup("
    ")) + return f"

    {description}

    " + + def get_body( + self, + environ: WSGIEnvironment | None = None, + scope: dict[str, t.Any] | None = None, + ) -> str: + """Get the HTML body.""" + return ( + "\n" + "\n" + f"{self.code} {escape(self.name)}\n" + f"

    {escape(self.name)}

    \n" + f"{self.get_description(environ)}\n" + ) + + def get_headers( + self, + environ: WSGIEnvironment | None = None, + scope: dict[str, t.Any] | None = None, + ) -> list[tuple[str, str]]: + """Get a list of headers.""" + return [("Content-Type", "text/html; charset=utf-8")] + + @t.overload + def get_response( + self, + environ: WSGIEnvironment | WSGIRequest | None = ..., + scope: None = None, + ) -> WSGIResponse: ... + @t.overload + def get_response( + self, + environ: None = None, + scope: dict[str, t.Any] = ..., + ) -> SansIOResponse: ... + def get_response( + self, + environ: WSGIEnvironment | WSGIRequest | None = None, + scope: dict[str, t.Any] | None = None, + ) -> WSGIResponse | SansIOResponse: + """Get a response object. + + :param environ: A WSGI environ dict or request object. If given, may be + used to customize the response based on the request. + :param scope: An ASGI scope dict. If given, may be used to customize the + response based on the request. + :return: A WSGI :class:`werkzeug.wrappers.Response` if called without + arguments or with ``environ``. A sans-IO + :class:`werkzeug.sansio.Response` for ASGI if called with + ``scope``. + """ + from .wrappers.response import Response + + if self.response is not None: + return self.response + if environ is not None: + environ = _get_environ(environ) + headers = self.get_headers(environ, scope) + return Response(self.get_body(environ, scope), self.code, headers) + + def __call__( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> t.Iterable[bytes]: + """Call the exception as WSGI application. + + :param environ: the WSGI environment. + :param start_response: the response callable provided by the WSGI + server. + """ + response = self.get_response(environ) + return response(environ, start_response) + + def __str__(self) -> str: + code = self.code if self.code is not None else "???" + return f"{code} {self.name}: {self.description}" + + def __repr__(self) -> str: + code = self.code if self.code is not None else "???" + return f"<{type(self).__name__} '{code}: {self.name}'>" + + +class BadRequest(HTTPException): + """*400* `Bad Request` + + Raise if the browser sends something to the application the application + or server cannot handle. + """ + + code = 400 + description = ( + "The browser (or proxy) sent a request that this server could not understand." + ) + + +class BadRequestKeyError(BadRequest, KeyError): + """An exception that is used to signal both a :exc:`KeyError` and a + :exc:`BadRequest`. Used by many of the datastructures. + """ + + _description = BadRequest.description + #: Show the KeyError along with the HTTP error message in the + #: response. This should be disabled in production, but can be + #: useful in a debug mode. + show_exception = False + + def __init__(self, arg: object | None = None, *args: t.Any, **kwargs: t.Any): + super().__init__(*args, **kwargs) + + if arg is None: + KeyError.__init__(self) + else: + KeyError.__init__(self, arg) + + @property + def description(self) -> str: + if self.show_exception: + return f"{self._description}\n{KeyError.__name__}: {KeyError.__str__(self)}" + + return self._description + + @description.setter + def description(self, value: str) -> None: + self._description = value + + +class ClientDisconnected(BadRequest): + """Internal exception that is raised if Werkzeug detects a disconnected + client. Since the client is already gone at that point attempting to + send the error message to the client might not work and might ultimately + result in another exception in the server. Mainly this is here so that + it is silenced by default as far as Werkzeug is concerned. + + Since disconnections cannot be reliably detected and are unspecified + by WSGI to a large extent this might or might not be raised if a client + is gone. + + .. versionadded:: 0.8 + """ + + +class SecurityError(BadRequest): + """Raised if something triggers a security error. This is otherwise + exactly like a bad request error. + + .. versionadded:: 0.9 + """ + + +class BadHost(BadRequest): + """Raised if the submitted host is badly formatted. + + .. versionadded:: 0.11.2 + """ + + +class Unauthorized(HTTPException): + """*401* ``Unauthorized`` + + Raise if the user is not authorized to access a resource. + + The ``www_authenticate`` argument should be used to set the + ``WWW-Authenticate`` header. This is used for HTTP basic auth and + other schemes. Use :class:`~werkzeug.datastructures.WWWAuthenticate` + to create correctly formatted values. Strictly speaking a 401 + response is invalid if it doesn't provide at least one value for + this header, although real clients typically don't care. + + :param description: Override the default message used for the body + of the response. + :param www-authenticate: A single value, or list of values, for the + WWW-Authenticate header(s). + + .. versionchanged:: 2.0 + Serialize multiple ``www_authenticate`` items into multiple + ``WWW-Authenticate`` headers, rather than joining them + into a single value, for better interoperability. + + .. versionchanged:: 0.15.3 + If the ``www_authenticate`` argument is not set, the + ``WWW-Authenticate`` header is not set. + + .. versionchanged:: 0.15.3 + The ``response`` argument was restored. + + .. versionchanged:: 0.15.1 + ``description`` was moved back as the first argument, restoring + its previous position. + + .. versionchanged:: 0.15.0 + ``www_authenticate`` was added as the first argument, ahead of + ``description``. + """ + + code = 401 + description = ( + "The server could not verify that you are authorized to access" + " the URL requested. You either supplied the wrong credentials" + " (e.g. a bad password), or your browser doesn't understand" + " how to supply the credentials required." + ) + + def __init__( + self, + description: str | None = None, + response: SansIOResponse | None = None, + www_authenticate: None | (WWWAuthenticate | t.Iterable[WWWAuthenticate]) = None, + ) -> None: + super().__init__(description, response) + + from .datastructures import WWWAuthenticate + + if isinstance(www_authenticate, WWWAuthenticate): + www_authenticate = (www_authenticate,) + + self.www_authenticate = www_authenticate + + def get_headers( + self, + environ: WSGIEnvironment | None = None, + scope: dict[str, t.Any] | None = None, + ) -> list[tuple[str, str]]: + headers = super().get_headers(environ, scope) + if self.www_authenticate: + headers.extend(("WWW-Authenticate", str(x)) for x in self.www_authenticate) + return headers + + +class Forbidden(HTTPException): + """*403* `Forbidden` + + Raise if the user doesn't have the permission for the requested resource + but was authenticated. + """ + + code = 403 + description = ( + "You don't have the permission to access the requested" + " resource. It is either read-protected or not readable by the" + " server." + ) + + +class NotFound(HTTPException): + """*404* `Not Found` + + Raise if a resource does not exist and never existed. + """ + + code = 404 + description = ( + "The requested URL was not found on the server. If you entered" + " the URL manually please check your spelling and try again." + ) + + +class MethodNotAllowed(HTTPException): + """*405* `Method Not Allowed` + + Raise if the server used a method the resource does not handle. For + example `POST` if the resource is view only. Especially useful for REST. + + The first argument for this exception should be a list of allowed methods. + Strictly speaking the response would be invalid if you don't provide valid + methods in the header which you can do with that list. + """ + + code = 405 + description = "The method is not allowed for the requested URL." + + def __init__( + self, + valid_methods: t.Iterable[str] | None = None, + description: str | None = None, + response: SansIOResponse | None = None, + ) -> None: + """Takes an optional list of valid http methods + starting with werkzeug 0.3 the list will be mandatory.""" + super().__init__(description=description, response=response) + self.valid_methods = valid_methods + + def get_headers( + self, + environ: WSGIEnvironment | None = None, + scope: dict[str, t.Any] | None = None, + ) -> list[tuple[str, str]]: + headers = super().get_headers(environ, scope) + if self.valid_methods: + headers.append(("Allow", ", ".join(self.valid_methods))) + return headers + + +class NotAcceptable(HTTPException): + """*406* `Not Acceptable` + + Raise if the server can't return any content conforming to the + `Accept` headers of the client. + """ + + code = 406 + description = ( + "The resource identified by the request is only capable of" + " generating response entities which have content" + " characteristics not acceptable according to the accept" + " headers sent in the request." + ) + + +class RequestTimeout(HTTPException): + """*408* `Request Timeout` + + Raise to signalize a timeout. + """ + + code = 408 + description = ( + "The server closed the network connection because the browser" + " didn't finish the request within the specified time." + ) + + +class Conflict(HTTPException): + """*409* `Conflict` + + Raise to signal that a request cannot be completed because it conflicts + with the current state on the server. + + .. versionadded:: 0.7 + """ + + code = 409 + description = ( + "A conflict happened while processing the request. The" + " resource might have been modified while the request was being" + " processed." + ) + + +class Gone(HTTPException): + """*410* `Gone` + + Raise if a resource existed previously and went away without new location. + """ + + code = 410 + description = ( + "The requested URL is no longer available on this server and" + " there is no forwarding address. If you followed a link from a" + " foreign page, please contact the author of this page." + ) + + +class LengthRequired(HTTPException): + """*411* `Length Required` + + Raise if the browser submitted data but no ``Content-Length`` header which + is required for the kind of processing the server does. + """ + + code = 411 + description = ( + "A request with this method requires a valid Content-" + "Length header." + ) + + +class PreconditionFailed(HTTPException): + """*412* `Precondition Failed` + + Status code used in combination with ``If-Match``, ``If-None-Match``, or + ``If-Unmodified-Since``. + """ + + code = 412 + description = ( + "The precondition on the request for the URL failed positive evaluation." + ) + + +class RequestEntityTooLarge(HTTPException): + """*413* `Request Entity Too Large` + + The status code one should return if the data submitted exceeded a given + limit. + """ + + code = 413 + description = "The data value transmitted exceeds the capacity limit." + + +class RequestURITooLarge(HTTPException): + """*414* `Request URI Too Large` + + Like *413* but for too long URLs. + """ + + code = 414 + description = ( + "The length of the requested URL exceeds the capacity limit for" + " this server. The request cannot be processed." + ) + + +class UnsupportedMediaType(HTTPException): + """*415* `Unsupported Media Type` + + The status code returned if the server is unable to handle the media type + the client transmitted. + """ + + code = 415 + description = ( + "The server does not support the media type transmitted in the request." + ) + + +class RequestedRangeNotSatisfiable(HTTPException): + """*416* `Requested Range Not Satisfiable` + + The client asked for an invalid part of the file. + + .. versionadded:: 0.7 + """ + + code = 416 + description = "The server cannot provide the requested range." + + def __init__( + self, + length: int | None = None, + units: str = "bytes", + description: str | None = None, + response: SansIOResponse | None = None, + ) -> None: + """Takes an optional `Content-Range` header value based on ``length`` + parameter. + """ + super().__init__(description=description, response=response) + self.length = length + self.units = units + + def get_headers( + self, + environ: WSGIEnvironment | None = None, + scope: dict[str, t.Any] | None = None, + ) -> list[tuple[str, str]]: + headers = super().get_headers(environ, scope) + if self.length is not None: + headers.append(("Content-Range", f"{self.units} */{self.length}")) + return headers + + +class ExpectationFailed(HTTPException): + """*417* `Expectation Failed` + + The server cannot meet the requirements of the Expect request-header. + + .. versionadded:: 0.7 + """ + + code = 417 + description = "The server could not meet the requirements of the Expect header" + + +class ImATeapot(HTTPException): + """*418* `I'm a teapot` + + The server should return this if it is a teapot and someone attempted + to brew coffee with it. + + .. versionadded:: 0.7 + """ + + code = 418 + description = "This server is a teapot, not a coffee machine" + + +class MisdirectedRequest(HTTPException): + """421 Misdirected Request + + Indicates that the request was directed to a server that is not able to + produce a response. + + .. versionadded:: 3.1 + """ + + code = 421 + description = "The server is not able to produce a response." + + +class UnprocessableEntity(HTTPException): + """*422* `Unprocessable Entity` + + Used if the request is well formed, but the instructions are otherwise + incorrect. + """ + + code = 422 + description = ( + "The request was well-formed but was unable to be followed due" + " to semantic errors." + ) + + +class Locked(HTTPException): + """*423* `Locked` + + Used if the resource that is being accessed is locked. + """ + + code = 423 + description = "The resource that is being accessed is locked." + + +class FailedDependency(HTTPException): + """*424* `Failed Dependency` + + Used if the method could not be performed on the resource + because the requested action depended on another action and that action failed. + """ + + code = 424 + description = ( + "The method could not be performed on the resource because the" + " requested action depended on another action and that action" + " failed." + ) + + +class PreconditionRequired(HTTPException): + """*428* `Precondition Required` + + The server requires this request to be conditional, typically to prevent + the lost update problem, which is a race condition between two or more + clients attempting to update a resource through PUT or DELETE. By requiring + each client to include a conditional header ("If-Match" or "If-Unmodified- + Since") with the proper value retained from a recent GET request, the + server ensures that each client has at least seen the previous revision of + the resource. + """ + + code = 428 + description = ( + "This request is required to be conditional; try using" + ' "If-Match" or "If-Unmodified-Since".' + ) + + +class _RetryAfter(HTTPException): + """Adds an optional ``retry_after`` parameter which will set the + ``Retry-After`` header. May be an :class:`int` number of seconds or + a :class:`~datetime.datetime`. + """ + + def __init__( + self, + description: str | None = None, + response: SansIOResponse | None = None, + retry_after: datetime | int | None = None, + ) -> None: + super().__init__(description, response) + self.retry_after = retry_after + + def get_headers( + self, + environ: WSGIEnvironment | None = None, + scope: dict[str, t.Any] | None = None, + ) -> list[tuple[str, str]]: + headers = super().get_headers(environ, scope) + + if self.retry_after: + if isinstance(self.retry_after, datetime): + from .http import http_date + + value = http_date(self.retry_after) + else: + value = str(self.retry_after) + + headers.append(("Retry-After", value)) + + return headers + + +class TooManyRequests(_RetryAfter): + """*429* `Too Many Requests` + + The server is limiting the rate at which this user receives + responses, and this request exceeds that rate. (The server may use + any convenient method to identify users and their request rates). + The server may include a "Retry-After" header to indicate how long + the user should wait before retrying. + + :param retry_after: If given, set the ``Retry-After`` header to this + value. May be an :class:`int` number of seconds or a + :class:`~datetime.datetime`. + + .. versionchanged:: 1.0 + Added ``retry_after`` parameter. + """ + + code = 429 + description = "This user has exceeded an allotted request count. Try again later." + + +class RequestHeaderFieldsTooLarge(HTTPException): + """*431* `Request Header Fields Too Large` + + The server refuses to process the request because the header fields are too + large. One or more individual fields may be too large, or the set of all + headers is too large. + """ + + code = 431 + description = "One or more header fields exceeds the maximum size." + + +class UnavailableForLegalReasons(HTTPException): + """*451* `Unavailable For Legal Reasons` + + This status code indicates that the server is denying access to the + resource as a consequence of a legal demand. + """ + + code = 451 + description = "Unavailable for legal reasons." + + +class InternalServerError(HTTPException): + """*500* `Internal Server Error` + + Raise if an internal server error occurred. This is a good fallback if an + unknown error occurred in the dispatcher. + + .. versionchanged:: 1.0.0 + Added the :attr:`original_exception` attribute. + """ + + code = 500 + description = ( + "The server encountered an internal error and was unable to" + " complete your request. Either the server is overloaded or" + " there is an error in the application." + ) + + def __init__( + self, + description: str | None = None, + response: SansIOResponse | None = None, + original_exception: BaseException | None = None, + ) -> None: + #: The original exception that caused this 500 error. Can be + #: used by frameworks to provide context when handling + #: unexpected errors. + self.original_exception = original_exception + super().__init__(description=description, response=response) + + +class NotImplemented(HTTPException): + """*501* `Not Implemented` + + Raise if the application does not support the action requested by the + browser. + """ + + code = 501 + description = "The server does not support the action requested by the browser." + + +class BadGateway(HTTPException): + """*502* `Bad Gateway` + + If you do proxying in your application you should return this status code + if you received an invalid response from the upstream server it accessed + in attempting to fulfill the request. + """ + + code = 502 + description = ( + "The proxy server received an invalid response from an upstream server." + ) + + +class ServiceUnavailable(_RetryAfter): + """*503* `Service Unavailable` + + Status code you should return if a service is temporarily + unavailable. + + :param retry_after: If given, set the ``Retry-After`` header to this + value. May be an :class:`int` number of seconds or a + :class:`~datetime.datetime`. + + .. versionchanged:: 1.0 + Added ``retry_after`` parameter. + """ + + code = 503 + description = ( + "The server is temporarily unable to service your request due" + " to maintenance downtime or capacity problems. Please try" + " again later." + ) + + +class GatewayTimeout(HTTPException): + """*504* `Gateway Timeout` + + Status code you should return if a connection to an upstream server + times out. + """ + + code = 504 + description = "The connection to an upstream server timed out." + + +class HTTPVersionNotSupported(HTTPException): + """*505* `HTTP Version Not Supported` + + The server does not support the HTTP protocol version used in the request. + """ + + code = 505 + description = ( + "The server does not support the HTTP protocol version used in the request." + ) + + +default_exceptions: dict[int, type[HTTPException]] = {} + + +def _find_exceptions() -> None: + for obj in globals().values(): + try: + is_http_exception = issubclass(obj, HTTPException) + except TypeError: + is_http_exception = False + if not is_http_exception or obj.code is None: + continue + old_obj = default_exceptions.get(obj.code, None) + if old_obj is not None and issubclass(obj, old_obj): + continue + default_exceptions[obj.code] = obj + + +_find_exceptions() +del _find_exceptions + + +class Aborter: + """When passed a dict of code -> exception items it can be used as + callable that raises exceptions. If the first argument to the + callable is an integer it will be looked up in the mapping, if it's + a WSGI application it will be raised in a proxy exception. + + The rest of the arguments are forwarded to the exception constructor. + """ + + def __init__( + self, + mapping: dict[int, type[HTTPException]] | None = None, + extra: dict[int, type[HTTPException]] | None = None, + ) -> None: + if mapping is None: + mapping = default_exceptions + self.mapping = dict(mapping) + if extra is not None: + self.mapping.update(extra) + + def __call__( + self, code: int | SansIOResponse, *args: t.Any, **kwargs: t.Any + ) -> t.NoReturn: + from .sansio.response import Response + + if isinstance(code, Response): + raise HTTPException(response=code) + + if code not in self.mapping: + raise LookupError(f"no exception for {code!r}") + + raise self.mapping[code](*args, **kwargs) + + +def abort(status: int | SansIOResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + """Raises an :py:exc:`HTTPException` for the given status code or WSGI + application. + + If a status code is given, it will be looked up in the list of + exceptions and will raise that exception. If passed a WSGI application, + it will wrap it in a proxy WSGI exception and raise that:: + + abort(404) # 404 Not Found + abort(Response('Hello World')) + + """ + _aborter(status, *args, **kwargs) + + +_aborter: Aborter = Aborter() diff --git a/venv/lib/python3.11/site-packages/werkzeug/formparser.py b/venv/lib/python3.11/site-packages/werkzeug/formparser.py new file mode 100755 index 0000000..0103414 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/formparser.py @@ -0,0 +1,430 @@ +from __future__ import annotations + +import typing as t +from io import BytesIO +from urllib.parse import parse_qsl + +from ._internal import _plain_int +from .datastructures import FileStorage +from .datastructures import Headers +from .datastructures import MultiDict +from .exceptions import RequestEntityTooLarge +from .http import parse_options_header +from .sansio.multipart import Data +from .sansio.multipart import Epilogue +from .sansio.multipart import Field +from .sansio.multipart import File +from .sansio.multipart import MultipartDecoder +from .sansio.multipart import NeedData +from .wsgi import get_content_length +from .wsgi import get_input_stream + +# there are some platforms where SpooledTemporaryFile is not available. +# In that case we need to provide a fallback. +try: + from tempfile import SpooledTemporaryFile +except ImportError: + from tempfile import TemporaryFile + + SpooledTemporaryFile = None # type: ignore + +if t.TYPE_CHECKING: + import typing as te + + from _typeshed.wsgi import WSGIEnvironment + + t_parse_result = tuple[ + t.IO[bytes], MultiDict[str, str], MultiDict[str, FileStorage] + ] + + class TStreamFactory(te.Protocol): + def __call__( + self, + total_content_length: int | None, + content_type: str | None, + filename: str | None, + content_length: int | None = None, + ) -> t.IO[bytes]: ... + + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + + +def default_stream_factory( + total_content_length: int | None, + content_type: str | None, + filename: str | None, + content_length: int | None = None, +) -> t.IO[bytes]: + max_size = 1024 * 500 + + if SpooledTemporaryFile is not None: + return t.cast(t.IO[bytes], SpooledTemporaryFile(max_size=max_size, mode="rb+")) + elif total_content_length is None or total_content_length > max_size: + return t.cast(t.IO[bytes], TemporaryFile("rb+")) + + return BytesIO() + + +def parse_form_data( + environ: WSGIEnvironment, + stream_factory: TStreamFactory | None = None, + max_form_memory_size: int | None = None, + max_content_length: int | None = None, + cls: type[MultiDict[str, t.Any]] | None = None, + silent: bool = True, + *, + max_form_parts: int | None = None, +) -> t_parse_result: + """Parse the form data in the environ and return it as tuple in the form + ``(stream, form, files)``. You should only call this method if the + transport method is `POST`, `PUT`, or `PATCH`. + + If the mimetype of the data transmitted is `multipart/form-data` the + files multidict will be filled with `FileStorage` objects. If the + mimetype is unknown the input stream is wrapped and returned as first + argument, else the stream is empty. + + This is a shortcut for the common usage of :class:`FormDataParser`. + + :param environ: the WSGI environment to be used for parsing. + :param stream_factory: An optional callable that returns a new read and + writeable file descriptor. This callable works + the same as :meth:`Response._get_file_stream`. + :param max_form_memory_size: the maximum number of bytes to be accepted for + in-memory stored form data. If the data + exceeds the value specified an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param max_content_length: If this is provided and the transmitted data + is longer than this value an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + :param silent: If set to False parsing errors will not be caught. + :param max_form_parts: The maximum number of multipart parts to be parsed. If this + is exceeded, a :exc:`~exceptions.RequestEntityTooLarge` exception is raised. + :return: A tuple in the form ``(stream, form, files)``. + + .. versionchanged:: 3.0 + The ``charset`` and ``errors`` parameters were removed. + + .. versionchanged:: 2.3 + Added the ``max_form_parts`` parameter. + + .. versionadded:: 0.5.1 + Added the ``silent`` parameter. + + .. versionadded:: 0.5 + Added the ``max_form_memory_size``, ``max_content_length``, and ``cls`` + parameters. + """ + return FormDataParser( + stream_factory=stream_factory, + max_form_memory_size=max_form_memory_size, + max_content_length=max_content_length, + max_form_parts=max_form_parts, + silent=silent, + cls=cls, + ).parse_from_environ(environ) + + +class FormDataParser: + """This class implements parsing of form data for Werkzeug. By itself + it can parse multipart and url encoded form data. It can be subclassed + and extended but for most mimetypes it is a better idea to use the + untouched stream and expose it as separate attributes on a request + object. + + :param stream_factory: An optional callable that returns a new read and + writeable file descriptor. This callable works + the same as :meth:`Response._get_file_stream`. + :param max_form_memory_size: the maximum number of bytes to be accepted for + in-memory stored form data. If the data + exceeds the value specified an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param max_content_length: If this is provided and the transmitted data + is longer than this value an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + :param silent: If set to False parsing errors will not be caught. + :param max_form_parts: The maximum number of multipart parts to be parsed. If this + is exceeded, a :exc:`~exceptions.RequestEntityTooLarge` exception is raised. + + .. versionchanged:: 3.0 + The ``charset`` and ``errors`` parameters were removed. + + .. versionchanged:: 3.0 + The ``parse_functions`` attribute and ``get_parse_func`` methods were removed. + + .. versionchanged:: 2.2.3 + Added the ``max_form_parts`` parameter. + + .. versionadded:: 0.8 + """ + + def __init__( + self, + stream_factory: TStreamFactory | None = None, + max_form_memory_size: int | None = None, + max_content_length: int | None = None, + cls: type[MultiDict[str, t.Any]] | None = None, + silent: bool = True, + *, + max_form_parts: int | None = None, + ) -> None: + if stream_factory is None: + stream_factory = default_stream_factory + + self.stream_factory = stream_factory + self.max_form_memory_size = max_form_memory_size + self.max_content_length = max_content_length + self.max_form_parts = max_form_parts + + if cls is None: + cls = t.cast("type[MultiDict[str, t.Any]]", MultiDict) + + self.cls = cls + self.silent = silent + + def parse_from_environ(self, environ: WSGIEnvironment) -> t_parse_result: + """Parses the information from the environment as form data. + + :param environ: the WSGI environment to be used for parsing. + :return: A tuple in the form ``(stream, form, files)``. + """ + stream = get_input_stream(environ, max_content_length=self.max_content_length) + content_length = get_content_length(environ) + mimetype, options = parse_options_header(environ.get("CONTENT_TYPE")) + return self.parse( + stream, + content_length=content_length, + mimetype=mimetype, + options=options, + ) + + def parse( + self, + stream: t.IO[bytes], + mimetype: str, + content_length: int | None, + options: dict[str, str] | None = None, + ) -> t_parse_result: + """Parses the information from the given stream, mimetype, + content length and mimetype parameters. + + :param stream: an input stream + :param mimetype: the mimetype of the data + :param content_length: the content length of the incoming data + :param options: optional mimetype parameters (used for + the multipart boundary for instance) + :return: A tuple in the form ``(stream, form, files)``. + + .. versionchanged:: 3.0 + The invalid ``application/x-url-encoded`` content type is not + treated as ``application/x-www-form-urlencoded``. + """ + if mimetype == "multipart/form-data": + parse_func = self._parse_multipart + elif mimetype == "application/x-www-form-urlencoded": + parse_func = self._parse_urlencoded + else: + return stream, self.cls(), self.cls() + + if options is None: + options = {} + + try: + return parse_func(stream, mimetype, content_length, options) + except ValueError: + if not self.silent: + raise + + return stream, self.cls(), self.cls() + + def _parse_multipart( + self, + stream: t.IO[bytes], + mimetype: str, + content_length: int | None, + options: dict[str, str], + ) -> t_parse_result: + parser = MultiPartParser( + stream_factory=self.stream_factory, + max_form_memory_size=self.max_form_memory_size, + max_form_parts=self.max_form_parts, + cls=self.cls, + ) + boundary = options.get("boundary", "").encode("ascii") + + if not boundary: + raise ValueError("Missing boundary") + + form, files = parser.parse(stream, boundary, content_length) + return stream, form, files + + def _parse_urlencoded( + self, + stream: t.IO[bytes], + mimetype: str, + content_length: int | None, + options: dict[str, str], + ) -> t_parse_result: + if ( + self.max_form_memory_size is not None + and content_length is not None + and content_length > self.max_form_memory_size + ): + raise RequestEntityTooLarge() + + items = parse_qsl( + stream.read().decode(), + keep_blank_values=True, + errors="werkzeug.url_quote", + ) + return stream, self.cls(items), self.cls() + + +class MultiPartParser: + def __init__( + self, + stream_factory: TStreamFactory | None = None, + max_form_memory_size: int | None = None, + cls: type[MultiDict[str, t.Any]] | None = None, + buffer_size: int = 64 * 1024, + max_form_parts: int | None = None, + ) -> None: + self.max_form_memory_size = max_form_memory_size + self.max_form_parts = max_form_parts + + if stream_factory is None: + stream_factory = default_stream_factory + + self.stream_factory = stream_factory + + if cls is None: + cls = t.cast("type[MultiDict[str, t.Any]]", MultiDict) + + self.cls = cls + self.buffer_size = buffer_size + + def fail(self, message: str) -> te.NoReturn: + raise ValueError(message) + + def get_part_charset(self, headers: Headers) -> str: + # Figure out input charset for current part + content_type = headers.get("content-type") + + if content_type: + parameters = parse_options_header(content_type)[1] + ct_charset = parameters.get("charset", "").lower() + + # A safe list of encodings. Modern clients should only send ASCII or UTF-8. + # This list will not be extended further. + if ct_charset in {"ascii", "us-ascii", "utf-8", "iso-8859-1"}: + return ct_charset + + return "utf-8" + + def start_file_streaming( + self, event: File, total_content_length: int | None + ) -> t.IO[bytes]: + content_type = event.headers.get("content-type") + + try: + content_length = _plain_int(event.headers["content-length"]) + except (KeyError, ValueError): + content_length = 0 + + container = self.stream_factory( + total_content_length=total_content_length, + filename=event.filename, + content_type=content_type, + content_length=content_length, + ) + return container + + def parse( + self, stream: t.IO[bytes], boundary: bytes, content_length: int | None + ) -> tuple[MultiDict[str, str], MultiDict[str, FileStorage]]: + current_part: Field | File + field_size: int | None = None + container: t.IO[bytes] | list[bytes] + _write: t.Callable[[bytes], t.Any] + + parser = MultipartDecoder( + boundary, + max_form_memory_size=self.max_form_memory_size, + max_parts=self.max_form_parts, + ) + + fields = [] + files = [] + + for data in _chunk_iter(stream.read, self.buffer_size): + parser.receive_data(data) + event = parser.next_event() + while not isinstance(event, (Epilogue, NeedData)): + if isinstance(event, Field): + current_part = event + field_size = 0 + container = [] + _write = container.append + elif isinstance(event, File): + current_part = event + field_size = None + container = self.start_file_streaming(event, content_length) + _write = container.write + elif isinstance(event, Data): + if self.max_form_memory_size is not None and field_size is not None: + # Ensure that accumulated data events do not exceed limit. + # Also checked within single event in MultipartDecoder. + field_size += len(event.data) + + if field_size > self.max_form_memory_size: + raise RequestEntityTooLarge() + + _write(event.data) + if not event.more_data: + if isinstance(current_part, Field): + value = b"".join(container).decode( + self.get_part_charset(current_part.headers), "replace" + ) + fields.append((current_part.name, value)) + else: + container = t.cast(t.IO[bytes], container) + container.seek(0) + files.append( + ( + current_part.name, + FileStorage( + container, + current_part.filename, + current_part.name, + headers=current_part.headers, + ), + ) + ) + + event = parser.next_event() + + return self.cls(fields), self.cls(files) + + +def _chunk_iter(read: t.Callable[[int], bytes], size: int) -> t.Iterator[bytes | None]: + """Read data in chunks for multipart/form-data parsing. Stop if no data is read. + Yield ``None`` at the end to signal end of parsing. + """ + while True: + data = read(size) + + if not data: + break + + yield data + + yield None diff --git a/venv/lib/python3.11/site-packages/werkzeug/http.py b/venv/lib/python3.11/site-packages/werkzeug/http.py new file mode 100755 index 0000000..fc22faa --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/http.py @@ -0,0 +1,1443 @@ +from __future__ import annotations + +import email.utils +import re +import typing as t +import warnings +from datetime import date +from datetime import datetime +from datetime import time +from datetime import timedelta +from datetime import timezone +from enum import Enum +from hashlib import sha1 +from time import mktime +from time import struct_time +from urllib.parse import quote +from urllib.parse import unquote + +from ._internal import _dt_as_utc +from ._internal import _plain_int + +if t.TYPE_CHECKING: + from _typeshed.wsgi import WSGIEnvironment + +_token_chars = frozenset( + "!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~" +) +_etag_re = re.compile(r'([Ww]/)?(?:"(.*?)"|(.*?))(?:\s*,\s*|$)') +_entity_headers = frozenset( + [ + "allow", + "content-encoding", + "content-language", + "content-length", + "content-location", + "content-md5", + "content-range", + "content-type", + "expires", + "last-modified", + ] +) +_hop_by_hop_headers = frozenset( + [ + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "te", + "trailer", + "transfer-encoding", + "upgrade", + ] +) +HTTP_STATUS_CODES = { + 100: "Continue", + 101: "Switching Protocols", + 102: "Processing", + 103: "Early Hints", # see RFC 8297 + 200: "OK", + 201: "Created", + 202: "Accepted", + 203: "Non Authoritative Information", + 204: "No Content", + 205: "Reset Content", + 206: "Partial Content", + 207: "Multi Status", + 208: "Already Reported", # see RFC 5842 + 226: "IM Used", # see RFC 3229 + 300: "Multiple Choices", + 301: "Moved Permanently", + 302: "Found", + 303: "See Other", + 304: "Not Modified", + 305: "Use Proxy", + 306: "Switch Proxy", # unused + 307: "Temporary Redirect", + 308: "Permanent Redirect", + 400: "Bad Request", + 401: "Unauthorized", + 402: "Payment Required", # unused + 403: "Forbidden", + 404: "Not Found", + 405: "Method Not Allowed", + 406: "Not Acceptable", + 407: "Proxy Authentication Required", + 408: "Request Timeout", + 409: "Conflict", + 410: "Gone", + 411: "Length Required", + 412: "Precondition Failed", + 413: "Request Entity Too Large", + 414: "Request URI Too Long", + 415: "Unsupported Media Type", + 416: "Requested Range Not Satisfiable", + 417: "Expectation Failed", + 418: "I'm a teapot", # see RFC 2324 + 421: "Misdirected Request", # see RFC 7540 + 422: "Unprocessable Entity", + 423: "Locked", + 424: "Failed Dependency", + 425: "Too Early", # see RFC 8470 + 426: "Upgrade Required", + 428: "Precondition Required", # see RFC 6585 + 429: "Too Many Requests", + 431: "Request Header Fields Too Large", + 449: "Retry With", # proprietary MS extension + 451: "Unavailable For Legal Reasons", + 500: "Internal Server Error", + 501: "Not Implemented", + 502: "Bad Gateway", + 503: "Service Unavailable", + 504: "Gateway Timeout", + 505: "HTTP Version Not Supported", + 506: "Variant Also Negotiates", # see RFC 2295 + 507: "Insufficient Storage", + 508: "Loop Detected", # see RFC 5842 + 510: "Not Extended", + 511: "Network Authentication Failed", +} + + +class COEP(Enum): + """Cross Origin Embedder Policies""" + + UNSAFE_NONE = "unsafe-none" + REQUIRE_CORP = "require-corp" + + +class COOP(Enum): + """Cross Origin Opener Policies""" + + UNSAFE_NONE = "unsafe-none" + SAME_ORIGIN_ALLOW_POPUPS = "same-origin-allow-popups" + SAME_ORIGIN = "same-origin" + + +def quote_header_value(value: t.Any, allow_token: bool = True) -> str: + """Add double quotes around a header value. If the header contains only ASCII token + characters, it will be returned unchanged. If the header contains ``"`` or ``\\`` + characters, they will be escaped with an additional ``\\`` character. + + This is the reverse of :func:`unquote_header_value`. + + :param value: The value to quote. Will be converted to a string. + :param allow_token: Disable to quote the value even if it only has token characters. + + .. versionchanged:: 3.0 + Passing bytes is not supported. + + .. versionchanged:: 3.0 + The ``extra_chars`` parameter is removed. + + .. versionchanged:: 2.3 + The value is quoted if it is the empty string. + + .. versionadded:: 0.5 + """ + value_str = str(value) + + if not value_str: + return '""' + + if allow_token: + token_chars = _token_chars + + if token_chars.issuperset(value_str): + return value_str + + value_str = value_str.replace("\\", "\\\\").replace('"', '\\"') + return f'"{value_str}"' + + +_unslash_re = re.compile(r"\\(.)", re.A) + + +def unquote_header_value(value: str) -> str: + """Remove double quotes and backslash escapes from a header value. + + This is the reverse of :func:`quote_header_value`. + + :param value: The header value to unquote. + + .. versionchanged:: 3.2 + Removes escape preceding any character. + + .. versionchanged:: 3.0 + The ``is_filename`` parameter is removed. + """ + if len(value) >= 2 and value[0] == value[-1] == '"': + return _unslash_re.sub(r"\g<1>", value[1:-1]) + + return value + + +def dump_options_header(header: str | None, options: t.Mapping[str, t.Any]) -> str: + """Produce a header value and ``key=value`` parameters separated by semicolons + ``;``. For example, the ``Content-Type`` header. + + .. code-block:: python + + dump_options_header("text/html", {"charset": "UTF-8"}) + 'text/html; charset=UTF-8' + + This is the reverse of :func:`parse_options_header`. + + If a value contains non-token characters, it will be quoted. + + If a value is ``None``, the parameter is skipped. + + In some keys for some headers, a UTF-8 value can be encoded using a special + ``key*=UTF-8''value`` form, where ``value`` is percent encoded. This function will + not produce that format automatically, but if a given key ends with an asterisk + ``*``, the value is assumed to have that form and will not be quoted further. + + :param header: The primary header value. + :param options: Parameters to encode as ``key=value`` pairs. + + .. versionchanged:: 2.3 + Keys with ``None`` values are skipped rather than treated as a bare key. + + .. versionchanged:: 2.2.3 + If a key ends with ``*``, its value will not be quoted. + """ + segments = [] + + if header is not None: + segments.append(header) + + for key, value in options.items(): + if value is None: + continue + + if key[-1] == "*": + segments.append(f"{key}={value}") + else: + segments.append(f"{key}={quote_header_value(value)}") + + return "; ".join(segments) + + +def dump_header(iterable: dict[str, t.Any] | t.Iterable[t.Any]) -> str: + """Produce a header value from a list of items or ``key=value`` pairs, separated by + commas ``,``. + + This is the reverse of :func:`parse_list_header`, :func:`parse_dict_header`, and + :func:`parse_set_header`. + + If a value contains non-token characters, it will be quoted. + + If a value is ``None``, the key is output alone. + + In some keys for some headers, a UTF-8 value can be encoded using a special + ``key*=UTF-8''value`` form, where ``value`` is percent encoded. This function will + not produce that format automatically, but if a given key ends with an asterisk + ``*``, the value is assumed to have that form and will not be quoted further. + + .. code-block:: python + + dump_header(["foo", "bar baz"]) + 'foo, "bar baz"' + + dump_header({"foo": "bar baz"}) + 'foo="bar baz"' + + :param iterable: The items to create a header from. + + .. versionchanged:: 3.0 + The ``allow_token`` parameter is removed. + + .. versionchanged:: 2.2.3 + If a key ends with ``*``, its value will not be quoted. + """ + if isinstance(iterable, dict): + items = [] + + for key, value in iterable.items(): + if value is None: + items.append(key) + elif key[-1] == "*": + items.append(f"{key}={value}") + else: + items.append(f"{key}={quote_header_value(value)}") + else: + items = [quote_header_value(x) for x in iterable] + + return ", ".join(items) + + +def dump_csp_header(header: ds.ContentSecurityPolicy) -> str: + """Dump a Content Security Policy header. + + These are structured into policies such as "default-src 'self'; + script-src 'self'". + + .. versionadded:: 1.0.0 + Support for Content Security Policy headers was added. + + """ + return "; ".join(f"{key} {value}" for key, value in header.items()) + + +def parse_list_header(value: str) -> list[str]: + """Parse a header value that consists of a list of comma separated items according + to `RFC 9110 `__. + + Surrounding quotes are removed from items, but internal quotes are left for + future parsing. Empty values are discarded. + + .. code-block:: python + + parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + This is the reverse of :func:`dump_header`. + + :param value: The header value to parse. + + .. versionchanged:: 3.2 + Quotes and escapes are kept if only part of an item is quoted. Empty + values are omitted. An empty list is returned if the value contains an + unclosed quoted string. + """ + items = [] + item = "" + escape = False + quote = False + + for char in value: + if escape: + escape = False + item += char + continue + + if quote: + if char == "\\": + escape = True + elif char == '"': + quote = False + + item += char + continue + + if char == ",": + items.append(item) + item = "" + continue + + if char == '"': + quote = True + + item += char + + if quote: + # invalid, unclosed quoted string + return [] + + items.append(item) + return [ + unquote_header_value(item) for item in (item.strip() for item in items) if item + ] + + +def parse_dict_header(value: str) -> dict[str, str | None]: + """Parse a list header using :func:`parse_list_header`, then parse each item as a + ``key=value`` pair. + + .. code-block:: python + + parse_dict_header('a=b, c="d, e", f') + {"a": "b", "c": "d, e", "f": None} + + This is the reverse of :func:`dump_header`. + + If a key does not have a value, it is ``None``. + + This handles charsets for values as described in + `RFC 2231 `__. Only ASCII, UTF-8, + and ISO-8859-1 charsets are accepted, otherwise the value remains quoted. + + :param value: The header value to parse. + + .. versionchanged:: 3.2 + An empty dict is returned if the value contains an unclosed quoted + string. + + .. versionchanged:: 3.0 + Passing bytes is not supported. + + .. versionchanged:: 3.0 + The ``cls`` argument is removed. + + .. versionchanged:: 2.3 + Added support for ``key*=charset''value`` encoded items. + + .. versionchanged:: 0.9 + The ``cls`` argument was added. + """ + result: dict[str, str | None] = {} + + for item in parse_list_header(value): + key, has_value, value = item.partition("=") + key = key.strip() + + if not key: + # =value is not valid + continue + + if not has_value: + result[key] = None + continue + + value = value.strip() + encoding: str | None = None + + if key[-1] == "*": + # key*=charset''value becomes key=value, where value is percent encoded + # adapted from parse_options_header, without the continuation handling + key = key[:-1] + match = _charset_value_re.match(value) + + if match: + # If there is a charset marker in the value, split it off. + encoding, value = match.groups() + encoding = encoding.lower() + + # A safe list of encodings. Modern clients should only send ASCII or UTF-8. + # This list will not be extended further. An invalid encoding will leave the + # value quoted. + if encoding in {"ascii", "us-ascii", "utf-8", "iso-8859-1"}: + # invalid bytes are replaced during unquoting + value = unquote(value, encoding=encoding) + + result[key] = unquote_header_value(value) + + return result + + +# https://httpwg.org/specs/rfc9110.html#parameter +_parameter_key_re = re.compile(r"([\w!#$%&'*+\-.^`|~]+)=", flags=re.ASCII) +_parameter_token_value_re = re.compile(r"[\w!#$%&'*+\-.^`|~]+", flags=re.ASCII) +# https://www.rfc-editor.org/rfc/rfc2231#section-4 +_charset_value_re = re.compile( + r""" + ([\w!#$%&*+\-.^`|~]*)' # charset part, could be empty + [\w!#$%&*+\-.^`|~]*' # don't care about language part, usually empty + ([\w!#$%&'*+\-.^`|~]+) # one or more token chars with percent encoding + """, + re.ASCII | re.VERBOSE, +) +# https://www.rfc-editor.org/rfc/rfc2231#section-3 +_continuation_re = re.compile(r"\*(\d+)$", re.ASCII) + + +def parse_options_header(value: str | None) -> tuple[str, dict[str, str]]: + """Parse a header that consists of a value with ``key=value`` parameters separated + by semicolons ``;``. For example, the ``Content-Type`` header. + + .. code-block:: python + + parse_options_header("text/html; charset=UTF-8") + ('text/html', {'charset': 'UTF-8'}) + + parse_options_header("") + ("", {}) + + This is the reverse of :func:`dump_options_header`. + + This parses valid parameter parts as described in + `RFC 9110 `__. Invalid parts are + skipped. + + This handles continuations and charsets as described in + `RFC 2231 `__, although not as + strictly as the RFC. Only ASCII, UTF-8, and ISO-8859-1 charsets are accepted, + otherwise the value remains quoted. + + Clients may not be consistent in how they handle a quote character within a quoted + value. The `HTML Standard `__ + replaces it with ``%22`` in multipart form data. + `RFC 9110 `__ uses backslash + escapes in HTTP headers. Both are decoded to the ``"`` character. + + Clients may not be consistent in how they handle non-ASCII characters. HTML + documents must declare ````, otherwise browsers may replace with + HTML character references, which can be decoded using :func:`html.unescape`. + + :param value: The header value to parse. + :return: ``(value, options)``, where ``options`` is a dict + + .. versionchanged:: 2.3 + Invalid parts, such as keys with no value, quoted keys, and incorrectly quoted + values, are discarded instead of treating as ``None``. + + .. versionchanged:: 2.3 + Only ASCII, UTF-8, and ISO-8859-1 are accepted for charset values. + + .. versionchanged:: 2.3 + Escaped quotes in quoted values, like ``%22`` and ``\\"``, are handled. + + .. versionchanged:: 2.2 + Option names are always converted to lowercase. + + .. versionchanged:: 2.2 + The ``multiple`` parameter was removed. + + .. versionchanged:: 0.15 + :rfc:`2231` parameter continuations are handled. + + .. versionadded:: 0.5 + """ + if value is None: + return "", {} + + value, _, rest = value.partition(";") + value = value.strip() + rest = rest.strip() + + if not value or not rest: + # empty (invalid) value, or value without options + return value, {} + + # Collect all valid key=value parts without processing the value. + parts: list[tuple[str, str]] = [] + + while True: + if (m := _parameter_key_re.match(rest)) is not None: + pk = m.group(1).lower() + rest = rest[m.end() :] + + # Value may be a token. + if (m := _parameter_token_value_re.match(rest)) is not None: + parts.append((pk, m.group())) + + # Value may be a quoted string, find the closing quote. + elif rest[:1] == '"': + pos = 1 + length = len(rest) + + while pos < length: + if rest[pos : pos + 2] in {"\\\\", '\\"'}: + # Consume escaped slashes and quotes. + pos += 2 + elif rest[pos] == '"': + # Stop at an unescaped quote. + parts.append((pk, rest[: pos + 1])) + rest = rest[pos + 1 :] + break + else: + # Consume any other character. + pos += 1 + + # Find the next section delimited by `;`, if any. + if (end := rest.find(";")) == -1: + break + + rest = rest[end + 1 :].lstrip() + + options: dict[str, str] = {} + encoding: str | None = None + continued_encoding: str | None = None + + # For each collected part, process optional charset and continuation, + # unquote quoted values. + for pk, pv in parts: + if pk[-1] == "*": + # key*=charset''value becomes key=value, where value is percent encoded + pk = pk[:-1] + match = _charset_value_re.match(pv) + + if match: + # If there is a valid charset marker in the value, split it off. + encoding, pv = match.groups() + # This might be the empty string, handled next. + encoding = encoding.lower() + + # No charset marker, or marker with empty charset value. + if not encoding: + encoding = continued_encoding + + # A safe list of encodings. Modern clients should only send ASCII or UTF-8. + # This list will not be extended further. An invalid encoding will leave the + # value quoted. + if encoding in {"ascii", "us-ascii", "utf-8", "iso-8859-1"}: + # Continuation parts don't require their own charset marker. This is + # looser than the RFC, it will persist across different keys and allows + # changing the charset during a continuation. But this implementation is + # much simpler than tracking the full state. + continued_encoding = encoding + # invalid bytes are replaced during unquoting + pv = unquote(pv, encoding=encoding) + + # Remove quotes. At this point the value cannot be empty or a single quote. + if pv[0] == pv[-1] == '"': + # HTTP headers use slash, multipart form data uses percent + pv = pv[1:-1].replace("\\\\", "\\").replace('\\"', '"').replace("%22", '"') + + match = _continuation_re.search(pk) + + if match: + # key*0=a; key*1=b becomes key=ab + pk = pk[: match.start()] + options[pk] = options.get(pk, "") + pv + else: + options[pk] = pv + + return value, options + + +_q_value_re = re.compile(r"-?\d+(\.\d+)?", re.ASCII) +_TAnyAccept = t.TypeVar("_TAnyAccept", bound="ds.Accept") + + +@t.overload +def parse_accept_header(value: str | None) -> ds.Accept: ... + + +@t.overload +def parse_accept_header(value: str | None, cls: type[_TAnyAccept]) -> _TAnyAccept: ... + + +def parse_accept_header( + value: str | None, cls: type[_TAnyAccept] | None = None +) -> _TAnyAccept: + """Parse an ``Accept`` header according to + `RFC 9110 `__. + + Returns an :class:`.Accept` instance, which can sort and inspect items based on + their quality parameter. When parsing ``Accept-Charset``, ``Accept-Encoding``, or + ``Accept-Language``, pass the appropriate :class:`.Accept` subclass. + + :param value: The header value to parse. + :param cls: The :class:`.Accept` class to wrap the result in. + :return: An instance of ``cls``. + + .. versionchanged:: 2.3 + Parse according to RFC 9110. Items with invalid ``q`` values are skipped. + """ + if cls is None: + cls = t.cast(type[_TAnyAccept], ds.Accept) + + if not value: + return cls(None) + + result = [] + + for item in parse_list_header(value): + item, options = parse_options_header(item) + + if "q" in options: + # pop q, remaining options are reconstructed + q_str = options.pop("q").strip() + + if _q_value_re.fullmatch(q_str) is None: + # ignore an invalid q + continue + + q = float(q_str) + + if q < 0 or q > 1: + # ignore an invalid q + continue + else: + q = 1 + + if options: + # reconstruct the media type with any options + item = dump_options_header(item, options) + + result.append((item, q)) + + return cls(result) + + +_TAnyCC = t.TypeVar("_TAnyCC", bound="ds.cache_control._CacheControl") + + +@t.overload +def parse_cache_control_header( + value: str | None, + on_update: t.Callable[[ds.cache_control._CacheControl], None] | None = None, +) -> ds.RequestCacheControl: ... + + +@t.overload +def parse_cache_control_header( + value: str | None, + on_update: t.Callable[[ds.cache_control._CacheControl], None] | None = None, + cls: type[_TAnyCC] = ..., +) -> _TAnyCC: ... + + +def parse_cache_control_header( + value: str | None, + on_update: t.Callable[[ds.cache_control._CacheControl], None] | None = None, + cls: type[_TAnyCC] | None = None, +) -> _TAnyCC: + """Parse a cache control header. The RFC differs between response and + request cache control, this method does not. It's your responsibility + to not use the wrong control statements. + + .. versionadded:: 0.5 + The `cls` was added. If not specified an immutable + :class:`~werkzeug.datastructures.RequestCacheControl` is returned. + + :param value: a cache control header to be parsed. + :param on_update: an optional callable that is called every time a value + on the :class:`~werkzeug.datastructures.CacheControl` + object is changed. + :param cls: the class for the returned object. By default + :class:`~werkzeug.datastructures.RequestCacheControl` is used. + :return: a `cls` object. + """ + if cls is None: + cls = t.cast("type[_TAnyCC]", ds.RequestCacheControl) + + if not value: + return cls((), on_update) + + return cls(parse_dict_header(value), on_update) + + +_TAnyCSP = t.TypeVar("_TAnyCSP", bound="ds.ContentSecurityPolicy") + + +@t.overload +def parse_csp_header( + value: str | None, + on_update: t.Callable[[ds.ContentSecurityPolicy], None] | None = None, +) -> ds.ContentSecurityPolicy: ... + + +@t.overload +def parse_csp_header( + value: str | None, + on_update: t.Callable[[ds.ContentSecurityPolicy], None] | None = None, + cls: type[_TAnyCSP] = ..., +) -> _TAnyCSP: ... + + +def parse_csp_header( + value: str | None, + on_update: t.Callable[[ds.ContentSecurityPolicy], None] | None = None, + cls: type[_TAnyCSP] | None = None, +) -> _TAnyCSP: + """Parse a Content Security Policy header. + + .. versionadded:: 1.0.0 + Support for Content Security Policy headers was added. + + :param value: a csp header to be parsed. + :param on_update: an optional callable that is called every time a value + on the object is changed. + :param cls: the class for the returned object. By default + :class:`~werkzeug.datastructures.ContentSecurityPolicy` is used. + :return: a `cls` object. + """ + if cls is None: + cls = t.cast("type[_TAnyCSP]", ds.ContentSecurityPolicy) + + if value is None: + return cls((), on_update) + + items = [] + + for policy in value.split(";"): + policy = policy.strip() + + # Ignore badly formatted policies (no space) + if " " in policy: + directive, value = policy.strip().split(" ", 1) + items.append((directive.strip(), value.strip())) + + return cls(items, on_update) + + +def parse_set_header( + value: str | None, + on_update: t.Callable[[ds.HeaderSet], None] | None = None, +) -> ds.HeaderSet: + """Parse a set-like header and return a + :class:`~werkzeug.datastructures.HeaderSet` object: + + >>> hs = parse_set_header('token, "quoted value"') + + The return value is an object that treats the items case-insensitively + and keeps the order of the items: + + >>> 'TOKEN' in hs + True + >>> hs.index('quoted value') + 1 + >>> hs + HeaderSet(['token', 'quoted value']) + + To create a header from the :class:`HeaderSet` again, use the + :func:`dump_header` function. + + :param value: a set header to be parsed. + :param on_update: an optional callable that is called every time a + value on the :class:`~werkzeug.datastructures.HeaderSet` + object is changed. + :return: a :class:`~werkzeug.datastructures.HeaderSet` + """ + if not value: + return ds.HeaderSet(None, on_update) + return ds.HeaderSet(parse_list_header(value), on_update) + + +def parse_if_range_header(value: str | None) -> ds.IfRange: + """Parses an if-range header which can be an etag or a date. Returns + a :class:`~werkzeug.datastructures.IfRange` object. + + .. versionchanged:: 2.0 + If the value represents a datetime, it is timezone-aware. + + .. versionadded:: 0.7 + """ + if not value: + return ds.IfRange() + date = parse_date(value) + if date is not None: + return ds.IfRange(date=date) + # drop weakness information + return ds.IfRange(unquote_etag(value)[0]) + + +def parse_range_header( + value: str | None, make_inclusive: bool = True +) -> ds.Range | None: + """Parses a range header into a :class:`~werkzeug.datastructures.Range` + object. If the header is missing or malformed `None` is returned. + `ranges` is a list of ``(start, stop)`` tuples where the ranges are + non-inclusive. + + .. versionadded:: 0.7 + """ + if not value or "=" not in value: + return None + + ranges = [] + last_end = 0 + units, rng = value.split("=", 1) + units = units.strip().lower() + + for item in rng.split(","): + item = item.strip() + if "-" not in item: + return None + if item.startswith("-"): + if last_end < 0: + return None + try: + begin = _plain_int(item) + except ValueError: + return None + end = None + last_end = -1 + elif "-" in item: + begin_str, end_str = item.split("-", 1) + begin_str = begin_str.strip() + end_str = end_str.strip() + + try: + begin = _plain_int(begin_str) + except ValueError: + return None + + if begin < last_end or last_end < 0: + return None + if end_str: + try: + end = _plain_int(end_str) + 1 + except ValueError: + return None + + if begin >= end: + return None + else: + end = None + last_end = end if end is not None else -1 + ranges.append((begin, end)) + + return ds.Range(units, ranges) + + +def parse_content_range_header( + value: str | None, + on_update: t.Callable[[ds.ContentRange], None] | None = None, +) -> ds.ContentRange | None: + """Parses a range header into a + :class:`~werkzeug.datastructures.ContentRange` object or `None` if + parsing is not possible. + + .. versionadded:: 0.7 + + :param value: a content range header to be parsed. + :param on_update: an optional callable that is called every time a value + on the :class:`~werkzeug.datastructures.ContentRange` + object is changed. + """ + if value is None: + return None + try: + units, rangedef = (value or "").strip().split(None, 1) + except ValueError: + return None + + if "/" not in rangedef: + return None + rng, length_str = rangedef.split("/", 1) + if length_str == "*": + length = None + else: + try: + length = _plain_int(length_str) + except ValueError: + return None + + if rng == "*": + if not is_byte_range_valid(None, None, length): + return None + + return ds.ContentRange(units, None, None, length, on_update=on_update) + elif "-" not in rng: + return None + + start_str, stop_str = rng.split("-", 1) + try: + start = _plain_int(start_str) + stop = _plain_int(stop_str) + 1 + except ValueError: + return None + + if is_byte_range_valid(start, stop, length): + return ds.ContentRange(units, start, stop, length, on_update=on_update) + + return None + + +def quote_etag(etag: str, weak: bool = False) -> str: + """Quote an etag. + + :param etag: the etag to quote. + :param weak: set to `True` to tag it "weak". + """ + if '"' in etag: + raise ValueError("invalid etag") + etag = f'"{etag}"' + if weak: + etag = f"W/{etag}" + return etag + + +@t.overload +def unquote_etag(etag: str) -> tuple[str, bool]: ... +@t.overload +def unquote_etag(etag: None) -> tuple[None, None]: ... +def unquote_etag( + etag: str | None, +) -> tuple[str, bool] | tuple[None, None]: + """Unquote a single etag: + + >>> unquote_etag('W/"bar"') + ('bar', True) + >>> unquote_etag('"bar"') + ('bar', False) + + :param etag: the etag identifier to unquote. + :return: a ``(etag, weak)`` tuple. + """ + if not etag: + return None, None + etag = etag.strip() + weak = False + if etag.startswith(("W/", "w/")): + weak = True + etag = etag[2:] + if etag[:1] == etag[-1:] == '"': + etag = etag[1:-1] + return etag, weak + + +def parse_etags(value: str | None) -> ds.ETags: + """Parse an etag header. + + :param value: the tag header to parse + :return: an :class:`~werkzeug.datastructures.ETags` object. + """ + if not value: + return ds.ETags() + strong = [] + weak = [] + end = len(value) + pos = 0 + while pos < end: + match = _etag_re.match(value, pos) + if match is None: + break + is_weak, quoted, raw = match.groups() + if raw == "*": + return ds.ETags(star_tag=True) + elif quoted: + raw = quoted + if is_weak: + weak.append(raw) + else: + strong.append(raw) + pos = match.end() + return ds.ETags(strong, weak) + + +def generate_etag(data: bytes) -> str: + """Generate an etag for some data. + + .. versionchanged:: 2.0 + Use SHA-1. MD5 may not be available in some environments. + """ + return sha1(data).hexdigest() + + +def parse_date(value: str | None) -> datetime | None: + """Parse an :rfc:`2822` date into a timezone-aware + :class:`datetime.datetime` object, or ``None`` if parsing fails. + + This is a wrapper for :func:`email.utils.parsedate_to_datetime`. It + returns ``None`` if parsing fails instead of raising an exception, + and always returns a timezone-aware datetime object. If the string + doesn't have timezone information, it is assumed to be UTC. + + :param value: A string with a supported date format. + + .. versionchanged:: 2.0 + Return a timezone-aware datetime object. Use + ``email.utils.parsedate_to_datetime``. + """ + if value is None: + return None + + try: + dt = email.utils.parsedate_to_datetime(value) + except (TypeError, ValueError): + return None + + if dt.tzinfo is None: + return dt.replace(tzinfo=timezone.utc) + + return dt + + +def http_date( + timestamp: datetime | date | int | float | struct_time | None = None, +) -> str: + """Format a datetime object or timestamp into an :rfc:`2822` date + string. + + This is a wrapper for :func:`email.utils.format_datetime`. It + assumes naive datetime objects are in UTC instead of raising an + exception. + + :param timestamp: The datetime or timestamp to format. Defaults to + the current time. + + .. versionchanged:: 2.0 + Use ``email.utils.format_datetime``. Accept ``date`` objects. + """ + if isinstance(timestamp, date): + if not isinstance(timestamp, datetime): + # Assume plain date is midnight UTC. + timestamp = datetime.combine(timestamp, time(), tzinfo=timezone.utc) + else: + # Ensure datetime is timezone-aware. + timestamp = _dt_as_utc(timestamp) + + return email.utils.format_datetime(timestamp, usegmt=True) + + if isinstance(timestamp, struct_time): + timestamp = mktime(timestamp) + + return email.utils.formatdate(timestamp, usegmt=True) + + +def parse_age(value: str | None = None) -> timedelta | None: + """Parses a base-10 integer count of seconds into a timedelta. + + If parsing fails, the return value is `None`. + + :param value: a string consisting of an integer represented in base-10 + :return: a :class:`datetime.timedelta` object or `None`. + """ + if not value: + return None + try: + seconds = int(value) + except ValueError: + return None + if seconds < 0: + return None + try: + return timedelta(seconds=seconds) + except OverflowError: + return None + + +def dump_age(age: timedelta | int | None = None) -> str | None: + """Formats the duration as a base-10 integer. + + :param age: should be an integer number of seconds, + a :class:`datetime.timedelta` object, or, + if the age is unknown, `None` (default). + """ + if age is None: + return None + if isinstance(age, timedelta): + age = int(age.total_seconds()) + else: + age = int(age) + + if age < 0: + raise ValueError("age cannot be negative") + + return str(age) + + +def is_resource_modified( + environ: WSGIEnvironment, + etag: str | None = None, + data: bytes | None = None, + last_modified: datetime | str | None = None, + ignore_if_range: bool = True, +) -> bool: + """Convenience method for conditional requests. + + :param environ: the WSGI environment of the request to be checked. + :param etag: the etag for the response for comparison. + :param data: or alternatively the data of the response to automatically + generate an etag using :func:`generate_etag`. + :param last_modified: an optional date of the last modification. + :param ignore_if_range: If `False`, `If-Range` header will be taken into + account. + :return: `True` if the resource was modified, otherwise `False`. + + .. versionchanged:: 2.0 + SHA-1 is used to generate an etag value for the data. MD5 may + not be available in some environments. + + .. versionchanged:: 1.0.0 + The check is run for methods other than ``GET`` and ``HEAD``. + """ + return _sansio_http.is_resource_modified( + http_range=environ.get("HTTP_RANGE"), + http_if_range=environ.get("HTTP_IF_RANGE"), + http_if_modified_since=environ.get("HTTP_IF_MODIFIED_SINCE"), + http_if_none_match=environ.get("HTTP_IF_NONE_MATCH"), + http_if_match=environ.get("HTTP_IF_MATCH"), + etag=etag, + data=data, + last_modified=last_modified, + ignore_if_range=ignore_if_range, + ) + + +def remove_entity_headers( + headers: ds.Headers | list[tuple[str, str]], + allowed: t.Iterable[str] = ("expires", "content-location"), +) -> None: + """Remove all entity headers from a list or :class:`Headers` object. This + operation works in-place. `Expires` and `Content-Location` headers are + by default not removed. The reason for this is :rfc:`2616` section + 10.3.5 which specifies some entity headers that should be sent. + + .. versionchanged:: 0.5 + added `allowed` parameter. + + :param headers: a list or :class:`Headers` object. + :param allowed: a list of headers that should still be allowed even though + they are entity headers. + """ + allowed = {x.lower() for x in allowed} + headers[:] = [ + (key, value) + for key, value in headers + if not is_entity_header(key) or key.lower() in allowed + ] + + +def remove_hop_by_hop_headers(headers: ds.Headers | list[tuple[str, str]]) -> None: + """Remove all HTTP/1.1 "Hop-by-Hop" headers from a list or + :class:`Headers` object. This operation works in-place. + + .. versionadded:: 0.5 + + :param headers: a list or :class:`Headers` object. + """ + headers[:] = [ + (key, value) for key, value in headers if not is_hop_by_hop_header(key) + ] + + +def is_entity_header(header: str) -> bool: + """Check if a header is an entity header. + + .. versionadded:: 0.5 + + :param header: the header to test. + :return: `True` if it's an entity header, `False` otherwise. + """ + return header.lower() in _entity_headers + + +def is_hop_by_hop_header(header: str) -> bool: + """Check if a header is an HTTP/1.1 "Hop-by-Hop" header. + + .. versionadded:: 0.5 + + :param header: the header to test. + :return: `True` if it's an HTTP/1.1 "Hop-by-Hop" header, `False` otherwise. + """ + return header.lower() in _hop_by_hop_headers + + +def parse_cookie( + header: WSGIEnvironment | str | None, + cls: type[ds.MultiDict[str, str]] | None = None, +) -> ds.MultiDict[str, str]: + """Parse a cookie from a string or WSGI environ. + + The same key can be provided multiple times, the values are stored + in-order. The default :class:`MultiDict` will have the first value + first, and all values can be retrieved with + :meth:`MultiDict.getlist`. + + :param header: The cookie header as a string, or a WSGI environ dict + with a ``HTTP_COOKIE`` key. + :param cls: A dict-like class to store the parsed cookies in. + Defaults to :class:`MultiDict`. + + .. versionchanged:: 3.0 + Passing bytes, and the ``charset`` and ``errors`` parameters, were removed. + + .. versionchanged:: 1.0 + Returns a :class:`MultiDict` instead of a ``TypeConversionDict``. + + .. versionchanged:: 0.5 + Returns a :class:`TypeConversionDict` instead of a regular dict. The ``cls`` + parameter was added. + """ + if isinstance(header, dict): + cookie = header.get("HTTP_COOKIE") + else: + cookie = header + + if cookie: + cookie = cookie.encode("latin1").decode() + + return _sansio_http.parse_cookie(cookie=cookie, cls=cls) + + +_cookie_no_quote_re = re.compile(r"[\w!#$%&'()*+\-./:<=>?@\[\]^`{|}~]*", re.A) +_cookie_slash_re = re.compile(rb"[\x00-\x19\",;\\\x7f-\xff]", re.A) +_cookie_slash_map = {b'"': b'\\"', b"\\": b"\\\\"} +_cookie_slash_map.update( + (v.to_bytes(1, "big"), b"\\%03o" % v) + for v in [*range(0x20), *b",;", *range(0x7F, 256)] +) + + +def dump_cookie( + key: str, + value: str = "", + max_age: timedelta | int | None = None, + expires: str | datetime | int | float | None = None, + path: str | None = "/", + domain: str | None = None, + secure: bool = False, + httponly: bool = False, + sync_expires: bool = True, + max_size: int = 4093, + samesite: str | None = None, + partitioned: bool = False, +) -> str: + """Create a Set-Cookie header without the ``Set-Cookie`` prefix. + + The return value is usually restricted to ascii as the vast majority + of values are properly escaped, but that is no guarantee. It's + tunneled through latin1 as required by :pep:`3333`. + + The return value is not ASCII safe if the key contains unicode + characters. This is technically against the specification but + happens in the wild. It's strongly recommended to not use + non-ASCII values for the keys. + + :param max_age: should be a number of seconds, or `None` (default) if + the cookie should last only as long as the client's + browser session. Additionally `timedelta` objects + are accepted, too. + :param expires: should be a `datetime` object or unix timestamp. + :param path: limits the cookie to a given path, per default it will + span the whole domain. + :param domain: Use this if you want to set a cross-domain cookie. For + example, ``domain="example.com"`` will set a cookie + that is readable by the domain ``www.example.com``, + ``foo.example.com`` etc. Otherwise, a cookie will only + be readable by the domain that set it. + :param secure: The cookie will only be available via HTTPS + :param httponly: disallow JavaScript to access the cookie. This is an + extension to the cookie standard and probably not + supported by all browsers. + :param charset: the encoding for string values. + :param sync_expires: automatically set expires if max_age is defined + but expires not. + :param max_size: Warn if the final header value exceeds this size. The + default, 4093, should be safely `supported by most browsers + `_. Set to 0 to disable this check. + :param samesite: Limits the scope of the cookie such that it will + only be attached to requests if those requests are same-site. + :param partitioned: Opts the cookie into partitioned storage. This + will also set secure to True + + .. _`cookie`: http://browsercookielimits.squawky.net/ + + .. versionchanged:: 3.1 + The ``partitioned`` parameter was added. + + .. versionchanged:: 3.0 + Passing bytes, and the ``charset`` parameter, were removed. + + .. versionchanged:: 2.3.3 + The ``path`` parameter is ``/`` by default. + + .. versionchanged:: 2.3.1 + The value allows more characters without quoting. + + .. versionchanged:: 2.3 + ``localhost`` and other names without a dot are allowed for the domain. A + leading dot is ignored. + + .. versionchanged:: 2.3 + The ``path`` parameter is ``None`` by default. + + .. versionchanged:: 1.0.0 + The string ``'None'`` is accepted for ``samesite``. + """ + if path is not None: + # safe = https://url.spec.whatwg.org/#url-path-segment-string + # as well as percent for things that are already quoted + # excluding semicolon since it's part of the header syntax + path = quote(path, safe="%!$&'()*+,/:=@") + + if domain: + domain = domain.partition(":")[0].lstrip(".").encode("idna").decode("ascii") + + if isinstance(max_age, timedelta): + max_age = int(max_age.total_seconds()) + + if expires is not None: + if not isinstance(expires, str): + expires = http_date(expires) + elif max_age is not None and sync_expires: + expires = http_date(datetime.now(tz=timezone.utc).timestamp() + max_age) + + if samesite is not None: + samesite = samesite.title() + + if samesite not in {"Strict", "Lax", "None"}: + raise ValueError("SameSite must be 'Strict', 'Lax', or 'None'.") + + if partitioned: + secure = True + + # Quote value if it contains characters not allowed by RFC 6265. Slash-escape with + # three octal digits, which matches http.cookies, although the RFC suggests base64. + if not _cookie_no_quote_re.fullmatch(value): + # Work with bytes here, since a UTF-8 character could be multiple bytes. + value = _cookie_slash_re.sub( + lambda m: _cookie_slash_map[m.group()], value.encode() + ).decode("ascii") + value = f'"{value}"' + + # Send a non-ASCII key as mojibake. Everything else should already be ASCII. + # TODO Remove encoding dance, it seems like clients accept UTF-8 keys + buf = [f"{key.encode().decode('latin1')}={value}"] + + for k, v in ( + ("Domain", domain), + ("Expires", expires), + ("Max-Age", max_age), + ("Secure", secure), + ("HttpOnly", httponly), + ("Path", path), + ("SameSite", samesite), + ("Partitioned", partitioned), + ): + if v is None or v is False: + continue + + if v is True: + buf.append(k) + continue + + buf.append(f"{k}={v}") + + rv = "; ".join(buf) + + # Warn if the final value of the cookie is larger than the limit. If the cookie is + # too large, then it may be silently ignored by the browser, which can be quite hard + # to debug. + cookie_size = len(rv) + + if max_size and cookie_size > max_size: + value_size = len(value) + warnings.warn( + f"The '{key}' cookie is too large: the value was {value_size} bytes but the" + f" header required {cookie_size - value_size} extra bytes. The final size" + f" was {cookie_size} bytes but the limit is {max_size} bytes. Browsers may" + " silently ignore cookies larger than this.", + stacklevel=2, + ) + + return rv + + +def is_byte_range_valid( + start: int | None, stop: int | None, length: int | None +) -> bool: + """Checks if a given byte content range is valid for the given length. + + .. versionadded:: 0.7 + """ + if (start is None) != (stop is None): + return False + elif start is None: + return length is None or length >= 0 + elif length is None: + return 0 <= start < stop # type: ignore + elif start >= stop: # type: ignore + return False + return 0 <= start < length + + +# circular dependencies +from . import datastructures as ds # noqa: E402 +from .sansio import http as _sansio_http # noqa: E402 diff --git a/venv/lib/python3.11/site-packages/werkzeug/local.py b/venv/lib/python3.11/site-packages/werkzeug/local.py new file mode 100755 index 0000000..32c1aca --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/local.py @@ -0,0 +1,653 @@ +from __future__ import annotations + +import copy +import math +import operator +import typing as t +from contextvars import ContextVar +from functools import partial +from functools import update_wrapper +from operator import attrgetter + +from .wsgi import ClosingIterator + +if t.TYPE_CHECKING: + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + +T = t.TypeVar("T") +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + + +def release_local(local: Local | LocalStack[t.Any]) -> None: + """Release the data for the current context in a :class:`Local` or + :class:`LocalStack` without using a :class:`LocalManager`. + + This should not be needed for modern use cases, and may be removed + in the future. + + .. versionadded:: 0.6.1 + """ + local.__release_local__() + + +class Local: + """Create a namespace of context-local data. This wraps a + :class:`ContextVar` containing a :class:`dict` value. + + This may incur a performance penalty compared to using individual + context vars, as it has to copy data to avoid mutating the dict + between nested contexts. + + :param context_var: The :class:`~contextvars.ContextVar` to use as + storage for this local. If not given, one will be created. + Context vars not created at the global scope may interfere with + garbage collection. + + .. versionchanged:: 2.0 + Uses ``ContextVar`` instead of a custom storage implementation. + """ + + __slots__ = ("__storage",) + + def __init__(self, context_var: ContextVar[dict[str, t.Any]] | None = None) -> None: + if context_var is None: + # A ContextVar not created at global scope interferes with + # Python's garbage collection. However, a local only makes + # sense defined at the global scope as well, in which case + # the GC issue doesn't seem relevant. + context_var = ContextVar(f"werkzeug.Local<{id(self)}>.storage") + + object.__setattr__(self, "_Local__storage", context_var) + + def __iter__(self) -> t.Iterator[tuple[str, t.Any]]: + return iter(self.__storage.get({}).items()) + + def __call__( + self, name: str, *, unbound_message: str | None = None + ) -> LocalProxy[t.Any]: + """Create a :class:`LocalProxy` that access an attribute on this + local namespace. + + :param name: Proxy this attribute. + :param unbound_message: The error message that the proxy will + show if the attribute isn't set. + """ + return LocalProxy(self, name, unbound_message=unbound_message) + + def __release_local__(self) -> None: + self.__storage.set({}) + + def __getattr__(self, name: str) -> t.Any: + values = self.__storage.get({}) + + if name in values: + return values[name] + + raise AttributeError(name) + + def __setattr__(self, name: str, value: t.Any) -> None: + values = self.__storage.get({}).copy() + values[name] = value + self.__storage.set(values) + + def __delattr__(self, name: str) -> None: + values = self.__storage.get({}) + + if name in values: + values = values.copy() + del values[name] + self.__storage.set(values) + else: + raise AttributeError(name) + + +class LocalStack(t.Generic[T]): + """Create a stack of context-local data. This wraps a + :class:`ContextVar` containing a :class:`list` value. + + This may incur a performance penalty compared to using individual + context vars, as it has to copy data to avoid mutating the list + between nested contexts. + + :param context_var: The :class:`~contextvars.ContextVar` to use as + storage for this local. If not given, one will be created. + Context vars not created at the global scope may interfere with + garbage collection. + + .. versionchanged:: 2.0 + Uses ``ContextVar`` instead of a custom storage implementation. + + .. versionadded:: 0.6.1 + """ + + __slots__ = ("_storage",) + + def __init__(self, context_var: ContextVar[list[T]] | None = None) -> None: + if context_var is None: + # A ContextVar not created at global scope interferes with + # Python's garbage collection. However, a local only makes + # sense defined at the global scope as well, in which case + # the GC issue doesn't seem relevant. + context_var = ContextVar(f"werkzeug.LocalStack<{id(self)}>.storage") + + self._storage = context_var + + def __release_local__(self) -> None: + self._storage.set([]) + + def push(self, obj: T) -> list[T]: + """Add a new item to the top of the stack.""" + stack = self._storage.get([]).copy() + stack.append(obj) + self._storage.set(stack) + return stack + + def pop(self) -> T | None: + """Remove the top item from the stack and return it. If the + stack is empty, return ``None``. + """ + stack = self._storage.get([]) + + if len(stack) == 0: + return None + + rv = stack[-1] + self._storage.set(stack[:-1]) + return rv + + @property + def top(self) -> T | None: + """The topmost item on the stack. If the stack is empty, + `None` is returned. + """ + stack = self._storage.get([]) + + if len(stack) == 0: + return None + + return stack[-1] + + def __call__( + self, name: str | None = None, *, unbound_message: str | None = None + ) -> LocalProxy[t.Any]: + """Create a :class:`LocalProxy` that accesses the top of this + local stack. + + :param name: If given, the proxy access this attribute of the + top item, rather than the item itself. + :param unbound_message: The error message that the proxy will + show if the stack is empty. + """ + return LocalProxy(self, name, unbound_message=unbound_message) + + +class LocalManager: + """Manage releasing the data for the current context in one or more + :class:`Local` and :class:`LocalStack` objects. + + This should not be needed for modern use cases, and may be removed + in the future. + + :param locals: A local or list of locals to manage. + + .. versionchanged:: 2.1 + The ``ident_func`` was removed. + + .. versionchanged:: 0.7 + The ``ident_func`` parameter was added. + + .. versionchanged:: 0.6.1 + The :func:`release_local` function can be used instead of a + manager. + """ + + __slots__ = ("locals",) + + def __init__( + self, + locals: None + | (Local | LocalStack[t.Any] | t.Iterable[Local | LocalStack[t.Any]]) = None, + ) -> None: + if locals is None: + self.locals = [] + elif isinstance(locals, Local): + self.locals = [locals] + else: + self.locals = list(locals) # type: ignore[arg-type] + + def cleanup(self) -> None: + """Release the data in the locals for this context. Call this at + the end of each request or use :meth:`make_middleware`. + """ + for local in self.locals: + release_local(local) + + def make_middleware(self, app: WSGIApplication) -> WSGIApplication: + """Wrap a WSGI application so that local data is released + automatically after the response has been sent for a request. + """ + + def application( + environ: WSGIEnvironment, start_response: StartResponse + ) -> t.Iterable[bytes]: + return ClosingIterator(app(environ, start_response), self.cleanup) + + return application + + def middleware(self, func: WSGIApplication) -> WSGIApplication: + """Like :meth:`make_middleware` but used as a decorator on the + WSGI application function. + + .. code-block:: python + + @manager.middleware + def application(environ, start_response): + ... + """ + return update_wrapper(self.make_middleware(func), func) + + def __repr__(self) -> str: + return f"<{type(self).__name__} storages: {len(self.locals)}>" + + +class _ProxyLookup: + """Descriptor that handles proxied attribute lookup for + :class:`LocalProxy`. + + :param f: The built-in function this attribute is accessed through. + Instead of looking up the special method, the function call + is redone on the object. + :param fallback: Return this function if the proxy is unbound + instead of raising a :exc:`RuntimeError`. + :param is_attr: This proxied name is an attribute, not a function. + Call the fallback immediately to get the value. + :param class_value: Value to return when accessed from the + ``LocalProxy`` class directly. Used for ``__doc__`` so building + docs still works. + """ + + __slots__ = ("bind_f", "fallback", "is_attr", "class_value", "name") + + def __init__( + self, + f: t.Callable[..., t.Any] | None = None, + fallback: t.Callable[[LocalProxy[t.Any]], t.Any] | None = None, + class_value: t.Any | None = None, + is_attr: bool = False, + ) -> None: + bind_f: t.Callable[[LocalProxy[t.Any], t.Any], t.Callable[..., t.Any]] | None + + if hasattr(f, "__get__"): + # A Python function, can be turned into a bound method. + + def bind_f( + instance: LocalProxy[t.Any], obj: t.Any + ) -> t.Callable[..., t.Any]: + return f.__get__(obj, type(obj)) # type: ignore + + elif f is not None: + # A C function, use partial to bind the first argument. + + def bind_f( + instance: LocalProxy[t.Any], obj: t.Any + ) -> t.Callable[..., t.Any]: + return partial(f, obj) + + else: + # Use getattr, which will produce a bound method. + bind_f = None + + self.bind_f = bind_f + self.fallback = fallback + self.class_value = class_value + self.is_attr = is_attr + + def __set_name__(self, owner: LocalProxy[t.Any], name: str) -> None: + self.name = name + + def __get__(self, instance: LocalProxy[t.Any], owner: type | None = None) -> t.Any: + if instance is None: + if self.class_value is not None: + return self.class_value + + return self + + try: + obj = instance._get_current_object() + except RuntimeError: + if self.fallback is None: + raise + + fallback = self.fallback.__get__(instance, owner) + + if self.is_attr: + # __class__ and __doc__ are attributes, not methods. + # Call the fallback to get the value. + return fallback() + + return fallback + + if self.bind_f is not None: + return self.bind_f(instance, obj) + + return getattr(obj, self.name) + + def __repr__(self) -> str: + return f"proxy {self.name}" + + def __call__( + self, instance: LocalProxy[t.Any], *args: t.Any, **kwargs: t.Any + ) -> t.Any: + """Support calling unbound methods from the class. For example, + this happens with ``copy.copy``, which does + ``type(x).__copy__(x)``. ``type(x)`` can't be proxied, so it + returns the proxy type and descriptor. + """ + return self.__get__(instance, type(instance))(*args, **kwargs) + + +class _ProxyIOp(_ProxyLookup): + """Look up an augmented assignment method on a proxied object. The + method is wrapped to return the proxy instead of the object. + """ + + __slots__ = () + + def __init__( + self, + f: t.Callable[..., t.Any] | None = None, + fallback: t.Callable[[LocalProxy[t.Any]], t.Any] | None = None, + ) -> None: + super().__init__(f, fallback) + + def bind_f(instance: LocalProxy[t.Any], obj: t.Any) -> t.Callable[..., t.Any]: + def i_op(self: t.Any, other: t.Any) -> LocalProxy[t.Any]: + f(self, other) # type: ignore + return instance + + return i_op.__get__(obj, type(obj)) # type: ignore + + self.bind_f = bind_f + + +def _l_to_r_op(op: F) -> F: + """Swap the argument order to turn an l-op into an r-op.""" + + def r_op(obj: t.Any, other: t.Any) -> t.Any: + return op(other, obj) + + return t.cast(F, r_op) + + +def _identity(o: T) -> T: + return o + + +class LocalProxy(t.Generic[T]): + """A proxy to the object bound to a context-local object. All + operations on the proxy are forwarded to the bound object. If no + object is bound, a ``RuntimeError`` is raised. + + :param local: The context-local object that provides the proxied + object. + :param name: Proxy this attribute from the proxied object. + :param unbound_message: The error message to show if the + context-local object is unbound. + + Proxy a :class:`~contextvars.ContextVar` to make it easier to + access. Pass a name to proxy that attribute. + + .. code-block:: python + + _request_var = ContextVar("request") + request = LocalProxy(_request_var) + session = LocalProxy(_request_var, "session") + + Proxy an attribute on a :class:`Local` namespace by calling the + local with the attribute name: + + .. code-block:: python + + data = Local() + user = data("user") + + Proxy the top item on a :class:`LocalStack` by calling the local. + Pass a name to proxy that attribute. + + .. code-block:: + + app_stack = LocalStack() + current_app = app_stack() + g = app_stack("g") + + Pass a function to proxy the return value from that function. This + was previously used to access attributes of local objects before + that was supported directly. + + .. code-block:: python + + session = LocalProxy(lambda: request.session) + + ``__repr__`` and ``__class__`` are proxied, so ``repr(x)`` and + ``isinstance(x, cls)`` will look like the proxied object. Use + ``issubclass(type(x), LocalProxy)`` to check if an object is a + proxy. + + .. code-block:: python + + repr(user) # + isinstance(user, User) # True + issubclass(type(user), LocalProxy) # True + + .. versionchanged:: 2.2.2 + ``__wrapped__`` is set when wrapping an object, not only when + wrapping a function, to prevent doctest from failing. + + .. versionchanged:: 2.2 + Can proxy a ``ContextVar`` or ``LocalStack`` directly. + + .. versionchanged:: 2.2 + The ``name`` parameter can be used with any proxied object, not + only ``Local``. + + .. versionchanged:: 2.2 + Added the ``unbound_message`` parameter. + + .. versionchanged:: 2.0 + Updated proxied attributes and methods to reflect the current + data model. + + .. versionchanged:: 0.6.1 + The class can be instantiated with a callable. + """ + + __slots__ = ("__wrapped", "_get_current_object") + + _get_current_object: t.Callable[[], T] + """Return the current object this proxy is bound to. If the proxy is + unbound, this raises a ``RuntimeError``. + + This should be used if you need to pass the object to something that + doesn't understand the proxy. It can also be useful for performance + if you are accessing the object multiple times in a function, rather + than going through the proxy multiple times. + """ + + def __init__( + self, + local: ContextVar[T] | Local | LocalStack[T] | t.Callable[[], T], + name: str | None = None, + *, + unbound_message: str | None = None, + ) -> None: + if name is None: + get_name = _identity + else: + get_name = attrgetter(name) # type: ignore[assignment] + + if unbound_message is None: + unbound_message = "object is not bound" + + if isinstance(local, Local): + if name is None: + raise TypeError("'name' is required when proxying a 'Local' object.") + + def _get_current_object() -> T: + try: + return get_name(local) # type: ignore[return-value] + except AttributeError: + raise RuntimeError(unbound_message) from None + + elif isinstance(local, LocalStack): + + def _get_current_object() -> T: + obj = local.top + + if obj is None: + raise RuntimeError(unbound_message) + + return get_name(obj) + + elif isinstance(local, ContextVar): + + def _get_current_object() -> T: + try: + obj = local.get() + except LookupError: + raise RuntimeError(unbound_message) from None + + return get_name(obj) + + elif callable(local): + + def _get_current_object() -> T: + return get_name(local()) + + else: + raise TypeError(f"Don't know how to proxy '{type(local)}'.") + + object.__setattr__(self, "_LocalProxy__wrapped", local) + object.__setattr__(self, "_get_current_object", _get_current_object) + + __doc__ = _ProxyLookup( + class_value=__doc__, fallback=lambda self: type(self).__doc__, is_attr=True + ) + __wrapped__ = _ProxyLookup( + fallback=lambda self: self._LocalProxy__wrapped, # type: ignore[attr-defined] + is_attr=True, + ) + # __del__ should only delete the proxy + __repr__ = _ProxyLookup( + repr, fallback=lambda self: f"<{type(self).__name__} unbound>" + ) + __str__ = _ProxyLookup(str) + __bytes__ = _ProxyLookup(bytes) + __format__ = _ProxyLookup() + __lt__ = _ProxyLookup(operator.lt) + __le__ = _ProxyLookup(operator.le) + __eq__ = _ProxyLookup(operator.eq) + __ne__ = _ProxyLookup(operator.ne) + __gt__ = _ProxyLookup(operator.gt) + __ge__ = _ProxyLookup(operator.ge) + __hash__ = _ProxyLookup(hash) + __bool__ = _ProxyLookup(bool, fallback=lambda self: False) + __getattr__ = _ProxyLookup(getattr) + # __getattribute__ triggered through __getattr__ + __setattr__ = _ProxyLookup(setattr) + __delattr__ = _ProxyLookup(delattr) + __dir__ = _ProxyLookup(dir, fallback=lambda self: []) + # __get__ (proxying descriptor not supported) + # __set__ (descriptor) + # __delete__ (descriptor) + # __set_name__ (descriptor) + # __objclass__ (descriptor) + # __slots__ used by proxy itself + # __dict__ (__getattr__) + # __weakref__ (__getattr__) + # __init_subclass__ (proxying metaclass not supported) + # __prepare__ (metaclass) + __class__ = _ProxyLookup(fallback=lambda self: type(self), is_attr=True) + __instancecheck__ = _ProxyLookup(lambda self, other: isinstance(other, self)) + __subclasscheck__ = _ProxyLookup(lambda self, other: issubclass(other, self)) + # __class_getitem__ triggered through __getitem__ + __call__ = _ProxyLookup(lambda self, *args, **kwargs: self(*args, **kwargs)) + __len__ = _ProxyLookup(len) + __length_hint__ = _ProxyLookup(operator.length_hint) + __getitem__ = _ProxyLookup(operator.getitem) + __setitem__ = _ProxyLookup(operator.setitem) + __delitem__ = _ProxyLookup(operator.delitem) + # __missing__ triggered through __getitem__ + __iter__ = _ProxyLookup(iter) + __next__ = _ProxyLookup(next) + __reversed__ = _ProxyLookup(reversed) + __contains__ = _ProxyLookup(operator.contains) + __add__ = _ProxyLookup(operator.add) + __sub__ = _ProxyLookup(operator.sub) + __mul__ = _ProxyLookup(operator.mul) + __matmul__ = _ProxyLookup(operator.matmul) + __truediv__ = _ProxyLookup(operator.truediv) + __floordiv__ = _ProxyLookup(operator.floordiv) + __mod__ = _ProxyLookup(operator.mod) + __divmod__ = _ProxyLookup(divmod) + __pow__ = _ProxyLookup(pow) + __lshift__ = _ProxyLookup(operator.lshift) + __rshift__ = _ProxyLookup(operator.rshift) + __and__ = _ProxyLookup(operator.and_) + __xor__ = _ProxyLookup(operator.xor) + __or__ = _ProxyLookup(operator.or_) + __radd__ = _ProxyLookup(_l_to_r_op(operator.add)) + __rsub__ = _ProxyLookup(_l_to_r_op(operator.sub)) + __rmul__ = _ProxyLookup(_l_to_r_op(operator.mul)) + __rmatmul__ = _ProxyLookup(_l_to_r_op(operator.matmul)) + __rtruediv__ = _ProxyLookup(_l_to_r_op(operator.truediv)) + __rfloordiv__ = _ProxyLookup(_l_to_r_op(operator.floordiv)) + __rmod__ = _ProxyLookup(_l_to_r_op(operator.mod)) + __rdivmod__ = _ProxyLookup(_l_to_r_op(divmod)) + __rpow__ = _ProxyLookup(_l_to_r_op(pow)) + __rlshift__ = _ProxyLookup(_l_to_r_op(operator.lshift)) + __rrshift__ = _ProxyLookup(_l_to_r_op(operator.rshift)) + __rand__ = _ProxyLookup(_l_to_r_op(operator.and_)) + __rxor__ = _ProxyLookup(_l_to_r_op(operator.xor)) + __ror__ = _ProxyLookup(_l_to_r_op(operator.or_)) + __iadd__ = _ProxyIOp(operator.iadd) + __isub__ = _ProxyIOp(operator.isub) + __imul__ = _ProxyIOp(operator.imul) + __imatmul__ = _ProxyIOp(operator.imatmul) + __itruediv__ = _ProxyIOp(operator.itruediv) + __ifloordiv__ = _ProxyIOp(operator.ifloordiv) + __imod__ = _ProxyIOp(operator.imod) + __ipow__ = _ProxyIOp(operator.ipow) + __ilshift__ = _ProxyIOp(operator.ilshift) + __irshift__ = _ProxyIOp(operator.irshift) + __iand__ = _ProxyIOp(operator.iand) + __ixor__ = _ProxyIOp(operator.ixor) + __ior__ = _ProxyIOp(operator.ior) + __neg__ = _ProxyLookup(operator.neg) + __pos__ = _ProxyLookup(operator.pos) + __abs__ = _ProxyLookup(abs) + __invert__ = _ProxyLookup(operator.invert) + __complex__ = _ProxyLookup(complex) + __int__ = _ProxyLookup(int) + __float__ = _ProxyLookup(float) + __index__ = _ProxyLookup(operator.index) + __round__ = _ProxyLookup(round) + __trunc__ = _ProxyLookup(math.trunc) + __floor__ = _ProxyLookup(math.floor) + __ceil__ = _ProxyLookup(math.ceil) + __enter__ = _ProxyLookup() + __exit__ = _ProxyLookup() + __await__ = _ProxyLookup() + __aiter__ = _ProxyLookup() + __anext__ = _ProxyLookup() + __aenter__ = _ProxyLookup() + __aexit__ = _ProxyLookup() + __copy__ = _ProxyLookup(copy.copy) + __deepcopy__ = _ProxyLookup(copy.deepcopy) + # __getnewargs_ex__ (pickle through proxy not supported) + # __getnewargs__ (pickle) + # __getstate__ (pickle) + # __setstate__ (pickle) + # __reduce__ (pickle) + # __reduce_ex__ (pickle) diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/__init__.py b/venv/lib/python3.11/site-packages/werkzeug/middleware/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..25061aa824c5075ee9220c9080303178e32c13e4 GIT binary patch literal 208 zcmZ3^%ge<81j1U=vq1D?5CH>>P{wCAAY(d13PUi1CZpdRF&(J2JhdphDz!9SKQ}WaB`38!u_#qPK0Y%qvm`!Vub}c5hfQvNN@-52T@fqL YPLQjL`GLd-W=2NF4-7D(h#4pb0BP7ZJ^%m! literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..054d6c4fb56c670d90304c4af16ceabd49e5aed5 GIT binary patch literal 3492 zcmaJ@&2JmW6`$qub7fhdR-8Dg#&Rl~F-68U+_X&OLXjO?Zp;dnnj&`gv zW|op^Q$P+r@X&)01dx%msE|YBpgrW6zoL);9f&;%=qWcA?n$Sfbo&T+xtFUOWV1hnS>DOvQ}YN+nW^C`hZeT8y&j!&v7C zABEMZ9j_#c3ArN%bh4O~bR6hZF{O|QxlPQ(Q(`9n9wFo(@DHz|W~xghoiaWJ)!Llr z*;dK$E!UwpE#Vn{X^nAh_LY~WEw5RERxH!B*`~o6EpcY}Oi+Ug%UQJ<{o~T@1#0vO z_16ranjOi4`mR=~+P>w%X4eN@Cysyux9a%Jr1E6B%s6v=`iJ`;Q!sB$WHoJ$mfT7O zOlFUa3Q7X2Ho4`44PeSrXv(6o%4nZ|8M+DT7_GTgx@K%JYG^A)X`MMHom&K>;c3t^ zcR@9fC=Li}IrOfvVJwxn<@q%9#s!bTbjsZ-s?=Z)PFJ|QDZn8PR>A}JI+U}|t4v74 zOsnIH2bKv`Rgvf5%m(9G2rldC2amczy|aApV`<;rC0e$?U1^3`bE~#VR~VH7Oj>q1 z?5b%PC0G`g30kIdhG$Jd%w+01@j8|eI21;}^JvvE!SwJ@1{sD~0rw!IT9<_@Q^(lVXn1yI7B|LX%sGyOK1ClcdrYrOVTO5laCC2A`jr9i|EqD zJRG)k5RmC-pl!&)XOFp+*0cqOdfYXuCB%A0qM%}}uKAE*;WNVoOgI2*@C8GUsb=)f z^73LBT~2Mb!R(BNW+BW%@4z__`lyC0zIzP#VO9lQF$6#vuxh(uon8wpF2^9xzOcvyyMu=t}Kn zw*VN~EH$dWTe1xSd3j|rG%a6py&A`O<>}RT-+hlRLQXTxi&Lz z8&$!ypRn1am0-Yd92aeK9Z`V!;F51}|2`8QEHGFY!j92brJbc)&V~iGSb@?nwL6!5 zsNqC;F%85HVWg-)&y1K#QB4tZ*c>raPh-WXIcg3)jTU2O1bW?AFy8BJJ%|~16+-6S z%8KPM+HFdJs7^-&9Q0M;%dIUdad$r~aM%Z}rCU~z6hMP4j*hS%5HMe|MlArJkWxAw zPu3XZ1Yw@Xd{+=tc|^>KK8Y$i3X!(TGP&&%>lTFx-O9P>(+akBz)?pPS`fO>RwNlB zPwyF?2<`JYD_f7Ch>t@%Eb5MGfPN^Z5U5})$JbO44}~3_H?5NYK=?c(&F{K*Lp|at7J(JWVR)HjiF~gV(h;751&*)W zv>HSOv&+2|feIkFM=bY=Yga2wyO{M*?9@_9t5); z_OHM!@dgZEkd{WqUu#7FoNP|Kxoz)8fE;MR?*(v4kN~5wFnAnir=jk-uk&_2ar~M% z8u7CWKI6uU%^s}O;Pw33v9RJE8P)=XZim#BU067I;aAA+l0Ur?8pc6DKNT=rJ%XT60^@zUNzJyBO5gWS4e#y-Gj6etC$2&sdl`b#IE)5Hrw zYH@D)j=oU%==T9RQgT0Gh=PHo`TGlt%X(q%-mP>rP*<5R0Sf3B&~AJQ&~%ay!)88? z!x=ml7xJ?sNMW%8klKH6Srp1t~P zVejnK-5LyVHx^ohWN0)L*cv8duYGlSC--G;cl!C;|Gcz6dhKBJT4Vlja{6yizJBt2 z_Q$FH$=QR+*}deO&GXlPjPIYn(MW6$?k9iIoV*0oz&(TViATfy1!N=5lglR4rj^r-?S3(*o78( z#V|Y;%e2VP452dAlOEs~;ep1MtI%t~SdIk}#QmBF?K@EXU~u`<#asIPom=z2TPWNP zPV2y8VvU*EO|fc)A&?Q1VUgBf0ueorj*=gQk+{LLz(CZCZ((SuilVe4lS;HjaQILm z%7r~L)qfw7(Y?-ns79auwnbDW*NkTNj^E8_cJKIoa-|jjr2;`YIs6CL{`(4s^x=Pg Co8P_w literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..4a25166bc4e08ed3745bf7b3e5b3507b2ae853c4 GIT binary patch literal 10977 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/lint.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/lint.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..fbb6f9895c6137a4a9639b53f9f716ae39d082ab GIT binary patch literal 20938 zcmc(Hdu$umn%@kc!-qsk)Wdq&Bfn(XGA+kW;z#1dkza}(`61c9k*}lB97>`^k;=@- zjv0EdbCGRiS7>yD+?vUC_6mz6l{ZP(EowBo*c9mk1%kGJkOqqg1PmD1=8yD`LWUh6 z5Ky$g@62#GL($f~1&WSFABShoIdjgL@BMv;|Ej9W%i#!azIkzG7sve*eJLJJ?Sg;w z2G4OfIf)zMBwn(``3c*Qji+mS+&<*Mrz7s1a1FUwnKSO55QYSH?TULQyhC1GyCos+ zoA3|$*|jHLHBmiO&91%iz(mbZ4bMd#7i)`;mg~@~FJ3nh9160Y{J5?ks%O_#xNaC~ z;5i$2n3JmCb9BN_pT2Zg<3mbaC zzurSDyVH(4tIO`Ru{&#UM=ZP3&hB*J&f2m&tJ$4(xU;_O&Kk)+z;$g5|8p#|_w2yo zKJkQ{RFjcpTs#&_s8QMbVui!&9UO}(;zUxKibussIe952MHMkDPQ)ZB9=#lvqoO(% zR>jGvJd%_r6j2E$V(Jw!G8T=DD`GN%+fna@=veqtEGdi05&AB&=POb9QdAbh2}ul3 zPR3)Auo_DyLSmmoGMv@Z~7|)Tx!4qOsmXk6DI~5rd!-|+lCbmW=CNXX~s!S#m3g(FE zh&y_Aii#RmrxY=g#Kc2hZzv>&r?77Eu%hhQ!`ALKV=cViJ(1+(6*)FKrtT4+>FIf1 zJQ0q^qpITFg9%2_@gDJ&fdgB2Z0(JQrE1>k_d)1&Ejzlkn zBjbZtCZi}2rsVi!SXSuTK@c=$H=h@QVRyzNXfJ~a_lwgKa$m@>ZonO)mP@K(mROE)7E*WtVEX?<8~+CO!vE_#x7NRF?Z zR^AI9%?+^sE?0lb3(9?KDhBcuQ?71tG^vV9eCQ_{&uzZo1rbNabmT5D_yq}SOcI?OHmYMTIPb6v9n=XE_o9Qx~N7B;2L+|?VIj>_sV-$GLEdf z4d;EqzYu85`cL7UJMh_S+SRu^zq9|{?tj>w->Vm(_`bhsp=s5k+u`v(+-g(;83FR5qS%0DAc&Pw4nVMB*yS?s@^n|P_c9esy?a$xW+9s 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 E28s3pt^fc4 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..0f9e2c96d039a07a29be63c9fb012064225c8914 GIT binary patch literal 7681 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..5990f873a0ae094d699ca0119ee83a349859d5f7 GIT binary patch literal 13917 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/dispatcher.py b/venv/lib/python3.11/site-packages/werkzeug/middleware/dispatcher.py new file mode 100755 index 0000000..e11bacc --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/middleware/dispatcher.py @@ -0,0 +1,81 @@ +""" +Application Dispatcher +====================== + +This middleware creates a single WSGI application that dispatches to +multiple other WSGI applications mounted at different URL paths. + +A common example is writing a Single Page Application, where you have a +backend API and a frontend written in JavaScript that does the routing +in the browser rather than requesting different pages from the server. +The frontend is a single HTML and JS file that should be served for any +path besides "/api". + +This example dispatches to an API app under "/api", an admin app +under "/admin", and an app that serves frontend files for all other +requests:: + + app = DispatcherMiddleware(serve_frontend, { + '/api': api_app, + '/admin': admin_app, + }) + +In production, you might instead handle this at the HTTP server level, +serving files or proxying to application servers based on location. The +API and admin apps would each be deployed with a separate WSGI server, +and the static files would be served directly by the HTTP server. + +.. autoclass:: DispatcherMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" + +from __future__ import annotations + +import typing as t + +if t.TYPE_CHECKING: + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +class DispatcherMiddleware: + """Combine multiple applications as a single WSGI application. + Requests are dispatched to an application based on the path it is + mounted under. + + :param app: The WSGI application to dispatch to if the request + doesn't match a mounted path. + :param mounts: Maps path prefixes to applications for dispatching. + """ + + def __init__( + self, + app: WSGIApplication, + mounts: dict[str, WSGIApplication] | None = None, + ) -> None: + self.app = app + self.mounts = mounts or {} + + def __call__( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> t.Iterable[bytes]: + script = environ.get("PATH_INFO", "") + path_info = "" + + while "/" in script: + if script in self.mounts: + app = self.mounts[script] + break + + script, last_item = script.rsplit("/", 1) + path_info = f"/{last_item}{path_info}" + else: + app = self.mounts.get(script, self.app) + + original_script_name = environ.get("SCRIPT_NAME", "") + environ["SCRIPT_NAME"] = original_script_name + script + environ["PATH_INFO"] = path_info + return app(environ, start_response) diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/http_proxy.py b/venv/lib/python3.11/site-packages/werkzeug/middleware/http_proxy.py new file mode 100755 index 0000000..5e23915 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/middleware/http_proxy.py @@ -0,0 +1,236 @@ +""" +Basic HTTP Proxy +================ + +.. autoclass:: ProxyMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" + +from __future__ import annotations + +import typing as t +from http import client +from urllib.parse import quote +from urllib.parse import urlsplit + +from ..datastructures import EnvironHeaders +from ..http import is_hop_by_hop_header +from ..wsgi import get_input_stream + +if t.TYPE_CHECKING: + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +class ProxyMiddleware: + """Proxy requests under a path to an external server, routing other + requests to the app. + + This middleware can only proxy HTTP requests, as HTTP is the only + protocol handled by the WSGI server. Other protocols, such as + WebSocket requests, cannot be proxied at this layer. This should + only be used for development, in production a real proxy server + should be used. + + The middleware takes a dict mapping a path prefix to a dict + describing the host to be proxied to:: + + app = ProxyMiddleware(app, { + "/static/": { + "target": "http://127.0.0.1:5001/", + } + }) + + Each host has the following options: + + ``target``: + The target URL to dispatch to. This is required. + ``remove_prefix``: + Whether to remove the prefix from the URL before dispatching it + to the target. The default is ``False``. + ``host``: + ``""`` (default): + The host header is automatically rewritten to the URL of the + target. + ``None``: + The host header is unmodified from the client request. + Any other value: + The host header is overwritten with the value. + ``headers``: + A dictionary of headers to be sent with the request to the + target. The default is ``{}``. + ``ssl_context``: + A :class:`ssl.SSLContext` defining how to verify requests if the + target is HTTPS. The default is ``None``. + + In the example above, everything under ``"/static/"`` is proxied to + the server on port 5001. The host header is rewritten to the target, + and the ``"/static/"`` prefix is removed from the URLs. + + :param app: The WSGI application to wrap. + :param targets: Proxy target configurations. See description above. + :param chunk_size: Size of chunks to read from input stream and + write to target. + :param timeout: Seconds before an operation to a target fails. + + .. versionadded:: 0.14 + """ + + def __init__( + self, + app: WSGIApplication, + targets: t.Mapping[str, dict[str, t.Any]], + chunk_size: int = 2 << 13, + timeout: int = 10, + ) -> None: + def _set_defaults(opts: dict[str, t.Any]) -> dict[str, t.Any]: + opts.setdefault("remove_prefix", False) + opts.setdefault("host", "") + opts.setdefault("headers", {}) + opts.setdefault("ssl_context", None) + return opts + + self.app = app + self.targets = { + f"/{k.strip('/')}/": _set_defaults(v) for k, v in targets.items() + } + self.chunk_size = chunk_size + self.timeout = timeout + + def proxy_to( + self, opts: dict[str, t.Any], path: str, prefix: str + ) -> WSGIApplication: + target = urlsplit(opts["target"]) + # socket can handle unicode host, but header must be ascii + host = target.hostname.encode("idna").decode("ascii") + + def application( + environ: WSGIEnvironment, start_response: StartResponse + ) -> t.Iterable[bytes]: + headers = list(EnvironHeaders(environ).items()) + headers[:] = [ + (k, v) + for k, v in headers + if not is_hop_by_hop_header(k) + and k.lower() not in ("content-length", "host") + ] + headers.append(("Connection", "close")) + + if opts["host"] == "": + headers.append(("Host", host)) + elif opts["host"] is None: + headers.append(("Host", environ["HTTP_HOST"])) + else: + headers.append(("Host", opts["host"])) + + headers.extend(opts["headers"].items()) + remote_path = path + + if opts["remove_prefix"]: + remote_path = remote_path[len(prefix) :].lstrip("/") + remote_path = f"{target.path.rstrip('/')}/{remote_path}" + + content_length = environ.get("CONTENT_LENGTH") + chunked = False + + if content_length not in ("", None): + headers.append(("Content-Length", content_length)) # type: ignore + elif content_length is not None: + headers.append(("Transfer-Encoding", "chunked")) + chunked = True + + try: + if target.scheme == "http": + con = client.HTTPConnection( + host, target.port or 80, timeout=self.timeout + ) + elif target.scheme == "https": + con = client.HTTPSConnection( + host, + target.port or 443, + timeout=self.timeout, + context=opts["ssl_context"], + ) + else: + raise RuntimeError( + "Target scheme must be 'http' or 'https', got" + f" {target.scheme!r}." + ) + + con.connect() + # safe = https://url.spec.whatwg.org/#url-path-segment-string + # as well as percent for things that are already quoted + remote_url = quote(remote_path, safe="!$&'()*+,/:;=@%") + querystring = environ["QUERY_STRING"] + + if querystring: + remote_url = f"{remote_url}?{querystring}" + + con.putrequest(environ["REQUEST_METHOD"], remote_url, skip_host=True) + + for k, v in headers: + if k.lower() == "connection": + v = "close" + + con.putheader(k, v) + + con.endheaders() + stream = get_input_stream(environ) + + while True: + data = stream.read(self.chunk_size) + + if not data: + break + + if chunked: + con.send(b"%x\r\n%s\r\n" % (len(data), data)) + else: + con.send(data) + + resp = con.getresponse() + except OSError: + from ..exceptions import BadGateway + + return BadGateway()(environ, start_response) + + start_response( + f"{resp.status} {resp.reason}", + [ + (k.title(), v) + for k, v in resp.getheaders() + if not is_hop_by_hop_header(k) + ], + ) + + def read() -> t.Iterator[bytes]: + while True: + try: + data = resp.read(self.chunk_size) + except OSError: + break + + if not data: + break + + yield data + + return read() + + return application + + def __call__( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> t.Iterable[bytes]: + path = environ["PATH_INFO"] + app = self.app + + for prefix, opts in self.targets.items(): + if path.startswith(prefix): + app = self.proxy_to(opts, path, prefix) + break + + return app(environ, start_response) diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/lint.py b/venv/lib/python3.11/site-packages/werkzeug/middleware/lint.py new file mode 100755 index 0000000..3714271 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/middleware/lint.py @@ -0,0 +1,439 @@ +""" +WSGI Protocol Linter +==================== + +This module provides a middleware that performs sanity checks on the +behavior of the WSGI server and application. It checks that the +:pep:`3333` WSGI spec is properly implemented. It also warns on some +common HTTP errors such as non-empty responses for 304 status codes. + +.. autoclass:: LintMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" + +from __future__ import annotations + +import typing as t +from types import TracebackType +from urllib.parse import urlparse +from warnings import warn + +from ..datastructures import Headers +from ..http import is_entity_header +from ..wsgi import FileWrapper + +if t.TYPE_CHECKING: + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +class WSGIWarning(Warning): + """Warning class for WSGI warnings.""" + + +class HTTPWarning(Warning): + """Warning class for HTTP warnings.""" + + +def check_type(context: str, obj: object, need: type = str) -> None: + if type(obj) is not need: + warn( + f"{context!r} requires {need.__name__!r}, got {type(obj).__name__!r}.", + WSGIWarning, + stacklevel=3, + ) + + +class InputStream: + def __init__(self, stream: t.IO[bytes]) -> None: + self._stream = stream + + def read(self, *args: t.Any) -> bytes: + if len(args) == 0: + warn( + "WSGI does not guarantee an EOF marker on the input stream, thus making" + " calls to 'wsgi.input.read()' unsafe. Conforming servers may never" + " return from this call.", + WSGIWarning, + stacklevel=2, + ) + elif len(args) != 1: + warn( + "Too many parameters passed to 'wsgi.input.read()'.", + WSGIWarning, + stacklevel=2, + ) + return self._stream.read(*args) + + def readline(self, *args: t.Any) -> bytes: + if len(args) == 0: + warn( + "Calls to 'wsgi.input.readline()' without arguments are unsafe. Use" + " 'wsgi.input.read()' instead.", + WSGIWarning, + stacklevel=2, + ) + elif len(args) == 1: + warn( + "'wsgi.input.readline()' was called with a size hint. WSGI does not" + " support this, although it's available on all major servers.", + WSGIWarning, + stacklevel=2, + ) + else: + raise TypeError("Too many arguments passed to 'wsgi.input.readline()'.") + return self._stream.readline(*args) + + def __iter__(self) -> t.Iterator[bytes]: + try: + return iter(self._stream) + except TypeError: + warn("'wsgi.input' is not iterable.", WSGIWarning, stacklevel=2) + return iter(()) + + def close(self) -> None: + warn("The application closed the input stream!", WSGIWarning, stacklevel=2) + self._stream.close() + + +class ErrorStream: + def __init__(self, stream: t.IO[str]) -> None: + self._stream = stream + + def write(self, s: str) -> None: + check_type("wsgi.error.write()", s, str) + self._stream.write(s) + + def flush(self) -> None: + self._stream.flush() + + def writelines(self, seq: t.Iterable[str]) -> None: + for line in seq: + self.write(line) + + def close(self) -> None: + warn("The application closed the error stream!", WSGIWarning, stacklevel=2) + self._stream.close() + + +class GuardedWrite: + def __init__(self, write: t.Callable[[bytes], object], chunks: list[int]) -> None: + self._write = write + self._chunks = chunks + + def __call__(self, s: bytes) -> None: + check_type("write()", s, bytes) + self._write(s) + self._chunks.append(len(s)) + + +class GuardedIterator: + def __init__( + self, + iterator: t.Iterable[bytes], + headers_set: tuple[int, Headers], + chunks: list[int], + ) -> None: + self._iterator = iterator + self._next = iter(iterator).__next__ + self.closed = False + self.headers_set = headers_set + self.chunks = chunks + + def __iter__(self) -> GuardedIterator: + return self + + def __next__(self) -> bytes: + if self.closed: + warn("Iterated over closed 'app_iter'.", WSGIWarning, stacklevel=2) + + rv = self._next() + + if not self.headers_set: + warn( + "The application returned before it started the response.", + WSGIWarning, + stacklevel=2, + ) + + check_type("application iterator items", rv, bytes) + self.chunks.append(len(rv)) + return rv + + def close(self) -> None: + self.closed = True + + if hasattr(self._iterator, "close"): + self._iterator.close() + + if self.headers_set: + status_code, headers = self.headers_set + bytes_sent = sum(self.chunks) + content_length = headers.get("content-length", type=int) + + if status_code == 304: + for key, _value in headers: + key = key.lower() + if key not in ("expires", "content-location") and is_entity_header( + key + ): + warn( + f"Entity header {key!r} found in 304 response.", + HTTPWarning, + stacklevel=2, + ) + if bytes_sent: + warn( + "304 responses must not have a body.", + HTTPWarning, + stacklevel=2, + ) + elif 100 <= status_code < 200 or status_code == 204: + if content_length != 0: + warn( + f"{status_code} responses must have an empty content length.", + HTTPWarning, + stacklevel=2, + ) + if bytes_sent: + warn( + f"{status_code} responses must not have a body.", + HTTPWarning, + stacklevel=2, + ) + elif content_length is not None and content_length != bytes_sent: + warn( + "Content-Length and the number of bytes sent to the" + " client do not match.", + WSGIWarning, + stacklevel=2, + ) + + def __del__(self) -> None: + if not self.closed: + try: + warn( + "Iterator was garbage collected before it was closed.", + WSGIWarning, + stacklevel=2, + ) + except Exception: + pass + + +class LintMiddleware: + """Warns about common errors in the WSGI and HTTP behavior of the + server and wrapped application. Some of the issues it checks are: + + - invalid status codes + - non-bytes sent to the WSGI server + - strings returned from the WSGI application + - non-empty conditional responses + - unquoted etags + - relative URLs in the Location header + - unsafe calls to wsgi.input + - unclosed iterators + + Error information is emitted using the :mod:`warnings` module. + + :param app: The WSGI application to wrap. + + .. code-block:: python + + from werkzeug.middleware.lint import LintMiddleware + app = LintMiddleware(app) + """ + + def __init__(self, app: WSGIApplication) -> None: + self.app = app + + def check_environ(self, environ: WSGIEnvironment) -> None: + if type(environ) is not dict: # noqa: E721 + warn( + "WSGI environment is not a standard Python dict.", + WSGIWarning, + stacklevel=4, + ) + for key in ( + "REQUEST_METHOD", + "SERVER_NAME", + "SERVER_PORT", + "wsgi.version", + "wsgi.input", + "wsgi.errors", + "wsgi.multithread", + "wsgi.multiprocess", + "wsgi.run_once", + ): + if key not in environ: + warn( + f"Required environment key {key!r} not found", + WSGIWarning, + stacklevel=3, + ) + if environ["wsgi.version"] != (1, 0): + warn("Environ is not a WSGI 1.0 environ.", WSGIWarning, stacklevel=3) + + script_name = environ.get("SCRIPT_NAME", "") + path_info = environ.get("PATH_INFO", "") + + if script_name and script_name[0] != "/": + warn( + f"'SCRIPT_NAME' does not start with a slash: {script_name!r}", + WSGIWarning, + stacklevel=3, + ) + + if path_info and path_info[0] != "/": + warn( + f"'PATH_INFO' does not start with a slash: {path_info!r}", + WSGIWarning, + stacklevel=3, + ) + + def check_start_response( + self, + status: str, + headers: list[tuple[str, str]], + exc_info: None | (tuple[type[BaseException], BaseException, TracebackType]), + ) -> tuple[int, Headers]: + check_type("status", status, str) + status_code_str = status.split(None, 1)[0] + + if len(status_code_str) != 3 or not status_code_str.isdecimal(): + warn("Status code must be three digits.", WSGIWarning, stacklevel=3) + + if len(status) < 4 or status[3] != " ": + warn( + f"Invalid value for status {status!r}. Valid status strings are three" + " digits, a space and a status explanation.", + WSGIWarning, + stacklevel=3, + ) + + status_code = int(status_code_str) + + if status_code < 100: + warn("Status code < 100 detected.", WSGIWarning, stacklevel=3) + + if type(headers) is not list: # noqa: E721 + warn("Header list is not a list.", WSGIWarning, stacklevel=3) + + for item in headers: + if type(item) is not tuple or len(item) != 2: + warn("Header items must be 2-item tuples.", WSGIWarning, stacklevel=3) + name, value = item + if type(name) is not str or type(value) is not str: # noqa: E721 + warn( + "Header keys and values must be strings.", WSGIWarning, stacklevel=3 + ) + if name.lower() == "status": + warn( + "The status header is not supported due to" + " conflicts with the CGI spec.", + WSGIWarning, + stacklevel=3, + ) + + if exc_info is not None and not isinstance(exc_info, tuple): + warn("Invalid value for exc_info.", WSGIWarning, stacklevel=3) + + headers_obj = Headers(headers) + self.check_headers(headers_obj) + + return status_code, headers_obj + + def check_headers(self, headers: Headers) -> None: + etag = headers.get("etag") + + if etag is not None: + if etag.startswith(("W/", "w/")): + if etag.startswith("w/"): + warn( + "Weak etag indicator should be upper case.", + HTTPWarning, + stacklevel=4, + ) + + etag = etag[2:] + + if not (etag[:1] == etag[-1:] == '"'): + warn("Unquoted etag emitted.", HTTPWarning, stacklevel=4) + + location = headers.get("location") + + if location is not None: + if not urlparse(location).netloc: + warn( + "Absolute URLs required for location header.", + HTTPWarning, + stacklevel=4, + ) + + def check_iterator(self, app_iter: t.Iterable[bytes]) -> None: + if isinstance(app_iter, str): + warn( + "The application returned a string. The response will send one" + " character at a time to the client, which will kill performance." + " Return a list or iterable instead.", + WSGIWarning, + stacklevel=3, + ) + + def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Iterable[bytes]: + if len(args) != 2: + warn("A WSGI app takes two arguments.", WSGIWarning, stacklevel=2) + + if kwargs: + warn( + "A WSGI app does not take keyword arguments.", WSGIWarning, stacklevel=2 + ) + + environ: WSGIEnvironment = args[0] + start_response: StartResponse = args[1] + + self.check_environ(environ) + environ["wsgi.input"] = InputStream(environ["wsgi.input"]) + environ["wsgi.errors"] = ErrorStream(environ["wsgi.errors"]) + + # Hook our own file wrapper in so that applications will always + # iterate to the end and we can check the content length. + environ["wsgi.file_wrapper"] = FileWrapper + + headers_set: list[t.Any] = [] + chunks: list[int] = [] + + def checking_start_response( + *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[bytes], None]: + if len(args) not in {2, 3}: + warn( + f"Invalid number of arguments: {len(args)}, expected 2 or 3.", + WSGIWarning, + stacklevel=2, + ) + + if kwargs: + warn( + "'start_response' does not take keyword arguments.", + WSGIWarning, + stacklevel=2, + ) + + status: str = args[0] + headers: list[tuple[str, str]] = args[1] + exc_info: ( + None | (tuple[type[BaseException], BaseException, TracebackType]) + ) = args[2] if len(args) == 3 else None + + headers_set[:] = self.check_start_response(status, headers, exc_info) + return GuardedWrite(start_response(status, headers, exc_info), chunks) + + app_iter = self.app(environ, t.cast("StartResponse", checking_start_response)) + self.check_iterator(app_iter) + return GuardedIterator( + app_iter, t.cast(tuple[int, Headers], headers_set), chunks + ) diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/profiler.py b/venv/lib/python3.11/site-packages/werkzeug/middleware/profiler.py new file mode 100755 index 0000000..112b877 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/middleware/profiler.py @@ -0,0 +1,155 @@ +""" +Application Profiler +==================== + +This module provides a middleware that profiles each request with the +:mod:`cProfile` module. This can help identify bottlenecks in your code +that may be slowing down your application. + +.. autoclass:: ProfilerMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" + +from __future__ import annotations + +import os.path +import sys +import time +import typing as t +from pstats import Stats + +try: + from cProfile import Profile +except ImportError: + from profile import Profile # type: ignore + +if t.TYPE_CHECKING: + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +class ProfilerMiddleware: + """Wrap a WSGI application and profile the execution of each + request. Responses are buffered so that timings are more exact. + + If ``stream`` is given, :class:`pstats.Stats` are written to it + after each request. If ``profile_dir`` is given, :mod:`cProfile` + data files are saved to that directory, one file per request. + + The filename can be customized by passing ``filename_format``. If + it is a string, it will be formatted using :meth:`str.format` with + the following fields available: + + - ``{method}`` - The request method; GET, POST, etc. + - ``{path}`` - The request path or 'root' should one not exist. + - ``{elapsed}`` - The elapsed time of the request in milliseconds. + - ``{time}`` - The time of the request. + + If it is a callable, it will be called with the WSGI ``environ`` and + be expected to return a filename string. The ``environ`` dictionary + will also have the ``"werkzeug.profiler"`` key populated with a + dictionary containing the following fields (more may be added in the + future): + - ``{elapsed}`` - The elapsed time of the request in milliseconds. + - ``{time}`` - The time of the request. + + :param app: The WSGI application to wrap. + :param stream: Write stats to this stream. Disable with ``None``. + :param sort_by: A tuple of columns to sort stats by. See + :meth:`pstats.Stats.sort_stats`. + :param restrictions: A tuple of restrictions to filter stats by. See + :meth:`pstats.Stats.print_stats`. + :param profile_dir: Save profile data files to this directory. + :param filename_format: Format string for profile data file names, + or a callable returning a name. See explanation above. + + .. code-block:: python + + from werkzeug.middleware.profiler import ProfilerMiddleware + app = ProfilerMiddleware(app) + + .. versionchanged:: 3.0 + Added the ``"werkzeug.profiler"`` key to the ``filename_format(environ)`` + parameter with the ``elapsed`` and ``time`` fields. + + .. versionchanged:: 0.15 + Stats are written even if ``profile_dir`` is given, and can be + disable by passing ``stream=None``. + + .. versionadded:: 0.15 + Added ``filename_format``. + + .. versionadded:: 0.9 + Added ``restrictions`` and ``profile_dir``. + """ + + def __init__( + self, + app: WSGIApplication, + stream: t.IO[str] | None = sys.stdout, + sort_by: t.Iterable[str] = ("time", "calls"), + restrictions: t.Iterable[str | int | float] = (), + profile_dir: str | None = None, + filename_format: str = "{method}.{path}.{elapsed:.0f}ms.{time:.0f}.prof", + ) -> None: + self._app = app + self._stream = stream + self._sort_by = sort_by + self._restrictions = restrictions + self._profile_dir = profile_dir + self._filename_format = filename_format + + def __call__( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> t.Iterable[bytes]: + response_body: list[bytes] = [] + + def catching_start_response(status, headers, exc_info=None): # type: ignore + start_response(status, headers, exc_info) + return response_body.append + + def runapp() -> None: + app_iter = self._app( + environ, t.cast("StartResponse", catching_start_response) + ) + response_body.extend(app_iter) + + if hasattr(app_iter, "close"): + app_iter.close() + + profile = Profile() + start = time.time() + profile.runcall(runapp) + body = b"".join(response_body) + elapsed = time.time() - start + + if self._profile_dir is not None: + if callable(self._filename_format): + environ["werkzeug.profiler"] = { + "elapsed": elapsed * 1000.0, + "time": time.time(), + } + filename = self._filename_format(environ) + else: + filename = self._filename_format.format( + method=environ["REQUEST_METHOD"], + path=environ["PATH_INFO"].strip("/").replace("/", ".") or "root", + elapsed=elapsed * 1000.0, + time=time.time(), + ) + filename = os.path.join(self._profile_dir, filename) + profile.dump_stats(filename) + + if self._stream is not None: + stats = Stats(profile, stream=self._stream) + stats.sort_stats(*self._sort_by) + print("-" * 80, file=self._stream) + path_info = environ.get("PATH_INFO", "") + print(f"PATH: {path_info!r}", file=self._stream) + stats.print_stats(*self._restrictions) + print(f"{'-' * 80}\n", file=self._stream) + + return [body] diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/proxy_fix.py b/venv/lib/python3.11/site-packages/werkzeug/middleware/proxy_fix.py new file mode 100755 index 0000000..cbf4e0b --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/middleware/proxy_fix.py @@ -0,0 +1,183 @@ +""" +X-Forwarded-For Proxy Fix +========================= + +This module provides a middleware that adjusts the WSGI environ based on +``X-Forwarded-`` headers that proxies in front of an application may +set. + +When an application is running behind a proxy server, WSGI may see the +request as coming from that server rather than the real client. Proxies +set various headers to track where the request actually came from. + +This middleware should only be used if the application is actually +behind such a proxy, and should be configured with the number of proxies +that are chained in front of it. Not all proxies set all the headers. +Since incoming headers can be faked, you must set how many proxies are +setting each header so the middleware knows what to trust. + +.. autoclass:: ProxyFix + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" + +from __future__ import annotations + +import typing as t + +from ..http import parse_list_header + +if t.TYPE_CHECKING: + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +class ProxyFix: + """Adjust the WSGI environ based on ``X-Forwarded-`` that proxies in + front of the application may set. + + - ``X-Forwarded-For`` sets ``REMOTE_ADDR``. + - ``X-Forwarded-Proto`` sets ``wsgi.url_scheme``. + - ``X-Forwarded-Host`` sets ``HTTP_HOST``, ``SERVER_NAME``, and + ``SERVER_PORT``. + - ``X-Forwarded-Port`` sets ``HTTP_HOST`` and ``SERVER_PORT``. + - ``X-Forwarded-Prefix`` sets ``SCRIPT_NAME``. + + You must tell the middleware how many proxies set each header so it + knows what values to trust. It is a security issue to trust values + that came from the client rather than a proxy. + + The original values of the headers are stored in the WSGI + environ as ``werkzeug.proxy_fix.orig``, a dict. + + :param app: The WSGI application to wrap. + :param x_for: Number of values to trust for ``X-Forwarded-For``. + :param x_proto: Number of values to trust for ``X-Forwarded-Proto``. + :param x_host: Number of values to trust for ``X-Forwarded-Host``. + :param x_port: Number of values to trust for ``X-Forwarded-Port``. + :param x_prefix: Number of values to trust for + ``X-Forwarded-Prefix``. + + .. code-block:: python + + from werkzeug.middleware.proxy_fix import ProxyFix + # App is behind one proxy that sets the -For and -Host headers. + app = ProxyFix(app, x_for=1, x_host=1) + + .. versionchanged:: 1.0 + The ``num_proxies`` argument and attribute; the ``get_remote_addr`` method; and + the environ keys ``orig_remote_addr``, ``orig_wsgi_url_scheme``, and + ``orig_http_host`` were removed. + + .. versionchanged:: 0.15 + All headers support multiple values. Each header is configured with a separate + number of trusted proxies. + + .. versionchanged:: 0.15 + Original WSGI environ values are stored in the ``werkzeug.proxy_fix.orig`` dict. + + .. versionchanged:: 0.15 + Support ``X-Forwarded-Port`` and ``X-Forwarded-Prefix``. + + .. versionchanged:: 0.15 + ``X-Forwarded-Host`` and ``X-Forwarded-Port`` modify + ``SERVER_NAME`` and ``SERVER_PORT``. + """ + + def __init__( + self, + app: WSGIApplication, + x_for: int = 1, + x_proto: int = 1, + x_host: int = 0, + x_port: int = 0, + x_prefix: int = 0, + ) -> None: + self.app = app + self.x_for = x_for + self.x_proto = x_proto + self.x_host = x_host + self.x_port = x_port + self.x_prefix = x_prefix + + def _get_real_value(self, trusted: int, value: str | None) -> str | None: + """Get the real value from a list header based on the configured + number of trusted proxies. + + :param trusted: Number of values to trust in the header. + :param value: Comma separated list header value to parse. + :return: The real value, or ``None`` if there are fewer values + than the number of trusted proxies. + + .. versionchanged:: 1.0 + Renamed from ``_get_trusted_comma``. + + .. versionadded:: 0.15 + """ + if not (trusted and value): + return None + values = parse_list_header(value) + if len(values) >= trusted: + return values[-trusted] + return None + + def __call__( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> t.Iterable[bytes]: + """Modify the WSGI environ based on the various ``Forwarded`` + headers before calling the wrapped application. Store the + original environ values in ``werkzeug.proxy_fix.orig_{key}``. + """ + environ_get = environ.get + orig_remote_addr = environ_get("REMOTE_ADDR") + orig_wsgi_url_scheme = environ_get("wsgi.url_scheme") + orig_http_host = environ_get("HTTP_HOST") + environ.update( + { + "werkzeug.proxy_fix.orig": { + "REMOTE_ADDR": orig_remote_addr, + "wsgi.url_scheme": orig_wsgi_url_scheme, + "HTTP_HOST": orig_http_host, + "SERVER_NAME": environ_get("SERVER_NAME"), + "SERVER_PORT": environ_get("SERVER_PORT"), + "SCRIPT_NAME": environ_get("SCRIPT_NAME"), + } + } + ) + + x_for = self._get_real_value(self.x_for, environ_get("HTTP_X_FORWARDED_FOR")) + if x_for: + environ["REMOTE_ADDR"] = x_for + + x_proto = self._get_real_value( + self.x_proto, environ_get("HTTP_X_FORWARDED_PROTO") + ) + if x_proto: + environ["wsgi.url_scheme"] = x_proto + + x_host = self._get_real_value(self.x_host, environ_get("HTTP_X_FORWARDED_HOST")) + if x_host: + environ["HTTP_HOST"] = environ["SERVER_NAME"] = x_host + # "]" to check for IPv6 address without port + if ":" in x_host and not x_host.endswith("]"): + environ["SERVER_NAME"], environ["SERVER_PORT"] = x_host.rsplit(":", 1) + + x_port = self._get_real_value(self.x_port, environ_get("HTTP_X_FORWARDED_PORT")) + if x_port: + host = environ.get("HTTP_HOST") + if host: + # "]" to check for IPv6 address without port + if ":" in host and not host.endswith("]"): + host = host.rsplit(":", 1)[0] + environ["HTTP_HOST"] = f"{host}:{x_port}" + environ["SERVER_PORT"] = x_port + + x_prefix = self._get_real_value( + self.x_prefix, environ_get("HTTP_X_FORWARDED_PREFIX") + ) + if x_prefix: + environ["SCRIPT_NAME"] = x_prefix + + return self.app(environ, start_response) diff --git a/venv/lib/python3.11/site-packages/werkzeug/middleware/shared_data.py b/venv/lib/python3.11/site-packages/werkzeug/middleware/shared_data.py new file mode 100755 index 0000000..c7c06df --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/middleware/shared_data.py @@ -0,0 +1,283 @@ +""" +Serve Shared Static Files +========================= + +.. autoclass:: SharedDataMiddleware + :members: is_allowed + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" + +from __future__ import annotations + +import collections.abc as cabc +import importlib.util +import mimetypes +import os +import posixpath +import typing as t +from datetime import datetime +from datetime import timezone +from io import BytesIO +from time import time +from zlib import adler32 + +from ..http import http_date +from ..http import is_resource_modified +from ..security import safe_join +from ..utils import get_content_type +from ..wsgi import get_path_info +from ..wsgi import wrap_file + +_TOpener = t.Callable[[], tuple[t.IO[bytes], datetime, int]] +_TLoader = t.Callable[[t.Optional[str]], tuple[t.Optional[str], t.Optional[_TOpener]]] + +if t.TYPE_CHECKING: + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +class SharedDataMiddleware: + """A WSGI middleware which provides static content for development + environments or simple server setups. Its usage is quite simple:: + + import os + from werkzeug.middleware.shared_data import SharedDataMiddleware + + app = SharedDataMiddleware(app, { + '/shared': os.path.join(os.path.dirname(__file__), 'shared') + }) + + The contents of the folder ``./shared`` will now be available on + ``http://example.com/shared/``. This is pretty useful during development + because a standalone media server is not required. Files can also be + mounted on the root folder and still continue to use the application because + the shared data middleware forwards all unhandled requests to the + application, even if the requests are below one of the shared folders. + + If `pkg_resources` is available you can also tell the middleware to serve + files from package data:: + + app = SharedDataMiddleware(app, { + '/static': ('myapplication', 'static') + }) + + This will then serve the ``static`` folder in the `myapplication` + Python package. + + The optional `disallow` parameter can be a list of :func:`~fnmatch.fnmatch` + rules for files that are not accessible from the web. If `cache` is set to + `False` no caching headers are sent. + + Currently the middleware does not support non-ASCII filenames. If the + encoding on the file system happens to match the encoding of the URI it may + work but this could also be by accident. We strongly suggest using ASCII + only file names for static files. + + The middleware will guess the mimetype using the Python `mimetype` + module. If it's unable to figure out the charset it will fall back + to `fallback_mimetype`. + + :param app: the application to wrap. If you don't want to wrap an + application you can pass it :exc:`NotFound`. + :param exports: a list or dict of exported files and folders. + :param disallow: a list of :func:`~fnmatch.fnmatch` rules. + :param cache: enable or disable caching headers. + :param cache_timeout: the cache timeout in seconds for the headers. + :param fallback_mimetype: The fallback mimetype for unknown files. + + .. versionchanged:: 1.0 + The default ``fallback_mimetype`` is + ``application/octet-stream``. If a filename looks like a text + mimetype, the ``utf-8`` charset is added to it. + + .. versionadded:: 0.6 + Added ``fallback_mimetype``. + + .. versionchanged:: 0.5 + Added ``cache_timeout``. + """ + + def __init__( + self, + app: WSGIApplication, + exports: ( + cabc.Mapping[str, str | tuple[str, str]] + | t.Iterable[tuple[str, str | tuple[str, str]]] + ), + disallow: None = None, + cache: bool = True, + cache_timeout: int = 60 * 60 * 12, + fallback_mimetype: str = "application/octet-stream", + ) -> None: + self.app = app + self.exports: list[tuple[str, _TLoader]] = [] + self.cache = cache + self.cache_timeout = cache_timeout + + if isinstance(exports, cabc.Mapping): + exports = exports.items() + + for key, value in exports: + if isinstance(value, tuple): + loader = self.get_package_loader(*value) + elif isinstance(value, str): + if os.path.isfile(value): + loader = self.get_file_loader(value) + else: + loader = self.get_directory_loader(value) + else: + raise TypeError(f"unknown def {value!r}") + + self.exports.append((key, loader)) + + if disallow is not None: + from fnmatch import fnmatch + + self.is_allowed = lambda x: not fnmatch(x, disallow) + + self.fallback_mimetype = fallback_mimetype + + def is_allowed(self, filename: str) -> bool: + """Subclasses can override this method to disallow the access to + certain files. However by providing `disallow` in the constructor + this method is overwritten. + """ + return True + + def _opener(self, filename: str) -> _TOpener: + return lambda: ( + open(filename, "rb"), + datetime.fromtimestamp(os.path.getmtime(filename), tz=timezone.utc), + int(os.path.getsize(filename)), + ) + + def get_file_loader(self, filename: str) -> _TLoader: + return lambda x: (os.path.basename(filename), self._opener(filename)) + + def get_package_loader(self, package: str, package_path: str) -> _TLoader: + load_time = datetime.now(timezone.utc) + spec = importlib.util.find_spec(package) + reader = spec.loader.get_resource_reader(package) # type: ignore[union-attr] + + def loader( + path: str | None, + ) -> tuple[str | None, _TOpener | None]: + if path is None: + return None, None + + path = safe_join(package_path, path) + + if path is None: + return None, None + + basename = posixpath.basename(path) + + try: + resource = reader.open_resource(path) + except OSError: + return None, None + + if isinstance(resource, BytesIO): + return ( + basename, + lambda: (resource, load_time, len(resource.getvalue())), + ) + + return ( + basename, + lambda: ( + resource, + datetime.fromtimestamp( + os.path.getmtime(resource.name), tz=timezone.utc + ), + os.path.getsize(resource.name), + ), + ) + + return loader + + def get_directory_loader(self, directory: str) -> _TLoader: + def loader( + path: str | None, + ) -> tuple[str | None, _TOpener | None]: + if path is not None: + path = safe_join(directory, path) + + if path is None: + return None, None + else: + path = directory + + if os.path.isfile(path): + return os.path.basename(path), self._opener(path) + + return None, None + + return loader + + def generate_etag(self, mtime: datetime, file_size: int, real_filename: str) -> str: + fn_str = os.fsencode(real_filename) + timestamp = mtime.timestamp() + checksum = adler32(fn_str) & 0xFFFFFFFF + return f"wzsdm-{timestamp}-{file_size}-{checksum}" + + def __call__( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> t.Iterable[bytes]: + path = get_path_info(environ) + file_loader = None + + for search_path, loader in self.exports: + if search_path == path: + real_filename, file_loader = loader(None) + + if file_loader is not None: + break + + if not search_path.endswith("/"): + search_path += "/" + + if path.startswith(search_path): + real_filename, file_loader = loader(path[len(search_path) :]) + + if file_loader is not None: + break + + if file_loader is None or not self.is_allowed(real_filename): # type: ignore + return self.app(environ, start_response) + + guessed_type = mimetypes.guess_type(real_filename) # type: ignore + mime_type = get_content_type(guessed_type[0] or self.fallback_mimetype, "utf-8") + f, mtime, file_size = file_loader() + + headers = [("Date", http_date())] + + if self.cache: + timeout = self.cache_timeout + etag = self.generate_etag(mtime, file_size, real_filename) # type: ignore + headers += [ + ("Etag", f'"{etag}"'), + ("Cache-Control", f"max-age={timeout}, public"), + ] + + if not is_resource_modified(environ, etag, last_modified=mtime): + f.close() + start_response("304 Not Modified", headers) + return [] + + headers.append(("Expires", http_date(time() + timeout))) + else: + headers.append(("Cache-Control", "public")) + + headers.extend( + ( + ("Content-Type", mime_type), + ("Content-Length", str(file_size)), + ("Last-Modified", http_date(mtime)), + ) + ) + start_response("200 OK", headers) + return wrap_file(environ, f) diff --git a/venv/lib/python3.11/site-packages/werkzeug/py.typed b/venv/lib/python3.11/site-packages/werkzeug/py.typed new file mode 100755 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/werkzeug/routing/__init__.py b/venv/lib/python3.11/site-packages/werkzeug/routing/__init__.py new file mode 100755 index 0000000..62adc48 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/routing/__init__.py @@ -0,0 +1,134 @@ +"""When it comes to combining multiple controller or view functions +(however you want to call them) you need a dispatcher. A simple way +would be applying regular expression tests on the ``PATH_INFO`` and +calling registered callback functions that return the value then. + +This module implements a much more powerful system than simple regular +expression matching because it can also convert values in the URLs and +build URLs. + +Here a simple example that creates a URL map for an application with +two subdomains (www and kb) and some URL rules: + +.. code-block:: python + + m = Map([ + # Static URLs + Rule('/', endpoint='static/index'), + Rule('/about', endpoint='static/about'), + Rule('/help', endpoint='static/help'), + # Knowledge Base + Subdomain('kb', [ + Rule('/', endpoint='kb/index'), + Rule('/browse/', endpoint='kb/browse'), + Rule('/browse//', endpoint='kb/browse'), + Rule('/browse//', endpoint='kb/browse') + ]) + ], default_subdomain='www') + +If the application doesn't use subdomains it's perfectly fine to not set +the default subdomain and not use the `Subdomain` rule factory. The +endpoint in the rules can be anything, for example import paths or +unique identifiers. The WSGI application can use those endpoints to get the +handler for that URL. It doesn't have to be a string at all but it's +recommended. + +Now it's possible to create a URL adapter for one of the subdomains and +build URLs: + +.. code-block:: python + + c = m.bind('example.com') + + c.build("kb/browse", dict(id=42)) + 'http://kb.example.com/browse/42/' + + c.build("kb/browse", dict()) + 'http://kb.example.com/browse/' + + c.build("kb/browse", dict(id=42, page=3)) + 'http://kb.example.com/browse/42/3' + + c.build("static/about") + '/about' + + c.build("static/index", force_external=True) + 'http://www.example.com/' + + c = m.bind('example.com', subdomain='kb') + + c.build("static/about") + 'http://www.example.com/about' + +The first argument to bind is the server name *without* the subdomain. +Per default it will assume that the script is mounted on the root, but +often that's not the case so you can provide the real mount point as +second argument: + +.. code-block:: python + + c = m.bind('example.com', '/applications/example') + +The third argument can be the subdomain, if not given the default +subdomain is used. For more details about binding have a look at the +documentation of the `MapAdapter`. + +And here is how you can match URLs: + +.. code-block:: python + + c = m.bind('example.com') + + c.match("/") + ('static/index', {}) + + c.match("/about") + ('static/about', {}) + + c = m.bind('example.com', '/', 'kb') + + c.match("/") + ('kb/index', {}) + + c.match("/browse/42/23") + ('kb/browse', {'id': 42, 'page': 23}) + +If matching fails you get a ``NotFound`` exception, if the rule thinks +it's a good idea to redirect (for example because the URL was defined +to have a slash at the end but the request was missing that slash) it +will raise a ``RequestRedirect`` exception. Both are subclasses of +``HTTPException`` so you can use those errors as responses in the +application. + +If matching succeeded but the URL rule was incompatible to the given +method (for example there were only rules for ``GET`` and ``HEAD`` but +routing tried to match a ``POST`` request) a ``MethodNotAllowed`` +exception is raised. +""" + +from .converters import AnyConverter as AnyConverter +from .converters import BaseConverter as BaseConverter +from .converters import FloatConverter as FloatConverter +from .converters import IntegerConverter as IntegerConverter +from .converters import PathConverter as PathConverter +from .converters import UnicodeConverter as UnicodeConverter +from .converters import UUIDConverter as UUIDConverter +from .converters import ValidationError as ValidationError +from .exceptions import BuildError as BuildError +from .exceptions import NoMatch as NoMatch +from .exceptions import RequestAliasRedirect as RequestAliasRedirect +from .exceptions import RequestPath as RequestPath +from .exceptions import RequestRedirect as RequestRedirect +from .exceptions import RoutingException as RoutingException +from .exceptions import WebsocketMismatch as WebsocketMismatch +from .map import Map as Map +from .map import MapAdapter as MapAdapter +from .matcher import StateMachineMatcher as StateMachineMatcher +from .rules import EndpointPrefix as EndpointPrefix +from .rules import parse_converter_args as parse_converter_args +from .rules import Rule as Rule +from .rules import RuleFactory as RuleFactory +from .rules import RuleTemplate as RuleTemplate +from .rules import RuleTemplateFactory as RuleTemplateFactory +from .rules import Subdomain as Subdomain +from .rules import Submount as Submount diff --git a/venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..2b937c97fb283b5b2d71123a46e185c500f75e8e GIT binary patch literal 5073 zcmbtYU2ojR6{RfMlBrKy^0yrioT9rj8E1I{@`N+N@_EST zo%1YTfPBHZ!15&INoSJfDacdK6w4POUvw_AYzKCC+L>l~8uE-Y!}1K|S!b5zS;%wF z9LsZ%=bd?$=OHgR3oI`{zT{kD`BHGXyXY*kd>QhRv&8aZaHV_IxytfVaIJgYxz6$x z$TyrDEMJ9u)49p=HORM|TP$CPeA~Ir@(sv$oI5Pvg#4NF8OygI-*xUnzP)QL-;v+X zTGrc+3Wc8tH|i=Ql8A(sANt|G==Ordj{}9SFws#EC@mr_4t>=Z?Oy06eiRzJ+KKw= z5TA~tp6JUkVI?vMMAA{+W$q4@@`MzgZ(^Ca9i?kxQy9NX%KP%z?nk}A6D=iV90$j= zwpRPSKx(0mVy%q9N+MAvF@l7S63yoJ=HAQ3*6SBvH=9C+p6z1EY^HA#rLiJ)wWND+ zVlC#%1j>`1PW2qhpr=S4!#C`~5zx zBo123{A&;ctVF{DX5F@HH5los2dyA-57yU3e4KQm(6$Bsx?)4Tl5zE~+@hY(#cqPt zT()`Cy8~U-O1-ioROrQ#A0`_W!{h3H=&7U1^2+J4vK94`vnHe;KAg}|L44MD?k^1g zTznNq{Xlv9N<5WDjTYX`y;7|lw4mu^Q?#+Ows6q;(EP&KmX7*Hm3NIPX?JnUAI^CU z7p?o=lmBlrYl-E)dQx&s!G_W1zg=eW+ZExdwgl)KqafL+AVw<7w!PJ6*cC&{izd}U_JeFd(AIiLWKxRGGThy)I6LTn`>cTqP@03ITe zZ1oa$nXMI=7lh*}4|sna^)pXKV80eTK-A1g&wwsH8H46{)d)V0(i1A2M43cB0%sR+ z?$*HkUbT`rtp?uUu8q-nr-Y9_XAzXYnsruf=qt)d!gesjRiP!7(gI2AeBa8a_ zqt$xlW7LaAz2*%i!k78LO7%|Gr zMTNC|SeBN7_SLnK-6Kjvru?DedzE$ZXccil^Z|KwjW&V=$V%u)+I&nDmy`k|E~Brb z?p;46ai?Sl7u>3Rei93BC3=@@{E<=7)b+N z?E2CW)R0a+8tCl`sMtj&v zXY6Fw6t_|nPoo6OAe<1vF4i=-a7Jyr*?hUTxBWcdGUgNjTS%K)M;d``uvZh~)qvUQ zb=NLn4N+V4vgx@l-VNXj%8|Jn*qO8`KSX*$KF^aQ4Pe08T?Ml8%HG6R7>~O<5@m>M zNqS`a<7KHp2<5RhL!-+YD!k&*@q*=yQ|4RAT1Kf7xC>s^|nQ;*^DjG3=^RRqFj z5a5x3P{2bV3k3opI~u9|KX|=b%VY0mHpAmTr7r-b(VnFXX|ZGOMG(oP*t4(&`rKE# z*f+b4D^0Ou;Z5k%rM=iU`{vEovtq~mH!|=&=8xxeHdx<&O7D%lHTgPvMQ;~;Sjqxp zGw`L!qXYfZSw9(o=KQJnLD#}g>cUZcpzqRK)iQWZsN|Jz*rVti2Y2DeKA|wQ7I*PV zP_HCCpzy=*Ms&|T&z=$68fZ8|&r&S4Q4KeDW&tWs)ooP&w0=Tu{oJg769vd0rfzUU^v%J;)i3I8VEUjQAGZUgk~-4X zVLk9$=%5GRTJ7P(y73eBAjWGNtZ3>$(!t+UZ@-?Qq~2)Yp9V>zQHzg%o_d@`^Iz2O$H&IT-k^=wcsLu++VF2k}~ta6skPX<=046R#(av567gK`;Ke;ky{ q&{`Xm%UNUY4y;lcS`P;0GPLT0av541gK{~`p31;Fqv+q@-2VrkV@8Sq literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/converters.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/converters.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..87c7a356919cabe20f35bdce0b06cc3489d18a64 GIT binary patch literal 12452 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 O`Aj_f#S^mdlK-#2Pn?DT literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/matcher.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/routing/__pycache__/matcher.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..b6703fb982ba1d5c65f0575a04646ff411979870 GIT binary patch literal 9101 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/routing/converters.py b/venv/lib/python3.11/site-packages/werkzeug/routing/converters.py new file mode 100755 index 0000000..6016a97 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/routing/converters.py @@ -0,0 +1,261 @@ +from __future__ import annotations + +import re +import typing as t +import uuid +from urllib.parse import quote + +if t.TYPE_CHECKING: + from .map import Map + + +class ValidationError(ValueError): + """Validation error. If a rule converter raises this exception the rule + does not match the current URL and the next URL is tried. + """ + + +class BaseConverter: + """Base class for all converters. + + .. versionchanged:: 2.3 + ``part_isolating`` defaults to ``False`` if ``regex`` contains a ``/``. + """ + + regex = "[^/]+" + weight = 100 + part_isolating = True + + def __init_subclass__(cls, **kwargs: t.Any) -> None: + super().__init_subclass__(**kwargs) + + # If the converter isn't inheriting its regex, disable part_isolating by default + # if the regex contains a / character. + if "regex" in cls.__dict__ and "part_isolating" not in cls.__dict__: + cls.part_isolating = "/" not in cls.regex + + def __init__(self, map: Map, *args: t.Any, **kwargs: t.Any) -> None: + self.map = map + + def to_python(self, value: str) -> t.Any: + return value + + def to_url(self, value: t.Any) -> str: + # safe = https://url.spec.whatwg.org/#url-path-segment-string + return quote(str(value), safe="!$&'()*+,/:;=@") + + +class UnicodeConverter(BaseConverter): + """This converter is the default converter and accepts any string but + only one path segment. Thus the string can not include a slash. + + This is the default validator. + + Example:: + + Rule('/pages/'), + Rule('/') + + :param map: the :class:`Map`. + :param minlength: the minimum length of the string. Must be greater + or equal 1. + :param maxlength: the maximum length of the string. + :param length: the exact length of the string. + """ + + def __init__( + self, + map: Map, + minlength: int = 1, + maxlength: int | None = None, + length: int | None = None, + ) -> None: + super().__init__(map) + if length is not None: + length_regex = f"{{{int(length)}}}" + else: + if maxlength is None: + maxlength_value = "" + else: + maxlength_value = str(int(maxlength)) + length_regex = f"{{{int(minlength)},{maxlength_value}}}" + self.regex = f"[^/]{length_regex}" + + +class AnyConverter(BaseConverter): + """Matches one of the items provided. Items can either be Python + identifiers or strings:: + + Rule('/') + + :param map: the :class:`Map`. + :param items: this function accepts the possible items as positional + arguments. + + .. versionchanged:: 2.2 + Value is validated when building a URL. + """ + + def __init__(self, map: Map, *items: str) -> None: + super().__init__(map) + self.items = set(items) + self.regex = f"(?:{'|'.join([re.escape(x) for x in items])})" + + def to_url(self, value: t.Any) -> str: + if value in self.items: + return str(value) + + valid_values = ", ".join(f"'{item}'" for item in sorted(self.items)) + raise ValueError(f"'{value}' is not one of {valid_values}") + + +class PathConverter(BaseConverter): + """Like the default :class:`UnicodeConverter`, but it also matches + slashes. This is useful for wikis and similar applications:: + + Rule('/') + Rule('//edit') + + :param map: the :class:`Map`. + """ + + part_isolating = False + regex = "[^/].*?" + weight = 200 + + +class NumberConverter(BaseConverter): + """Baseclass for `IntegerConverter` and `FloatConverter`. + + :internal: + """ + + weight = 50 + num_convert: t.Callable[[t.Any], t.Any] = int + + def __init__( + self, + map: Map, + fixed_digits: int = 0, + min: int | None = None, + max: int | None = None, + signed: bool = False, + ) -> None: + if signed: + self.regex = self.signed_regex + super().__init__(map) + self.fixed_digits = fixed_digits + self.min = min + self.max = max + self.signed = signed + + def to_python(self, value: str) -> t.Any: + if self.fixed_digits and len(value) != self.fixed_digits: + raise ValidationError() + value_num = self.num_convert(value) + if (self.min is not None and value_num < self.min) or ( + self.max is not None and value_num > self.max + ): + raise ValidationError() + return value_num + + def to_url(self, value: t.Any) -> str: + value_str = str(self.num_convert(value)) + if self.fixed_digits: + value_str = value_str.zfill(self.fixed_digits) + return value_str + + @property + def signed_regex(self) -> str: + return f"-?{self.regex}" + + +class IntegerConverter(NumberConverter): + """This converter only accepts integer values:: + + Rule("/page/") + + By default it only accepts unsigned, positive values. The ``signed`` + parameter will enable signed, negative values. :: + + Rule("/page/") + + :param map: The :class:`Map`. + :param fixed_digits: The number of fixed digits in the URL. If you + set this to ``4`` for example, the rule will only match if the + URL looks like ``/0001/``. The default is variable length. + :param min: The minimal value. + :param max: The maximal value. + :param signed: Allow signed (negative) values. + + .. versionadded:: 0.15 + The ``signed`` parameter. + """ + + regex = r"\d+" + + +class FloatConverter(NumberConverter): + """This converter only accepts floating point values:: + + Rule("/probability/") + + By default it only accepts unsigned, positive values. The ``signed`` + parameter will enable signed, negative values. :: + + Rule("/offset/") + + :param map: The :class:`Map`. + :param min: The minimal value. + :param max: The maximal value. + :param signed: Allow signed (negative) values. + + .. versionadded:: 0.15 + The ``signed`` parameter. + """ + + regex = r"\d+\.\d+" + num_convert = float + + def __init__( + self, + map: Map, + min: float | None = None, + max: float | None = None, + signed: bool = False, + ) -> None: + super().__init__(map, min=min, max=max, signed=signed) # type: ignore + + +class UUIDConverter(BaseConverter): + """This converter only accepts UUID strings:: + + Rule('/object/') + + .. versionadded:: 0.10 + + :param map: the :class:`Map`. + """ + + regex = ( + r"[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-" + r"[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" + ) + + def to_python(self, value: str) -> uuid.UUID: + return uuid.UUID(value) + + def to_url(self, value: uuid.UUID) -> str: + return str(value) + + +#: the default converter mapping for the map. +DEFAULT_CONVERTERS: t.Mapping[str, type[BaseConverter]] = { + "default": UnicodeConverter, + "string": UnicodeConverter, + "any": AnyConverter, + "path": PathConverter, + "int": IntegerConverter, + "float": FloatConverter, + "uuid": UUIDConverter, +} diff --git a/venv/lib/python3.11/site-packages/werkzeug/routing/exceptions.py b/venv/lib/python3.11/site-packages/werkzeug/routing/exceptions.py new file mode 100755 index 0000000..eeabd4e --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/routing/exceptions.py @@ -0,0 +1,152 @@ +from __future__ import annotations + +import difflib +import typing as t + +from ..exceptions import BadRequest +from ..exceptions import HTTPException +from ..utils import cached_property +from ..utils import redirect + +if t.TYPE_CHECKING: + from _typeshed.wsgi import WSGIEnvironment + + from ..wrappers.request import Request + from ..wrappers.response import Response + from .map import MapAdapter + from .rules import Rule + + +class RoutingException(Exception): + """Special exceptions that require the application to redirect, notifying + about missing urls, etc. + + :internal: + """ + + +class RequestRedirect(HTTPException, RoutingException): + """Raise if the map requests a redirect. This is for example the case if + `strict_slashes` are activated and an url that requires a trailing slash. + + The attribute `new_url` contains the absolute destination url. + """ + + code = 308 + + def __init__(self, new_url: str) -> None: + super().__init__(new_url) + self.new_url = new_url + + def get_response( + self, + environ: WSGIEnvironment | Request | None = None, + scope: dict[str, t.Any] | None = None, + ) -> Response: + return redirect(self.new_url, self.code) + + +class RequestPath(RoutingException): + """Internal exception.""" + + __slots__ = ("path_info",) + + def __init__(self, path_info: str) -> None: + super().__init__() + self.path_info = path_info + + +class RequestAliasRedirect(RoutingException): # noqa: B903 + """This rule is an alias and wants to redirect to the canonical URL.""" + + def __init__(self, matched_values: t.Mapping[str, t.Any], endpoint: t.Any) -> None: + super().__init__() + self.matched_values = matched_values + self.endpoint = endpoint + + +class BuildError(RoutingException, LookupError): + """Raised if the build system cannot find a URL for an endpoint with the + values provided. + """ + + def __init__( + self, + endpoint: t.Any, + values: t.Mapping[str, t.Any], + method: str | None, + adapter: MapAdapter | None = None, + ) -> None: + super().__init__(endpoint, values, method) + self.endpoint = endpoint + self.values = values + self.method = method + self.adapter = adapter + + @cached_property + def suggested(self) -> Rule | None: + return self.closest_rule(self.adapter) + + def closest_rule(self, adapter: MapAdapter | None) -> Rule | None: + def _score_rule(rule: Rule) -> float: + return sum( + [ + 0.98 + * difflib.SequenceMatcher( + # endpoints can be any type, compare as strings + None, + str(rule.endpoint), + str(self.endpoint), + ).ratio(), + 0.01 * bool(set(self.values or ()).issubset(rule.arguments)), + 0.01 * bool(rule.methods and self.method in rule.methods), + ] + ) + + if adapter and adapter.map._rules: + return max(adapter.map._rules, key=_score_rule) + + return None + + def __str__(self) -> str: + message = [f"Could not build url for endpoint {self.endpoint!r}"] + if self.method: + message.append(f" ({self.method!r})") + if self.values: + message.append(f" with values {sorted(self.values)!r}") + message.append(".") + if self.suggested: + if self.endpoint == self.suggested.endpoint: + if ( + self.method + and self.suggested.methods is not None + and self.method not in self.suggested.methods + ): + message.append( + " Did you mean to use methods" + f" {sorted(self.suggested.methods)!r}?" + ) + missing_values = self.suggested.arguments.union( + set(self.suggested.defaults or ()) + ) - set(self.values.keys()) + if missing_values: + message.append( + f" Did you forget to specify values {sorted(missing_values)!r}?" + ) + else: + message.append(f" Did you mean {self.suggested.endpoint!r} instead?") + return "".join(message) + + +class WebsocketMismatch(BadRequest): + """The only matched rule is either a WebSocket and the request is + HTTP, or the rule is HTTP and the request is a WebSocket. + """ + + +class NoMatch(Exception): + __slots__ = ("have_match_for", "websocket_mismatch") + + def __init__(self, have_match_for: set[str], websocket_mismatch: bool) -> None: + self.have_match_for = have_match_for + self.websocket_mismatch = websocket_mismatch diff --git a/venv/lib/python3.11/site-packages/werkzeug/routing/map.py b/venv/lib/python3.11/site-packages/werkzeug/routing/map.py new file mode 100755 index 0000000..c86f95a --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/routing/map.py @@ -0,0 +1,928 @@ +from __future__ import annotations + +import typing as t +import warnings +from pprint import pformat +from threading import Lock +from urllib.parse import quote +from urllib.parse import urljoin +from urllib.parse import urlunsplit + +from .._internal import _get_environ +from .._internal import _wsgi_decoding_dance +from ..datastructures import ImmutableDict +from ..datastructures import MultiDict +from ..exceptions import BadHost +from ..exceptions import HTTPException +from ..exceptions import MethodNotAllowed +from ..exceptions import NotFound +from ..urls import _urlencode +from ..wsgi import get_host +from .converters import DEFAULT_CONVERTERS +from .exceptions import BuildError +from .exceptions import NoMatch +from .exceptions import RequestAliasRedirect +from .exceptions import RequestPath +from .exceptions import RequestRedirect +from .exceptions import WebsocketMismatch +from .matcher import StateMachineMatcher +from .rules import _simple_rule_re +from .rules import Rule + +if t.TYPE_CHECKING: + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + from ..wrappers.request import Request + from .converters import BaseConverter + from .rules import RuleFactory + + +class Map: + """The map class stores all the URL rules and some configuration + parameters. Some of the configuration values are only stored on the + `Map` instance since those affect all rules, others are just defaults + and can be overridden for each rule. Note that you have to specify all + arguments besides the `rules` as keyword arguments! + + :param rules: sequence of url rules for this map. + :param default_subdomain: The default subdomain for rules without a + subdomain defined. + :param strict_slashes: If a rule ends with a slash but the matched + URL does not, redirect to the URL with a trailing slash. + :param merge_slashes: Merge consecutive slashes when matching or + building URLs. Matches will redirect to the normalized URL. + Slashes in variable parts are not merged. + :param redirect_defaults: This will redirect to the default rule if it + wasn't visited that way. This helps creating + unique URLs. + :param converters: A dict of converters that adds additional converters + to the list of converters. If you redefine one + converter this will override the original one. + :param sort_parameters: If set to `True` the url parameters are sorted. + See `url_encode` for more details. + :param sort_key: The sort key function for `url_encode`. + :param host_matching: if set to `True` it enables the host matching + feature and disables the subdomain one. If + enabled the `host` parameter to rules is used + instead of the `subdomain` one. + + .. versionchanged:: 3.0 + The ``charset`` and ``encoding_errors`` parameters were removed. + + .. versionchanged:: 1.0 + If ``url_scheme`` is ``ws`` or ``wss``, only WebSocket rules will match. + + .. versionchanged:: 1.0 + The ``merge_slashes`` parameter was added. + + .. versionchanged:: 0.7 + The ``encoding_errors`` and ``host_matching`` parameters were added. + + .. versionchanged:: 0.5 + The ``sort_parameters`` and ``sort_key`` parameters were added. + """ + + #: A dict of default converters to be used. + default_converters = ImmutableDict(DEFAULT_CONVERTERS) + + #: The type of lock to use when updating. + #: + #: .. versionadded:: 1.0 + lock_class = Lock + + def __init__( + self, + rules: t.Iterable[RuleFactory] | None = None, + default_subdomain: str = "", + strict_slashes: bool = True, + merge_slashes: bool = True, + redirect_defaults: bool = True, + converters: t.Mapping[str, type[BaseConverter]] | None = None, + sort_parameters: bool = False, + sort_key: t.Callable[[t.Any], t.Any] | None = None, + host_matching: bool = False, + ) -> None: + self._matcher = StateMachineMatcher(merge_slashes) + self._rules_by_endpoint: dict[t.Any, list[Rule]] = {} + self._remap = True + self._remap_lock = self.lock_class() + + self.default_subdomain = default_subdomain + self.strict_slashes = strict_slashes + self.redirect_defaults = redirect_defaults + self.host_matching = host_matching + + self.converters = self.default_converters.copy() + if converters: + self.converters.update(converters) + + self.sort_parameters = sort_parameters + self.sort_key = sort_key + + for rulefactory in rules or (): + self.add(rulefactory) + + @property + def merge_slashes(self) -> bool: + return self._matcher.merge_slashes + + @merge_slashes.setter + def merge_slashes(self, value: bool) -> None: + self._matcher.merge_slashes = value + + def is_endpoint_expecting(self, endpoint: t.Any, *arguments: str) -> bool: + """Iterate over all rules and check if the endpoint expects + the arguments provided. This is for example useful if you have + some URLs that expect a language code and others that do not and + you want to wrap the builder a bit so that the current language + code is automatically added if not provided but endpoints expect + it. + + :param endpoint: the endpoint to check. + :param arguments: this function accepts one or more arguments + as positional arguments. Each one of them is + checked. + """ + self.update() + arguments_set = set(arguments) + for rule in self._rules_by_endpoint[endpoint]: + if arguments_set.issubset(rule.arguments): + return True + return False + + @property + def _rules(self) -> list[Rule]: + return [rule for rules in self._rules_by_endpoint.values() for rule in rules] + + def iter_rules(self, endpoint: t.Any | None = None) -> t.Iterator[Rule]: + """Iterate over all rules or the rules of an endpoint. + + :param endpoint: if provided only the rules for that endpoint + are returned. + :return: an iterator + """ + self.update() + if endpoint is not None: + return iter(self._rules_by_endpoint[endpoint]) + return iter(self._rules) + + def add(self, rulefactory: RuleFactory) -> None: + """Add a new rule or factory to the map and bind it. Requires that the + rule is not bound to another map. + + :param rulefactory: a :class:`Rule` or :class:`RuleFactory` + """ + for rule in rulefactory.get_rules(self): + rule.bind(self) + if not rule.build_only: + self._matcher.add(rule) + self._rules_by_endpoint.setdefault(rule.endpoint, []).append(rule) + self._remap = True + + def bind( + self, + server_name: str, + script_name: str | None = None, + subdomain: str | None = None, + url_scheme: str = "http", + default_method: str = "GET", + path_info: str | None = None, + query_args: t.Mapping[str, t.Any] | str | None = None, + ) -> MapAdapter: + """Return a new :class:`MapAdapter` with the details specified to the + call. Note that `script_name` will default to ``'/'`` if not further + specified or `None`. The `server_name` at least is a requirement + because the HTTP RFC requires absolute URLs for redirects and so all + redirect exceptions raised by Werkzeug will contain the full canonical + URL. + + If no path_info is passed to :meth:`match` it will use the default path + info passed to bind. While this doesn't really make sense for + manual bind calls, it's useful if you bind a map to a WSGI + environment which already contains the path info. + + `subdomain` will default to the `default_subdomain` for this map if + no defined. If there is no `default_subdomain` you cannot use the + subdomain feature. + + .. versionchanged:: 1.0 + If ``url_scheme`` is ``ws`` or ``wss``, only WebSocket rules + will match. + + .. versionchanged:: 0.15 + ``path_info`` defaults to ``'/'`` if ``None``. + + .. versionchanged:: 0.8 + ``query_args`` can be a string. + + .. versionchanged:: 0.7 + Added ``query_args``. + """ + server_name = server_name.lower() + if self.host_matching: + if subdomain is not None: + raise RuntimeError("host matching enabled and a subdomain was provided") + elif subdomain is None: + subdomain = self.default_subdomain + if script_name is None: + script_name = "/" + if path_info is None: + path_info = "/" + + # Port isn't part of IDNA, and might push a name over the 63 octet limit. + server_name, port_sep, port = server_name.partition(":") + + try: + server_name = server_name.encode("idna").decode("ascii") + except UnicodeError as e: + raise BadHost() from e + + return MapAdapter( + self, + f"{server_name}{port_sep}{port}", + script_name, + subdomain, + url_scheme, + path_info, + default_method, + query_args, + ) + + def bind_to_environ( + self, + environ: WSGIEnvironment | Request, + server_name: str | None = None, + subdomain: str | None = None, + ) -> MapAdapter: + """Like :meth:`bind` but you can pass it an WSGI environment and it + will fetch the information from that dictionary. Note that because of + limitations in the protocol there is no way to get the current + subdomain and real `server_name` from the environment. If you don't + provide it, Werkzeug will use `SERVER_NAME` and `SERVER_PORT` (or + `HTTP_HOST` if provided) as used `server_name` with disabled subdomain + feature. + + If `subdomain` is `None` but an environment and a server name is + provided it will calculate the current subdomain automatically. + Example: `server_name` is ``'example.com'`` and the `SERVER_NAME` + in the wsgi `environ` is ``'staging.dev.example.com'`` the calculated + subdomain will be ``'staging.dev'``. + + If the object passed as environ has an environ attribute, the value of + this attribute is used instead. This allows you to pass request + objects. Additionally `PATH_INFO` added as a default of the + :class:`MapAdapter` so that you don't have to pass the path info to + the match method. + + .. versionchanged:: 1.0.0 + If the passed server name specifies port 443, it will match + if the incoming scheme is ``https`` without a port. + + .. versionchanged:: 1.0.0 + A warning is shown when the passed server name does not + match the incoming WSGI server name. + + .. versionchanged:: 0.8 + This will no longer raise a ValueError when an unexpected server + name was passed. + + .. versionchanged:: 0.5 + previously this method accepted a bogus `calculate_subdomain` + parameter that did not have any effect. It was removed because + of that. + + :param environ: a WSGI environment. + :param server_name: an optional server name hint (see above). + :param subdomain: optionally the current subdomain (see above). + """ + env = _get_environ(environ) + wsgi_server_name = get_host(env).lower() + scheme = env["wsgi.url_scheme"] + upgrade = any( + v.strip() == "upgrade" + for v in env.get("HTTP_CONNECTION", "").lower().split(",") + ) + + if upgrade and env.get("HTTP_UPGRADE", "").lower() == "websocket": + scheme = "wss" if scheme == "https" else "ws" + + if server_name is None: + server_name = wsgi_server_name + else: + server_name = server_name.lower() + + # strip standard port to match get_host() + if scheme in {"http", "ws"} and server_name.endswith(":80"): + server_name = server_name[:-3] + elif scheme in {"https", "wss"} and server_name.endswith(":443"): + server_name = server_name[:-4] + + if subdomain is None and not self.host_matching: + cur_server_name = wsgi_server_name.split(".") + real_server_name = server_name.split(".") + offset = -len(real_server_name) + + if cur_server_name[offset:] != real_server_name: + # This can happen even with valid configs if the server was + # accessed directly by IP address under some situations. + # Instead of raising an exception like in Werkzeug 0.7 or + # earlier we go by an invalid subdomain which will result + # in a 404 error on matching. + warnings.warn( + f"Current server name {wsgi_server_name!r} doesn't match configured" + f" server name {server_name!r}", + stacklevel=2, + ) + subdomain = "" + else: + subdomain = ".".join(filter(None, cur_server_name[:offset])) + + def _get_wsgi_string(name: str) -> str | None: + val = env.get(name) + if val is not None: + return _wsgi_decoding_dance(val) + return None + + script_name = _get_wsgi_string("SCRIPT_NAME") + path_info = _get_wsgi_string("PATH_INFO") + query_args = _get_wsgi_string("QUERY_STRING") + return Map.bind( + self, + server_name, + script_name, + subdomain, + scheme, + env["REQUEST_METHOD"], + path_info, + query_args=query_args, + ) + + def update(self) -> None: + """Called before matching and building to keep the compiled rules + in the correct order after things changed. + """ + if not self._remap: + return + + with self._remap_lock: + if not self._remap: + return + + self._matcher.update() + for rules in self._rules_by_endpoint.values(): + rules.sort(key=lambda x: x.build_compare_key()) + self._remap = False + + def __repr__(self) -> str: + rules = self.iter_rules() + return f"{type(self).__name__}({pformat(list(rules))})" + + +class MapAdapter: + """Returned by :meth:`Map.bind` or :meth:`Map.bind_to_environ` and does + the URL matching and building based on runtime information. + """ + + def __init__( + self, + map: Map, + server_name: str, + script_name: str, + subdomain: str | None, + url_scheme: str, + path_info: str, + default_method: str, + query_args: t.Mapping[str, t.Any] | str | None = None, + ): + self.map = map + self.server_name = server_name + + if not script_name.endswith("/"): + script_name += "/" + + self.script_name = script_name + self.subdomain = subdomain + self.url_scheme = url_scheme + self.path_info = path_info + self.default_method = default_method + self.query_args = query_args + self.websocket = self.url_scheme in {"ws", "wss"} + + def dispatch( + self, + view_func: t.Callable[[str, t.Mapping[str, t.Any]], WSGIApplication], + path_info: str | None = None, + method: str | None = None, + catch_http_exceptions: bool = False, + ) -> WSGIApplication: + """Does the complete dispatching process. `view_func` is called with + the endpoint and a dict with the values for the view. It should + look up the view function, call it, and return a response object + or WSGI application. http exceptions are not caught by default + so that applications can display nicer error messages by just + catching them by hand. If you want to stick with the default + error messages you can pass it ``catch_http_exceptions=True`` and + it will catch the http exceptions. + + Here a small example for the dispatch usage:: + + from werkzeug.wrappers import Request, Response + from werkzeug.wsgi import responder + from werkzeug.routing import Map, Rule + + def on_index(request): + return Response('Hello from the index') + + url_map = Map([Rule('/', endpoint='index')]) + views = {'index': on_index} + + @responder + def application(environ, start_response): + request = Request(environ) + urls = url_map.bind_to_environ(environ) + return urls.dispatch(lambda e, v: views[e](request, **v), + catch_http_exceptions=True) + + Keep in mind that this method might return exception objects, too, so + use :class:`Response.force_type` to get a response object. + + :param view_func: a function that is called with the endpoint as + first argument and the value dict as second. Has + to dispatch to the actual view function with this + information. (see above) + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + :param catch_http_exceptions: set to `True` to catch any of the + werkzeug :class:`HTTPException`\\s. + """ + try: + try: + endpoint, args = self.match(path_info, method) + except RequestRedirect as e: + return e + return view_func(endpoint, args) + except HTTPException as e: + if catch_http_exceptions: + return e + raise + + @t.overload + def match( + self, + path_info: str | None = None, + method: str | None = None, + return_rule: t.Literal[False] = False, + query_args: t.Mapping[str, t.Any] | str | None = None, + websocket: bool | None = None, + ) -> tuple[t.Any, t.Mapping[str, t.Any]]: ... + + @t.overload + def match( + self, + path_info: str | None = None, + method: str | None = None, + return_rule: t.Literal[True] = True, + query_args: t.Mapping[str, t.Any] | str | None = None, + websocket: bool | None = None, + ) -> tuple[Rule, t.Mapping[str, t.Any]]: ... + + def match( + self, + path_info: str | None = None, + method: str | None = None, + return_rule: bool = False, + query_args: t.Mapping[str, t.Any] | str | None = None, + websocket: bool | None = None, + ) -> tuple[t.Any | Rule, t.Mapping[str, t.Any]]: + """The usage is simple: you just pass the match method the current + path info as well as the method (which defaults to `GET`). The + following things can then happen: + + - you receive a `NotFound` exception that indicates that no URL is + matching. A `NotFound` exception is also a WSGI application you + can call to get a default page not found page (happens to be the + same object as `werkzeug.exceptions.NotFound`) + + - you receive a `MethodNotAllowed` exception that indicates that there + is a match for this URL but not for the current request method. + This is useful for RESTful applications. + + - you receive a `RequestRedirect` exception with a `new_url` + attribute. This exception is used to notify you about a request + Werkzeug requests from your WSGI application. This is for example the + case if you request ``/foo`` although the correct URL is ``/foo/`` + You can use the `RequestRedirect` instance as response-like object + similar to all other subclasses of `HTTPException`. + + - you receive a ``WebsocketMismatch`` exception if the only + match is a WebSocket rule but the bind is an HTTP request, or + if the match is an HTTP rule but the bind is a WebSocket + request. + + - you get a tuple in the form ``(endpoint, arguments)`` if there is + a match (unless `return_rule` is True, in which case you get a tuple + in the form ``(rule, arguments)``) + + If the path info is not passed to the match method the default path + info of the map is used (defaults to the root URL if not defined + explicitly). + + All of the exceptions raised are subclasses of `HTTPException` so they + can be used as WSGI responses. They will all render generic error or + redirect pages. + + Here is a small example for matching: + + >>> m = Map([ + ... Rule('/', endpoint='index'), + ... Rule('/downloads/', endpoint='downloads/index'), + ... Rule('/downloads/', endpoint='downloads/show') + ... ]) + >>> urls = m.bind("example.com", "/") + >>> urls.match("/", "GET") + ('index', {}) + >>> urls.match("/downloads/42") + ('downloads/show', {'id': 42}) + + And here is what happens on redirect and missing URLs: + + >>> urls.match("/downloads") + Traceback (most recent call last): + ... + RequestRedirect: http://example.com/downloads/ + >>> urls.match("/missing") + Traceback (most recent call last): + ... + NotFound: 404 Not Found + + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + :param return_rule: return the rule that matched instead of just the + endpoint (defaults to `False`). + :param query_args: optional query arguments that are used for + automatic redirects as string or dictionary. It's + currently not possible to use the query arguments + for URL matching. + :param websocket: Match WebSocket instead of HTTP requests. A + websocket request has a ``ws`` or ``wss`` + :attr:`url_scheme`. This overrides that detection. + + .. versionadded:: 1.0 + Added ``websocket``. + + .. versionchanged:: 0.8 + ``query_args`` can be a string. + + .. versionadded:: 0.7 + Added ``query_args``. + + .. versionadded:: 0.6 + Added ``return_rule``. + """ + self.map.update() + if path_info is None: + path_info = self.path_info + if query_args is None: + query_args = self.query_args or {} + method = (method or self.default_method).upper() + + if websocket is None: + websocket = self.websocket + + domain_part = self.server_name + + if not self.map.host_matching and self.subdomain is not None: + domain_part = self.subdomain + + path_part = f"/{path_info.lstrip('/')}" if path_info else "" + + try: + result = self.map._matcher.match(domain_part, path_part, method, websocket) + except RequestPath as e: + # safe = https://url.spec.whatwg.org/#url-path-segment-string + new_path = quote(e.path_info, safe="!$&'()*+,/:;=@") + raise RequestRedirect( + self.make_redirect_url(new_path, query_args) + ) from None + except RequestAliasRedirect as e: + raise RequestRedirect( + self.make_alias_redirect_url( + f"{domain_part}|{path_part}", + e.endpoint, + e.matched_values, + method, + query_args, + ) + ) from None + except NoMatch as e: + if e.have_match_for: + raise MethodNotAllowed(valid_methods=list(e.have_match_for)) from None + + if e.websocket_mismatch: + raise WebsocketMismatch() from None + + raise NotFound() from None + else: + rule, rv = result + + if self.map.redirect_defaults: + redirect_url = self.get_default_redirect(rule, method, rv, query_args) + if redirect_url is not None: + raise RequestRedirect(redirect_url) + + if rule.redirect_to is not None: + if isinstance(rule.redirect_to, str): + + def _handle_match(match: t.Match[str]) -> str: + value = rv[match.group(1)] + return rule._converters[match.group(1)].to_url(value) + + redirect_url = _simple_rule_re.sub(_handle_match, rule.redirect_to) + else: + redirect_url = rule.redirect_to(self, **rv) + + if self.subdomain: + netloc = f"{self.subdomain}.{self.server_name}" + else: + netloc = self.server_name + + raise RequestRedirect( + urljoin( + f"{self.url_scheme or 'http'}://{netloc}{self.script_name}", + redirect_url, + ) + ) + + if return_rule: + return rule, rv + else: + return rule.endpoint, rv + + def test(self, path_info: str | None = None, method: str | None = None) -> bool: + """Test if a rule would match. Works like `match` but returns `True` + if the URL matches, or `False` if it does not exist. + + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + """ + try: + self.match(path_info, method) + except RequestRedirect: + pass + except HTTPException: + return False + return True + + def allowed_methods(self, path_info: str | None = None) -> t.Iterable[str]: + """Returns the valid methods that match for a given path. + + .. versionadded:: 0.7 + """ + try: + self.match(path_info, method="--") + except MethodNotAllowed as e: + return e.valid_methods # type: ignore + except HTTPException: + pass + return [] + + def get_host(self, domain_part: str | None) -> str: + """Figures out the full host name for the given domain part. The + domain part is a subdomain in case host matching is disabled or + a full host name. + """ + if self.map.host_matching: + if domain_part is None: + return self.server_name + + return domain_part + + if domain_part is None: + subdomain = self.subdomain + else: + subdomain = domain_part + + if subdomain: + return f"{subdomain}.{self.server_name}" + else: + return self.server_name + + def get_default_redirect( + self, + rule: Rule, + method: str, + values: t.MutableMapping[str, t.Any], + query_args: t.Mapping[str, t.Any] | str, + ) -> str | None: + """A helper that returns the URL to redirect to if it finds one. + This is used for default redirecting only. + + :internal: + """ + assert self.map.redirect_defaults + for r in self.map._rules_by_endpoint[rule.endpoint]: + # every rule that comes after this one, including ourself + # has a lower priority for the defaults. We order the ones + # with the highest priority up for building. + if r is rule: + break + if r.provides_defaults_for(rule) and r.suitable_for(values, method): + values.update(r.defaults) # type: ignore + domain_part, path = r.build(values) # type: ignore + return self.make_redirect_url(path, query_args, domain_part=domain_part) + return None + + def encode_query_args(self, query_args: t.Mapping[str, t.Any] | str) -> str: + if not isinstance(query_args, str): + return _urlencode(query_args) + return query_args + + def make_redirect_url( + self, + path_info: str, + query_args: t.Mapping[str, t.Any] | str | None = None, + domain_part: str | None = None, + ) -> str: + """Creates a redirect URL. + + :internal: + """ + if query_args is None: + query_args = self.query_args + + if query_args: + query_str = self.encode_query_args(query_args) + else: + query_str = None + + scheme = self.url_scheme or "http" + host = self.get_host(domain_part) + path = "/".join((self.script_name.strip("/"), path_info.lstrip("/"))) + return urlunsplit((scheme, host, path, query_str, None)) + + def make_alias_redirect_url( + self, + path: str, + endpoint: t.Any, + values: t.Mapping[str, t.Any], + method: str, + query_args: t.Mapping[str, t.Any] | str, + ) -> str: + """Internally called to make an alias redirect URL.""" + url = self.build( + endpoint, values, method, append_unknown=False, force_external=True + ) + if query_args: + url += f"?{self.encode_query_args(query_args)}" + assert url != path, "detected invalid alias setting. No canonical URL found" + return url + + def _partial_build( + self, + endpoint: t.Any, + values: t.Mapping[str, t.Any], + method: str | None, + append_unknown: bool, + ) -> tuple[str, str, bool] | None: + """Helper for :meth:`build`. Returns subdomain and path for the + rule that accepts this endpoint, values and method. + + :internal: + """ + # in case the method is none, try with the default method first + if method is None: + rv = self._partial_build( + endpoint, values, self.default_method, append_unknown + ) + if rv is not None: + return rv + + # Default method did not match or a specific method is passed. + # Check all for first match with matching host. If no matching + # host is found, go with first result. + first_match = None + + for rule in self.map._rules_by_endpoint.get(endpoint, ()): + if rule.suitable_for(values, method): + build_rv = rule.build(values, append_unknown) + + if build_rv is not None: + rv = (build_rv[0], build_rv[1], rule.websocket) + if self.map.host_matching: + if rv[0] == self.server_name: + return rv + elif first_match is None: + first_match = rv + else: + return rv + + return first_match + + def build( + self, + endpoint: t.Any, + values: t.Mapping[str, t.Any] | None = None, + method: str | None = None, + force_external: bool = False, + append_unknown: bool = True, + url_scheme: str | None = None, + ) -> str: + """Build a URL by filling in any variable slots in the endpoint's rule + with the provided values. + + This produces relative URLs (path only, no host) by default, which is + appropriate for most use cases. When using subdomain or host matching, + the URL will be absolute if the endpoint is not on the same host as the + current request. If you need an absolute URL no matter what, such as + when adding a link to an email, pass ``force_external=True``. + + Characters that are not allowed directly in URLs will be percent-encoded + using UTF-8. + + Additional values that don't match any rule parts are added to the query + (``?key=value``) part of the URL. + + If a rule is not found, an :exc:`.BuildError` is raised. Converters may + also raise exceptions when preparing a value. + + Unlike matching, building does not perform comprehensive validation of + the values, it's assumed that they are trusted and correct. It's also + possible to build a URL for one endpoint that will be matched by + another, or will not match. This is very unlikely to happen or to matter + in most applications, especially with testing. If you need a + stronger guarantee, you can use a helper to verify that + ``match(build(endpoint)) == endpoint``. + + :param endpoint: The endpoint for the rule to build. + :param values: Values for the variable parts of the rule, which will be + converted using the part's converter's + :meth:`~.BaseConverter.to_url` method. Keys that don't match + variable parts will be converted to a query string unless + ``append_unknown`` is disabled. + :param method: Further match the rule to build by this HTTP method, for + when there are multiple rules for the same endpoint that vary based + on method. + :param force_external: Always produce an absolute URL, for external use. + If ``scheme`` is not set, this produces a protocol-relative URL. + :param append_unknown: Convert values that don't match any rule parts + to a query string. Disable to ignore such values. + :param url_scheme: Scheme to use for absolute URLs. Defaults to + :attr:`url_scheme`. + + .. versionchanged:: 2.0 + Added the ``url_scheme`` parameter. + + .. versionadded:: 0.6 + Added the ``append_unknown`` parameter. + """ + self.map.update() + + if values: + if isinstance(values, MultiDict): + values = { + k: (v[0] if len(v) == 1 else v) + for k, v in dict.items(values) + if len(v) != 0 + } + else: # plain dict + values = {k: v for k, v in values.items() if v is not None} + else: + values = {} + + rv = self._partial_build(endpoint, values, method, append_unknown) + if rv is None: + raise BuildError(endpoint, values, method, self) + + domain_part, path, websocket = rv + host = self.get_host(domain_part) + + if url_scheme is None: + url_scheme = self.url_scheme + + # Always build WebSocket routes with the scheme (browsers + # require full URLs). If bound to a WebSocket, ensure that HTTP + # routes are built with an HTTP scheme. + secure = url_scheme in {"https", "wss"} + + if websocket: + force_external = True + url_scheme = "wss" if secure else "ws" + elif url_scheme: + url_scheme = "https" if secure else "http" + + # shortcut this. + if not force_external and ( + (self.map.host_matching and host == self.server_name) + or (not self.map.host_matching and domain_part == self.subdomain) + ): + return f"{self.script_name.rstrip('/')}/{path.lstrip('/')}" + + scheme = f"{url_scheme}:" if url_scheme else "" + return f"{scheme}//{host}{self.script_name[:-1]}/{path.lstrip('/')}" diff --git a/venv/lib/python3.11/site-packages/werkzeug/routing/matcher.py b/venv/lib/python3.11/site-packages/werkzeug/routing/matcher.py new file mode 100755 index 0000000..1f03c46 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/routing/matcher.py @@ -0,0 +1,202 @@ +from __future__ import annotations + +import re +import typing as t +from dataclasses import dataclass +from dataclasses import field + +from .converters import ValidationError +from .exceptions import NoMatch +from .exceptions import RequestAliasRedirect +from .exceptions import RequestPath +from .rules import Rule +from .rules import RulePart + + +class SlashRequired(Exception): + pass + + +@dataclass +class State: + """A representation of a rule state. + + This includes the *rules* that correspond to the state and the + possible *static* and *dynamic* transitions to the next state. + """ + + dynamic: list[tuple[RulePart, State]] = field(default_factory=list) + rules: list[Rule] = field(default_factory=list) + static: dict[str, State] = field(default_factory=dict) + + +class StateMachineMatcher: + def __init__(self, merge_slashes: bool) -> None: + self._root = State() + self.merge_slashes = merge_slashes + + def add(self, rule: Rule) -> None: + state = self._root + for part in rule._parts: + if part.static: + state.static.setdefault(part.content, State()) + state = state.static[part.content] + else: + for test_part, new_state in state.dynamic: + if test_part == part: + state = new_state + break + else: + new_state = State() + state.dynamic.append((part, new_state)) + state = new_state + state.rules.append(rule) + + def update(self) -> None: + # For every state the dynamic transitions should be sorted by + # the weight of the transition + state = self._root + + def _update_state(state: State) -> None: + state.dynamic.sort(key=lambda entry: entry[0].weight) + for new_state in state.static.values(): + _update_state(new_state) + for _, new_state in state.dynamic: + _update_state(new_state) + + _update_state(state) + + def match( + self, domain: str, path: str, method: str, websocket: bool + ) -> tuple[Rule, t.MutableMapping[str, t.Any]]: + # To match to a rule we need to start at the root state and + # try to follow the transitions until we find a match, or find + # there is no transition to follow. + + have_match_for = set() + websocket_mismatch = False + + def _match( + state: State, parts: list[str], values: list[str] + ) -> tuple[Rule, list[str]] | None: + # This function is meant to be called recursively, and will attempt + # to match the head part to the state's transitions. + nonlocal have_match_for, websocket_mismatch + + # The base case is when all parts have been matched via + # transitions. Hence if there is a rule with methods & + # websocket that work return it and the dynamic values + # extracted. + if parts == []: + for rule in state.rules: + if rule.methods is not None and method not in rule.methods: + have_match_for.update(rule.methods) + elif rule.websocket != websocket: + websocket_mismatch = True + else: + return rule, values + + # Test if there is a match with this path with a + # trailing slash, if so raise an exception to report + # that matching is possible with an additional slash + if "" in state.static: + for rule in state.static[""].rules: + if websocket == rule.websocket and ( + rule.methods is None or method in rule.methods + ): + if rule.strict_slashes: + raise SlashRequired() + else: + return rule, values + return None + + part = parts[0] + # To match this part try the static transitions first + if part in state.static: + rv = _match(state.static[part], parts[1:], values) + if rv is not None: + return rv + # No match via the static transitions, so try the dynamic + # ones. + for test_part, new_state in state.dynamic: + target = part + remaining = parts[1:] + # A final part indicates a transition that always + # consumes the remaining parts i.e. transitions to a + # final state. + if test_part.final: + target = "/".join(parts) + remaining = [] + match = re.compile(test_part.content).match(target) + if match is not None: + if test_part.suffixed: + # If a part_isolating=False part has a slash suffix, remove the + # suffix from the match and check for the slash redirect next. + suffix = match.groups()[-1] + if suffix == "/": + remaining = [""] + + converter_groups = sorted( + match.groupdict().items(), key=lambda entry: entry[0] + ) + groups = [ + value + for key, value in converter_groups + if key[:11] == "__werkzeug_" + ] + rv = _match(new_state, remaining, values + groups) + if rv is not None: + return rv + + # If there is no match and the only part left is a + # trailing slash ("") consider rules that aren't + # strict-slashes as these should match if there is a final + # slash part. + if parts == [""]: + for rule in state.rules: + if rule.strict_slashes: + continue + if rule.methods is not None and method not in rule.methods: + have_match_for.update(rule.methods) + elif rule.websocket != websocket: + websocket_mismatch = True + else: + return rule, values + + return None + + try: + rv = _match(self._root, [domain, *path.split("/")], []) + except SlashRequired: + raise RequestPath(f"{path}/") from None + + if self.merge_slashes and rv is None: + # Try to match again, but with slashes merged + path = re.sub("/{2,}", "/", path) + try: + rv = _match(self._root, [domain, *path.split("/")], []) + except SlashRequired: + raise RequestPath(f"{path}/") from None + if rv is None or rv[0].merge_slashes is False: + raise NoMatch(have_match_for, websocket_mismatch) + else: + raise RequestPath(f"{path}") + elif rv is not None: + rule, values = rv + + result = {} + for name, value in zip(rule._converters.keys(), values): + try: + value = rule._converters[name].to_python(value) + except ValidationError: + raise NoMatch(have_match_for, websocket_mismatch) from None + result[str(name)] = value + if rule.defaults: + result.update(rule.defaults) + + if rule.alias and rule.map.redirect_defaults: + raise RequestAliasRedirect(result, rule.endpoint) + + return rule, result + + raise NoMatch(have_match_for, websocket_mismatch) diff --git a/venv/lib/python3.11/site-packages/werkzeug/routing/rules.py b/venv/lib/python3.11/site-packages/werkzeug/routing/rules.py new file mode 100755 index 0000000..7971660 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/routing/rules.py @@ -0,0 +1,927 @@ +from __future__ import annotations + +import ast +import re +import typing as t +from dataclasses import dataclass +from string import Template +from types import CodeType +from urllib.parse import quote + +from ..datastructures import iter_multi_items +from ..urls import _urlencode +from .converters import ValidationError + +if t.TYPE_CHECKING: + from .converters import BaseConverter + from .map import Map + + +class Weighting(t.NamedTuple): + number_static_weights: int + static_weights: list[tuple[int, int]] + number_argument_weights: int + argument_weights: list[int] + + +@dataclass +class RulePart: + """A part of a rule. + + Rules can be represented by parts as delimited by `/` with + instances of this class representing those parts. The *content* is + either the raw content if *static* or a regex string to match + against. The *weight* can be used to order parts when matching. + + """ + + content: str + final: bool + static: bool + suffixed: bool + weight: Weighting + + +_part_re = re.compile( + r""" + (?: + (?P/) # a slash + | + (?P[^[a-zA-Z_][a-zA-Z0-9_]*) # converter name + (?:\((?P.*?)\))? # converter arguments + : # variable delimiter + )? + (?P[a-zA-Z_][a-zA-Z0-9_]*) # variable name + > + ) + ) + """, + re.VERBOSE, +) + +_simple_rule_re = re.compile(r"<([^>]+)>") +_converter_args_re = re.compile( + r""" + \s* + ((?P\w+)\s*=\s*)? + (?P + True|False| + \d+.\d+| + \d+.| + \d+| + [\w\d_.]+| + [urUR]?(?P"[^"]*?"|'[^']*') + )\s*, + """, + re.VERBOSE, +) + +_PYTHON_CONSTANTS = {"None": None, "True": True, "False": False} + + +def _find(value: str, target: str, pos: int) -> int: + """Find the *target* in *value* after *pos*. + + Returns the *value* length if *target* isn't found. + """ + try: + return value.index(target, pos) + except ValueError: + return len(value) + + +def _pythonize(value: str) -> None | bool | int | float | str: + if value in _PYTHON_CONSTANTS: + return _PYTHON_CONSTANTS[value] + for convert in int, float: + try: + return convert(value) + except ValueError: + pass + if value[:1] == value[-1:] and value[0] in "\"'": + value = value[1:-1] + return str(value) + + +def parse_converter_args(argstr: str) -> tuple[tuple[t.Any, ...], dict[str, t.Any]]: + argstr += "," + args = [] + kwargs = {} + position = 0 + + for item in _converter_args_re.finditer(argstr): + if item.start() != position: + raise ValueError( + f"Cannot parse converter argument '{argstr[position : item.start()]}'" + ) + + value = item.group("stringval") + if value is None: + value = item.group("value") + value = _pythonize(value) + if not item.group("name"): + args.append(value) + else: + name = item.group("name") + kwargs[name] = value + position = item.end() + + return tuple(args), kwargs + + +class RuleFactory: + """As soon as you have more complex URL setups it's a good idea to use rule + factories to avoid repetitive tasks. Some of them are builtin, others can + be added by subclassing `RuleFactory` and overriding `get_rules`. + """ + + def get_rules(self, map: Map) -> t.Iterable[Rule]: + """Subclasses of `RuleFactory` have to override this method and return + an iterable of rules.""" + raise NotImplementedError() + + +class Subdomain(RuleFactory): + """All URLs provided by this factory have the subdomain set to a + specific domain. For example if you want to use the subdomain for + the current language this can be a good setup:: + + url_map = Map([ + Rule('/', endpoint='#select_language'), + Subdomain('', [ + Rule('/', endpoint='index'), + Rule('/about', endpoint='about'), + Rule('/help', endpoint='help') + ]) + ]) + + All the rules except for the ``'#select_language'`` endpoint will now + listen on a two letter long subdomain that holds the language code + for the current request. + """ + + def __init__(self, subdomain: str, rules: t.Iterable[RuleFactory]) -> None: + self.subdomain = subdomain + self.rules = rules + + def get_rules(self, map: Map) -> t.Iterator[Rule]: + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.subdomain = self.subdomain + yield rule + + +class Submount(RuleFactory): + """Like `Subdomain` but prefixes the URL rule with a given string:: + + url_map = Map([ + Rule('/', endpoint='index'), + Submount('/blog', [ + Rule('/', endpoint='blog/index'), + Rule('/entry/', endpoint='blog/show') + ]) + ]) + + Now the rule ``'blog/show'`` matches ``/blog/entry/``. + """ + + def __init__(self, path: str, rules: t.Iterable[RuleFactory]) -> None: + self.path = path.rstrip("/") + self.rules = rules + + def get_rules(self, map: Map) -> t.Iterator[Rule]: + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.rule = self.path + rule.rule + yield rule + + +class EndpointPrefix(RuleFactory): + """Prefixes all endpoints (which must be strings for this factory) with + another string. This can be useful for sub applications:: + + url_map = Map([ + Rule('/', endpoint='index'), + EndpointPrefix('blog/', [Submount('/blog', [ + Rule('/', endpoint='index'), + Rule('/entry/', endpoint='show') + ])]) + ]) + """ + + def __init__(self, prefix: str, rules: t.Iterable[RuleFactory]) -> None: + self.prefix = prefix + self.rules = rules + + def get_rules(self, map: Map) -> t.Iterator[Rule]: + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.endpoint = self.prefix + rule.endpoint + yield rule + + +class RuleTemplate: + """Returns copies of the rules wrapped and expands string templates in + the endpoint, rule, defaults or subdomain sections. + + Here a small example for such a rule template:: + + from werkzeug.routing import Map, Rule, RuleTemplate + + resource = RuleTemplate([ + Rule('/$name/', endpoint='$name.list'), + Rule('/$name/', endpoint='$name.show') + ]) + + url_map = Map([resource(name='user'), resource(name='page')]) + + When a rule template is called the keyword arguments are used to + replace the placeholders in all the string parameters. + """ + + def __init__(self, rules: t.Iterable[Rule]) -> None: + self.rules = list(rules) + + def __call__(self, *args: t.Any, **kwargs: t.Any) -> RuleTemplateFactory: + return RuleTemplateFactory(self.rules, dict(*args, **kwargs)) + + +class RuleTemplateFactory(RuleFactory): + """A factory that fills in template variables into rules. Used by + `RuleTemplate` internally. + + :internal: + """ + + def __init__( + self, rules: t.Iterable[RuleFactory], context: dict[str, t.Any] + ) -> None: + self.rules = rules + self.context = context + + def get_rules(self, map: Map) -> t.Iterator[Rule]: + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + new_defaults = subdomain = None + if rule.defaults: + new_defaults = {} + for key, value in rule.defaults.items(): + if isinstance(value, str): + value = Template(value).substitute(self.context) + new_defaults[key] = value + if rule.subdomain is not None: + subdomain = Template(rule.subdomain).substitute(self.context) + new_endpoint = rule.endpoint + if isinstance(new_endpoint, str): + new_endpoint = Template(new_endpoint).substitute(self.context) + yield Rule( + Template(rule.rule).substitute(self.context), + new_defaults, + subdomain, + rule.methods, + rule.build_only, + new_endpoint, + rule.strict_slashes, + ) + + +_ASTT = t.TypeVar("_ASTT", bound=ast.AST) + + +def _prefix_names(src: str, expected_type: type[_ASTT]) -> _ASTT: + """ast parse and prefix names with `.` to avoid collision with user vars""" + tree: ast.AST = ast.parse(src).body[0] + if isinstance(tree, ast.Expr): + tree = tree.value + if not isinstance(tree, expected_type): + raise TypeError( + f"AST node is of type {type(tree).__name__}, not {expected_type.__name__}" + ) + for node in ast.walk(tree): + if isinstance(node, ast.Name): + node.id = f".{node.id}" + return tree + + +_CALL_CONVERTER_CODE_FMT = "self._converters[{elem!r}].to_url()" +_IF_KWARGS_URL_ENCODE_CODE = """\ +if kwargs: + params = self._encode_query_vars(kwargs) + q = "?" if params else "" +else: + q = params = "" +""" +_IF_KWARGS_URL_ENCODE_AST = _prefix_names(_IF_KWARGS_URL_ENCODE_CODE, ast.If) +_URL_ENCODE_AST_NAMES = ( + _prefix_names("q", ast.Name), + _prefix_names("params", ast.Name), +) + + +class Rule(RuleFactory): + """A Rule represents one URL pattern. There are some options for `Rule` + that change the way it behaves and are passed to the `Rule` constructor. + Note that besides the rule-string all arguments *must* be keyword arguments + in order to not break the application on Werkzeug upgrades. + + `string` + Rule strings basically are just normal URL paths with placeholders in + the format ```` where the converter and the + arguments are optional. If no converter is defined the `default` + converter is used which means `string` in the normal configuration. + + URL rules that end with a slash are branch URLs, others are leaves. + If you have `strict_slashes` enabled (which is the default), all + branch URLs that are matched without a trailing slash will trigger a + redirect to the same URL with the missing slash appended. + + The converters are defined on the `Map`. + + `endpoint` + The endpoint for this rule. This can be anything. A reference to a + function, a string, a number etc. The preferred way is using a string + because the endpoint is used for URL generation. + + `defaults` + An optional dict with defaults for other rules with the same endpoint. + This is a bit tricky but useful if you want to have unique URLs:: + + url_map = Map([ + Rule('/all/', defaults={'page': 1}, endpoint='all_entries'), + Rule('/all/page/', endpoint='all_entries') + ]) + + If a user now visits ``http://example.com/all/page/1`` they will be + redirected to ``http://example.com/all/``. If `redirect_defaults` is + disabled on the `Map` instance this will only affect the URL + generation. + + `subdomain` + The subdomain rule string for this rule. If not specified the rule + only matches for the `default_subdomain` of the map. If the map is + not bound to a subdomain this feature is disabled. + + Can be useful if you want to have user profiles on different subdomains + and all subdomains are forwarded to your application:: + + url_map = Map([ + Rule('/', subdomain='', endpoint='user/homepage'), + Rule('/stats', subdomain='', endpoint='user/stats') + ]) + + `methods` + A sequence of http methods this rule applies to. If not specified, all + methods are allowed. For example this can be useful if you want different + endpoints for `POST` and `GET`. If methods are defined and the path + matches but the method matched against is not in this list or in the + list of another rule for that path the error raised is of the type + `MethodNotAllowed` rather than `NotFound`. If `GET` is present in the + list of methods and `HEAD` is not, `HEAD` is added automatically. + + `strict_slashes` + Override the `Map` setting for `strict_slashes` only for this rule. If + not specified the `Map` setting is used. + + `merge_slashes` + Override :attr:`Map.merge_slashes` for this rule. + + `build_only` + Set this to True and the rule will never match but will create a URL + that can be build. This is useful if you have resources on a subdomain + or folder that are not handled by the WSGI application (like static data) + + `redirect_to` + If given this must be either a string or callable. In case of a + callable it's called with the url adapter that triggered the match and + the values of the URL as keyword arguments and has to return the target + for the redirect, otherwise it has to be a string with placeholders in + rule syntax:: + + def foo_with_slug(adapter, id): + # ask the database for the slug for the old id. this of + # course has nothing to do with werkzeug. + return f'foo/{Foo.get_slug_for_id(id)}' + + url_map = Map([ + Rule('/foo/', endpoint='foo'), + Rule('/some/old/url/', redirect_to='foo/'), + Rule('/other/old/url/', redirect_to=foo_with_slug) + ]) + + When the rule is matched the routing system will raise a + `RequestRedirect` exception with the target for the redirect. + + Keep in mind that the URL will be joined against the URL root of the + script so don't use a leading slash on the target URL unless you + really mean root of that domain. + + `alias` + If enabled this rule serves as an alias for another rule with the same + endpoint and arguments. + + `host` + If provided and the URL map has host matching enabled this can be + used to provide a match rule for the whole host. This also means + that the subdomain feature is disabled. + + `websocket` + If ``True``, this rule is only matches for WebSocket (``ws://``, + ``wss://``) requests. By default, rules will only match for HTTP + requests. + + .. versionchanged:: 2.1 + Percent-encoded newlines (``%0a``), which are decoded by WSGI + servers, are considered when routing instead of terminating the + match early. + + .. versionadded:: 1.0 + Added ``websocket``. + + .. versionadded:: 1.0 + Added ``merge_slashes``. + + .. versionadded:: 0.7 + Added ``alias`` and ``host``. + + .. versionchanged:: 0.6.1 + ``HEAD`` is added to ``methods`` if ``GET`` is present. + """ + + def __init__( + self, + string: str, + defaults: t.Mapping[str, t.Any] | None = None, + subdomain: str | None = None, + methods: t.Iterable[str] | None = None, + build_only: bool = False, + endpoint: t.Any | None = None, + strict_slashes: bool | None = None, + merge_slashes: bool | None = None, + redirect_to: str | t.Callable[..., str] | None = None, + alias: bool = False, + host: str | None = None, + websocket: bool = False, + ) -> None: + if not string.startswith("/"): + raise ValueError(f"URL rule '{string}' must start with a slash.") + + self.rule = string + self.is_leaf = not string.endswith("/") + self.is_branch = string.endswith("/") + + self.map: Map = None # type: ignore + self.strict_slashes = strict_slashes + self.merge_slashes = merge_slashes + self.subdomain = subdomain + self.host = host + self.defaults = defaults + self.build_only = build_only + self.alias = alias + self.websocket = websocket + + if methods is not None: + if isinstance(methods, str): + raise TypeError("'methods' should be a list of strings.") + + methods = {x.upper() for x in methods} + + if "HEAD" not in methods and "GET" in methods: + methods.add("HEAD") + + if websocket and methods - {"GET", "HEAD", "OPTIONS"}: + raise ValueError( + "WebSocket rules can only use 'GET', 'HEAD', and 'OPTIONS' methods." + ) + + self.methods = methods + self.endpoint: t.Any = endpoint + self.redirect_to = redirect_to + + if defaults: + self.arguments = set(map(str, defaults)) + else: + self.arguments = set() + + self._converters: dict[str, BaseConverter] = {} + self._trace: list[tuple[bool, str]] = [] + self._parts: list[RulePart] = [] + + def empty(self) -> Rule: + """ + Return an unbound copy of this rule. + + This can be useful if want to reuse an already bound URL for another + map. See ``get_empty_kwargs`` to override what keyword arguments are + provided to the new copy. + """ + return type(self)(self.rule, **self.get_empty_kwargs()) + + def get_empty_kwargs(self) -> t.Mapping[str, t.Any]: + """ + Provides kwargs for instantiating empty copy with empty() + + Use this method to provide custom keyword arguments to the subclass of + ``Rule`` when calling ``some_rule.empty()``. Helpful when the subclass + has custom keyword arguments that are needed at instantiation. + + Must return a ``dict`` that will be provided as kwargs to the new + instance of ``Rule``, following the initial ``self.rule`` value which + is always provided as the first, required positional argument. + """ + defaults = None + if self.defaults: + defaults = dict(self.defaults) + return dict( + defaults=defaults, + subdomain=self.subdomain, + methods=self.methods, + build_only=self.build_only, + endpoint=self.endpoint, + strict_slashes=self.strict_slashes, + redirect_to=self.redirect_to, + alias=self.alias, + host=self.host, + ) + + def get_rules(self, map: Map) -> t.Iterator[Rule]: + yield self + + def refresh(self) -> None: + """Rebinds and refreshes the URL. Call this if you modified the + rule in place. + + :internal: + """ + self.bind(self.map, rebind=True) + + def bind(self, map: Map, rebind: bool = False) -> None: + """Bind the url to a map and create a regular expression based on + the information from the rule itself and the defaults from the map. + + :internal: + """ + if self.map is not None and not rebind: + raise RuntimeError(f"url rule {self!r} already bound to map {self.map!r}") + self.map = map + if self.strict_slashes is None: + self.strict_slashes = map.strict_slashes + if self.merge_slashes is None: + self.merge_slashes = map.merge_slashes + if self.subdomain is None: + self.subdomain = map.default_subdomain + self.compile() + + def get_converter( + self, + variable_name: str, + converter_name: str, + args: tuple[t.Any, ...], + kwargs: t.Mapping[str, t.Any], + ) -> BaseConverter: + """Looks up the converter for the given parameter. + + .. versionadded:: 0.9 + """ + if converter_name not in self.map.converters: + raise LookupError(f"the converter {converter_name!r} does not exist") + return self.map.converters[converter_name](self.map, *args, **kwargs) + + def _encode_query_vars(self, query_vars: t.Mapping[str, t.Any]) -> str: + items: t.Iterable[tuple[str, str]] = iter_multi_items(query_vars) + + if self.map.sort_parameters: + items = sorted(items, key=self.map.sort_key) + + return _urlencode(items) + + def _parse_rule(self, rule: str) -> t.Iterable[RulePart]: + content = "" + static = True + argument_weights = [] + static_weights: list[tuple[int, int]] = [] + final = False + convertor_number = 0 + + pos = 0 + while pos < len(rule): + match = _part_re.match(rule, pos) + if match is None: + raise ValueError(f"malformed url rule: {rule!r}") + + data = match.groupdict() + if data["static"] is not None: + static_weights.append((len(static_weights), -len(data["static"]))) + self._trace.append((False, data["static"])) + content += data["static"] if static else re.escape(data["static"]) + + if data["variable"] is not None: + if static: + # Switching content to represent regex, hence the need to escape + content = re.escape(content) + static = False + c_args, c_kwargs = parse_converter_args(data["arguments"] or "") + convobj = self.get_converter( + data["variable"], data["converter"] or "default", c_args, c_kwargs + ) + self._converters[data["variable"]] = convobj + self.arguments.add(data["variable"]) + if not convobj.part_isolating: + final = True + content += f"(?P<__werkzeug_{convertor_number}>{convobj.regex})" + convertor_number += 1 + argument_weights.append(convobj.weight) + self._trace.append((True, data["variable"])) + + if data["slash"] is not None: + self._trace.append((False, "/")) + if final: + content += "/" + else: + if not static: + content += r"\Z" + weight = Weighting( + -len(static_weights), + static_weights, + -len(argument_weights), + argument_weights, + ) + yield RulePart( + content=content, + final=final, + static=static, + suffixed=False, + weight=weight, + ) + content = "" + static = True + argument_weights = [] + static_weights = [] + final = False + convertor_number = 0 + + pos = match.end() + + suffixed = False + if final and content[-1] == "/": + # If a converter is part_isolating=False (matches slashes) and ends with a + # slash, augment the regex to support slash redirects. + suffixed = True + content = content[:-1] + "(? None: + """Compiles the regular expression and stores it.""" + assert self.map is not None, "rule not bound" + + if self.map.host_matching: + domain_rule = self.host or "" + else: + domain_rule = self.subdomain or "" + self._parts = [] + self._trace = [] + self._converters = {} + if domain_rule == "": + self._parts = [ + RulePart( + content="", + final=False, + static=True, + suffixed=False, + weight=Weighting(0, [], 0, []), + ) + ] + else: + self._parts.extend(self._parse_rule(domain_rule)) + self._trace.append((False, "|")) + rule = self.rule + if self.merge_slashes: + rule = re.sub("/{2,}", "/", self.rule) + self._parts.extend(self._parse_rule(rule)) + + self._build: t.Callable[..., tuple[str, str]] + self._build = self._compile_builder(False).__get__(self, None) + self._build_unknown: t.Callable[..., tuple[str, str]] + self._build_unknown = self._compile_builder(True).__get__(self, None) + + @staticmethod + def _get_func_code(code: CodeType, name: str) -> t.Callable[..., tuple[str, str]]: + globs: dict[str, t.Any] = {} + locs: dict[str, t.Any] = {} + exec(code, globs, locs) + return locs[name] # type: ignore + + def _compile_builder( + self, append_unknown: bool = True + ) -> t.Callable[..., tuple[str, str]]: + defaults = self.defaults or {} + dom_ops: list[tuple[bool, str]] = [] + url_ops: list[tuple[bool, str]] = [] + + opl = dom_ops + for is_dynamic, data in self._trace: + if data == "|" and opl is dom_ops: + opl = url_ops + continue + # this seems like a silly case to ever come up but: + # if a default is given for a value that appears in the rule, + # resolve it to a constant ahead of time + if is_dynamic and data in defaults: + data = self._converters[data].to_url(defaults[data]) + opl.append((False, data)) + elif not is_dynamic: + # safe = https://url.spec.whatwg.org/#url-path-segment-string + opl.append((False, quote(data, safe="!$&'()*+,/:;=@"))) + else: + opl.append((True, data)) + + def _convert(elem: str) -> ast.Call: + ret = _prefix_names(_CALL_CONVERTER_CODE_FMT.format(elem=elem), ast.Call) + ret.args = [ast.Name(elem, ast.Load())] + return ret + + def _parts(ops: list[tuple[bool, str]]) -> list[ast.expr]: + parts: list[ast.expr] = [ + _convert(elem) if is_dynamic else ast.Constant(elem) + for is_dynamic, elem in ops + ] + parts = parts or [ast.Constant("")] + # constant fold + ret = [parts[0]] + for p in parts[1:]: + if isinstance(p, ast.Constant) and isinstance(ret[-1], ast.Constant): + ret[-1] = ast.Constant(ret[-1].value + p.value) # type: ignore[operator] + else: + ret.append(p) + return ret + + dom_parts = _parts(dom_ops) + url_parts = _parts(url_ops) + body: list[ast.stmt] + if not append_unknown: + body = [] + else: + body = [_IF_KWARGS_URL_ENCODE_AST] + url_parts.extend(_URL_ENCODE_AST_NAMES) + + def _join(parts: list[ast.expr]) -> ast.expr: + if len(parts) == 1: # shortcut + return parts[0] + return ast.JoinedStr(parts) + + body.append( + ast.Return(ast.Tuple([_join(dom_parts), _join(url_parts)], ast.Load())) + ) + + pargs = [ + elem + for is_dynamic, elem in dom_ops + url_ops + if is_dynamic and elem not in defaults + ] + kargs = [str(k) for k in defaults] + + func_ast = _prefix_names("def _(): pass", ast.FunctionDef) + func_ast.name = f"" + func_ast.args.args.append(ast.arg(".self", None)) + for arg in pargs + kargs: + func_ast.args.args.append(ast.arg(arg, None)) + func_ast.args.kwarg = ast.arg(".kwargs", None) + for _ in kargs: + func_ast.args.defaults.append(ast.Constant("")) + func_ast.body = body + + # Use `ast.parse` instead of `ast.Module` for better portability, since the + # signature of `ast.Module` can change. + module = ast.parse("") + module.body = [func_ast] + + # mark everything as on line 1, offset 0 + # less error-prone than `ast.fix_missing_locations` + # bad line numbers cause an assert to fail in debug builds + for node in ast.walk(module): + if "lineno" in node._attributes: + node.lineno = 1 # type: ignore[attr-defined] + if "end_lineno" in node._attributes: + node.end_lineno = node.lineno # type: ignore[attr-defined] + if "col_offset" in node._attributes: + node.col_offset = 0 # type: ignore[attr-defined] + if "end_col_offset" in node._attributes: + node.end_col_offset = node.col_offset # type: ignore[attr-defined] + + code = compile(module, "", "exec") + return self._get_func_code(code, func_ast.name) + + def build( + self, values: t.Mapping[str, t.Any], append_unknown: bool = True + ) -> tuple[str, str] | None: + """Assembles the relative url for that rule and the subdomain. + If building doesn't work for some reasons `None` is returned. + + :internal: + """ + try: + if append_unknown: + return self._build_unknown(**values) + else: + return self._build(**values) + except ValidationError: + return None + + def provides_defaults_for(self, rule: Rule) -> bool: + """Check if this rule has defaults for a given rule. + + :internal: + """ + return bool( + not self.build_only + and self.defaults + and self.endpoint == rule.endpoint + and self != rule + and self.arguments == rule.arguments + ) + + def suitable_for( + self, values: t.Mapping[str, t.Any], method: str | None = None + ) -> bool: + """Check if the dict of values has enough data for url generation. + + :internal: + """ + # if a method was given explicitly and that method is not supported + # by this rule, this rule is not suitable. + if ( + method is not None + and self.methods is not None + and method not in self.methods + ): + return False + + defaults = self.defaults or () + + # all arguments required must be either in the defaults dict or + # the value dictionary otherwise it's not suitable + for key in self.arguments: + if key not in defaults and key not in values: + return False + + # in case defaults are given we ensure that either the value was + # skipped or the value is the same as the default value. + if defaults: + for key, value in defaults.items(): + if key in values and value != values[key]: + return False + + return True + + def build_compare_key(self) -> tuple[int, int, int]: + """The build compare key for sorting. + + :internal: + """ + return (1 if self.alias else 0, -len(self.arguments), -len(self.defaults or ())) + + def __eq__(self, other: object) -> bool: + return isinstance(other, type(self)) and self._trace == other._trace + + __hash__ = None # type: ignore + + def __str__(self) -> str: + return self.rule + + def __repr__(self) -> str: + if self.map is None: + return f"<{type(self).__name__} (unbound)>" + parts = [] + for is_dynamic, data in self._trace: + if is_dynamic: + parts.append(f"<{data}>") + else: + parts.append(data) + parts_str = "".join(parts).lstrip("|") + methods = f" ({', '.join(self.methods)})" if self.methods is not None else "" + return f"<{type(self).__name__} {parts_str!r}{methods} -> {self.endpoint}>" diff --git a/venv/lib/python3.11/site-packages/werkzeug/sansio/__init__.py b/venv/lib/python3.11/site-packages/werkzeug/sansio/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..9c769a84635ec8923e9c41f62f381d47278da899 GIT binary patch literal 204 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..982c7f5b78f50e557535ad8fad73e520d9452fdf GIT binary patch literal 15608 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 Ai~s-t literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/request.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/request.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..31befa44d0b61f54d8612924ca4e1f3e37c6f8af GIT binary patch literal 23512 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

    e>2Uv=pAk_qJNu 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/response.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/response.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..38b931166330e77f93cec5cd38e233f627b6f0e4 GIT binary patch literal 34137 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 YJfZkgQ5ZZ{PmXK^_E2xnD!9e}2Y9JpaR2}S literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/sansio/http.py b/venv/lib/python3.11/site-packages/werkzeug/sansio/http.py new file mode 100755 index 0000000..c68a57f --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/sansio/http.py @@ -0,0 +1,170 @@ +from __future__ import annotations + +import re +import typing as t +from datetime import datetime + +from .._internal import _dt_as_utc +from ..http import generate_etag +from ..http import parse_date +from ..http import parse_etags +from ..http import parse_if_range_header +from ..http import unquote_etag + +_etag_re = re.compile(r'([Ww]/)?(?:"(.*?)"|(.*?))(?:\s*,\s*|$)') + + +def is_resource_modified( + http_range: str | None = None, + http_if_range: str | None = None, + http_if_modified_since: str | None = None, + http_if_none_match: str | None = None, + http_if_match: str | None = None, + etag: str | None = None, + data: bytes | None = None, + last_modified: datetime | str | None = None, + ignore_if_range: bool = True, +) -> bool: + """Convenience method for conditional requests. + :param http_range: Range HTTP header + :param http_if_range: If-Range HTTP header + :param http_if_modified_since: If-Modified-Since HTTP header + :param http_if_none_match: If-None-Match HTTP header + :param http_if_match: If-Match HTTP header + :param etag: the etag for the response for comparison. + :param data: or alternatively the data of the response to automatically + generate an etag using :func:`generate_etag`. + :param last_modified: an optional date of the last modification. + :param ignore_if_range: If `False`, `If-Range` header will be taken into + account. + :return: `True` if the resource was modified, otherwise `False`. + + .. versionadded:: 2.2 + """ + if etag is None and data is not None: + etag = generate_etag(data) + elif data is not None: + raise TypeError("both data and etag given") + + unmodified = False + if isinstance(last_modified, str): + last_modified = parse_date(last_modified) + + # HTTP doesn't use microsecond, remove it to avoid false positive + # comparisons. Mark naive datetimes as UTC. + if last_modified is not None: + last_modified = _dt_as_utc(last_modified.replace(microsecond=0)) + + if_range = None + if not ignore_if_range and http_range is not None: + # https://tools.ietf.org/html/rfc7233#section-3.2 + # A server MUST ignore an If-Range header field received in a request + # that does not contain a Range header field. + if_range = parse_if_range_header(http_if_range) + + if if_range is not None and if_range.date is not None: + modified_since: datetime | None = if_range.date + else: + modified_since = parse_date(http_if_modified_since) + + if modified_since and last_modified and last_modified <= modified_since: + unmodified = True + + if etag: + etag, _ = unquote_etag(etag) + + if if_range is not None and if_range.etag is not None: + unmodified = parse_etags(if_range.etag).contains(etag) + else: + if_none_match = parse_etags(http_if_none_match) + if if_none_match: + # https://tools.ietf.org/html/rfc7232#section-3.2 + # "A recipient MUST use the weak comparison function when comparing + # entity-tags for If-None-Match" + unmodified = if_none_match.contains_weak(etag) + + # https://tools.ietf.org/html/rfc7232#section-3.1 + # "Origin server MUST use the strong comparison function when + # comparing entity-tags for If-Match" + if_match = parse_etags(http_if_match) + if if_match: + unmodified = not if_match.is_strong(etag) + + return not unmodified + + +_cookie_re = re.compile( + r""" + ([^=;]*) + (?:\s*=\s* + ( + "(?:[^\\"]|\\.)*" + | + .*? + ) + )? + \s*;\s* + """, + flags=re.ASCII | re.VERBOSE, +) +_cookie_unslash_re = re.compile(rb"\\([0-3][0-7]{2}|.)") + + +def _cookie_unslash_replace(m: t.Match[bytes]) -> bytes: + v = m.group(1) + + if len(v) == 1: + return v + + return int(v, 8).to_bytes(1, "big") + + +def parse_cookie( + cookie: str | None = None, + cls: type[ds.MultiDict[str, str]] | None = None, +) -> ds.MultiDict[str, str]: + """Parse a cookie from a string. + + The same key can be provided multiple times, the values are stored + in-order. The default :class:`MultiDict` will have the first value + first, and all values can be retrieved with + :meth:`MultiDict.getlist`. + + :param cookie: The cookie header as a string. + :param cls: A dict-like class to store the parsed cookies in. + Defaults to :class:`MultiDict`. + + .. versionchanged:: 3.0 + Passing bytes, and the ``charset`` and ``errors`` parameters, were removed. + + .. versionadded:: 2.2 + """ + if cls is None: + cls = t.cast("type[ds.MultiDict[str, str]]", ds.MultiDict) + + if not cookie: + return cls() + + cookie = f"{cookie};" + out = [] + + for ck, cv in _cookie_re.findall(cookie): + ck = ck.strip() + cv = cv.strip() + + if not ck: + continue + + if len(cv) >= 2 and cv[0] == cv[-1] == '"': + # Work with bytes here, since a UTF-8 character could be multiple bytes. + cv = _cookie_unslash_re.sub( + _cookie_unslash_replace, cv[1:-1].encode() + ).decode(errors="replace") + + out.append((ck, cv)) + + return cls(out) + + +# circular dependencies +from .. import datastructures as ds # noqa: E402 diff --git a/venv/lib/python3.11/site-packages/werkzeug/sansio/multipart.py b/venv/lib/python3.11/site-packages/werkzeug/sansio/multipart.py new file mode 100755 index 0000000..9582aba --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/sansio/multipart.py @@ -0,0 +1,331 @@ +from __future__ import annotations + +import re +import typing as t +from dataclasses import dataclass +from enum import auto +from enum import Enum + +from ..datastructures import Headers +from ..exceptions import RequestEntityTooLarge +from ..http import parse_options_header + + +class Event: + pass + + +@dataclass(frozen=True) +class Preamble(Event): + data: bytes + + +@dataclass(frozen=True) +class Field(Event): + name: str + headers: Headers + + +@dataclass(frozen=True) +class File(Event): + name: str + filename: str + headers: Headers + + +@dataclass(frozen=True) +class Data(Event): + data: bytes + more_data: bool + + +@dataclass(frozen=True) +class Epilogue(Event): + data: bytes + + +class NeedData(Event): + pass + + +NEED_DATA = NeedData() + + +class State(Enum): + PREAMBLE = auto() + PART = auto() + DATA = auto() + DATA_START = auto() + EPILOGUE = auto() + COMPLETE = auto() + + +# Multipart line breaks MUST be CRLF (\r\n) by RFC-7578, except that +# many implementations break this and either use CR or LF alone. +LINE_BREAK = b"(?:\r\n|\n|\r)" +BLANK_LINE_RE = re.compile(b"(?:\r\n\r\n|\r\r|\n\n)", re.MULTILINE) +LINE_BREAK_RE = re.compile(LINE_BREAK, re.MULTILINE) +# Header values can be continued via a space or tab after the linebreak, as +# per RFC2231 +HEADER_CONTINUATION_RE = re.compile(b"%s[ \t]" % LINE_BREAK, re.MULTILINE) +# This must be long enough to contain any line breaks plus any +# additional boundary markers (--) such that they will be found in a +# subsequent search +SEARCH_EXTRA_LENGTH = 8 + + +class MultipartDecoder: + """Decodes a multipart message as bytes into Python events. + + The part data is returned as available to allow the caller to save + the data from memory to disk, if desired. + + .. versionchanged:: 3.1.4 + Handle chunks that split a``\r\n`` sequence. + """ + + def __init__( + self, + boundary: bytes, + max_form_memory_size: int | None = None, + *, + max_parts: int | None = None, + ) -> None: + self.buffer = bytearray() + self.complete = False + self.max_form_memory_size = max_form_memory_size + self.max_parts = max_parts + self.state = State.PREAMBLE + self.boundary = boundary + + # Note in the below \h i.e. horizontal whitespace is used + # as [^\S\n\r] as \h isn't supported in python. + + # The preamble must end with a boundary where the boundary is + # prefixed by a line break, RFC2046. Except that many + # implementations including Werkzeug's tests omit the line + # break prefix. In addition the first boundary could be the + # epilogue boundary (for empty form-data) hence the matching + # group to understand if it is an epilogue boundary. + self.preamble_re = re.compile( + rb"%s?--%s(--[^\S\n\r]*%s?|[^\S\n\r]*%s)" + % (LINE_BREAK, re.escape(boundary), LINE_BREAK, LINE_BREAK), + re.MULTILINE, + ) + # A boundary must include a line break prefix and suffix, and + # may include trailing whitespace. In addition the boundary + # could be the epilogue boundary hence the matching group to + # understand if it is an epilogue boundary. + self.boundary_re = re.compile( + rb"%s--%s(--[^\S\n\r]*%s?|[^\S\n\r]*%s)" + % (LINE_BREAK, re.escape(boundary), LINE_BREAK, LINE_BREAK), + re.MULTILINE, + ) + self._search_position = 0 + self._parts_decoded = 0 + + def receive_data(self, data: bytes | None) -> None: + if data is None: + self.complete = True + elif ( + self.max_form_memory_size is not None + and len(self.buffer) + len(data) > self.max_form_memory_size + ): + # Ensure that data within single event does not exceed limit. + # Also checked across accumulated events in MultiPartParser. + raise RequestEntityTooLarge() + else: + self.buffer.extend(data) + + def next_event(self) -> Event: + event: Event = NEED_DATA + if self.state == State.PREAMBLE: + match = self.preamble_re.search(self.buffer, self._search_position) + if match is not None: + if match.group(1).startswith(b"--"): + self.state = State.EPILOGUE + else: + self.state = State.PART + data = bytes(self.buffer[: match.start()]) + del self.buffer[: match.end()] + event = Preamble(data=data) + self._search_position = 0 + else: + # Update the search start position to be equal to the + # current buffer length (already searched) minus a + # safe buffer for part of the search target. + self._search_position = max( + 0, len(self.buffer) - len(self.boundary) - SEARCH_EXTRA_LENGTH + ) + + elif self.state == State.PART: + match = BLANK_LINE_RE.search(self.buffer, self._search_position) + if match is not None: + headers = self._parse_headers(self.buffer[: match.start()]) + # The final header ends with a single CRLF, however a + # blank line indicates the start of the + # body. Therefore the end is after the first CRLF. + headers_end = (match.start() + match.end()) // 2 + del self.buffer[:headers_end] + + if "content-disposition" not in headers: + raise ValueError("Missing Content-Disposition header") + + disposition, extra = parse_options_header( + headers["content-disposition"] + ) + name = t.cast(str, extra.get("name")) + filename = extra.get("filename") + if filename is not None: + event = File( + filename=filename, + headers=headers, + name=name, + ) + else: + event = Field( + headers=headers, + name=name, + ) + self.state = State.DATA_START + self._search_position = 0 + self._parts_decoded += 1 + + if self.max_parts is not None and self._parts_decoded > self.max_parts: + raise RequestEntityTooLarge() + else: + # Update the search start position to be equal to the + # current buffer length (already searched) minus a + # safe buffer for part of the search target. + self._search_position = max(0, len(self.buffer) - SEARCH_EXTRA_LENGTH) + + elif self.state == State.DATA_START: + data, del_index, more_data = self._parse_data(self.buffer, start=True) + del self.buffer[:del_index] + event = Data(data=data, more_data=more_data) + if more_data: + self.state = State.DATA + + elif self.state == State.DATA: + data, del_index, more_data = self._parse_data(self.buffer, start=False) + del self.buffer[:del_index] + if data or not more_data: + event = Data(data=data, more_data=more_data) + + elif self.state == State.EPILOGUE and self.complete: + event = Epilogue(data=bytes(self.buffer)) + del self.buffer[:] + self.state = State.COMPLETE + + if self.complete and isinstance(event, NeedData): + raise ValueError(f"Invalid form-data cannot parse beyond {self.state}") + + return event + + def _parse_headers(self, data: bytes | bytearray) -> Headers: + headers: list[tuple[str, str]] = [] + # Merge the continued headers into one line + data = HEADER_CONTINUATION_RE.sub(b" ", data) + # Now there is one header per line + for line in data.splitlines(): + line = line.strip() + + if line != b"": + name, _, value = line.decode().partition(":") + headers.append((name.strip(), value.strip())) + return Headers(headers) + + def _parse_data( + self, data: bytes | bytearray, *, start: bool + ) -> tuple[bytes, int, bool]: + # Body parts must start with CRLF (or CR or LF) + if start: + match = LINE_BREAK_RE.match(data) + data_start = t.cast(t.Match[bytes], match).end() + else: + data_start = 0 + + if self.buffer.find(b"--" + self.boundary) == -1: + # No complete boundary in the buffer, but there may be + # a partial boundary at the end. + data_end = del_index = ( + self._last_partial_boundary_index(data[data_start:]) + data_start + ) + more_data = True + else: + match = self.boundary_re.search(data) + if match is not None: + if match.group(1).startswith(b"--"): + self.state = State.EPILOGUE + else: + self.state = State.PART + data_end = match.start() + del_index = match.end() + else: + data_end = del_index = ( + self._last_partial_boundary_index(data[data_start:]) + data_start + ) + more_data = match is None + return bytes(data[data_start:data_end]), del_index, more_data + + def _last_partial_boundary_index(self, data: bytes | bytearray) -> int: + # Find the last index following which a partial boundary + # could be present in the data. This will be the earliest + # position of a LF or a CR, unless that position is more + # than a complete boundary from the end in which case there + # is no partial boundary. + complete_boundary_index = len(data) - len(b"\r\n--" + self.boundary) + try: + last_nl = data.rindex(b"\n") + except ValueError: + last_nl = len(data) + else: + if last_nl < complete_boundary_index: + last_nl = len(data) + try: + last_cr = data.rindex(b"\r") + except ValueError: + last_cr = len(data) + else: + if last_cr < complete_boundary_index: + last_cr = len(data) + return min(last_nl, last_cr) + + +class MultipartEncoder: + def __init__(self, boundary: bytes) -> None: + self.boundary = boundary + self.state = State.PREAMBLE + + def send_event(self, event: Event) -> bytes: + if isinstance(event, Preamble) and self.state == State.PREAMBLE: + self.state = State.PART + return event.data + elif isinstance(event, (Field, File)) and self.state in { + State.PREAMBLE, + State.PART, + State.DATA, + }: + data = b"\r\n--" + self.boundary + b"\r\n" + data += b'Content-Disposition: form-data; name="%s"' % event.name.encode() + if isinstance(event, File): + data += b'; filename="%s"' % event.filename.encode() + data += b"\r\n" + for name, value in t.cast(Field, event).headers: + if name.lower() != "content-disposition": + data += f"{name}: {value}\r\n".encode() + self.state = State.DATA_START + return data + elif isinstance(event, Data) and self.state == State.DATA_START: + self.state = State.DATA + if len(event.data) > 0: + return b"\r\n" + event.data + else: + return event.data + elif isinstance(event, Data) and self.state == State.DATA: + return event.data + elif isinstance(event, Epilogue): + self.state = State.COMPLETE + return b"\r\n--" + self.boundary + b"--\r\n" + event.data + else: + raise ValueError(f"Cannot generate {event} in state: {self.state}") diff --git a/venv/lib/python3.11/site-packages/werkzeug/sansio/request.py b/venv/lib/python3.11/site-packages/werkzeug/sansio/request.py new file mode 100755 index 0000000..0d72f32 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/sansio/request.py @@ -0,0 +1,536 @@ +from __future__ import annotations + +import typing as t +from datetime import datetime +from urllib.parse import parse_qsl + +from ..datastructures import Accept +from ..datastructures import Authorization +from ..datastructures import CharsetAccept +from ..datastructures import ETags +from ..datastructures import Headers +from ..datastructures import HeaderSet +from ..datastructures import IfRange +from ..datastructures import ImmutableList +from ..datastructures import ImmutableMultiDict +from ..datastructures import LanguageAccept +from ..datastructures import MIMEAccept +from ..datastructures import MultiDict +from ..datastructures import Range +from ..datastructures import RequestCacheControl +from ..http import parse_accept_header +from ..http import parse_cache_control_header +from ..http import parse_date +from ..http import parse_etags +from ..http import parse_if_range_header +from ..http import parse_list_header +from ..http import parse_options_header +from ..http import parse_range_header +from ..http import parse_set_header +from ..user_agent import UserAgent +from ..utils import cached_property +from ..utils import header_property +from .http import parse_cookie +from .utils import get_content_length +from .utils import get_current_url +from .utils import get_host + + +class Request: + """Represents the non-IO parts of a HTTP request, including the + method, URL info, and headers. + + This class is not meant for general use. It should only be used when + implementing WSGI, ASGI, or another HTTP application spec. Werkzeug + provides a WSGI implementation at :cls:`werkzeug.wrappers.Request`. + + :param method: The method the request was made with, such as + ``GET``. + :param scheme: The URL scheme of the protocol the request used, such + as ``https`` or ``wss``. + :param server: The address of the server. ``(host, port)``, + ``(path, None)`` for unix sockets, or ``None`` if not known. + :param root_path: The prefix that the application is mounted under. + This is prepended to generated URLs, but is not part of route + matching. + :param path: The path part of the URL after ``root_path``. + :param query_string: The part of the URL after the "?". + :param headers: The headers received with the request. + :param remote_addr: The address of the client sending the request. + + .. versionchanged:: 3.0 + The ``charset``, ``url_charset``, and ``encoding_errors`` attributes + were removed. + + .. versionadded:: 2.0 + """ + + #: the class to use for `args` and `form`. The default is an + #: :class:`~werkzeug.datastructures.ImmutableMultiDict` which supports + #: multiple values per key. A :class:`~werkzeug.datastructures.ImmutableDict` + #: is faster but only remembers the last key. It is also + #: possible to use mutable structures, but this is not recommended. + #: + #: .. versionadded:: 0.6 + parameter_storage_class: type[MultiDict[str, t.Any]] = ImmutableMultiDict + + #: The type to be used for dict values from the incoming WSGI + #: environment. (For example for :attr:`cookies`.) By default an + #: :class:`~werkzeug.datastructures.ImmutableMultiDict` is used. + #: + #: .. versionchanged:: 1.0.0 + #: Changed to ``ImmutableMultiDict`` to support multiple values. + #: + #: .. versionadded:: 0.6 + dict_storage_class: type[MultiDict[str, t.Any]] = ImmutableMultiDict + + #: the type to be used for list values from the incoming WSGI environment. + #: By default an :class:`~werkzeug.datastructures.ImmutableList` is used + #: (for example for :attr:`access_list`). + #: + #: .. versionadded:: 0.6 + list_storage_class: type[list[t.Any]] = ImmutableList + + user_agent_class: type[UserAgent] = UserAgent + """The class used and returned by the :attr:`user_agent` property to + parse the header. Defaults to + :class:`~werkzeug.user_agent.UserAgent`, which does no parsing. An + extension can provide a subclass that uses a parser to provide other + data. + + .. versionadded:: 2.0 + """ + + #: Valid host names when handling requests. By default all hosts are + #: trusted, which means that whatever the client says the host is + #: will be accepted. + #: + #: Because ``Host`` and ``X-Forwarded-Host`` headers can be set to + #: any value by a malicious client, it is recommended to either set + #: this property or implement similar validation in the proxy (if + #: the application is being run behind one). + #: + #: .. versionadded:: 0.9 + trusted_hosts: list[str] | None = None + + def __init__( + self, + method: str, + scheme: str, + server: tuple[str, int | None] | None, + root_path: str, + path: str, + query_string: bytes, + headers: Headers, + remote_addr: str | None, + ) -> None: + #: The method the request was made with, such as ``GET``. + self.method = method.upper() + #: The URL scheme of the protocol the request used, such as + #: ``https`` or ``wss``. + self.scheme = scheme + #: The address of the server. ``(host, port)``, ``(path, None)`` + #: for unix sockets, or ``None`` if not known. + self.server = server + #: The prefix that the application is mounted under, without a + #: trailing slash. :attr:`path` comes after this. + self.root_path = root_path.rstrip("/") + #: The path part of the URL after :attr:`root_path`. This is the + #: path used for routing within the application. + self.path = "/" + path.lstrip("/") + #: The part of the URL after the "?". This is the raw value, use + #: :attr:`args` for the parsed values. + self.query_string = query_string + #: The headers received with the request. + self.headers = headers + #: The address of the client sending the request. + self.remote_addr = remote_addr + + def __repr__(self) -> str: + try: + url = self.url + except Exception as e: + url = f"(invalid URL: {e})" + + return f"<{type(self).__name__} {url!r} [{self.method}]>" + + @cached_property + def args(self) -> MultiDict[str, str]: + """The parsed URL parameters (the part in the URL after the question + mark). + + By default an + :class:`~werkzeug.datastructures.ImmutableMultiDict` + is returned from this function. This can be changed by setting + :attr:`parameter_storage_class` to a different type. This might + be necessary if the order of the form data is important. + + .. versionchanged:: 2.3 + Invalid bytes remain percent encoded. + """ + return self.parameter_storage_class( + parse_qsl( + self.query_string.decode(), + keep_blank_values=True, + errors="werkzeug.url_quote", + ) + ) + + @cached_property + def access_route(self) -> list[str]: + """If a forwarded header exists this is a list of all ip addresses + from the client ip to the last proxy server. + """ + if "X-Forwarded-For" in self.headers: + return self.list_storage_class( + parse_list_header(self.headers["X-Forwarded-For"]) + ) + elif self.remote_addr is not None: + return self.list_storage_class([self.remote_addr]) + return self.list_storage_class() + + @cached_property + def full_path(self) -> str: + """Requested path, including the query string.""" + return f"{self.path}?{self.query_string.decode()}" + + @property + def is_secure(self) -> bool: + """``True`` if the request was made with a secure protocol + (HTTPS or WSS). + """ + return self.scheme in {"https", "wss"} + + @cached_property + def url(self) -> str: + """The full request URL with the scheme, host, root path, path, + and query string.""" + return get_current_url( + self.scheme, self.host, self.root_path, self.path, self.query_string + ) + + @cached_property + def base_url(self) -> str: + """Like :attr:`url` but without the query string.""" + return get_current_url(self.scheme, self.host, self.root_path, self.path) + + @cached_property + def root_url(self) -> str: + """The request URL scheme, host, and root path. This is the root + that the application is accessed from. + """ + return get_current_url(self.scheme, self.host, self.root_path) + + @cached_property + def host_url(self) -> str: + """The request URL scheme and host only.""" + return get_current_url(self.scheme, self.host) + + @cached_property + def host(self) -> str: + """The host name the request was made to, including the port if + it's non-standard. Validated with :attr:`trusted_hosts`. + + See :func:`.get_host` for a detailed explanation. + """ + return get_host( + self.scheme, self.headers.get("host"), self.server, self.trusted_hosts + ) + + @cached_property + def cookies(self) -> ImmutableMultiDict[str, str]: + """A :class:`dict` with the contents of all cookies transmitted with + the request.""" + wsgi_combined_cookie = ";".join(self.headers.getlist("Cookie")) + return parse_cookie( # type: ignore + wsgi_combined_cookie, cls=self.dict_storage_class + ) + + # Common Descriptors + + content_type = header_property[str]( + "Content-Type", + doc="""The Content-Type entity-header field indicates the media + type of the entity-body sent to the recipient or, in the case of + the HEAD method, the media type that would have been sent had + the request been a GET.""", + read_only=True, + ) + + @cached_property + def content_length(self) -> int | None: + """The Content-Length entity-header field indicates the size of the + entity-body in bytes or, in the case of the HEAD method, the size of + the entity-body that would have been sent had the request been a + GET. + """ + return get_content_length( + http_content_length=self.headers.get("Content-Length"), + http_transfer_encoding=self.headers.get("Transfer-Encoding"), + ) + + content_encoding = header_property[str]( + "Content-Encoding", + doc="""The Content-Encoding entity-header field is used as a + modifier to the media-type. When present, its value indicates + what additional content codings have been applied to the + entity-body, and thus what decoding mechanisms must be applied + in order to obtain the media-type referenced by the Content-Type + header field. + + .. versionadded:: 0.9""", + read_only=True, + ) + content_md5 = header_property[str]( + "Content-MD5", + doc="""The Content-MD5 entity-header field, as defined in + RFC 1864, is an MD5 digest of the entity-body for the purpose of + providing an end-to-end message integrity check (MIC) of the + entity-body. (Note: a MIC is good for detecting accidental + modification of the entity-body in transit, but is not proof + against malicious attacks.) + + .. versionadded:: 0.9""", + read_only=True, + ) + referrer = header_property[str]( + "Referer", + doc="""The Referer[sic] request-header field allows the client + to specify, for the server's benefit, the address (URI) of the + resource from which the Request-URI was obtained (the + "referrer", although the header field is misspelled).""", + read_only=True, + ) + date = header_property( + "Date", + None, + parse_date, + doc="""The Date general-header field represents the date and + time at which the message was originated, having the same + semantics as orig-date in RFC 822. + + .. versionchanged:: 2.0 + The datetime object is timezone-aware. + """, + read_only=True, + ) + max_forwards = header_property( + "Max-Forwards", + None, + int, + doc="""The Max-Forwards request-header field provides a + mechanism with the TRACE and OPTIONS methods to limit the number + of proxies or gateways that can forward the request to the next + inbound server.""", + read_only=True, + ) + + def _parse_content_type(self) -> None: + if not hasattr(self, "_parsed_content_type"): + self._parsed_content_type = parse_options_header( + self.headers.get("Content-Type", "") + ) + + @property + def mimetype(self) -> str: + """Like :attr:`content_type`, but without parameters (eg, without + charset, type etc.) and always lowercase. For example if the content + type is ``text/HTML; charset=utf-8`` the mimetype would be + ``'text/html'``. + """ + self._parse_content_type() + return self._parsed_content_type[0].lower() + + @property + def mimetype_params(self) -> dict[str, str]: + """The mimetype parameters as dict. For example if the content + type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + """ + self._parse_content_type() + return self._parsed_content_type[1] + + @cached_property + def pragma(self) -> HeaderSet: + """The Pragma general-header field is used to include + implementation-specific directives that might apply to any recipient + along the request/response chain. All pragma directives specify + optional behavior from the viewpoint of the protocol; however, some + systems MAY require that behavior be consistent with the directives. + """ + return parse_set_header(self.headers.get("Pragma", "")) + + # Accept + + @cached_property + def accept_mimetypes(self) -> MIMEAccept: + """List of mimetypes this client supports as + :class:`~werkzeug.datastructures.MIMEAccept` object. + """ + return parse_accept_header(self.headers.get("Accept"), MIMEAccept) + + @cached_property + def accept_charsets(self) -> CharsetAccept: + """List of charsets this client supports as + :class:`~werkzeug.datastructures.CharsetAccept` object. + """ + return parse_accept_header(self.headers.get("Accept-Charset"), CharsetAccept) + + @cached_property + def accept_encodings(self) -> Accept: + """List of encodings this client accepts. Encodings in a HTTP term + are compression encodings such as gzip. For charsets have a look at + :attr:`accept_charset`. + """ + return parse_accept_header(self.headers.get("Accept-Encoding")) + + @cached_property + def accept_languages(self) -> LanguageAccept: + """List of languages this client accepts as + :class:`~werkzeug.datastructures.LanguageAccept` object. + + .. versionchanged 0.5 + In previous versions this was a regular + :class:`~werkzeug.datastructures.Accept` object. + """ + return parse_accept_header(self.headers.get("Accept-Language"), LanguageAccept) + + # ETag + + @cached_property + def cache_control(self) -> RequestCacheControl: + """A :class:`~werkzeug.datastructures.RequestCacheControl` object + for the incoming cache control headers. + """ + cache_control = self.headers.get("Cache-Control") + return parse_cache_control_header(cache_control, None, RequestCacheControl) + + @cached_property + def if_match(self) -> ETags: + """An object containing all the etags in the `If-Match` header. + + :rtype: :class:`~werkzeug.datastructures.ETags` + """ + return parse_etags(self.headers.get("If-Match")) + + @cached_property + def if_none_match(self) -> ETags: + """An object containing all the etags in the `If-None-Match` header. + + :rtype: :class:`~werkzeug.datastructures.ETags` + """ + return parse_etags(self.headers.get("If-None-Match")) + + @cached_property + def if_modified_since(self) -> datetime | None: + """The parsed `If-Modified-Since` header as a datetime object. + + .. versionchanged:: 2.0 + The datetime object is timezone-aware. + """ + return parse_date(self.headers.get("If-Modified-Since")) + + @cached_property + def if_unmodified_since(self) -> datetime | None: + """The parsed `If-Unmodified-Since` header as a datetime object. + + .. versionchanged:: 2.0 + The datetime object is timezone-aware. + """ + return parse_date(self.headers.get("If-Unmodified-Since")) + + @cached_property + def if_range(self) -> IfRange: + """The parsed ``If-Range`` header. + + .. versionchanged:: 2.0 + ``IfRange.date`` is timezone-aware. + + .. versionadded:: 0.7 + """ + return parse_if_range_header(self.headers.get("If-Range")) + + @cached_property + def range(self) -> Range | None: + """The parsed `Range` header. + + .. versionadded:: 0.7 + + :rtype: :class:`~werkzeug.datastructures.Range` + """ + return parse_range_header(self.headers.get("Range")) + + # User Agent + + @cached_property + def user_agent(self) -> UserAgent: + """The user agent. Use ``user_agent.string`` to get the header + value. Set :attr:`user_agent_class` to a subclass of + :class:`~werkzeug.user_agent.UserAgent` to provide parsing for + the other properties or other extended data. + + .. versionchanged:: 2.1 + The built-in parser was removed. Set ``user_agent_class`` to a ``UserAgent`` + subclass to parse data from the string. + """ + return self.user_agent_class(self.headers.get("User-Agent", "")) + + # Authorization + + @cached_property + def authorization(self) -> Authorization | None: + """The ``Authorization`` header parsed into an :class:`.Authorization` object. + ``None`` if the header is not present. + + .. versionchanged:: 2.3 + :class:`Authorization` is no longer a ``dict``. The ``token`` attribute + was added for auth schemes that use a token instead of parameters. + """ + return Authorization.from_header(self.headers.get("Authorization")) + + # CORS + + origin = header_property[str]( + "Origin", + doc=( + "The host that the request originated from. Set" + " :attr:`~CORSResponseMixin.access_control_allow_origin` on" + " the response to indicate which origins are allowed." + ), + read_only=True, + ) + + access_control_request_headers = header_property( + "Access-Control-Request-Headers", + load_func=parse_set_header, + doc=( + "Sent with a preflight request to indicate which headers" + " will be sent with the cross origin request. Set" + " :attr:`~CORSResponseMixin.access_control_allow_headers`" + " on the response to indicate which headers are allowed." + ), + read_only=True, + ) + + access_control_request_method = header_property[str]( + "Access-Control-Request-Method", + doc=( + "Sent with a preflight request to indicate which method" + " will be used for the cross origin request. Set" + " :attr:`~CORSResponseMixin.access_control_allow_methods`" + " on the response to indicate which methods are allowed." + ), + read_only=True, + ) + + @property + def is_json(self) -> bool: + """Check if the mimetype indicates JSON data, either + :mimetype:`application/json` or :mimetype:`application/*+json`. + """ + mt = self.mimetype + return ( + mt == "application/json" + or mt.startswith("application/") + and mt.endswith("+json") + ) diff --git a/venv/lib/python3.11/site-packages/werkzeug/sansio/response.py b/venv/lib/python3.11/site-packages/werkzeug/sansio/response.py new file mode 100755 index 0000000..a52f963 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/sansio/response.py @@ -0,0 +1,763 @@ +from __future__ import annotations + +import typing as t +from datetime import datetime +from datetime import timedelta +from datetime import timezone +from http import HTTPStatus + +from ..datastructures import CallbackDict +from ..datastructures import ContentRange +from ..datastructures import ContentSecurityPolicy +from ..datastructures import Headers +from ..datastructures import HeaderSet +from ..datastructures import ResponseCacheControl +from ..datastructures import WWWAuthenticate +from ..http import COEP +from ..http import COOP +from ..http import dump_age +from ..http import dump_cookie +from ..http import dump_header +from ..http import dump_options_header +from ..http import http_date +from ..http import HTTP_STATUS_CODES +from ..http import parse_age +from ..http import parse_cache_control_header +from ..http import parse_content_range_header +from ..http import parse_csp_header +from ..http import parse_date +from ..http import parse_options_header +from ..http import parse_set_header +from ..http import quote_etag +from ..http import unquote_etag +from ..utils import get_content_type +from ..utils import header_property + +if t.TYPE_CHECKING: + from ..datastructures.cache_control import _CacheControl + + +def _set_property(name: str, doc: str | None = None) -> property: + def fget(self: Response) -> HeaderSet: + def on_update(header_set: HeaderSet) -> None: + if not header_set and name in self.headers: + del self.headers[name] + elif header_set: + self.headers[name] = header_set.to_header() + + return parse_set_header(self.headers.get(name), on_update) + + def fset( + self: Response, + value: None | (str | dict[str, str | int] | t.Iterable[str]), + ) -> None: + if not value: + del self.headers[name] + elif isinstance(value, str): + self.headers[name] = value + else: + self.headers[name] = dump_header(value) + + return property(fget, fset, doc=doc) + + +class Response: + """Represents the non-IO parts of an HTTP response, specifically the + status and headers but not the body. + + This class is not meant for general use. It should only be used when + implementing WSGI, ASGI, or another HTTP application spec. Werkzeug + provides a WSGI implementation at :cls:`werkzeug.wrappers.Response`. + + :param status: The status code for the response. Either an int, in + which case the default status message is added, or a string in + the form ``{code} {message}``, like ``404 Not Found``. Defaults + to 200. + :param headers: A :class:`~werkzeug.datastructures.Headers` object, + or a list of ``(key, value)`` tuples that will be converted to a + ``Headers`` object. + :param mimetype: The mime type (content type without charset or + other parameters) of the response. If the value starts with + ``text/`` (or matches some other special cases), the charset + will be added to create the ``content_type``. + :param content_type: The full content type of the response. + Overrides building the value from ``mimetype``. + + .. versionchanged:: 3.0 + The ``charset`` attribute was removed. + + .. versionadded:: 2.0 + """ + + #: the default status if none is provided. + default_status = 200 + + #: the default mimetype if none is provided. + default_mimetype: str | None = "text/plain" + + #: Warn if a cookie header exceeds this size. The default, 4093, should be + #: safely `supported by most browsers `_. A cookie larger than + #: this size will still be sent, but it may be ignored or handled + #: incorrectly by some browsers. Set to 0 to disable this check. + #: + #: .. versionadded:: 0.13 + #: + #: .. _`cookie`: http://browsercookielimits.squawky.net/ + max_cookie_size = 4093 + + # A :class:`Headers` object representing the response headers. + headers: Headers + + def __init__( + self, + status: int | str | HTTPStatus | None = None, + headers: t.Mapping[str, str | t.Iterable[str]] + | t.Iterable[tuple[str, str]] + | None = None, + mimetype: str | None = None, + content_type: str | None = None, + ) -> None: + if isinstance(headers, Headers): + self.headers = headers + elif not headers: + self.headers = Headers() + else: + self.headers = Headers(headers) + + if content_type is None: + if mimetype is None and "content-type" not in self.headers: + mimetype = self.default_mimetype + if mimetype is not None: + mimetype = get_content_type(mimetype, "utf-8") + content_type = mimetype + if content_type is not None: + self.headers["Content-Type"] = content_type + if status is None: + status = self.default_status + self.status = status + + def __repr__(self) -> str: + return f"<{type(self).__name__} [{self.status}]>" + + @property + def status_code(self) -> int: + """The HTTP status code as a number.""" + return self._status_code + + @status_code.setter + def status_code(self, code: int) -> None: + self.status = code + + @property + def status(self) -> str: + """The HTTP status code as a string.""" + return self._status + + @status.setter + def status(self, value: str | int | HTTPStatus) -> None: + self._status, self._status_code = self._clean_status(value) + + def _clean_status(self, value: str | int | HTTPStatus) -> tuple[str, int]: + if isinstance(value, (int, HTTPStatus)): + status_code = int(value) + else: + value = value.strip() + + if not value: + raise ValueError("Empty status argument") + + code_str, sep, _ = value.partition(" ") + + try: + status_code = int(code_str) + except ValueError: + # only message + return f"0 {value}", 0 + + if sep: + # code and message + return value, status_code + + # only code, look up message + try: + status = f"{status_code} {HTTP_STATUS_CODES[status_code].upper()}" + except KeyError: + status = f"{status_code} UNKNOWN" + + return status, status_code + + def set_cookie( + self, + key: str, + value: str = "", + max_age: timedelta | int | None = None, + expires: str | datetime | int | float | None = None, + path: str | None = "/", + domain: str | None = None, + secure: bool = False, + httponly: bool = False, + samesite: str | None = None, + partitioned: bool = False, + ) -> None: + """Sets a cookie. + + A warning is raised if the size of the cookie header exceeds + :attr:`max_cookie_size`, but the header will still be set. + + :param key: the key (name) of the cookie to be set. + :param value: the value of the cookie. + :param max_age: should be a number of seconds, or `None` (default) if + the cookie should last only as long as the client's + browser session. + :param expires: should be a `datetime` object or UNIX timestamp. + :param path: limits the cookie to a given path, per default it will + span the whole domain. + :param domain: if you want to set a cross-domain cookie. For example, + ``domain="example.com"`` will set a cookie that is + readable by the domain ``www.example.com``, + ``foo.example.com`` etc. Otherwise, a cookie will only + be readable by the domain that set it. + :param secure: If ``True``, the cookie will only be available + via HTTPS. + :param httponly: Disallow JavaScript access to the cookie. + :param samesite: Limit the scope of the cookie to only be + attached to requests that are "same-site". + :param partitioned: If ``True``, the cookie will be partitioned. + + .. versionchanged:: 3.1 + The ``partitioned`` parameter was added. + """ + self.headers.add( + "Set-Cookie", + dump_cookie( + key, + value=value, + max_age=max_age, + expires=expires, + path=path, + domain=domain, + secure=secure, + httponly=httponly, + max_size=self.max_cookie_size, + samesite=samesite, + partitioned=partitioned, + ), + ) + + def delete_cookie( + self, + key: str, + path: str | None = "/", + domain: str | None = None, + secure: bool = False, + httponly: bool = False, + samesite: str | None = None, + partitioned: bool = False, + ) -> None: + """Delete a cookie. Fails silently if key doesn't exist. + + :param key: the key (name) of the cookie to be deleted. + :param path: if the cookie that should be deleted was limited to a + path, the path has to be defined here. + :param domain: if the cookie that should be deleted was limited to a + domain, that domain has to be defined here. + :param secure: If ``True``, the cookie will only be available + via HTTPS. + :param httponly: Disallow JavaScript access to the cookie. + :param samesite: Limit the scope of the cookie to only be + attached to requests that are "same-site". + :param partitioned: If ``True``, the cookie will be partitioned. + """ + self.set_cookie( + key, + expires=0, + max_age=0, + path=path, + domain=domain, + secure=secure, + httponly=httponly, + samesite=samesite, + partitioned=partitioned, + ) + + @property + def is_json(self) -> bool: + """Check if the mimetype indicates JSON data, either + :mimetype:`application/json` or :mimetype:`application/*+json`. + """ + mt = self.mimetype + return mt is not None and ( + mt == "application/json" + or mt.startswith("application/") + and mt.endswith("+json") + ) + + # Common Descriptors + + @property + def mimetype(self) -> str | None: + """The mimetype (content type without charset etc.)""" + ct = self.headers.get("content-type") + + if ct: + return ct.split(";")[0].strip() + else: + return None + + @mimetype.setter + def mimetype(self, value: str) -> None: + self.headers["Content-Type"] = get_content_type(value, "utf-8") + + @property + def mimetype_params(self) -> dict[str, str]: + """The mimetype parameters as dict. For example if the + content type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + + .. versionadded:: 0.5 + """ + + def on_update(d: CallbackDict[str, str]) -> None: + self.headers["Content-Type"] = dump_options_header(self.mimetype, d) + + d = parse_options_header(self.headers.get("content-type", ""))[1] + return CallbackDict(d, on_update) + + location = header_property[str]( + "Location", + doc="""The Location response-header field is used to redirect + the recipient to a location other than the Request-URI for + completion of the request or identification of a new + resource.""", + ) + age = header_property( + "Age", + None, + parse_age, + dump_age, # type: ignore + doc="""The Age response-header field conveys the sender's + estimate of the amount of time since the response (or its + revalidation) was generated at the origin server. + + Age values are non-negative decimal integers, representing time + in seconds.""", + ) + content_type = header_property[str]( + "Content-Type", + doc="""The Content-Type entity-header field indicates the media + type of the entity-body sent to the recipient or, in the case of + the HEAD method, the media type that would have been sent had + the request been a GET.""", + ) + content_length = header_property( + "Content-Length", + None, + int, + str, + doc="""The Content-Length entity-header field indicates the size + of the entity-body, in decimal number of OCTETs, sent to the + recipient or, in the case of the HEAD method, the size of the + entity-body that would have been sent had the request been a + GET.""", + ) + content_location = header_property[str]( + "Content-Location", + doc="""The Content-Location entity-header field MAY be used to + supply the resource location for the entity enclosed in the + message when that entity is accessible from a location separate + from the requested resource's URI.""", + ) + content_encoding = header_property[str]( + "Content-Encoding", + doc="""The Content-Encoding entity-header field is used as a + modifier to the media-type. When present, its value indicates + what additional content codings have been applied to the + entity-body, and thus what decoding mechanisms must be applied + in order to obtain the media-type referenced by the Content-Type + header field.""", + ) + content_md5 = header_property[str]( + "Content-MD5", + doc="""The Content-MD5 entity-header field, as defined in + RFC 1864, is an MD5 digest of the entity-body for the purpose of + providing an end-to-end message integrity check (MIC) of the + entity-body. (Note: a MIC is good for detecting accidental + modification of the entity-body in transit, but is not proof + against malicious attacks.)""", + ) + date = header_property( + "Date", + None, + parse_date, + http_date, + doc="""The Date general-header field represents the date and + time at which the message was originated, having the same + semantics as orig-date in RFC 822. + + .. versionchanged:: 2.0 + The datetime object is timezone-aware. + """, + ) + expires = header_property( + "Expires", + None, + parse_date, + http_date, + doc="""The Expires entity-header field gives the date/time after + which the response is considered stale. A stale cache entry may + not normally be returned by a cache. + + .. versionchanged:: 2.0 + The datetime object is timezone-aware. + """, + ) + last_modified = header_property( + "Last-Modified", + None, + parse_date, + http_date, + doc="""The Last-Modified entity-header field indicates the date + and time at which the origin server believes the variant was + last modified. + + .. versionchanged:: 2.0 + The datetime object is timezone-aware. + """, + ) + + @property + def retry_after(self) -> datetime | None: + """The Retry-After response-header field can be used with a + 503 (Service Unavailable) response to indicate how long the + service is expected to be unavailable to the requesting client. + + Time in seconds until expiration or date. + + .. versionchanged:: 2.0 + The datetime object is timezone-aware. + """ + value = self.headers.get("retry-after") + if value is None: + return None + + try: + seconds = int(value) + except ValueError: + return parse_date(value) + + return datetime.now(timezone.utc) + timedelta(seconds=seconds) + + @retry_after.setter + def retry_after(self, value: datetime | int | str | None) -> None: + if value is None: + if "retry-after" in self.headers: + del self.headers["retry-after"] + return + elif isinstance(value, datetime): + value = http_date(value) + else: + value = str(value) + self.headers["Retry-After"] = value + + vary = _set_property( + "Vary", + doc="""The Vary field value indicates the set of request-header + fields that fully determines, while the response is fresh, + whether a cache is permitted to use the response to reply to a + subsequent request without revalidation.""", + ) + content_language = _set_property( + "Content-Language", + doc="""The Content-Language entity-header field describes the + natural language(s) of the intended audience for the enclosed + entity. Note that this might not be equivalent to all the + languages used within the entity-body.""", + ) + allow = _set_property( + "Allow", + doc="""The Allow entity-header field lists the set of methods + supported by the resource identified by the Request-URI. The + purpose of this field is strictly to inform the recipient of + valid methods associated with the resource. An Allow header + field MUST be present in a 405 (Method Not Allowed) + response.""", + ) + + # ETag + + @property + def cache_control(self) -> ResponseCacheControl: + """The Cache-Control general-header field is used to specify + directives that MUST be obeyed by all caching mechanisms along the + request/response chain. + """ + + def on_update(cache_control: _CacheControl) -> None: + if not cache_control and "cache-control" in self.headers: + del self.headers["cache-control"] + elif cache_control: + self.headers["Cache-Control"] = cache_control.to_header() + + return parse_cache_control_header( + self.headers.get("cache-control"), on_update, ResponseCacheControl + ) + + def set_etag(self, etag: str, weak: bool = False) -> None: + """Set the etag, and override the old one if there was one.""" + self.headers["ETag"] = quote_etag(etag, weak) + + def get_etag(self) -> tuple[str, bool] | tuple[None, None]: + """Return a tuple in the form ``(etag, is_weak)``. If there is no + ETag the return value is ``(None, None)``. + """ + return unquote_etag(self.headers.get("ETag")) + + accept_ranges = header_property[str]( + "Accept-Ranges", + doc="""The `Accept-Ranges` header. Even though the name would + indicate that multiple values are supported, it must be one + string token only. + + The values ``'bytes'`` and ``'none'`` are common. + + .. versionadded:: 0.7""", + ) + + @property + def content_range(self) -> ContentRange: + """The ``Content-Range`` header as a + :class:`~werkzeug.datastructures.ContentRange` object. Available + even if the header is not set. + + .. versionadded:: 0.7 + """ + + def on_update(rng: ContentRange) -> None: + if not rng: + del self.headers["content-range"] + else: + self.headers["Content-Range"] = rng.to_header() + + rv = parse_content_range_header(self.headers.get("content-range"), on_update) + # always provide a content range object to make the descriptor + # more user friendly. It provides an unset() method that can be + # used to remove the header quickly. + if rv is None: + rv = ContentRange(None, None, None, on_update=on_update) + return rv + + @content_range.setter + def content_range(self, value: ContentRange | str | None) -> None: + if not value: + del self.headers["content-range"] + elif isinstance(value, str): + self.headers["Content-Range"] = value + else: + self.headers["Content-Range"] = value.to_header() + + # Authorization + + @property + def www_authenticate(self) -> WWWAuthenticate: + """The ``WWW-Authenticate`` header parsed into a :class:`.WWWAuthenticate` + object. Modifying the object will modify the header value. + + This header is not set by default. To set this header, assign an instance of + :class:`.WWWAuthenticate` to this attribute. + + .. code-block:: python + + response.www_authenticate = WWWAuthenticate( + "basic", {"realm": "Authentication Required"} + ) + + Multiple values for this header can be sent to give the client multiple options. + Assign a list to set multiple headers. However, modifying the items in the list + will not automatically update the header values, and accessing this attribute + will only ever return the first value. + + To unset this header, assign ``None`` or use ``del``. + + .. versionchanged:: 2.3 + This attribute can be assigned to set the header. A list can be assigned + to set multiple header values. Use ``del`` to unset the header. + + .. versionchanged:: 2.3 + :class:`WWWAuthenticate` is no longer a ``dict``. The ``token`` attribute + was added for auth challenges that use a token instead of parameters. + """ + value = WWWAuthenticate.from_header(self.headers.get("WWW-Authenticate")) + + if value is None: + value = WWWAuthenticate("basic") + + def on_update(value: WWWAuthenticate) -> None: + self.www_authenticate = value + + value._on_update = on_update + return value + + @www_authenticate.setter + def www_authenticate( + self, value: WWWAuthenticate | list[WWWAuthenticate] | None + ) -> None: + if not value: # None or empty list + del self.www_authenticate + elif isinstance(value, list): + # Clear any existing header by setting the first item. + self.headers.set("WWW-Authenticate", value[0].to_header()) + + for item in value[1:]: + # Add additional header lines for additional items. + self.headers.add("WWW-Authenticate", item.to_header()) + else: + self.headers.set("WWW-Authenticate", value.to_header()) + + def on_update(value: WWWAuthenticate) -> None: + self.www_authenticate = value + + # When setting a single value, allow updating it directly. + value._on_update = on_update + + @www_authenticate.deleter + def www_authenticate(self) -> None: + if "WWW-Authenticate" in self.headers: + del self.headers["WWW-Authenticate"] + + # CSP + + @property + def content_security_policy(self) -> ContentSecurityPolicy: + """The ``Content-Security-Policy`` header as a + :class:`~werkzeug.datastructures.ContentSecurityPolicy` object. Available + even if the header is not set. + + The Content-Security-Policy header adds an additional layer of + security to help detect and mitigate certain types of attacks. + """ + + def on_update(csp: ContentSecurityPolicy) -> None: + if not csp: + del self.headers["content-security-policy"] + else: + self.headers["Content-Security-Policy"] = csp.to_header() + + rv = parse_csp_header(self.headers.get("content-security-policy"), on_update) + if rv is None: + rv = ContentSecurityPolicy(None, on_update=on_update) + return rv + + @content_security_policy.setter + def content_security_policy( + self, value: ContentSecurityPolicy | str | None + ) -> None: + if not value: + del self.headers["content-security-policy"] + elif isinstance(value, str): + self.headers["Content-Security-Policy"] = value + else: + self.headers["Content-Security-Policy"] = value.to_header() + + @property + def content_security_policy_report_only(self) -> ContentSecurityPolicy: + """The ``Content-Security-policy-report-only`` header as a + :class:`~werkzeug.datastructures.ContentSecurityPolicy` object. Available + even if the header is not set. + + The Content-Security-Policy-Report-Only header adds a csp policy + that is not enforced but is reported thereby helping detect + certain types of attacks. + """ + + def on_update(csp: ContentSecurityPolicy) -> None: + if not csp: + del self.headers["content-security-policy-report-only"] + else: + self.headers["Content-Security-policy-report-only"] = csp.to_header() + + rv = parse_csp_header( + self.headers.get("content-security-policy-report-only"), on_update + ) + if rv is None: + rv = ContentSecurityPolicy(None, on_update=on_update) + return rv + + @content_security_policy_report_only.setter + def content_security_policy_report_only( + self, value: ContentSecurityPolicy | str | None + ) -> None: + if not value: + del self.headers["content-security-policy-report-only"] + elif isinstance(value, str): + self.headers["Content-Security-policy-report-only"] = value + else: + self.headers["Content-Security-policy-report-only"] = value.to_header() + + # CORS + + @property + def access_control_allow_credentials(self) -> bool: + """Whether credentials can be shared by the browser to + JavaScript code. As part of the preflight request it indicates + whether credentials can be used on the cross origin request. + """ + return "Access-Control-Allow-Credentials" in self.headers + + @access_control_allow_credentials.setter + def access_control_allow_credentials(self, value: bool | None) -> None: + if value is True: + self.headers["Access-Control-Allow-Credentials"] = "true" + else: + self.headers.pop("Access-Control-Allow-Credentials", None) + + access_control_allow_headers = header_property( + "Access-Control-Allow-Headers", + load_func=parse_set_header, + dump_func=dump_header, + doc="Which headers can be sent with the cross origin request.", + ) + + access_control_allow_methods = header_property( + "Access-Control-Allow-Methods", + load_func=parse_set_header, + dump_func=dump_header, + doc="Which methods can be used for the cross origin request.", + ) + + access_control_allow_origin = header_property[str]( + "Access-Control-Allow-Origin", + doc="The origin or '*' for any origin that may make cross origin requests.", + ) + + access_control_expose_headers = header_property( + "Access-Control-Expose-Headers", + load_func=parse_set_header, + dump_func=dump_header, + doc="Which headers can be shared by the browser to JavaScript code.", + ) + + access_control_max_age = header_property( + "Access-Control-Max-Age", + load_func=int, + dump_func=str, + doc="The maximum age in seconds the access control settings can be cached for.", + ) + + cross_origin_opener_policy = header_property[COOP]( + "Cross-Origin-Opener-Policy", + load_func=lambda value: COOP(value), + dump_func=lambda value: value.value, + default=COOP.UNSAFE_NONE, + doc="""Allows control over sharing of browsing context group with cross-origin + documents. Values must be a member of the :class:`werkzeug.http.COOP` enum.""", + ) + + cross_origin_embedder_policy = header_property[COEP]( + "Cross-Origin-Embedder-Policy", + load_func=lambda value: COEP(value), + dump_func=lambda value: value.value, + default=COEP.UNSAFE_NONE, + doc="""Prevents a document from loading any cross-origin resources that do not + explicitly grant the document permission. Values must be a member of the + :class:`werkzeug.http.COEP` enum.""", + ) diff --git a/venv/lib/python3.11/site-packages/werkzeug/sansio/utils.py b/venv/lib/python3.11/site-packages/werkzeug/sansio/utils.py new file mode 100755 index 0000000..586d169 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/sansio/utils.py @@ -0,0 +1,224 @@ +from __future__ import annotations + +import re +import typing as t +from urllib.parse import quote + +from .._internal import _plain_int +from ..exceptions import SecurityError +from ..http import parse_set_header +from ..urls import uri_to_iri + +_host_re = re.compile( + r""" + ( + [a-z0-9.-]+ # domain or ipv4 + | + \[[a-f0-9]*:[a-f0-9.:]+] # ipv6 + ) + (?::[0-9]+)? # optional port + """, + flags=re.ASCII | re.IGNORECASE | re.VERBOSE, +) + + +def host_is_trusted( + hostname: str | None, trusted_list: t.Collection[str] | None = None +) -> bool: + """Perform some checks on a ``Host`` header ``host:port``. The host must be + made up of valid characters, but this does not check validity beyond that. + If a list of trusted domains is given, the domain must match one. + + :param hostname: The ``Host`` header ``host:port`` to check. + :param trusted_list: A list of trusted domains to match. These should + already be IDNA encoded, but will be encoded if needed. The port is + ignored for this check. If a name starts with a dot it will match as a + suffix, accepting all subdomains. If empty or ``None``, all domains are + allowed. + + .. versionchanged:: 3.2 + The value's characters are validated. + + .. versionchanged:: 3.2 + ``trusted_list`` defaults to ``None``. + + .. versionadded:: 0.9 + """ + if not hostname: + return False + + if _host_re.fullmatch(hostname) is None: + return False + + hostname = hostname.partition(":")[0] + + if not trusted_list: + return True + + if isinstance(trusted_list, str): + trusted_list = [trusted_list] + + for ref in trusted_list: + if ref.startswith("."): + ref = ref[1:] + suffix_match = True + else: + suffix_match = False + + try: + ref = ref.partition(":")[0].encode("idna").decode("ascii") + except UnicodeEncodeError: + return False + + if ref == hostname or (suffix_match and hostname.endswith(f".{ref}")): + return True + + return False + + +def get_host( + scheme: str, + host_header: str | None, + server: tuple[str, int | None] | None = None, + trusted_hosts: t.Collection[str] | None = None, +) -> str: + """Get and validate a request's ``host:port`` based on the given values. + + The ``Host`` header sent by the client is preferred. Otherwise, the server's + configured address is used. The port is omitted if it matches the standard + HTTP or HTTPS ports. + + The value is passed through :func:`host_is_trusted`. The host must be made + up of valid characters, but this does not check validity beyond that. If a + list of trusted domains is given, the domain must match one. + + If the host header is not available, such as for HTTP/0.9 and 1.0, or it has + invalid characters, the empty string is returned. Subdomain and host + routing, and external URL building, will not work in these cases. + + :param scheme: The protocol of the request. Used to omit the standard ports + 80 and 443. + :param host_header: The ``Host`` header value. + :param server: The server's configured address ``(host, port)``. The server + may be using a Unix socket and give ``(path, None)``; this is ignored as + it would not produce a useful host value. + :param trusted_hosts: A list of trusted domains to match. These should + already be IDNA encoded, but will be encoded if needed. The port is + ignored for this check. If a name starts with a dot it will match as a + suffix, accepting all subdomains. If empty or ``None``, all domains are + allowed. + + :return: Host, with port if necessary. + :raise .SecurityError: If the host is not trusted. + + .. versionchanged:: 3.1.8 + The empty string is again returned if no host header value is available, + or if the characters are invalid. + + .. versionchanged:: 3.1.7 + The characters of the host value are validated. The empty string is no + longer allowed if no header value is available. + + .. versionchanged:: 3.2 + When using the server address, Unix sockets are ignored. + + .. versionchanged:: 3.1.3 + If ``SERVER_NAME`` is IPv6, it is wrapped in ``[]``. + """ + if host_header is not None: + host = host_header + # The port server[1] will be None for a Unix socket. Ignore in that case. + elif server is not None and server[1] is not None: + host = server[0] + + # If SERVER_NAME is IPv6, wrap it in [] to match Host header. + # Check for : because domain or IPv4 can't have that. + if ":" in host and host[0] != "[": + host = f"[{host}]" + + host = f"{host}:{server[1]}" + else: + # Pass through empty host from HTTP/0.9 and 1.0. + return "" + + if scheme in {"http", "ws"}: + host = host.removesuffix(":80") + elif scheme in {"https", "wss"}: + host = host.removesuffix(":443") + + if not host_is_trusted(host, trusted_hosts): + if trusted_hosts: + raise SecurityError(f"Host {host!r} is not trusted.") + + # Invalid characters, treat as empty. + return "" + + return host + + +def get_current_url( + scheme: str, + host: str, + root_path: str | None = None, + path: str | None = None, + query_string: bytes | None = None, +) -> str: + """Recreate the URL for a request. If an optional part isn't + provided, it and subsequent parts are not included in the URL. + + The URL is an IRI, not a URI, so it may contain Unicode characters. + Use :func:`~werkzeug.urls.iri_to_uri` to convert it to ASCII. + + :param scheme: The protocol the request used, like ``"https"``. + :param host: The host the request was made to. See :func:`get_host`. + :param root_path: Prefix that the application is mounted under. This + is prepended to ``path``. + :param path: The path part of the URL after ``root_path``. + :param query_string: The portion of the URL after the "?". + """ + url = [scheme, "://", host] + + if root_path is None: + url.append("/") + return uri_to_iri("".join(url)) + + # safe = https://url.spec.whatwg.org/#url-path-segment-string + # as well as percent for things that are already quoted + url.append(quote(root_path.rstrip("/"), safe="!$&'()*+,/:;=@%")) + url.append("/") + + if path is None: + return uri_to_iri("".join(url)) + + url.append(quote(path.lstrip("/"), safe="!$&'()*+,/:;=@%")) + + if query_string: + url.append("?") + url.append(quote(query_string, safe="!$&'()*+,/:;=?@%")) + + return uri_to_iri("".join(url)) + + +def get_content_length( + http_content_length: str | None = None, + http_transfer_encoding: str | None = None, +) -> int | None: + """Return the ``Content-Length`` header value as an int. If the header is not given + or the ``Transfer-Encoding`` header is ``chunked``, ``None`` is returned to indicate + a streaming request. If the value is not an integer, or negative, 0 is returned. + + :param http_content_length: The Content-Length HTTP header. + :param http_transfer_encoding: The Transfer-Encoding HTTP header. + + .. versionadded:: 2.2 + """ + if ( + http_transfer_encoding is not None + and "chunked" in parse_set_header(http_transfer_encoding) + ) or http_content_length is None: + return None + + try: + return max(0, _plain_int(http_content_length)) + except ValueError: + return 0 diff --git a/venv/lib/python3.11/site-packages/werkzeug/security.py b/venv/lib/python3.11/site-packages/werkzeug/security.py new file mode 100755 index 0000000..9ae5117 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/security.py @@ -0,0 +1,201 @@ +from __future__ import annotations + +import hashlib +import hmac +import os +import posixpath +import secrets + +SALT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" +DEFAULT_PBKDF2_ITERATIONS = 1_000_000 + +_os_alt_seps: list[str] = list( + sep for sep in [os.sep, os.altsep] if sep is not None and sep != "/" +) +# https://chrisdenton.github.io/omnipath/Special%20Dos%20Device%20Names.html +_windows_device_files = { + "AUX", + "CON", + "CONIN$", + "CONOUT$", + *(f"COM{c}" for c in "123456789¹²³"), + *(f"LPT{c}" for c in "123456789¹²³"), + "NUL", + "PRN", +} + + +def gen_salt(length: int) -> str: + """Generate a random string of SALT_CHARS with specified ``length``.""" + if length <= 0: + raise ValueError("Salt length must be at least 1.") + + return "".join(secrets.choice(SALT_CHARS) for _ in range(length)) + + +def _hash_internal(method: str, salt: str, password: str) -> tuple[str, str]: + method, *args = method.split(":") + salt_bytes = salt.encode() + password_bytes = password.encode() + + if method == "scrypt": + if not args: + n = 2**15 + r = 8 + p = 1 + else: + try: + n, r, p = map(int, args) + except ValueError: + raise ValueError("'scrypt' takes 3 arguments.") from None + + maxmem = 132 * n * r * p # ideally 128, but some extra seems needed + return ( + hashlib.scrypt( + password_bytes, salt=salt_bytes, n=n, r=r, p=p, maxmem=maxmem + ).hex(), + f"scrypt:{n}:{r}:{p}", + ) + elif method == "pbkdf2": + len_args = len(args) + + if len_args == 0: + hash_name = "sha256" + iterations = DEFAULT_PBKDF2_ITERATIONS + elif len_args == 1: + hash_name = args[0] + iterations = DEFAULT_PBKDF2_ITERATIONS + elif len_args == 2: + hash_name = args[0] + iterations = int(args[1]) + else: + raise ValueError("'pbkdf2' takes 2 arguments.") + + return ( + hashlib.pbkdf2_hmac( + hash_name, password_bytes, salt_bytes, iterations + ).hex(), + f"pbkdf2:{hash_name}:{iterations}", + ) + else: + raise ValueError(f"Invalid hash method '{method}'.") + + +def generate_password_hash( + password: str, method: str = "scrypt", salt_length: int = 16 +) -> str: + """Securely hash a password for storage. A password can be compared to a stored hash + using :func:`check_password_hash`. + + The following methods are supported: + + - ``scrypt``, the default. The parameters are ``n``, ``r``, and ``p``, the default + is ``scrypt:32768:8:1``. See :func:`hashlib.scrypt`. + - ``pbkdf2``, less secure. The parameters are ``hash_method`` and ``iterations``, + the default is ``pbkdf2:sha256:600000``. See :func:`hashlib.pbkdf2_hmac`. + + Default parameters may be updated to reflect current guidelines, and methods may be + deprecated and removed if they are no longer considered secure. To migrate old + hashes, you may generate a new hash when checking an old hash, or you may contact + users with a link to reset their password. + + :param password: The plaintext password. + :param method: The key derivation function and parameters. + :param salt_length: The number of characters to generate for the salt. + + .. versionchanged:: 3.1 + The default iterations for pbkdf2 was increased to 1,000,000. + + .. versionchanged:: 2.3 + Scrypt support was added. + + .. versionchanged:: 2.3 + The default iterations for pbkdf2 was increased to 600,000. + + .. versionchanged:: 2.3 + All plain hashes are deprecated and will not be supported in Werkzeug 3.0. + """ + salt = gen_salt(salt_length) + h, actual_method = _hash_internal(method, salt, password) + return f"{actual_method}${salt}${h}" + + +def check_password_hash(pwhash: str, password: str) -> bool: + """Securely check that the given stored password hash, previously generated using + :func:`generate_password_hash`, matches the given password. + + Methods may be deprecated and removed if they are no longer considered secure. To + migrate old hashes, you may generate a new hash when checking an old hash, or you + may contact users with a link to reset their password. + + :param pwhash: The hashed password. + :param password: The plaintext password. + + .. versionchanged:: 2.3 + All plain hashes are deprecated and will not be supported in Werkzeug 3.0. + """ + try: + method, salt, hashval = pwhash.split("$", 2) + except ValueError: + return False + + return hmac.compare_digest(_hash_internal(method, salt, password)[0], hashval) + + +def safe_join(directory: str, *untrusted: str) -> str | None: + """Safely join zero or more untrusted path components to a trusted base + directory to avoid escaping the base directory. + + The untrusted path is assumed to be from/for a URL, such as for serving + files. Therefore, it should only use the forward slash ``/`` path separator, + and will be joined using that separator. On Windows, the backslash ``\\`` + separator is not allowed. + + :param directory: The trusted base directory. + :param untrusted: The untrusted path components relative to the + base directory. + :return: A safe path, otherwise ``None``. + + .. versionchanged:: 3.1.6 + Special device names in multi-segment paths are not allowed on Windows. + + .. versionchanged:: 3.1.5 + More special device names, regardless of extension or trailing spaces, + are not allowed on Windows. + + .. versionchanged:: 3.1.4 + Special device names are not allowed on Windows. + """ + if not directory: + # Ensure we end up with ./path if directory="" is given, + # otherwise the first untrusted part could become trusted. + directory = "." + + parts = [directory] + + for part in untrusted: + if not part: + continue + + part = posixpath.normpath(part) + + if ( + os.path.isabs(part) + # ntpath.isabs doesn't catch this + or part.startswith("/") + or part == ".." + or part.startswith("../") + or any(sep in part for sep in _os_alt_seps) + or ( + os.name == "nt" + and any( + p.partition(".")[0].strip().upper() in _windows_device_files + for p in part.split("/") + ) + ) + ): + return None + + parts.append(part) + + return posixpath.join(*parts) diff --git a/venv/lib/python3.11/site-packages/werkzeug/serving.py b/venv/lib/python3.11/site-packages/werkzeug/serving.py new file mode 100755 index 0000000..37f3a2d --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/serving.py @@ -0,0 +1,1126 @@ +"""A WSGI and HTTP server for use **during development only**. This +server is convenient to use, but is not designed to be particularly +stable, secure, or efficient. Use a dedicate WSGI server and HTTP +server when deploying to production. + +It provides features like interactive debugging and code reloading. Use +``run_simple`` to start the server. Put this in a ``run.py`` script: + +.. code-block:: python + + from myapp import create_app + from werkzeug import run_simple +""" + +from __future__ import annotations + +import errno +import io +import os +import selectors +import socket +import socketserver +import sys +import typing as t +from datetime import datetime as dt +from datetime import timedelta +from datetime import timezone +from http.server import BaseHTTPRequestHandler +from http.server import HTTPServer +from urllib.parse import unquote +from urllib.parse import urlsplit + +from ._internal import _log +from ._internal import _wsgi_encoding_dance +from .exceptions import InternalServerError +from .http import parse_set_header +from .urls import uri_to_iri + +try: + import ssl + + connection_dropped_errors: tuple[type[Exception], ...] = ( + ConnectionError, + socket.timeout, + ssl.SSLEOFError, + ) +except ImportError: + + class _SslDummy: + def __getattr__(self, name: str) -> t.Any: + raise RuntimeError( # noqa: B904 + "SSL is unavailable because this Python runtime was not" + " compiled with SSL/TLS support." + ) + + ssl = _SslDummy() # type: ignore + connection_dropped_errors = (ConnectionError, socket.timeout) + +_log_add_style = True + +if os.name == "nt": + try: + __import__("colorama") + except ImportError: + _log_add_style = False + +can_fork = hasattr(os, "fork") + +if can_fork: + ForkingMixIn = socketserver.ForkingMixIn +else: + + class ForkingMixIn: # type: ignore + pass + + +try: + af_unix = socket.AF_UNIX +except AttributeError: + af_unix = None # type: ignore + +LISTEN_QUEUE = 128 + +_TSSLContextArg = t.Optional[ + t.Union["ssl.SSLContext", tuple[str, t.Optional[str]], t.Literal["adhoc"]] +] + +if t.TYPE_CHECKING: + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + from cryptography.hazmat.primitives.asymmetric.rsa import ( + RSAPrivateKeyWithSerialization, + ) + from cryptography.x509 import Certificate + + +class DechunkedInput(io.RawIOBase): + """An input stream that handles Transfer-Encoding 'chunked'""" + + def __init__(self, rfile: t.IO[bytes]) -> None: + self._rfile = rfile + self._done = False + self._len = 0 + + def readable(self) -> bool: + return True + + def read_chunk_len(self) -> int: + try: + line = self._rfile.readline().decode("latin1") + _len = int(line.strip(), 16) + except ValueError as e: + raise OSError("Invalid chunk header") from e + if _len < 0: + raise OSError("Negative chunk length not allowed") + return _len + + def readinto(self, buf: bytearray) -> int: # type: ignore + read = 0 + while not self._done and read < len(buf): + if self._len == 0: + # This is the first chunk or we fully consumed the previous + # one. Read the next length of the next chunk + self._len = self.read_chunk_len() + + if self._len == 0: + # Found the final chunk of size 0. The stream is now exhausted, + # but there is still a final newline that should be consumed + self._done = True + + if self._len > 0: + # There is data (left) in this chunk, so append it to the + # buffer. If this operation fully consumes the chunk, this will + # reset self._len to 0. + n = min(len(buf), self._len) + + # If (read + chunk size) becomes more than len(buf), buf will + # grow beyond the original size and read more data than + # required. So only read as much data as can fit in buf. + if read + n > len(buf): + buf[read:] = self._rfile.read(len(buf) - read) + self._len -= len(buf) - read + read = len(buf) + else: + buf[read : read + n] = self._rfile.read(n) + self._len -= n + read += n + + if self._len == 0: + # Skip the terminating newline of a chunk that has been fully + # consumed. This also applies to the 0-sized final chunk + terminator = self._rfile.readline() + if terminator not in (b"\n", b"\r\n", b"\r"): + raise OSError("Missing chunk terminating newline") + + return read + + +class WSGIRequestHandler(BaseHTTPRequestHandler): + """A request handler that implements WSGI dispatching.""" + + server: BaseWSGIServer + + @property + def server_version(self) -> str: # type: ignore + return self.server._server_version + + def make_environ(self) -> WSGIEnvironment: + request_url = urlsplit(self.path) + url_scheme = "http" if self.server.ssl_context is None else "https" + + if not self.client_address: + self.client_address = ("", 0) + elif isinstance(self.client_address, str): + self.client_address = (self.client_address, 0) + + # If there was no scheme but the path started with two slashes, + # the first segment may have been incorrectly parsed as the + # netloc, prepend it to the path again. + if not request_url.scheme and request_url.netloc: + path_info = f"/{request_url.netloc}{request_url.path}" + else: + path_info = request_url.path + + path_info = unquote(path_info) + + environ: WSGIEnvironment = { + "wsgi.version": (1, 0), + "wsgi.url_scheme": url_scheme, + "wsgi.input": self.rfile, + "wsgi.errors": sys.stderr, + "wsgi.multithread": self.server.multithread, + "wsgi.multiprocess": self.server.multiprocess, + "wsgi.run_once": False, + "werkzeug.socket": self.connection, + "SERVER_SOFTWARE": self.server_version, + "REQUEST_METHOD": self.command, + "SCRIPT_NAME": "", + "PATH_INFO": _wsgi_encoding_dance(path_info), + "QUERY_STRING": _wsgi_encoding_dance(request_url.query), + # Non-standard, added by mod_wsgi, uWSGI + "REQUEST_URI": _wsgi_encoding_dance(self.path), + # Non-standard, added by gunicorn + "RAW_URI": _wsgi_encoding_dance(self.path), + "REMOTE_ADDR": self.address_string(), + "REMOTE_PORT": self.port_integer(), + "SERVER_NAME": self.server.server_address[0], + "SERVER_PORT": str(self.server.server_address[1]), + "SERVER_PROTOCOL": self.request_version, + } + + for key, value in self.headers.items(): + if "_" in key: + continue + + key = key.upper().replace("-", "_") + value = value.replace("\r\n", "") + if key not in ("CONTENT_TYPE", "CONTENT_LENGTH"): + key = f"HTTP_{key}" + if key in environ: + value = f"{environ[key]},{value}" + environ[key] = value + + if "chunked" in parse_set_header(environ.get("HTTP_TRANSFER_ENCODING")): + environ["wsgi.input_terminated"] = True + environ["wsgi.input"] = DechunkedInput(environ["wsgi.input"]) + + # Per RFC 2616, if the URL is absolute, use that as the host. + # We're using "has a scheme" to indicate an absolute URL. + if request_url.scheme and request_url.netloc: + environ["HTTP_HOST"] = request_url.netloc + + try: + # binary_form=False gives nicer information, but wouldn't be compatible with + # what Nginx or Apache could return. + peer_cert = self.connection.getpeercert(binary_form=True) + if peer_cert is not None: + # Nginx and Apache use PEM format. + environ["SSL_CLIENT_CERT"] = ssl.DER_cert_to_PEM_cert(peer_cert) + except ValueError: + # SSL handshake hasn't finished. + self.server.log("error", "Cannot fetch SSL peer certificate info") + except AttributeError: + # Not using TLS, the socket will not have getpeercert(). + pass + + return environ + + def run_wsgi(self) -> None: + if self.headers.get("Expect", "").lower().strip() == "100-continue": + self.wfile.write(b"HTTP/1.1 100 Continue\r\n\r\n") + + self.environ = environ = self.make_environ() + status_set: str | None = None + headers_set: list[tuple[str, str]] | None = None + status_sent: str | None = None + headers_sent: list[tuple[str, str]] | None = None + chunk_response: bool = False + + def write(data: bytes) -> None: + nonlocal status_sent, headers_sent, chunk_response + assert status_set is not None, "write() before start_response" + assert headers_set is not None, "write() before start_response" + if status_sent is None: + status_sent = status_set + headers_sent = headers_set + try: + code_str, msg = status_sent.split(None, 1) + except ValueError: + code_str, msg = status_sent, "" + code = int(code_str) + self.send_response(code, msg) + header_keys = set() + for key, value in headers_sent: + self.send_header(key, value) + header_keys.add(key.lower()) + + # Use chunked transfer encoding if there is no content + # length. Do not use for 1xx and 204 responses. 304 + # responses and HEAD requests are also excluded, which + # is the more conservative behavior and matches other + # parts of the code. + # https://httpwg.org/specs/rfc7230.html#rfc.section.3.3.1 + if ( + not ( + "content-length" in header_keys + or environ["REQUEST_METHOD"] == "HEAD" + or (100 <= code < 200) + or code in {204, 304} + ) + and self.protocol_version >= "HTTP/1.1" + ): + chunk_response = True + self.send_header("Transfer-Encoding", "chunked") + + # Always close the connection. This disables HTTP/1.1 + # keep-alive connections. They aren't handled well by + # Python's http.server because it doesn't know how to + # drain the stream before the next request line. + self.send_header("Connection", "close") + self.end_headers() + + assert isinstance(data, bytes), "applications must write bytes" + + if data: + if chunk_response: + self.wfile.write(hex(len(data))[2:].encode()) + self.wfile.write(b"\r\n") + + self.wfile.write(data) + + if chunk_response: + self.wfile.write(b"\r\n") + + self.wfile.flush() + + def start_response(status, headers, exc_info=None): # type: ignore + nonlocal status_set, headers_set + if exc_info: + try: + if headers_sent: + raise exc_info[1].with_traceback(exc_info[2]) + finally: + exc_info = None + elif headers_set: + raise AssertionError("Headers already set") + status_set = status + headers_set = headers + return write + + def execute(app: WSGIApplication) -> None: + application_iter = app(environ, start_response) + try: + for data in application_iter: + write(data) + if not headers_sent: + write(b"") + if chunk_response: + self.wfile.write(b"0\r\n\r\n") + finally: + # Check for any remaining data in the read socket, and discard it. This + # will read past request.max_content_length, but lets the client see a + # 413 response instead of a connection reset failure. If we supported + # keep-alive connections, this naive approach would break by reading the + # next request line. Since we know that write (above) closes every + # connection we can read everything. + selector = selectors.DefaultSelector() + selector.register(self.connection, selectors.EVENT_READ) + total_size = 0 + total_reads = 0 + + # A timeout of 0 tends to fail because a client needs a small amount of + # time to continue sending its data. + while selector.select(timeout=0.01): + # Only read 10MB into memory at a time. + data = self.rfile.read(10_000_000) + total_size += len(data) + total_reads += 1 + + # Stop reading on no data, >=10GB, or 1000 reads. If a client sends + # more than that, they'll get a connection reset failure. + if not data or total_size >= 10_000_000_000 or total_reads > 1000: + break + + selector.close() + + if hasattr(application_iter, "close"): + application_iter.close() + + try: + execute(self.server.app) + except connection_dropped_errors as e: + self.connection_dropped(e, environ) + except Exception as e: + if self.server.passthrough_errors: + raise + + if status_sent is not None and chunk_response: + self.close_connection = True + + try: + # if we haven't yet sent the headers but they are set + # we roll back to be able to set them again. + if status_sent is None: + status_set = None + headers_set = None + execute(InternalServerError()) + except Exception: + pass + + from .debug.tbtools import DebugTraceback + + msg = DebugTraceback(e).render_traceback_text() + self.server.log("error", f"Error on request:\n{msg}") + + def handle(self) -> None: + """Handles a request ignoring dropped connections.""" + try: + super().handle() + except (ConnectionError, socket.timeout) as e: + self.connection_dropped(e) + except Exception as e: + if self.server.ssl_context is not None and is_ssl_error(e): + self.log_error("SSL error occurred: %s", e) + else: + raise + + def connection_dropped( + self, error: BaseException, environ: WSGIEnvironment | None = None + ) -> None: + """Called if the connection was closed by the client. By default + nothing happens. + """ + + def __getattr__(self, name: str) -> t.Any: + # All HTTP methods are handled by run_wsgi. + if name.startswith("do_"): + return self.run_wsgi + + # All other attributes are forwarded to the base class. + return getattr(super(), name) + + def address_string(self) -> str: + if getattr(self, "environ", None): + return self.environ["REMOTE_ADDR"] # type: ignore + + if not self.client_address: + return "" + + return self.client_address[0] + + def port_integer(self) -> int: + return self.client_address[1] + + # Escape control characters. This is defined (but private) in Python 3.12. + _control_char_table = str.maketrans( + {c: rf"\x{c:02x}" for c in [*range(0x20), *range(0x7F, 0xA0)]} + ) + _control_char_table[ord("\\")] = r"\\" + + def log_request(self, code: int | str = "-", size: int | str = "-") -> None: + try: + path = uri_to_iri(self.path) + msg = f"{self.command} {path} {self.request_version}" + except AttributeError: + # path isn't set if the requestline was bad + msg = self.requestline + + # Escape control characters that may be in the decoded path. + msg = msg.translate(self._control_char_table) + code = str(code) + + if code[0] == "1": # 1xx - Informational + msg = _ansi_style(msg, "bold") + elif code == "200": # 2xx - Success + pass + elif code == "304": # 304 - Resource Not Modified + msg = _ansi_style(msg, "cyan") + elif code[0] == "3": # 3xx - Redirection + msg = _ansi_style(msg, "green") + elif code == "404": # 404 - Resource Not Found + msg = _ansi_style(msg, "yellow") + elif code[0] == "4": # 4xx - Client Error + msg = _ansi_style(msg, "bold", "red") + else: # 5xx, or any other response + msg = _ansi_style(msg, "bold", "magenta") + + self.log("info", '"%s" %s %s', msg, code, size) + + def log_error(self, format: str, *args: t.Any) -> None: + self.log("error", format, *args) + + def log_message(self, format: str, *args: t.Any) -> None: + self.log("info", format, *args) + + def log(self, type: str, message: str, *args: t.Any) -> None: + # an IPv6 scoped address contains "%" which breaks logging + address_string = self.address_string().replace("%", "%%") + _log( + type, + f"{address_string} - - [{self.log_date_time_string()}] {message}\n", + *args, + ) + + +def _ansi_style(value: str, *styles: str) -> str: + if not _log_add_style: + return value + + codes = { + "bold": 1, + "red": 31, + "green": 32, + "yellow": 33, + "magenta": 35, + "cyan": 36, + } + + for style in styles: + value = f"\x1b[{codes[style]}m{value}" + + return f"{value}\x1b[0m" + + +def generate_adhoc_ssl_pair( + cn: str | None = None, +) -> tuple[Certificate, RSAPrivateKeyWithSerialization]: + try: + from cryptography import x509 + from cryptography.hazmat.backends import default_backend + from cryptography.hazmat.primitives import hashes + from cryptography.hazmat.primitives.asymmetric import rsa + from cryptography.x509.oid import NameOID + except ImportError: + raise TypeError( + "Using ad-hoc certificates requires the cryptography library." + ) from None + + backend = default_backend() + pkey = rsa.generate_private_key( + public_exponent=65537, key_size=2048, backend=backend + ) + + # pretty damn sure that this is not actually accepted by anyone + if cn is None: + cn = "*" + + subject = x509.Name( + [ + x509.NameAttribute(NameOID.ORGANIZATION_NAME, "Dummy Certificate"), + x509.NameAttribute(NameOID.COMMON_NAME, cn), + ] + ) + + backend = default_backend() + cert = ( + x509.CertificateBuilder() + .subject_name(subject) + .issuer_name(subject) + .public_key(pkey.public_key()) + .serial_number(x509.random_serial_number()) + .not_valid_before(dt.now(timezone.utc)) + .not_valid_after(dt.now(timezone.utc) + timedelta(days=365)) + .add_extension(x509.ExtendedKeyUsage([x509.OID_SERVER_AUTH]), critical=False) + .add_extension( + x509.SubjectAlternativeName([x509.DNSName(cn), x509.DNSName(f"*.{cn}")]), + critical=False, + ) + .sign(pkey, hashes.SHA256(), backend) + ) + return cert, pkey + + +def make_ssl_devcert( + base_path: str, host: str | None = None, cn: str | None = None +) -> tuple[str, str]: + """Creates an SSL key for development. This should be used instead of + the ``'adhoc'`` key which generates a new cert on each server start. + It accepts a path for where it should store the key and cert and + either a host or CN. If a host is given it will use the CN + ``*.host/CN=host``. + + For more information see :func:`run_simple`. + + .. versionadded:: 0.9 + + :param base_path: the path to the certificate and key. The extension + ``.crt`` is added for the certificate, ``.key`` is + added for the key. + :param host: the name of the host. This can be used as an alternative + for the `cn`. + :param cn: the `CN` to use. + """ + + if host is not None: + cn = host + cert, pkey = generate_adhoc_ssl_pair(cn=cn) + + from cryptography.hazmat.primitives import serialization + + cert_file = f"{base_path}.crt" + pkey_file = f"{base_path}.key" + + with open(cert_file, "wb") as f: + f.write(cert.public_bytes(serialization.Encoding.PEM)) + with open(pkey_file, "wb") as f: + f.write( + pkey.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.TraditionalOpenSSL, + encryption_algorithm=serialization.NoEncryption(), + ) + ) + + return cert_file, pkey_file + + +def generate_adhoc_ssl_context() -> ssl.SSLContext: + """Generates an adhoc SSL context for the development server.""" + import atexit + import tempfile + + cert, pkey = generate_adhoc_ssl_pair() + + from cryptography.hazmat.primitives import serialization + + cert_handle, cert_file = tempfile.mkstemp() + pkey_handle, pkey_file = tempfile.mkstemp() + atexit.register(os.remove, pkey_file) + atexit.register(os.remove, cert_file) + + os.write(cert_handle, cert.public_bytes(serialization.Encoding.PEM)) + os.write( + pkey_handle, + pkey.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.TraditionalOpenSSL, + encryption_algorithm=serialization.NoEncryption(), + ), + ) + + os.close(cert_handle) + os.close(pkey_handle) + ctx = load_ssl_context(cert_file, pkey_file) + return ctx + + +def load_ssl_context( + cert_file: str, pkey_file: str | None = None, protocol: int | None = None +) -> ssl.SSLContext: + """Loads SSL context from cert/private key files and optional protocol. + Many parameters are directly taken from the API of + :py:class:`ssl.SSLContext`. + + :param cert_file: Path of the certificate to use. + :param pkey_file: Path of the private key to use. If not given, the key + will be obtained from the certificate file. + :param protocol: A ``PROTOCOL`` constant from the :mod:`ssl` module. + Defaults to :data:`ssl.PROTOCOL_TLS_SERVER`. + """ + if protocol is None: + protocol = ssl.PROTOCOL_TLS_SERVER + + ctx = ssl.SSLContext(protocol) + ctx.load_cert_chain(cert_file, pkey_file) + return ctx + + +def is_ssl_error(error: Exception | None = None) -> bool: + """Checks if the given error (or the current one) is an SSL error.""" + if error is None: + error = t.cast(Exception, sys.exc_info()[1]) + return isinstance(error, ssl.SSLError) + + +def select_address_family(host: str, port: int) -> socket.AddressFamily: + """Return ``AF_INET4``, ``AF_INET6``, or ``AF_UNIX`` depending on + the host and port.""" + if host.startswith("unix://"): + return socket.AF_UNIX + elif ":" in host and hasattr(socket, "AF_INET6"): + return socket.AF_INET6 + return socket.AF_INET + + +def get_sockaddr( + host: str, port: int, family: socket.AddressFamily +) -> tuple[str, int] | str: + """Return a fully qualified socket address that can be passed to + :func:`socket.bind`.""" + if family == af_unix: + # Absolute path avoids IDNA encoding error when path starts with dot. + return os.path.abspath(host.partition("://")[2]) + try: + res = socket.getaddrinfo( + host, port, family, socket.SOCK_STREAM, socket.IPPROTO_TCP + ) + except socket.gaierror: + return host, port + return res[0][4] # type: ignore + + +def get_interface_ip(family: socket.AddressFamily) -> str: + """Get the IP address of an external interface. Used when binding to + 0.0.0.0 or ::1 to show a more useful URL. + + :meta private: + """ + # arbitrary private address + host = "fd31:f903:5ab5:1::1" if family == socket.AF_INET6 else "10.253.155.219" + + with socket.socket(family, socket.SOCK_DGRAM) as s: + try: + s.connect((host, 58162)) + except OSError: + return "::1" if family == socket.AF_INET6 else "127.0.0.1" + + return s.getsockname()[0] # type: ignore + + +class BaseWSGIServer(HTTPServer): + """A WSGI server that that handles one request at a time. + + Use :func:`make_server` to create a server instance. + """ + + multithread = False + multiprocess = False + request_queue_size = LISTEN_QUEUE + allow_reuse_address = True + + def __init__( + self, + host: str, + port: int, + app: WSGIApplication, + handler: type[WSGIRequestHandler] | None = None, + passthrough_errors: bool = False, + ssl_context: _TSSLContextArg | None = None, + fd: int | None = None, + ) -> None: + if handler is None: + handler = WSGIRequestHandler + + # If the handler doesn't directly set a protocol version and + # thread or process workers are used, then allow chunked + # responses and keep-alive connections by enabling HTTP/1.1. + if "protocol_version" not in vars(handler) and ( + self.multithread or self.multiprocess + ): + handler.protocol_version = "HTTP/1.1" + + self.host = host + self.port = port + self.app = app + self.passthrough_errors = passthrough_errors + + self.address_family = address_family = select_address_family(host, port) + server_address = get_sockaddr(host, int(port), address_family) + + # Remove a leftover Unix socket file from a previous run. Don't + # remove a file that was set up by run_simple. + if address_family == af_unix and fd is None: + server_address = t.cast(str, server_address) + + if os.path.exists(server_address): + os.unlink(server_address) + + # Bind and activate will be handled manually, it should only + # happen if we're not using a socket that was already set up. + super().__init__( + server_address, # type: ignore[arg-type] + handler, + bind_and_activate=False, + ) + + if fd is None: + # No existing socket descriptor, do bind_and_activate=True. + try: + self.server_bind() + self.server_activate() + except OSError as e: + # Catch connection issues and show them without the traceback. Show + # extra instructions for address not found, and for macOS. + self.server_close() + print(e.strerror, file=sys.stderr) + + if e.errno == errno.EADDRINUSE: + print( + f"Port {port} is in use by another program. Either identify and" + " stop that program, or start the server with a different" + " port.", + file=sys.stderr, + ) + + if sys.platform == "darwin" and port == 5000: + print( + "On macOS, try searching for and disabling" + " 'AirPlay Receiver' in System Settings.", + file=sys.stderr, + ) + + sys.exit(1) + except BaseException: + self.server_close() + raise + else: + # TCPServer automatically opens a socket even if bind_and_activate is False. + # Close it to silence a ResourceWarning. + self.server_close() + + # Use the passed in socket directly. + self.socket = socket.fromfd(fd, address_family, socket.SOCK_STREAM) + self.server_address = self.socket.getsockname() + + if address_family != af_unix: + # If port was 0, this will record the bound port. + self.port = self.server_address[1] + + if ssl_context is not None: + if isinstance(ssl_context, tuple): + ssl_context = load_ssl_context(*ssl_context) + elif ssl_context == "adhoc": + ssl_context = generate_adhoc_ssl_context() + + self.socket = ssl_context.wrap_socket(self.socket, server_side=True) + self.ssl_context: ssl.SSLContext | None = ssl_context + else: + self.ssl_context = None + + import importlib.metadata + + self._server_version = f"Werkzeug/{importlib.metadata.version('werkzeug')}" + + def log(self, type: str, message: str, *args: t.Any) -> None: + _log(type, message, *args) + + def serve_forever(self, poll_interval: float = 0.5) -> None: + try: + super().serve_forever(poll_interval=poll_interval) + except KeyboardInterrupt: + pass + finally: + self.server_close() + + def handle_error( + self, request: t.Any, client_address: tuple[str, int] | str + ) -> None: + if self.passthrough_errors: + raise + + return super().handle_error(request, client_address) + + def log_startup(self) -> None: + """Show information about the address when starting the server.""" + dev_warning = ( + "WARNING: This is a development server. Do not use it in a production" + " deployment. Use a production WSGI server instead." + ) + dev_warning = _ansi_style(dev_warning, "bold", "red") + messages = [dev_warning] + + if self.address_family == af_unix: + messages.append(f" * Running on {self.host}") + else: + scheme = "http" if self.ssl_context is None else "https" + display_hostname = self.host + + if self.host in {"0.0.0.0", "::"}: + messages.append(f" * Running on all addresses ({self.host})") + + if self.host == "0.0.0.0": + localhost = "127.0.0.1" + display_hostname = get_interface_ip(socket.AF_INET) + else: + localhost = "[::1]" + display_hostname = get_interface_ip(socket.AF_INET6) + + messages.append(f" * Running on {scheme}://{localhost}:{self.port}") + + if ":" in display_hostname: + display_hostname = f"[{display_hostname}]" + + messages.append(f" * Running on {scheme}://{display_hostname}:{self.port}") + + _log("info", "\n".join(messages)) + + +class ThreadedWSGIServer(socketserver.ThreadingMixIn, BaseWSGIServer): + """A WSGI server that handles concurrent requests in separate + threads. + + Use :func:`make_server` to create a server instance. + """ + + multithread = True + daemon_threads = True + + +class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer): + """A WSGI server that handles concurrent requests in separate forked + processes. + + Use :func:`make_server` to create a server instance. + """ + + multiprocess = True + + def __init__( + self, + host: str, + port: int, + app: WSGIApplication, + processes: int = 40, + handler: type[WSGIRequestHandler] | None = None, + passthrough_errors: bool = False, + ssl_context: _TSSLContextArg | None = None, + fd: int | None = None, + ) -> None: + if not can_fork: + raise ValueError("Your platform does not support forking.") + + super().__init__(host, port, app, handler, passthrough_errors, ssl_context, fd) + self.max_children = processes + + +def make_server( + host: str, + port: int, + app: WSGIApplication, + threaded: bool = False, + processes: int = 1, + request_handler: type[WSGIRequestHandler] | None = None, + passthrough_errors: bool = False, + ssl_context: _TSSLContextArg | None = None, + fd: int | None = None, +) -> BaseWSGIServer: + """Create an appropriate WSGI server instance based on the value of + ``threaded`` and ``processes``. + + This is called from :func:`run_simple`, but can be used separately + to have access to the server object, such as to run it in a separate + thread. + + See :func:`run_simple` for parameter docs. + """ + if threaded and processes > 1: + raise ValueError("Cannot have a multi-thread and multi-process server.") + + if threaded: + return ThreadedWSGIServer( + host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd + ) + + if processes > 1: + return ForkingWSGIServer( + host, + port, + app, + processes, + request_handler, + passthrough_errors, + ssl_context, + fd=fd, + ) + + return BaseWSGIServer( + host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd + ) + + +def is_running_from_reloader() -> bool: + """Check if the server is running as a subprocess within the + Werkzeug reloader. + + .. versionadded:: 0.10 + """ + return os.environ.get("WERKZEUG_RUN_MAIN") == "true" + + +def run_simple( + hostname: str, + port: int, + application: WSGIApplication, + use_reloader: bool = False, + use_debugger: bool = False, + use_evalex: bool = True, + extra_files: t.Iterable[str] | None = None, + exclude_patterns: t.Iterable[str] | None = None, + reloader_interval: int = 1, + reloader_type: str = "auto", + threaded: bool = False, + processes: int = 1, + request_handler: type[WSGIRequestHandler] | None = None, + static_files: dict[str, str | tuple[str, str]] | None = None, + passthrough_errors: bool = False, + ssl_context: _TSSLContextArg | None = None, +) -> None: + """Start a development server for a WSGI application. Various + optional features can be enabled. + + .. warning:: + + Do not use the development server when deploying to production. + It is intended for use only during local development. It is not + designed to be particularly efficient, stable, or secure. + + :param hostname: The host to bind to, for example ``'localhost'``. + Can be a domain, IPv4 or IPv6 address, or file path starting + with ``unix://`` for a Unix socket. + :param port: The port to bind to, for example ``8080``. Using ``0`` + tells the OS to pick a random free port. + :param application: The WSGI application to run. + :param use_reloader: Use a reloader process to restart the server + process when files are changed. + :param use_debugger: Use Werkzeug's debugger, which will show + formatted tracebacks on unhandled exceptions. + :param use_evalex: Make the debugger interactive. A Python terminal + can be opened for any frame in the traceback. Some protection is + provided by requiring a PIN, but this should never be enabled + on a publicly visible server. + :param extra_files: The reloader will watch these files for changes + in addition to Python modules. For example, watch a + configuration file. + :param exclude_patterns: The reloader will ignore changes to any + files matching these :mod:`fnmatch` patterns. For example, + ignore cache files. + :param reloader_interval: How often the reloader tries to check for + changes. + :param reloader_type: The reloader to use. The ``'stat'`` reloader + is built in, but may require significant CPU to watch files. The + ``'watchdog'`` reloader is much more efficient but requires + installing the ``watchdog`` package first. + :param threaded: Handle concurrent requests using threads. Cannot be + used with ``processes``. + :param processes: Handle concurrent requests using up to this number + of processes. Cannot be used with ``threaded``. + :param request_handler: Use a different + :class:`~BaseHTTPServer.BaseHTTPRequestHandler` subclass to + handle requests. + :param static_files: A dict mapping URL prefixes to directories to + serve static files from using + :class:`~werkzeug.middleware.SharedDataMiddleware`. + :param passthrough_errors: Don't catch unhandled exceptions at the + server level, let the server crash instead. If ``use_debugger`` + is enabled, the debugger will still catch such errors. + :param ssl_context: Configure TLS to serve over HTTPS. Can be an + :class:`ssl.SSLContext` object, a ``(cert_file, key_file)`` + tuple to create a typical context, or the string ``'adhoc'`` to + generate a temporary self-signed certificate. + + .. versionchanged:: 2.1 + Instructions are shown for dealing with an "address already in + use" error. + + .. versionchanged:: 2.1 + Running on ``0.0.0.0`` or ``::`` shows the loopback IP in + addition to a real IP. + + .. versionchanged:: 2.1 + The command-line interface was removed. + + .. versionchanged:: 2.0 + Running on ``0.0.0.0`` or ``::`` shows a real IP address that + was bound as well as a warning not to run the development server + in production. + + .. versionchanged:: 2.0 + The ``exclude_patterns`` parameter was added. + + .. versionchanged:: 0.15 + Bind to a Unix socket by passing a ``hostname`` that starts with + ``unix://``. + + .. versionchanged:: 0.10 + Improved the reloader and added support for changing the backend + through the ``reloader_type`` parameter. + + .. versionchanged:: 0.9 + A command-line interface was added. + + .. versionchanged:: 0.8 + ``ssl_context`` can be a tuple of paths to the certificate and + private key files. + + .. versionchanged:: 0.6 + The ``ssl_context`` parameter was added. + + .. versionchanged:: 0.5 + The ``static_files`` and ``passthrough_errors`` parameters were + added. + """ + if not isinstance(port, int): + raise TypeError("port must be an integer") + + if static_files: + from .middleware.shared_data import SharedDataMiddleware + + application = SharedDataMiddleware(application, static_files) + + if use_debugger: + from .debug import DebuggedApplication + + application = DebuggedApplication(application, evalex=use_evalex) + # Allow the specified hostname to use the debugger, in addition to + # localhost domains. + application.trusted_hosts.append(hostname) + + if not is_running_from_reloader(): + fd = None + else: + fd = int(os.environ["WERKZEUG_SERVER_FD"]) + + srv = make_server( + hostname, + port, + application, + threaded, + processes, + request_handler, + passthrough_errors, + ssl_context, + fd=fd, + ) + srv.socket.set_inheritable(True) + os.environ["WERKZEUG_SERVER_FD"] = str(srv.fileno()) + + if not is_running_from_reloader(): + srv.log_startup() + _log("info", _ansi_style("Press CTRL+C to quit", "yellow")) + + if use_reloader: + from ._reloader import run_with_reloader + + try: + run_with_reloader( + srv.serve_forever, + extra_files=extra_files, + exclude_patterns=exclude_patterns, + interval=reloader_interval, + reloader_type=reloader_type, + ) + finally: + srv.server_close() + else: + srv.serve_forever() diff --git a/venv/lib/python3.11/site-packages/werkzeug/test.py b/venv/lib/python3.11/site-packages/werkzeug/test.py new file mode 100755 index 0000000..58b4ce7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/test.py @@ -0,0 +1,1464 @@ +from __future__ import annotations + +import dataclasses +import mimetypes +import sys +import typing as t +from collections import defaultdict +from datetime import datetime +from io import BytesIO +from itertools import chain +from random import random +from tempfile import TemporaryFile +from time import time +from urllib.parse import unquote +from urllib.parse import urlsplit +from urllib.parse import urlunsplit + +from ._internal import _get_environ +from ._internal import _wsgi_decoding_dance +from ._internal import _wsgi_encoding_dance +from .datastructures import Authorization +from .datastructures import CallbackDict +from .datastructures import CombinedMultiDict +from .datastructures import EnvironHeaders +from .datastructures import FileMultiDict +from .datastructures import Headers +from .datastructures import MultiDict +from .http import dump_cookie +from .http import dump_options_header +from .http import parse_cookie +from .http import parse_date +from .http import parse_options_header +from .sansio.multipart import Data +from .sansio.multipart import Epilogue +from .sansio.multipart import Field +from .sansio.multipart import File +from .sansio.multipart import MultipartEncoder +from .sansio.multipart import Preamble +from .urls import _urlencode +from .urls import iri_to_uri +from .utils import cached_property +from .utils import get_content_type +from .wrappers.request import Request +from .wrappers.response import Response +from .wsgi import ClosingIterator +from .wsgi import get_current_url + +if t.TYPE_CHECKING: + import typing_extensions as te + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +def stream_encode_multipart( + data: t.Mapping[str, t.Any], + use_tempfile: bool = True, + threshold: int = 1024 * 500, + boundary: str | None = None, +) -> tuple[t.IO[bytes], int, str]: + """Encode a dict of values (either strings or file descriptors or + :class:`FileStorage` objects.) into a multipart encoded string stored + in a file descriptor. + + .. versionchanged:: 3.0 + The ``charset`` parameter was removed. + """ + if boundary is None: + boundary = f"---------------WerkzeugFormPart_{time()}{random()}" + + stream: t.IO[bytes] = BytesIO() + total_length = 0 + on_disk = False + write_binary: t.Callable[[bytes], int] + + if use_tempfile: + + def write_binary(s: bytes) -> int: + nonlocal stream, total_length, on_disk + + if on_disk: + return stream.write(s) + else: + length = len(s) + + if length + total_length <= threshold: + stream.write(s) + else: + new_stream = t.cast(t.IO[bytes], TemporaryFile("wb+")) + new_stream.write(stream.getvalue()) # type: ignore + new_stream.write(s) + stream = new_stream + on_disk = True + + total_length += length + return length + + else: + write_binary = stream.write + + encoder = MultipartEncoder(boundary.encode()) + write_binary(encoder.send_event(Preamble(data=b""))) + for key, value in _iter_data(data): + reader = getattr(value, "read", None) + if reader is not None: + filename = getattr(value, "filename", getattr(value, "name", None)) + content_type = getattr(value, "content_type", None) + if content_type is None: + content_type = ( + filename + and mimetypes.guess_type(filename)[0] + or "application/octet-stream" + ) + headers = value.headers + headers.update([("Content-Type", content_type)]) + if filename is None: + write_binary(encoder.send_event(Field(name=key, headers=headers))) + else: + write_binary( + encoder.send_event( + File(name=key, filename=filename, headers=headers) + ) + ) + while True: + chunk = reader(16384) + + if not chunk: + write_binary(encoder.send_event(Data(data=chunk, more_data=False))) + break + + write_binary(encoder.send_event(Data(data=chunk, more_data=True))) + else: + if not isinstance(value, str): + value = str(value) + write_binary(encoder.send_event(Field(name=key, headers=Headers()))) + write_binary(encoder.send_event(Data(data=value.encode(), more_data=False))) + + write_binary(encoder.send_event(Epilogue(data=b""))) + + length = stream.tell() + stream.seek(0) + return stream, length, boundary + + +def encode_multipart( + values: t.Mapping[str, t.Any], boundary: str | None = None +) -> tuple[str, bytes]: + """Like `stream_encode_multipart` but returns a tuple in the form + (``boundary``, ``data``) where data is bytes. + + .. versionchanged:: 3.0 + The ``charset`` parameter was removed. + """ + stream, length, boundary = stream_encode_multipart( + values, use_tempfile=False, boundary=boundary + ) + return boundary, stream.read() + + +def _iter_data(data: t.Mapping[str, t.Any]) -> t.Iterator[tuple[str, t.Any]]: + """Iterate over a mapping that might have a list of values, yielding + all key, value pairs. Almost like iter_multi_items but only allows + lists, not tuples, of values so tuples can be used for files. + """ + if isinstance(data, MultiDict): + yield from data.items(multi=True) + else: + for key, value in data.items(): + if isinstance(value, list): + for v in value: + yield key, v + else: + yield key, value + + +_TAnyMultiDict = t.TypeVar("_TAnyMultiDict", bound="MultiDict[t.Any, t.Any]") + + +class EnvironBuilder: + """This class can be used to conveniently create a WSGI environment + for testing purposes. It can be used to quickly create WSGI environments + or request objects from arbitrary data. + + The signature of this class is also used in some other places as of + Werkzeug 0.5 (:func:`create_environ`, :meth:`Response.from_values`, + :meth:`Client.open`). Because of this most of the functionality is + available through the constructor alone. + + Files and regular form data can be manipulated independently of each + other with the :attr:`form` and :attr:`files` attributes, but are + passed with the same argument to the constructor: `data`. + + `data` can be any of these values: + + - a `str` or `bytes` object: The object is converted into an + :attr:`input_stream`, the :attr:`content_length` is set and you have to + provide a :attr:`content_type`. + - a `dict` or :class:`MultiDict`: The keys have to be strings. The values + have to be either any of the following objects, or a list of any of the + following objects: + + - a :class:`file`-like object: These are converted into + :class:`FileStorage` objects automatically. + - a `tuple`: The :meth:`~FileMultiDict.add_file` method is called + with the key and the unpacked `tuple` items as positional + arguments. + - a `str`: The string is set as form data for the associated key. + - a file-like object: The object content is loaded in memory and then + handled like a regular `str` or a `bytes`. + + :param path: the path of the request. In the WSGI environment this will + end up as `PATH_INFO`. If the `query_string` is not defined + and there is a question mark in the `path` everything after + it is used as query string. + :param base_url: the base URL is a URL that is used to extract the WSGI + URL scheme, host (server name + server port) and the + script root (`SCRIPT_NAME`). + :param query_string: an optional string or dict with URL parameters. + :param method: the HTTP method to use, defaults to `GET`. + :param input_stream: an optional input stream. Do not specify this and + `data`. As soon as an input stream is set you can't + modify :attr:`args` and :attr:`files` unless you + set the :attr:`input_stream` to `None` again. + :param content_type: The content type for the request. As of 0.5 you + don't have to provide this when specifying files + and form data via `data`. + :param content_length: The content length for the request. You don't + have to specify this when providing data via + `data`. + :param errors_stream: an optional error stream that is used for + `wsgi.errors`. Defaults to :data:`stderr`. + :param multithread: controls `wsgi.multithread`. Defaults to `False`. + :param multiprocess: controls `wsgi.multiprocess`. Defaults to `False`. + :param run_once: controls `wsgi.run_once`. Defaults to `False`. + :param headers: an optional list or :class:`Headers` object of headers. + :param data: a string or dict of form data or a file-object. + See explanation above. + :param json: An object to be serialized and assigned to ``data``. + Defaults the content type to ``"application/json"``. + Serialized with the function assigned to :attr:`json_dumps`. + :param environ_base: an optional dict of environment defaults. + :param environ_overrides: an optional dict of environment overrides. + :param auth: An authorization object to use for the + ``Authorization`` header value. A ``(username, password)`` tuple + is a shortcut for ``Basic`` authorization. + + .. versionchanged:: 3.0 + The ``charset`` parameter was removed. + + .. versionchanged:: 2.1 + ``CONTENT_TYPE`` and ``CONTENT_LENGTH`` are not duplicated as + header keys in the environ. + + .. versionchanged:: 2.0 + ``REQUEST_URI`` and ``RAW_URI`` is the full raw URI including + the query string, not only the path. + + .. versionchanged:: 2.0 + The default :attr:`request_class` is ``Request`` instead of + ``BaseRequest``. + + .. versionadded:: 2.0 + Added the ``auth`` parameter. + + .. versionadded:: 0.15 + The ``json`` param and :meth:`json_dumps` method. + + .. versionadded:: 0.15 + The environ has keys ``REQUEST_URI`` and ``RAW_URI`` containing + the path before percent-decoding. This is not part of the WSGI + PEP, but many WSGI servers include it. + + .. versionchanged:: 0.6 + ``path`` and ``base_url`` can now be unicode strings that are + encoded with :func:`iri_to_uri`. + """ + + #: the server protocol to use. defaults to HTTP/1.1 + server_protocol = "HTTP/1.1" + + #: the wsgi version to use. defaults to (1, 0) + wsgi_version = (1, 0) + + #: The default request class used by :meth:`get_request`. + request_class = Request + + import json + + #: The serialization function used when ``json`` is passed. + json_dumps = staticmethod(json.dumps) + del json + + _args: MultiDict[str, str] | None + _query_string: str | None + _input_stream: t.IO[bytes] | None + _form: MultiDict[str, str] | None + _files: FileMultiDict | None + + def __init__( + self, + path: str = "/", + base_url: str | None = None, + query_string: t.Mapping[str, str] | str | None = None, + method: str = "GET", + input_stream: t.IO[bytes] | None = None, + content_type: str | None = None, + content_length: int | None = None, + errors_stream: t.IO[str] | None = None, + multithread: bool = False, + multiprocess: bool = False, + run_once: bool = False, + headers: Headers | t.Iterable[tuple[str, str]] | None = None, + data: None | (t.IO[bytes] | str | bytes | t.Mapping[str, t.Any]) = None, + environ_base: t.Mapping[str, t.Any] | None = None, + environ_overrides: t.Mapping[str, t.Any] | None = None, + mimetype: str | None = None, + json: t.Mapping[str, t.Any] | None = None, + auth: Authorization | tuple[str, str] | None = None, + ) -> None: + if query_string is not None and "?" in path: + raise ValueError("Query string is defined in the path and as an argument") + request_uri = urlsplit(path) + if query_string is None and "?" in path: + query_string = request_uri.query + + self.path = iri_to_uri(request_uri.path) + self.request_uri = path + if base_url is not None: + base_url = iri_to_uri(base_url) + self.base_url = base_url + if isinstance(query_string, str): + self.query_string = query_string + else: + if query_string is None: + query_string = MultiDict() + elif not isinstance(query_string, MultiDict): + query_string = MultiDict(query_string) + self.args = query_string + self.method = method + if headers is None: + headers = Headers() + elif not isinstance(headers, Headers): + headers = Headers(headers) + self.headers = headers + if content_type is not None: + self.content_type = content_type + if errors_stream is None: + errors_stream = sys.stderr + self.errors_stream = errors_stream + self.multithread = multithread + self.multiprocess = multiprocess + self.run_once = run_once + self.environ_base = environ_base + self.environ_overrides = environ_overrides + self.input_stream = input_stream + self.content_length = content_length + self.closed = False + + if auth is not None: + if isinstance(auth, tuple): + auth = Authorization( + "basic", {"username": auth[0], "password": auth[1]} + ) + + self.headers.set("Authorization", auth.to_header()) + + if json is not None: + if data is not None: + raise TypeError("can't provide both json and data") + + data = self.json_dumps(json) + + if self.content_type is None: + self.content_type = "application/json" + + if data: + if input_stream is not None: + raise TypeError("can't provide input stream and data") + if hasattr(data, "read"): + data = data.read() + if isinstance(data, str): + data = data.encode() + if isinstance(data, bytes): + self.input_stream = BytesIO(data) + if self.content_length is None: + self.content_length = len(data) + else: + for key, value in _iter_data(data): + if isinstance(value, (tuple, dict)) or hasattr(value, "read"): + self._add_file_from_data(key, value) + else: + self.form.setlistdefault(key).append(value) + + if mimetype is not None: + self.mimetype = mimetype + + @classmethod + def from_environ(cls, environ: WSGIEnvironment, **kwargs: t.Any) -> EnvironBuilder: + """Turn an environ dict back into a builder. Any extra kwargs + override the args extracted from the environ. + + .. versionchanged:: 2.0 + Path and query values are passed through the WSGI decoding + dance to avoid double encoding. + + .. versionadded:: 0.15 + """ + headers = Headers(EnvironHeaders(environ)) + out = { + "path": _wsgi_decoding_dance(environ["PATH_INFO"]), + "base_url": cls._make_base_url( + environ["wsgi.url_scheme"], + headers.pop("Host"), + _wsgi_decoding_dance(environ["SCRIPT_NAME"]), + ), + "query_string": _wsgi_decoding_dance(environ["QUERY_STRING"]), + "method": environ["REQUEST_METHOD"], + "input_stream": environ["wsgi.input"], + "content_type": headers.pop("Content-Type", None), + "content_length": headers.pop("Content-Length", None), + "errors_stream": environ["wsgi.errors"], + "multithread": environ["wsgi.multithread"], + "multiprocess": environ["wsgi.multiprocess"], + "run_once": environ["wsgi.run_once"], + "headers": headers, + } + out.update(kwargs) + return cls(**out) + + def _add_file_from_data( + self, + key: str, + value: (t.IO[bytes] | tuple[t.IO[bytes], str] | tuple[t.IO[bytes], str, str]), + ) -> None: + """Called in the EnvironBuilder to add files from the data dict.""" + if isinstance(value, tuple): + self.files.add_file(key, *value) + else: + self.files.add_file(key, value) + + @staticmethod + def _make_base_url(scheme: str, host: str, script_root: str) -> str: + return urlunsplit((scheme, host, script_root, "", "")).rstrip("/") + "/" + + @property + def base_url(self) -> str: + """The base URL is used to extract the URL scheme, host name, + port, and root path. + """ + return self._make_base_url(self.url_scheme, self.host, self.script_root) + + @base_url.setter + def base_url(self, value: str | None) -> None: + if value is None: + scheme = "http" + netloc = "localhost" + script_root = "" + else: + scheme, netloc, script_root, qs, anchor = urlsplit(value) + if qs or anchor: + raise ValueError("base url must not contain a query string or fragment") + self.script_root = script_root.rstrip("/") + self.host = netloc + self.url_scheme = scheme + + @property + def content_type(self) -> str | None: + """The content type for the request. Reflected from and to + the :attr:`headers`. Do not set if you set :attr:`files` or + :attr:`form` for auto detection. + """ + ct = self.headers.get("Content-Type") + if ct is None and not self._input_stream: + if self._files: + return "multipart/form-data" + if self._form: + return "application/x-www-form-urlencoded" + return None + return ct + + @content_type.setter + def content_type(self, value: str | None) -> None: + if value is None: + self.headers.pop("Content-Type", None) + else: + self.headers["Content-Type"] = value + + @property + def mimetype(self) -> str | None: + """The mimetype (content type without charset etc.) + + .. versionadded:: 0.14 + """ + ct = self.content_type + return ct.split(";")[0].strip() if ct else None + + @mimetype.setter + def mimetype(self, value: str) -> None: + self.content_type = get_content_type(value, "utf-8") + + @property + def mimetype_params(self) -> t.Mapping[str, str]: + """The mimetype parameters as dict. For example if the + content type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + + .. versionadded:: 0.14 + """ + + def on_update(d: CallbackDict[str, str]) -> None: + self.headers["Content-Type"] = dump_options_header(self.mimetype, d) + + d = parse_options_header(self.headers.get("content-type", ""))[1] + return CallbackDict(d, on_update) + + @property + def content_length(self) -> int | None: + """The content length as integer. Reflected from and to the + :attr:`headers`. Do not set if you set :attr:`files` or + :attr:`form` for auto detection. + """ + return self.headers.get("Content-Length", type=int) + + @content_length.setter + def content_length(self, value: int | None) -> None: + if value is None: + self.headers.pop("Content-Length", None) + else: + self.headers["Content-Length"] = str(value) + + def _get_form(self, name: str, storage: type[_TAnyMultiDict]) -> _TAnyMultiDict: + """Common behavior for getting the :attr:`form` and + :attr:`files` properties. + + :param name: Name of the internal cached attribute. + :param storage: Storage class used for the data. + """ + if self.input_stream is not None: + raise AttributeError("an input stream is defined") + + rv = getattr(self, name) + + if rv is None: + rv = storage() + setattr(self, name, rv) + + return rv # type: ignore + + def _set_form(self, name: str, value: MultiDict[str, t.Any]) -> None: + """Common behavior for setting the :attr:`form` and + :attr:`files` properties. + + :param name: Name of the internal cached attribute. + :param value: Value to assign to the attribute. + """ + self._input_stream = None + setattr(self, name, value) + + @property + def form(self) -> MultiDict[str, str]: + """A :class:`MultiDict` of form values.""" + return self._get_form("_form", MultiDict) + + @form.setter + def form(self, value: MultiDict[str, str]) -> None: + self._set_form("_form", value) + + @property + def files(self) -> FileMultiDict: + """A :class:`FileMultiDict` of uploaded files. Use + :meth:`~FileMultiDict.add_file` to add new files. + """ + return self._get_form("_files", FileMultiDict) + + @files.setter + def files(self, value: FileMultiDict) -> None: + self._set_form("_files", value) + + @property + def input_stream(self) -> t.IO[bytes] | None: + """An optional input stream. This is mutually exclusive with + setting :attr:`form` and :attr:`files`, setting it will clear + those. Do not provide this if the method is not ``POST`` or + another method that has a body. + """ + return self._input_stream + + @input_stream.setter + def input_stream(self, value: t.IO[bytes] | None) -> None: + self._input_stream = value + self._form = None + self._files = None + + @property + def query_string(self) -> str: + """The query string. If you set this to a string + :attr:`args` will no longer be available. + """ + if self._query_string is None: + if self._args is not None: + return _urlencode(self._args) + return "" + return self._query_string + + @query_string.setter + def query_string(self, value: str | None) -> None: + self._query_string = value + self._args = None + + @property + def args(self) -> MultiDict[str, str]: + """The URL arguments as :class:`MultiDict`.""" + if self._query_string is not None: + raise AttributeError("a query string is defined") + if self._args is None: + self._args = MultiDict() + return self._args + + @args.setter + def args(self, value: MultiDict[str, str] | None) -> None: + self._query_string = None + self._args = value + + @property + def server_name(self) -> str: + """The server name (read-only, use :attr:`host` to set)""" + return self.host.split(":", 1)[0] + + @property + def server_port(self) -> int: + """The server port as integer (read-only, use :attr:`host` to set)""" + pieces = self.host.split(":", 1) + + if len(pieces) == 2: + try: + return int(pieces[1]) + except ValueError: + pass + + if self.url_scheme == "https": + return 443 + return 80 + + def __del__(self) -> None: + try: + self.close() + except Exception: + pass + + def close(self) -> None: + """Closes all files. If you put real :class:`file` objects into the + :attr:`files` dict you can call this method to automatically close + them all in one go. + """ + if self.closed: + return + try: + files = self.files.values() + except AttributeError: + files = () + for f in files: + try: + f.close() + except Exception: + pass + self.closed = True + + def get_environ(self) -> WSGIEnvironment: + """Return the built environ. + + .. versionchanged:: 0.15 + The content type and length headers are set based on + input stream detection. Previously this only set the WSGI + keys. + """ + input_stream = self.input_stream + content_length = self.content_length + + mimetype = self.mimetype + content_type = self.content_type + + if input_stream is not None: + start_pos = input_stream.tell() + input_stream.seek(0, 2) + end_pos = input_stream.tell() + input_stream.seek(start_pos) + content_length = end_pos - start_pos + elif mimetype == "multipart/form-data": + input_stream, content_length, boundary = stream_encode_multipart( + CombinedMultiDict([self.form, self.files]) + ) + content_type = f'{mimetype}; boundary="{boundary}"' + elif mimetype == "application/x-www-form-urlencoded": + form_encoded = _urlencode(self.form).encode("ascii") + content_length = len(form_encoded) + input_stream = BytesIO(form_encoded) + else: + input_stream = BytesIO() + + result: WSGIEnvironment = {} + if self.environ_base: + result.update(self.environ_base) + + def _path_encode(x: str) -> str: + return _wsgi_encoding_dance(unquote(x)) + + raw_uri = _wsgi_encoding_dance(self.request_uri) + result.update( + { + "REQUEST_METHOD": self.method, + "SCRIPT_NAME": _path_encode(self.script_root), + "PATH_INFO": _path_encode(self.path), + "QUERY_STRING": _wsgi_encoding_dance(self.query_string), + # Non-standard, added by mod_wsgi, uWSGI + "REQUEST_URI": raw_uri, + # Non-standard, added by gunicorn + "RAW_URI": raw_uri, + "SERVER_NAME": self.server_name, + "SERVER_PORT": str(self.server_port), + "HTTP_HOST": self.host, + "SERVER_PROTOCOL": self.server_protocol, + "wsgi.version": self.wsgi_version, + "wsgi.url_scheme": self.url_scheme, + "wsgi.input": input_stream, + "wsgi.errors": self.errors_stream, + "wsgi.multithread": self.multithread, + "wsgi.multiprocess": self.multiprocess, + "wsgi.run_once": self.run_once, + } + ) + + headers = self.headers.copy() + # Don't send these as headers, they're part of the environ. + headers.remove("Content-Type") + headers.remove("Content-Length") + + if content_type is not None: + result["CONTENT_TYPE"] = content_type + + if content_length is not None: + result["CONTENT_LENGTH"] = str(content_length) + + combined_headers = defaultdict(list) + + for key, value in headers.to_wsgi_list(): + combined_headers[f"HTTP_{key.upper().replace('-', '_')}"].append(value) + + for key, values in combined_headers.items(): + result[key] = ", ".join(values) + + if self.environ_overrides: + result.update(self.environ_overrides) + + return result + + def get_request(self, cls: type[Request] | None = None) -> Request: + """Returns a request with the data. If the request class is not + specified :attr:`request_class` is used. + + :param cls: The request wrapper to use. + """ + if cls is None: + cls = self.request_class + + return cls(self.get_environ()) + + +class ClientRedirectError(Exception): + """If a redirect loop is detected when using follow_redirects=True with + the :cls:`Client`, then this exception is raised. + """ + + +class Client: + """Simulate sending requests to a WSGI application without running a WSGI or HTTP + server. + + :param application: The WSGI application to make requests to. + :param response_wrapper: A :class:`.Response` class to wrap response data with. + Defaults to :class:`.TestResponse`. If it's not a subclass of ``TestResponse``, + one will be created. + :param use_cookies: Persist cookies from ``Set-Cookie`` response headers to the + ``Cookie`` header in subsequent requests. Domain and path matching is supported, + but other cookie parameters are ignored. + :param allow_subdomain_redirects: Allow requests to follow redirects to subdomains. + Enable this if the application handles subdomains and redirects between them. + + .. versionchanged:: 2.3 + Simplify cookie implementation, support domain and path matching. + + .. versionchanged:: 2.1 + All data is available as properties on the returned response object. The + response cannot be returned as a tuple. + + .. versionchanged:: 2.0 + ``response_wrapper`` is always a subclass of :class:``TestResponse``. + + .. versionchanged:: 0.5 + Added the ``use_cookies`` parameter. + """ + + def __init__( + self, + application: WSGIApplication, + response_wrapper: type[Response] | None = None, + use_cookies: bool = True, + allow_subdomain_redirects: bool = False, + ) -> None: + self.application = application + + if response_wrapper in {None, Response}: + response_wrapper = TestResponse + elif response_wrapper is not None and not issubclass( + response_wrapper, TestResponse + ): + response_wrapper = type( + "WrapperTestResponse", + (TestResponse, response_wrapper), + {}, + ) + + self.response_wrapper = t.cast(type["TestResponse"], response_wrapper) + + if use_cookies: + self._cookies: dict[tuple[str, str, str], Cookie] | None = {} + else: + self._cookies = None + + self.allow_subdomain_redirects = allow_subdomain_redirects + + def get_cookie( + self, key: str, domain: str = "localhost", path: str = "/" + ) -> Cookie | None: + """Return a :class:`.Cookie` if it exists. Cookies are uniquely identified by + ``(domain, path, key)``. + + :param key: The decoded form of the key for the cookie. + :param domain: The domain the cookie was set for. + :param path: The path the cookie was set for. + + .. versionadded:: 2.3 + """ + if self._cookies is None: + raise TypeError( + "Cookies are disabled. Create a client with 'use_cookies=True'." + ) + + return self._cookies.get((domain, path, key)) + + def set_cookie( + self, + key: str, + value: str = "", + *, + domain: str = "localhost", + origin_only: bool = True, + path: str = "/", + **kwargs: t.Any, + ) -> None: + """Set a cookie to be sent in subsequent requests. + + This is a convenience to skip making a test request to a route that would set + the cookie. To test the cookie, make a test request to a route that uses the + cookie value. + + The client uses ``domain``, ``origin_only``, and ``path`` to determine which + cookies to send with a request. It does not use other cookie parameters that + browsers use, since they're not applicable in tests. + + :param key: The key part of the cookie. + :param value: The value part of the cookie. + :param domain: Send this cookie with requests that match this domain. If + ``origin_only`` is true, it must be an exact match, otherwise it may be a + suffix match. + :param origin_only: Whether the domain must be an exact match to the request. + :param path: Send this cookie with requests that match this path either exactly + or as a prefix. + :param kwargs: Passed to :func:`.dump_cookie`. + + .. versionchanged:: 3.0 + The parameter ``server_name`` is removed. The first parameter is + ``key``. Use the ``domain`` and ``origin_only`` parameters instead. + + .. versionchanged:: 2.3 + The ``origin_only`` parameter was added. + + .. versionchanged:: 2.3 + The ``domain`` parameter defaults to ``localhost``. + """ + if self._cookies is None: + raise TypeError( + "Cookies are disabled. Create a client with 'use_cookies=True'." + ) + + cookie = Cookie._from_response_header( + domain, "/", dump_cookie(key, value, domain=domain, path=path, **kwargs) + ) + cookie.origin_only = origin_only + + if cookie._should_delete: + self._cookies.pop(cookie._storage_key, None) + else: + self._cookies[cookie._storage_key] = cookie + + def delete_cookie( + self, + key: str, + *, + domain: str = "localhost", + path: str = "/", + ) -> None: + """Delete a cookie if it exists. Cookies are uniquely identified by + ``(domain, path, key)``. + + :param key: The decoded form of the key for the cookie. + :param domain: The domain the cookie was set for. + :param path: The path the cookie was set for. + + .. versionchanged:: 3.0 + The ``server_name`` parameter is removed. The first parameter is + ``key``. Use the ``domain`` parameter instead. + + .. versionchanged:: 3.0 + The ``secure``, ``httponly`` and ``samesite`` parameters are removed. + + .. versionchanged:: 2.3 + The ``domain`` parameter defaults to ``localhost``. + """ + if self._cookies is None: + raise TypeError( + "Cookies are disabled. Create a client with 'use_cookies=True'." + ) + + self._cookies.pop((domain, path, key), None) + + def _add_cookies_to_wsgi(self, environ: WSGIEnvironment) -> None: + """If cookies are enabled, set the ``Cookie`` header in the environ to the + cookies that are applicable to the request host and path. + + :meta private: + + .. versionadded:: 2.3 + """ + if self._cookies is None: + return + + url = urlsplit(get_current_url(environ)) + server_name = url.hostname or "localhost" + value = "; ".join( + c._to_request_header() + for c in self._cookies.values() + if c._matches_request(server_name, url.path) + ) + + if value: + environ["HTTP_COOKIE"] = value + else: + environ.pop("HTTP_COOKIE", None) + + def _update_cookies_from_response( + self, server_name: str, path: str, headers: list[str] + ) -> None: + """If cookies are enabled, update the stored cookies from any ``Set-Cookie`` + headers in the response. + + :meta private: + + .. versionadded:: 2.3 + """ + if self._cookies is None: + return + + for header in headers: + cookie = Cookie._from_response_header(server_name, path, header) + + if cookie._should_delete: + self._cookies.pop(cookie._storage_key, None) + else: + self._cookies[cookie._storage_key] = cookie + + def run_wsgi_app( + self, environ: WSGIEnvironment, buffered: bool = False + ) -> tuple[t.Iterable[bytes], str, Headers]: + """Runs the wrapped WSGI app with the given environment. + + :meta private: + """ + self._add_cookies_to_wsgi(environ) + rv = run_wsgi_app(self.application, environ, buffered=buffered) + url = urlsplit(get_current_url(environ)) + self._update_cookies_from_response( + url.hostname or "localhost", url.path, rv[2].getlist("Set-Cookie") + ) + return rv + + def resolve_redirect( + self, response: TestResponse, buffered: bool = False + ) -> TestResponse: + """Perform a new request to the location given by the redirect + response to the previous request. + + :meta private: + """ + scheme, netloc, path, qs, anchor = urlsplit(response.location) + builder = EnvironBuilder.from_environ( + response.request.environ, path=path, query_string=qs + ) + + to_name_parts = netloc.split(":", 1)[0].split(".") + from_name_parts = builder.server_name.split(".") + + if to_name_parts != [""]: + # The new location has a host, use it for the base URL. + builder.url_scheme = scheme + builder.host = netloc + else: + # A local redirect with autocorrect_location_header=False + # doesn't have a host, so use the request's host. + to_name_parts = from_name_parts + + # Explain why a redirect to a different server name won't be followed. + if to_name_parts != from_name_parts: + if to_name_parts[-len(from_name_parts) :] == from_name_parts: + if not self.allow_subdomain_redirects: + raise RuntimeError("Following subdomain redirects is not enabled.") + else: + raise RuntimeError("Following external redirects is not supported.") + + path_parts = path.split("/") + root_parts = builder.script_root.split("/") + + if path_parts[: len(root_parts)] == root_parts: + # Strip the script root from the path. + builder.path = path[len(builder.script_root) :] + else: + # The new location is not under the script root, so use the + # whole path and clear the previous root. + builder.path = path + builder.script_root = "" + + # Only 307 and 308 preserve all of the original request. + if response.status_code not in {307, 308}: + # HEAD is preserved, everything else becomes GET. + if builder.method != "HEAD": + builder.method = "GET" + + # Clear the body and the headers that describe it. + + if builder.input_stream is not None: + builder.input_stream.close() + builder.input_stream = None + + builder.content_type = None + builder.content_length = None + builder.headers.pop("Transfer-Encoding", None) + + return self.open(builder, buffered=buffered) + + def open( + self, + *args: t.Any, + buffered: bool = False, + follow_redirects: bool = False, + **kwargs: t.Any, + ) -> TestResponse: + """Generate an environ dict from the given arguments, make a + request to the application using it, and return the response. + + :param args: Passed to :class:`EnvironBuilder` to create the + environ for the request. If a single arg is passed, it can + be an existing :class:`EnvironBuilder` or an environ dict. + :param buffered: Convert the iterator returned by the app into + a list. If the iterator has a ``close()`` method, it is + called automatically. + :param follow_redirects: Make additional requests to follow HTTP + redirects until a non-redirect status is returned. + :attr:`TestResponse.history` lists the intermediate + responses. + + .. versionchanged:: 2.1 + Removed the ``as_tuple`` parameter. + + .. versionchanged:: 2.0 + The request input stream is closed when calling + ``response.close()``. Input streams for redirects are + automatically closed. + + .. versionchanged:: 0.5 + If a dict is provided as file in the dict for the ``data`` + parameter the content type has to be called ``content_type`` + instead of ``mimetype``. This change was made for + consistency with :class:`werkzeug.FileWrapper`. + + .. versionchanged:: 0.5 + Added the ``follow_redirects`` parameter. + """ + request: Request | None = None + + if not kwargs and len(args) == 1: + arg = args[0] + + if isinstance(arg, EnvironBuilder): + request = arg.get_request() + elif isinstance(arg, dict): + request = EnvironBuilder.from_environ(arg).get_request() + elif isinstance(arg, Request): + request = arg + + if request is None: + builder = EnvironBuilder(*args, **kwargs) + + try: + request = builder.get_request() + finally: + builder.close() + + response_parts = self.run_wsgi_app(request.environ, buffered=buffered) + response = self.response_wrapper(*response_parts, request=request) + + redirects = set() + history: list[TestResponse] = [] + + if not follow_redirects: + return response + + while response.status_code in { + 301, + 302, + 303, + 305, + 307, + 308, + }: + # Exhaust intermediate response bodies to ensure middleware + # that returns an iterator runs any cleanup code. + if not buffered: + response.make_sequence() + response.close() + + new_redirect_entry = (response.location, response.status_code) + + if new_redirect_entry in redirects: + raise ClientRedirectError( + f"Loop detected: A {response.status_code} redirect" + f" to {response.location} was already made." + ) + + redirects.add(new_redirect_entry) + response.history = tuple(history) + history.append(response) + response = self.resolve_redirect(response, buffered=buffered) + else: + # This is the final request after redirects. + response.history = tuple(history) + # Close the input stream when closing the response, in case + # the input is an open temporary file. + response.call_on_close(request.input_stream.close) + return response + + def get(self, *args: t.Any, **kw: t.Any) -> TestResponse: + """Call :meth:`open` with ``method`` set to ``GET``.""" + kw["method"] = "GET" + return self.open(*args, **kw) + + def post(self, *args: t.Any, **kw: t.Any) -> TestResponse: + """Call :meth:`open` with ``method`` set to ``POST``.""" + kw["method"] = "POST" + return self.open(*args, **kw) + + def put(self, *args: t.Any, **kw: t.Any) -> TestResponse: + """Call :meth:`open` with ``method`` set to ``PUT``.""" + kw["method"] = "PUT" + return self.open(*args, **kw) + + def delete(self, *args: t.Any, **kw: t.Any) -> TestResponse: + """Call :meth:`open` with ``method`` set to ``DELETE``.""" + kw["method"] = "DELETE" + return self.open(*args, **kw) + + def patch(self, *args: t.Any, **kw: t.Any) -> TestResponse: + """Call :meth:`open` with ``method`` set to ``PATCH``.""" + kw["method"] = "PATCH" + return self.open(*args, **kw) + + def options(self, *args: t.Any, **kw: t.Any) -> TestResponse: + """Call :meth:`open` with ``method`` set to ``OPTIONS``.""" + kw["method"] = "OPTIONS" + return self.open(*args, **kw) + + def head(self, *args: t.Any, **kw: t.Any) -> TestResponse: + """Call :meth:`open` with ``method`` set to ``HEAD``.""" + kw["method"] = "HEAD" + return self.open(*args, **kw) + + def trace(self, *args: t.Any, **kw: t.Any) -> TestResponse: + """Call :meth:`open` with ``method`` set to ``TRACE``.""" + kw["method"] = "TRACE" + return self.open(*args, **kw) + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.application!r}>" + + +def create_environ(*args: t.Any, **kwargs: t.Any) -> WSGIEnvironment: + """Create a new WSGI environ dict based on the values passed. The first + parameter should be the path of the request which defaults to '/'. The + second one can either be an absolute path (in that case the host is + localhost:80) or a full path to the request with scheme, netloc port and + the path to the script. + + This accepts the same arguments as the :class:`EnvironBuilder` + constructor. + + .. versionchanged:: 0.5 + This function is now a thin wrapper over :class:`EnvironBuilder` which + was added in 0.5. The `headers`, `environ_base`, `environ_overrides` + and `charset` parameters were added. + """ + builder = EnvironBuilder(*args, **kwargs) + + try: + return builder.get_environ() + finally: + builder.close() + + +def run_wsgi_app( + app: WSGIApplication, environ: WSGIEnvironment, buffered: bool = False +) -> tuple[t.Iterable[bytes], str, Headers]: + """Return a tuple in the form (app_iter, status, headers) of the + application output. This works best if you pass it an application that + returns an iterator all the time. + + Sometimes applications may use the `write()` callable returned + by the `start_response` function. This tries to resolve such edge + cases automatically. But if you don't get the expected output you + should set `buffered` to `True` which enforces buffering. + + If passed an invalid WSGI application the behavior of this function is + undefined. Never pass non-conforming WSGI applications to this function. + + :param app: the application to execute. + :param buffered: set to `True` to enforce buffering. + :return: tuple in the form ``(app_iter, status, headers)`` + """ + # Copy environ to ensure any mutations by the app (ProxyFix, for + # example) don't affect subsequent requests (such as redirects). + environ = _get_environ(environ).copy() + status: str + response: tuple[str, list[tuple[str, str]]] | None = None + buffer: list[bytes] = [] + + def start_response(status, headers, exc_info=None): # type: ignore + nonlocal response + + if exc_info: + try: + raise exc_info[1].with_traceback(exc_info[2]) + finally: + exc_info = None + + response = (status, headers) + return buffer.append + + app_rv = app(environ, start_response) + close_func = getattr(app_rv, "close", None) + app_iter: t.Iterable[bytes] = iter(app_rv) + + # when buffering we emit the close call early and convert the + # application iterator into a regular list + if buffered: + try: + app_iter = list(app_iter) + finally: + if close_func is not None: + close_func() + + # otherwise we iterate the application iter until we have a response, chain + # the already received data with the already collected data and wrap it in + # a new `ClosingIterator` if we need to restore a `close` callable from the + # original return value. + else: + for item in app_iter: + buffer.append(item) + + if response is not None: + break + + if buffer: + app_iter = chain(buffer, app_iter) + + if close_func is not None and app_iter is not app_rv: + app_iter = ClosingIterator(app_iter, close_func) + + status, headers = response # type: ignore + return app_iter, status, Headers(headers) + + +class TestResponse(Response): + """:class:`~werkzeug.wrappers.Response` subclass that provides extra + information about requests made with the test :class:`Client`. + + Test client requests will always return an instance of this class. + If a custom response class is passed to the client, it is + subclassed along with this to support test information. + + If the test request included large files, or if the application is + serving a file, call :meth:`close` to close any open files and + prevent Python showing a ``ResourceWarning``. + + .. versionchanged:: 2.2 + Set the ``default_mimetype`` to None to prevent a mimetype being + assumed if missing. + + .. versionchanged:: 2.1 + Response instances cannot be treated as tuples. + + .. versionadded:: 2.0 + Test client methods always return instances of this class. + """ + + default_mimetype = None + # Don't assume a mimetype, instead use whatever the response provides + + request: Request + """A request object with the environ used to make the request that + resulted in this response. + """ + + history: tuple[TestResponse, ...] + """A list of intermediate responses. Populated when the test request + is made with ``follow_redirects`` enabled. + """ + + # Tell Pytest to ignore this, it's not a test class. + __test__ = False + + def __init__( + self, + response: t.Iterable[bytes], + status: str, + headers: Headers, + request: Request, + history: tuple[TestResponse] = (), # type: ignore + **kwargs: t.Any, + ) -> None: + super().__init__(response, status, headers, **kwargs) + self.request = request + self.history = history + self._compat_tuple = response, status, headers + + @cached_property + def text(self) -> str: + """The response data as text. A shortcut for + ``response.get_data(as_text=True)``. + + .. versionadded:: 2.1 + """ + return self.get_data(as_text=True) + + +@dataclasses.dataclass +class Cookie: + """A cookie key, value, and parameters. + + The class itself is not a public API. Its attributes are documented for inspection + with :meth:`.Client.get_cookie` only. + + .. versionadded:: 2.3 + """ + + key: str + """The cookie key, encoded as a client would see it.""" + + value: str + """The cookie key, encoded as a client would see it.""" + + decoded_key: str + """The cookie key, decoded as the application would set and see it.""" + + decoded_value: str + """The cookie value, decoded as the application would set and see it.""" + + expires: datetime | None + """The time at which the cookie is no longer valid.""" + + max_age: int | None + """The number of seconds from when the cookie was set at which it is + no longer valid. + """ + + domain: str + """The domain that the cookie was set for, or the request domain if not set.""" + + origin_only: bool + """Whether the cookie will be sent for exact domain matches only. This is ``True`` + if the ``Domain`` parameter was not present. + """ + + path: str + """The path that the cookie was set for.""" + + secure: bool | None + """The ``Secure`` parameter.""" + + http_only: bool | None + """The ``HttpOnly`` parameter.""" + + same_site: str | None + """The ``SameSite`` parameter.""" + + def _matches_request(self, server_name: str, path: str) -> bool: + return ( + server_name == self.domain + or ( + not self.origin_only + and server_name.endswith(self.domain) + and server_name[: -len(self.domain)].endswith(".") + ) + ) and ( + path == self.path + or ( + path.startswith(self.path) + and path[len(self.path) - self.path.endswith("/") :].startswith("/") + ) + ) + + def _to_request_header(self) -> str: + return f"{self.key}={self.value}" + + @classmethod + def _from_response_header(cls, server_name: str, path: str, header: str) -> te.Self: + header, _, parameters_str = header.partition(";") + key, _, value = header.partition("=") + decoded_key, decoded_value = next(parse_cookie(header).items()) # type: ignore[call-overload] + params = {} + + for item in parameters_str.split(";"): + k, sep, v = item.partition("=") + params[k.strip().lower()] = v.strip() if sep else None + + return cls( + key=key.strip(), + value=value.strip(), + decoded_key=decoded_key, + decoded_value=decoded_value, + expires=parse_date(params.get("expires")), + max_age=int(params["max-age"] or 0) if "max-age" in params else None, + domain=params.get("domain") or server_name, + origin_only="domain" not in params, + path=params.get("path") or path.rpartition("/")[0] or "/", + secure="secure" in params, + http_only="httponly" in params, + same_site=params.get("samesite"), + ) + + @property + def _storage_key(self) -> tuple[str, str, str]: + return self.domain, self.path, self.decoded_key + + @property + def _should_delete(self) -> bool: + return self.max_age == 0 or ( + self.expires is not None and self.expires.timestamp() == 0 + ) diff --git a/venv/lib/python3.11/site-packages/werkzeug/testapp.py b/venv/lib/python3.11/site-packages/werkzeug/testapp.py new file mode 100755 index 0000000..cdf7fac --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/testapp.py @@ -0,0 +1,194 @@ +"""A small application that can be used to test a WSGI server and check +it for WSGI compliance. +""" + +from __future__ import annotations + +import importlib.metadata +import os +import sys +import typing as t +from textwrap import wrap + +from markupsafe import escape + +from .wrappers.request import Request +from .wrappers.response import Response + +TEMPLATE = """\ + + +WSGI Information + +

    +""" + + +def iter_sys_path() -> t.Iterator[tuple[str, bool, bool]]: + if os.name == "posix": + + def strip(x: str) -> str: + prefix = os.path.expanduser("~") + if x.startswith(prefix): + x = f"~{x[len(prefix) :]}" + return x + + else: + + def strip(x: str) -> str: + return x + + cwd = os.path.abspath(os.getcwd()) + for item in sys.path: + path = os.path.join(cwd, item or os.path.curdir) + yield strip(os.path.normpath(path)), not os.path.isdir(path), path != item + + +@Request.application +def test_app(req: Request) -> Response: + """Simple test application that dumps the environment. You can use + it to check if Werkzeug is working properly: + + .. sourcecode:: pycon + + >>> from werkzeug.serving import run_simple + >>> from werkzeug.testapp import test_app + >>> run_simple('localhost', 3000, test_app) + * Running on http://localhost:3000/ + + The application displays important information from the WSGI environment, + the Python interpreter and the installed libraries. + """ + try: + import pkg_resources + except ImportError: + eggs: t.Iterable[t.Any] = () + else: + eggs = sorted( + pkg_resources.working_set, + key=lambda x: x.project_name.lower(), + ) + python_eggs = [] + for egg in eggs: + try: + version = egg.version + except (ValueError, AttributeError): + version = "unknown" + python_eggs.append( + f"
  • {escape(egg.project_name)} [{escape(version)}]" + ) + + wsgi_env = [] + sorted_environ = sorted(req.environ.items(), key=lambda x: repr(x[0]).lower()) + for key, value in sorted_environ: + value = "".join(wrap(str(escape(repr(value))))) + wsgi_env.append(f"{escape(key)}{value}") + + sys_path = [] + for item, virtual, expanded in iter_sys_path(): + css = [] + if virtual: + css.append("virtual") + if expanded: + css.append("exp") + class_str = f' class="{" ".join(css)}"' if css else "" + sys_path.append(f"{escape(item)}") + + context = { + "python_version": "
    ".join(escape(sys.version).splitlines()), + "platform": escape(sys.platform), + "os": escape(os.name), + "api_version": sys.api_version, + "byteorder": sys.byteorder, + "werkzeug_version": _get_werkzeug_version(), + "python_eggs": "\n".join(python_eggs), + "wsgi_env": "\n".join(wsgi_env), + "sys_path": "\n".join(sys_path), + } + return Response(TEMPLATE % context, mimetype="text/html") + + +_werkzeug_version = "" + + +def _get_werkzeug_version() -> str: + global _werkzeug_version + + if not _werkzeug_version: + _werkzeug_version = importlib.metadata.version("werkzeug") + + return _werkzeug_version + + +if __name__ == "__main__": + from .serving import run_simple + + run_simple("localhost", 5000, test_app, use_reloader=True) diff --git a/venv/lib/python3.11/site-packages/werkzeug/urls.py b/venv/lib/python3.11/site-packages/werkzeug/urls.py new file mode 100755 index 0000000..5bffe39 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/urls.py @@ -0,0 +1,203 @@ +from __future__ import annotations + +import codecs +import re +import typing as t +import urllib.parse +from urllib.parse import quote +from urllib.parse import unquote +from urllib.parse import urlencode +from urllib.parse import urlsplit +from urllib.parse import urlunsplit + +from .datastructures import iter_multi_items + + +def _codec_error_url_quote(e: UnicodeError) -> tuple[str, int]: + """Used in :func:`uri_to_iri` after unquoting to re-quote any + invalid bytes. + """ + # the docs state that UnicodeError does have these attributes, + # but mypy isn't picking them up + out = quote(e.object[e.start : e.end], safe="") # type: ignore + return out, e.end # type: ignore + + +codecs.register_error("werkzeug.url_quote", _codec_error_url_quote) + + +def _make_unquote_part(name: str, chars: str) -> t.Callable[[str], str]: + """Create a function that unquotes all percent encoded characters except those + given. This allows working with unquoted characters if possible while not changing + the meaning of a given part of a URL. + """ + choices = "|".join(f"{ord(c):02X}" for c in sorted(chars)) + pattern = re.compile(f"((?:%(?:{choices}))+)", re.I) + + def _unquote_partial(value: str) -> str: + parts = iter(pattern.split(value)) + out = [] + + for part in parts: + out.append(unquote(part, "utf-8", "werkzeug.url_quote")) + out.append(next(parts, "")) + + return "".join(out) + + _unquote_partial.__name__ = f"_unquote_{name}" + return _unquote_partial + + +# characters that should remain quoted in URL parts +# based on https://url.spec.whatwg.org/#percent-encoded-bytes +# always keep all controls, space, and % quoted +_always_unsafe = bytes((*range(0x21), 0x25, 0x7F)).decode() +_unquote_fragment = _make_unquote_part("fragment", _always_unsafe) +_unquote_query = _make_unquote_part("query", _always_unsafe + "&=+#") +_unquote_path = _make_unquote_part("path", _always_unsafe + "/?#") +_unquote_user = _make_unquote_part("user", _always_unsafe + ":@/?#") + + +def uri_to_iri(uri: str) -> str: + """Convert a URI to an IRI. All valid UTF-8 characters are unquoted, + leaving all reserved and invalid characters quoted. If the URL has + a domain, it is decoded from Punycode. + + >>> uri_to_iri("http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF") + 'http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF' + + :param uri: The URI to convert. + + .. versionchanged:: 3.0 + Passing a tuple or bytes, and the ``charset`` and ``errors`` parameters, + are removed. + + .. versionchanged:: 2.3 + Which characters remain quoted is specific to each part of the URL. + + .. versionchanged:: 0.15 + All reserved and invalid characters remain quoted. Previously, + only some reserved characters were preserved, and invalid bytes + were replaced instead of left quoted. + + .. versionadded:: 0.6 + """ + parts = urlsplit(uri) + path = _unquote_path(parts.path) + query = _unquote_query(parts.query) + fragment = _unquote_fragment(parts.fragment) + + if parts.hostname: + netloc = _decode_idna(parts.hostname) + else: + netloc = "" + + if ":" in netloc: + netloc = f"[{netloc}]" + + if parts.port: + netloc = f"{netloc}:{parts.port}" + + if parts.username: + auth = _unquote_user(parts.username) + + if parts.password: + password = _unquote_user(parts.password) + auth = f"{auth}:{password}" + + netloc = f"{auth}@{netloc}" + + return urlunsplit((parts.scheme, netloc, path, query, fragment)) + + +def iri_to_uri(iri: str) -> str: + """Convert an IRI to a URI. All non-ASCII and unsafe characters are + quoted. If the URL has a domain, it is encoded to Punycode. + + >>> iri_to_uri('http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF') + 'http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF' + + :param iri: The IRI to convert. + + .. versionchanged:: 3.0 + Passing a tuple or bytes, the ``charset`` and ``errors`` parameters, + and the ``safe_conversion`` parameter, are removed. + + .. versionchanged:: 2.3 + Which characters remain unquoted is specific to each part of the URL. + + .. versionchanged:: 0.15 + All reserved characters remain unquoted. Previously, only some reserved + characters were left unquoted. + + .. versionchanged:: 0.9.6 + The ``safe_conversion`` parameter was added. + + .. versionadded:: 0.6 + """ + parts = urlsplit(iri) + # safe = https://url.spec.whatwg.org/#url-path-segment-string + # as well as percent for things that are already quoted + path = quote(parts.path, safe="%!$&'()*+,/:;=@") + query = quote(parts.query, safe="%!$&'()*+,/:;=?@") + fragment = quote(parts.fragment, safe="%!#$&'()*+,/:;=?@") + + if parts.hostname: + netloc = parts.hostname.encode("idna").decode("ascii") + else: + netloc = "" + + if ":" in netloc: + netloc = f"[{netloc}]" + + if parts.port: + netloc = f"{netloc}:{parts.port}" + + if parts.username: + auth = quote(parts.username, safe="%!$&'()*+,;=") + + if parts.password: + password = quote(parts.password, safe="%!$&'()*+,;=") + auth = f"{auth}:{password}" + + netloc = f"{auth}@{netloc}" + + return urlunsplit((parts.scheme, netloc, path, query, fragment)) + + +# Python < 3.12 +# itms-services was worked around in previous iri_to_uri implementations, but +# we can tell Python directly that it needs to preserve the //. +if "itms-services" not in urllib.parse.uses_netloc: + urllib.parse.uses_netloc.append("itms-services") + + +def _decode_idna(domain: str) -> str: + try: + data = domain.encode("ascii") + except UnicodeEncodeError: + # If the domain is not ASCII, it's decoded already. + return domain + + try: + # Try decoding in one shot. + return data.decode("idna") + except UnicodeDecodeError: + pass + + # Decode each part separately, leaving invalid parts as punycode. + parts = [] + + for part in data.split(b"."): + try: + parts.append(part.decode("idna")) + except UnicodeDecodeError: + parts.append(part.decode("ascii")) + + return ".".join(parts) + + +def _urlencode(query: t.Mapping[str, str] | t.Iterable[tuple[str, str]]) -> str: + items = [x for x in iter_multi_items(query) if x[1] is not None] + # safe = https://url.spec.whatwg.org/#percent-encoded-bytes + return urlencode(items, safe="!$'()*,/:;?@") diff --git a/venv/lib/python3.11/site-packages/werkzeug/user_agent.py b/venv/lib/python3.11/site-packages/werkzeug/user_agent.py new file mode 100755 index 0000000..17e5d3f --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/user_agent.py @@ -0,0 +1,47 @@ +from __future__ import annotations + + +class UserAgent: + """Represents a parsed user agent header value. + + The default implementation does no parsing, only the :attr:`string` + attribute is set. A subclass may parse the string to set the + common attributes or expose other information. Set + :attr:`werkzeug.wrappers.Request.user_agent_class` to use a + subclass. + + :param string: The header value to parse. + + .. versionadded:: 2.0 + This replaces the previous ``useragents`` module, but does not + provide a built-in parser. + """ + + platform: str | None = None + """The OS name, if it could be parsed from the string.""" + + browser: str | None = None + """The browser name, if it could be parsed from the string.""" + + version: str | None = None + """The browser version, if it could be parsed from the string.""" + + language: str | None = None + """The browser language, if it could be parsed from the string.""" + + def __init__(self, string: str) -> None: + self.string: str = string + """The original header value.""" + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.browser}/{self.version}>" + + def __str__(self) -> str: + return self.string + + def __bool__(self) -> bool: + return bool(self.browser) + + def to_header(self) -> str: + """Convert to a header value.""" + return self.string diff --git a/venv/lib/python3.11/site-packages/werkzeug/utils.py b/venv/lib/python3.11/site-packages/werkzeug/utils.py new file mode 100755 index 0000000..d023f98 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/utils.py @@ -0,0 +1,684 @@ +from __future__ import annotations + +import io +import mimetypes +import os +import pkgutil +import re +import sys +import typing as t +import unicodedata +from datetime import datetime +from time import time +from urllib.parse import quote +from zlib import adler32 + +from markupsafe import escape + +from ._internal import _DictAccessorProperty +from ._internal import _missing +from ._internal import _TAccessorValue +from .datastructures import Headers +from .exceptions import NotFound +from .exceptions import RequestedRangeNotSatisfiable +from .security import _windows_device_files +from .security import safe_join +from .wsgi import wrap_file + +if t.TYPE_CHECKING: + from _typeshed.wsgi import WSGIEnvironment + + from .wrappers.request import Request + from .wrappers.response import Response + +_T = t.TypeVar("_T") + +_entity_re = re.compile(r"&([^;]+);") +_filename_ascii_strip_re = re.compile(r"[^A-Za-z0-9_.-]") + + +class cached_property(property, t.Generic[_T]): + """A :func:`property` that is only evaluated once. Subsequent access + returns the cached value. Setting the property sets the cached + value. Deleting the property clears the cached value, accessing it + again will evaluate it again. + + .. code-block:: python + + class Example: + @cached_property + def value(self): + # calculate something important here + return 42 + + e = Example() + e.value # evaluates + e.value # uses cache + e.value = 16 # sets cache + del e.value # clears cache + + If the class defines ``__slots__``, it must add ``_cache_{name}`` as + a slot. Alternatively, it can add ``__dict__``, but that's usually + not desirable. + + .. versionchanged:: 2.1 + Works with ``__slots__``. + + .. versionchanged:: 2.0 + ``del obj.name`` clears the cached value. + """ + + def __init__( + self, + fget: t.Callable[[t.Any], _T], + name: str | None = None, + doc: str | None = None, + ) -> None: + super().__init__(fget, doc=doc) + self.__name__ = name or fget.__name__ + self.slot_name = f"_cache_{self.__name__}" + self.__module__ = fget.__module__ + + def __set__(self, obj: object, value: _T) -> None: + if hasattr(obj, "__dict__"): + obj.__dict__[self.__name__] = value + else: + setattr(obj, self.slot_name, value) + + def __get__(self, obj: object, type: type = None) -> _T: # type: ignore + if obj is None: + return self # type: ignore + + obj_dict = getattr(obj, "__dict__", None) + + if obj_dict is not None: + value: _T = obj_dict.get(self.__name__, _missing) + else: + value = getattr(obj, self.slot_name, _missing) # type: ignore[arg-type] + + if value is _missing: + value = self.fget(obj) # type: ignore + + if obj_dict is not None: + obj.__dict__[self.__name__] = value + else: + setattr(obj, self.slot_name, value) + + return value + + def __delete__(self, obj: object) -> None: + if hasattr(obj, "__dict__"): + del obj.__dict__[self.__name__] + else: + setattr(obj, self.slot_name, _missing) + + +class environ_property(_DictAccessorProperty[_TAccessorValue]): + """Maps request attributes to environment variables. This works not only + for the Werkzeug request object, but also any other class with an + environ attribute: + + >>> class Test(object): + ... environ = {'key': 'value'} + ... test = environ_property('key') + >>> var = Test() + >>> var.test + 'value' + + If you pass it a second value it's used as default if the key does not + exist, the third one can be a converter that takes a value and converts + it. If it raises :exc:`ValueError` or :exc:`TypeError` the default value + is used. If no default value is provided `None` is used. + + Per default the property is read only. You have to explicitly enable it + by passing ``read_only=False`` to the constructor. + """ + + read_only = True + + def lookup(self, obj: Request) -> WSGIEnvironment: + return obj.environ + + +class header_property(_DictAccessorProperty[_TAccessorValue]): + """Like `environ_property` but for headers.""" + + def lookup(self, obj: Request | Response) -> Headers: # type: ignore[override] + return obj.headers + + +# https://cgit.freedesktop.org/xdg/shared-mime-info/tree/freedesktop.org.xml.in +# https://www.iana.org/assignments/media-types/media-types.xhtml +# Types listed in the XDG mime info that have a charset in the IANA registration. +_charset_mimetypes = { + "application/ecmascript", + "application/javascript", + "application/sql", + "application/xml", + "application/xml-dtd", + "application/xml-external-parsed-entity", +} + + +def get_content_type(mimetype: str, charset: str) -> str: + """Returns the full content type string with charset for a mimetype. + + If the mimetype represents text, the charset parameter will be + appended, otherwise the mimetype is returned unchanged. + + :param mimetype: The mimetype to be used as content type. + :param charset: The charset to be appended for text mimetypes. + :return: The content type. + + .. versionchanged:: 0.15 + Any type that ends with ``+xml`` gets a charset, not just those + that start with ``application/``. Known text types such as + ``application/javascript`` are also given charsets. + """ + if ( + mimetype.startswith("text/") + or mimetype in _charset_mimetypes + or mimetype.endswith("+xml") + ): + mimetype += f"; charset={charset}" + + return mimetype + + +def secure_filename(filename: str) -> str: + r"""Pass it a filename and it will return a secure version of it. This + filename can then safely be stored on a regular file system and passed + to :func:`os.path.join`. The filename returned is an ASCII only string + for maximum portability. + + On windows systems the function also makes sure that the file is not + named after one of the special device files. + + >>> secure_filename("My cool movie.mov") + 'My_cool_movie.mov' + >>> secure_filename("../../../etc/passwd") + 'etc_passwd' + >>> secure_filename('i contain cool \xfcml\xe4uts.txt') + 'i_contain_cool_umlauts.txt' + + The function might return an empty filename. It's your responsibility + to ensure that the filename is unique and that you abort or + generate a random filename if the function returned an empty one. + + .. versionadded:: 0.5 + + :param filename: the filename to secure + """ + filename = unicodedata.normalize("NFKD", filename) + filename = filename.encode("ascii", "ignore").decode("ascii") + + for sep in os.sep, os.path.altsep: + if sep: + filename = filename.replace(sep, " ") + filename = str(_filename_ascii_strip_re.sub("", "_".join(filename.split()))).strip( + "._" + ) + + # on nt a couple of special files are present in each folder. We + # have to ensure that the target file is not such a filename. In + # this case we prepend an underline + if ( + os.name == "nt" + and filename + and filename.split(".")[0].upper() in _windows_device_files + ): + filename = f"_{filename}" + + return filename + + +def redirect( + location: str, code: int = 302, Response: type[Response] | None = None +) -> Response: + """Returns a response object (a WSGI application) that, if called, + redirects the client to the target location. Supported codes are + 301, 302, 303, 305, 307, and 308. 300 is not supported because + it's not a real redirect and 304 because it's the answer for a + request with a request with defined If-Modified-Since headers. + + .. versionadded:: 0.6 + The location can now be a unicode string that is encoded using + the :func:`iri_to_uri` function. + + .. versionadded:: 0.10 + The class used for the Response object can now be passed in. + + :param location: the location the response should redirect to. + :param code: the redirect status code. defaults to 302. + :param class Response: a Response class to use when instantiating a + response. The default is :class:`werkzeug.wrappers.Response` if + unspecified. + """ + if Response is None: + from .wrappers import Response + + html_location = escape(location) + response = Response( # type: ignore[misc] + "\n" + "\n" + "Redirecting...\n" + "

    Redirecting...

    \n" + "

    You should be redirected automatically to the target URL: " + f'{html_location}. If not, click the link.\n', + code, + mimetype="text/html", + ) + response.headers["Location"] = location + return response + + +def append_slash_redirect(environ: WSGIEnvironment, code: int = 308) -> Response: + """Redirect to the current URL with a slash appended. + + If the current URL is ``/user/42``, the redirect URL will be + ``42/``. When joined to the current URL during response + processing or by the browser, this will produce ``/user/42/``. + + The behavior is undefined if the path ends with a slash already. If + called unconditionally on a URL, it may produce a redirect loop. + + :param environ: Use the path and query from this WSGI environment + to produce the redirect URL. + :param code: the status code for the redirect. + + .. versionchanged:: 2.1 + Produce a relative URL that only modifies the last segment. + Relevant when the current path has multiple segments. + + .. versionchanged:: 2.1 + The default status code is 308 instead of 301. This preserves + the request method and body. + """ + tail = environ["PATH_INFO"].rpartition("/")[2] + + if not tail: + new_path = "./" + else: + new_path = f"{tail}/" + + query_string = environ.get("QUERY_STRING") + + if query_string: + new_path = f"{new_path}?{query_string}" + + return redirect(new_path, code) + + +def send_file( + path_or_file: os.PathLike[str] | str | t.IO[bytes], + environ: WSGIEnvironment, + mimetype: str | None = None, + as_attachment: bool = False, + download_name: str | None = None, + conditional: bool = True, + etag: bool | str = True, + last_modified: datetime | int | float | None = None, + max_age: None | (int | t.Callable[[str | None], int | None]) = None, + use_x_sendfile: bool = False, + response_class: type[Response] | None = None, + _root_path: os.PathLike[str] | str | None = None, +) -> Response: + """Send the contents of a file to the client. + + The first argument can be a file path or a file-like object. Paths + are preferred in most cases because Werkzeug can manage the file and + get extra information from the path. Passing a file-like object + requires that the file is opened in binary mode, and is mostly + useful when building a file in memory with :class:`io.BytesIO`. + + Never pass file paths provided by a user. The path is assumed to be + trusted, so a user could craft a path to access a file you didn't + intend. Use :func:`send_from_directory` to safely serve user-provided paths. + + If the WSGI server sets a ``file_wrapper`` in ``environ``, it is + used, otherwise Werkzeug's built-in wrapper is used. Alternatively, + if the HTTP server supports ``X-Sendfile``, ``use_x_sendfile=True`` + will tell the server to send the given path, which is much more + efficient than reading it in Python. + + :param path_or_file: The path to the file to send, relative to the + current working directory if a relative path is given. + Alternatively, a file-like object opened in binary mode. Make + sure the file pointer is seeked to the start of the data. + :param environ: The WSGI environ for the current request. + :param mimetype: The MIME type to send for the file. If not + provided, it will try to detect it from the file name. + :param as_attachment: Indicate to a browser that it should offer to + save the file instead of displaying it. + :param download_name: The default name browsers will use when saving + the file. Defaults to the passed file name. + :param conditional: Enable conditional and range responses based on + request headers. Requires passing a file path and ``environ``. + :param etag: Calculate an ETag for the file, which requires passing + a file path. Can also be a string to use instead. + :param last_modified: The last modified time to send for the file, + in seconds. If not provided, it will try to detect it from the + file path. + :param max_age: How long the client should cache the file, in + seconds. If set, ``Cache-Control`` will be ``public``, otherwise + it will be ``no-cache`` to prefer conditional caching. + :param use_x_sendfile: Set the ``X-Sendfile`` header to let the + server to efficiently send the file. Requires support from the + HTTP server. Requires passing a file path. + :param response_class: Build the response using this class. Defaults + to :class:`~werkzeug.wrappers.Response`. + :param _root_path: Do not use. For internal use only. Use + :func:`send_from_directory` to safely send files under a path. + + .. versionchanged:: 2.0.2 + ``send_file`` only sets a detected ``Content-Encoding`` if + ``as_attachment`` is disabled. + + .. versionadded:: 2.0 + Adapted from Flask's implementation. + + .. versionchanged:: 2.0 + ``download_name`` replaces Flask's ``attachment_filename`` + parameter. If ``as_attachment=False``, it is passed with + ``Content-Disposition: inline`` instead. + + .. versionchanged:: 2.0 + ``max_age`` replaces Flask's ``cache_timeout`` parameter. + ``conditional`` is enabled and ``max_age`` is not set by + default. + + .. versionchanged:: 2.0 + ``etag`` replaces Flask's ``add_etags`` parameter. It can be a + string to use instead of generating one. + + .. versionchanged:: 2.0 + If an encoding is returned when guessing ``mimetype`` from + ``download_name``, set the ``Content-Encoding`` header. + """ + if response_class is None: + from .wrappers import Response + + response_class = Response + + path: str | None = None + file: t.IO[bytes] | None = None + size: int | None = None + mtime: float | None = None + headers = Headers() + + if isinstance(path_or_file, (os.PathLike, str)) or hasattr( + path_or_file, "__fspath__" + ): + path_or_file = t.cast("os.PathLike[str] | str", path_or_file) + + # Flask will pass app.root_path, allowing its send_file wrapper + # to not have to deal with paths. + if _root_path is not None: + path = os.path.join(_root_path, path_or_file) + else: + path = os.path.abspath(path_or_file) + + stat = os.stat(path) + size = stat.st_size + mtime = stat.st_mtime + else: + file = path_or_file + + if download_name is None and path is not None: + download_name = os.path.basename(path) + + if mimetype is None: + if download_name is None: + raise TypeError( + "Unable to detect the MIME type because a file name is" + " not available. Either set 'download_name', pass a" + " path instead of a file, or set 'mimetype'." + ) + + mimetype, encoding = mimetypes.guess_type(download_name) + + if mimetype is None: + mimetype = "application/octet-stream" + + # Don't send encoding for attachments, it causes browsers to + # save decompress tar.gz files. + if encoding is not None and not as_attachment: + headers.set("Content-Encoding", encoding) + + if download_name is not None: + try: + download_name.encode("ascii") + except UnicodeEncodeError: + simple = unicodedata.normalize("NFKD", download_name) + simple = simple.encode("ascii", "ignore").decode("ascii") + # safe = RFC 5987 attr-char + quoted = quote(download_name, safe="!#$&+-.^_`|~") + names = {"filename": simple, "filename*": f"UTF-8''{quoted}"} + else: + names = {"filename": download_name} + + value = "attachment" if as_attachment else "inline" + headers.set("Content-Disposition", value, **names) + elif as_attachment: + raise TypeError( + "No name provided for attachment. Either set" + " 'download_name' or pass a path instead of a file." + ) + + if use_x_sendfile and path is not None: + headers["X-Sendfile"] = path + data = None + else: + if file is None: + file = open(path, "rb") # type: ignore + elif isinstance(file, io.BytesIO): + size = file.getbuffer().nbytes + elif isinstance(file, io.TextIOBase): + raise ValueError("Files must be opened in binary mode or use BytesIO.") + + data = wrap_file(environ, file) + + rv = response_class( + data, mimetype=mimetype, headers=headers, direct_passthrough=True + ) + + if size is not None: + rv.content_length = size + + if last_modified is not None: + rv.last_modified = last_modified # type: ignore + elif mtime is not None: + rv.last_modified = mtime # type: ignore + + rv.cache_control.no_cache = True + + # Flask will pass app.get_send_file_max_age, allowing its send_file + # wrapper to not have to deal with paths. + if callable(max_age): + max_age = max_age(path) + + if max_age is not None: + if max_age > 0: + rv.cache_control.no_cache = None + rv.cache_control.public = True + + rv.cache_control.max_age = max_age + rv.expires = int(time() + max_age) # type: ignore + + if isinstance(etag, str): + rv.set_etag(etag) + elif etag and path is not None: + check = adler32(path.encode()) & 0xFFFFFFFF + rv.set_etag(f"{mtime}-{size}-{check}") + + if conditional: + try: + rv = rv.make_conditional(environ, accept_ranges=True, complete_length=size) + except RequestedRangeNotSatisfiable: + if file is not None: + file.close() + + raise + + # Some x-sendfile implementations incorrectly ignore the 304 + # status code and send the file anyway. + if rv.status_code == 304: + rv.headers.pop("x-sendfile", None) + + return rv + + +def send_from_directory( + directory: os.PathLike[str] | str, + path: os.PathLike[str] | str, + environ: WSGIEnvironment, + **kwargs: t.Any, +) -> Response: + """Send a file from within a directory using :func:`send_file`. + + This is a secure way to serve files from a folder, such as static + files or uploads. Uses :func:`~werkzeug.security.safe_join` to + ensure the path coming from the client is not maliciously crafted to + point outside the specified directory. + + If the final path does not point to an existing regular file, + returns a 404 :exc:`~werkzeug.exceptions.NotFound` error. + + :param directory: The directory that ``path`` must be located under. This *must not* + be a value provided by the client, otherwise it becomes insecure. + :param path: The path to the file to send, relative to ``directory``. This is the + part of the path provided by the client, which is checked for security. + :param environ: The WSGI environ for the current request. + :param kwargs: Arguments to pass to :func:`send_file`. + + .. versionadded:: 2.0 + Adapted from Flask's implementation. + """ + path_str = safe_join(os.fspath(directory), os.fspath(path)) + + if path_str is None: + raise NotFound() + + # Flask will pass app.root_path, allowing its send_from_directory + # wrapper to not have to deal with paths. + if "_root_path" in kwargs: + path_str = os.path.join(kwargs["_root_path"], path_str) + + if not os.path.isfile(path_str): + raise NotFound() + + return send_file(path_str, environ, **kwargs) + + +def import_string(import_name: str, silent: bool = False) -> t.Any: + """Imports an object based on a string. This is useful if you want to + use import paths as endpoints or something similar. An import path can + be specified either in dotted notation (``xml.sax.saxutils.escape``) + or with a colon as object delimiter (``xml.sax.saxutils:escape``). + + If `silent` is True the return value will be `None` if the import fails. + + :param import_name: the dotted name for the object to import. + :param silent: if set to `True` import errors are ignored and + `None` is returned instead. + :return: imported object + """ + import_name = import_name.replace(":", ".") + try: + try: + __import__(import_name) + except ImportError: + if "." not in import_name: + raise + else: + return sys.modules[import_name] + + module_name, obj_name = import_name.rsplit(".", 1) + module = __import__(module_name, globals(), locals(), [obj_name]) + try: + return getattr(module, obj_name) + except AttributeError as e: + raise ImportError(e) from None + + except ImportError as e: + if not silent: + raise ImportStringError(import_name, e).with_traceback( + sys.exc_info()[2] + ) from None + + return None + + +def find_modules( + import_path: str, include_packages: bool = False, recursive: bool = False +) -> t.Iterator[str]: + """Finds all the modules below a package. This can be useful to + automatically import all views / controllers so that their metaclasses / + function decorators have a chance to register themselves on the + application. + + Packages are not returned unless `include_packages` is `True`. This can + also recursively list modules but in that case it will import all the + packages to get the correct load path of that module. + + :param import_path: the dotted name for the package to find child modules. + :param include_packages: set to `True` if packages should be returned, too. + :param recursive: set to `True` if recursion should happen. + :return: generator + """ + module = import_string(import_path) + path = getattr(module, "__path__", None) + if path is None: + raise ValueError(f"{import_path!r} is not a package") + basename = f"{module.__name__}." + for _importer, modname, ispkg in pkgutil.iter_modules(path): + modname = basename + modname + if ispkg: + if include_packages: + yield modname + if recursive: + yield from find_modules(modname, include_packages, True) + else: + yield modname + + +class ImportStringError(ImportError): + """Provides information about a failed :func:`import_string` attempt.""" + + #: String in dotted notation that failed to be imported. + import_name: str + #: Wrapped exception. + exception: BaseException + + def __init__(self, import_name: str, exception: BaseException) -> None: + self.import_name = import_name + self.exception = exception + msg = import_name + name = "" + tracked = [] + for part in import_name.replace(":", ".").split("."): + name = f"{name}.{part}" if name else part + imported = import_string(name, silent=True) + if imported: + tracked.append((name, getattr(imported, "__file__", None))) + else: + track = [f"- {n!r} found in {i!r}." for n, i in tracked] + track.append(f"- {name!r} not found.") + track_str = "\n".join(track) + msg = ( + f"import_string() failed for {import_name!r}. Possible reasons" + f" are:\n\n" + "- missing __init__.py in a package;\n" + "- package or module path not included in sys.path;\n" + "- duplicated package or module name taking precedence in" + " sys.path;\n" + "- missing module, class, function or variable;\n\n" + f"Debugged import:\n\n{track_str}\n\n" + f"Original exception:\n\n{type(exception).__name__}: {exception}" + ) + break + + super().__init__(msg) + + def __repr__(self) -> str: + return f"<{type(self).__name__}({self.import_name!r}, {self.exception!r})>" diff --git a/venv/lib/python3.11/site-packages/werkzeug/wrappers/__init__.py b/venv/lib/python3.11/site-packages/werkzeug/wrappers/__init__.py new file mode 100755 index 0000000..b36f228 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/wrappers/__init__.py @@ -0,0 +1,3 @@ +from .request import Request as Request +from .response import Response as Response +from .response import ResponseStream as ResponseStream diff --git a/venv/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..3db484f2b0f2207b10a01c8486115a2dfdb8d6a5 GIT binary patch literal 369 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 XzFzGEl5CtVXFlU6Up(eHW6u8p;w@Dt literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/response.cpython-311.pyc b/venv/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/response.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..f29e7315eb5a338c00d8be0186b15da38b0fb3ad GIT binary patch literal 37268 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/werkzeug/wrappers/request.py b/venv/lib/python3.11/site-packages/werkzeug/wrappers/request.py new file mode 100755 index 0000000..9f1eee1 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/wrappers/request.py @@ -0,0 +1,650 @@ +from __future__ import annotations + +import collections.abc as cabc +import functools +import json +import typing as t +from io import BytesIO + +from .._internal import _wsgi_decoding_dance +from ..datastructures import CombinedMultiDict +from ..datastructures import EnvironHeaders +from ..datastructures import FileStorage +from ..datastructures import ImmutableMultiDict +from ..datastructures import iter_multi_items +from ..datastructures import MultiDict +from ..exceptions import BadRequest +from ..exceptions import UnsupportedMediaType +from ..formparser import default_stream_factory +from ..formparser import FormDataParser +from ..sansio.request import Request as _SansIORequest +from ..utils import cached_property +from ..utils import environ_property +from ..wsgi import _get_server +from ..wsgi import get_input_stream + +if t.TYPE_CHECKING: + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +class Request(_SansIORequest): + """Represents an incoming WSGI HTTP request, with headers and body + taken from the WSGI environment. Has properties and methods for + using the functionality defined by various HTTP specs. The data in + requests object is read-only. + + Text data is assumed to use UTF-8 encoding, which should be true for + the vast majority of modern clients. Using an encoding set by the + client is unsafe in Python due to extra encodings it provides, such + as ``zip``. To change the assumed encoding, subclass and replace + :attr:`charset`. + + :param environ: The WSGI environ is generated by the WSGI server and + contains information about the server configuration and client + request. + :param populate_request: Add this request object to the WSGI environ + as ``environ['werkzeug.request']``. Can be useful when + debugging. + :param shallow: Makes reading from :attr:`stream` (and any method + that would read from it) raise a :exc:`RuntimeError`. Useful to + prevent consuming the form data in middleware, which would make + it unavailable to the final application. + + .. versionchanged:: 3.0 + The ``charset``, ``url_charset``, and ``encoding_errors`` parameters + were removed. + + .. versionchanged:: 2.1 + Old ``BaseRequest`` and mixin classes were removed. + + .. versionchanged:: 2.1 + Remove the ``disable_data_descriptor`` attribute. + + .. versionchanged:: 2.0 + Combine ``BaseRequest`` and mixins into a single ``Request`` + class. + + .. versionchanged:: 0.5 + Read-only mode is enforced with immutable classes for all data. + """ + + #: the maximum content length. This is forwarded to the form data + #: parsing function (:func:`parse_form_data`). When set and the + #: :attr:`form` or :attr:`files` attribute is accessed and the + #: parsing fails because more than the specified value is transmitted + #: a :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. + #: + #: .. versionadded:: 0.5 + max_content_length: int | None = None + + #: the maximum form field size. This is forwarded to the form data + #: parsing function (:func:`parse_form_data`). When set and the + #: :attr:`form` or :attr:`files` attribute is accessed and the + #: data in memory for post data is longer than the specified value a + #: :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. + #: + #: .. versionchanged:: 3.1 + #: Defaults to 500kB instead of unlimited. + #: + #: .. versionadded:: 0.5 + max_form_memory_size: int | None = 500_000 + + #: The maximum number of multipart parts to parse, passed to + #: :attr:`form_data_parser_class`. Parsing form data with more than this + #: many parts will raise :exc:`~.RequestEntityTooLarge`. + #: + #: .. versionadded:: 2.2.3 + max_form_parts = 1000 + + #: The form data parser that should be used. Can be replaced to customize + #: the form date parsing. + form_data_parser_class: type[FormDataParser] = FormDataParser + + #: The WSGI environment containing HTTP headers and information from + #: the WSGI server. + environ: WSGIEnvironment + + #: Set when creating the request object. If ``True``, reading from + #: the request body will cause a ``RuntimeException``. Useful to + #: prevent modifying the stream from middleware. + shallow: bool + + def __init__( + self, + environ: WSGIEnvironment, + populate_request: bool = True, + shallow: bool = False, + ) -> None: + super().__init__( + method=environ.get("REQUEST_METHOD", "GET"), + scheme=environ.get("wsgi.url_scheme", "http"), + server=_get_server(environ), + root_path=_wsgi_decoding_dance(environ.get("SCRIPT_NAME") or ""), + path=_wsgi_decoding_dance(environ.get("PATH_INFO") or ""), + query_string=environ.get("QUERY_STRING", "").encode("latin1"), + headers=EnvironHeaders(environ), + remote_addr=environ.get("REMOTE_ADDR"), + ) + self.environ = environ + self.shallow = shallow + + if populate_request and not shallow: + self.environ["werkzeug.request"] = self + + @classmethod + def from_values(cls, *args: t.Any, **kwargs: t.Any) -> Request: + """Create a new request object based on the values provided. If + environ is given missing values are filled from there. This method is + useful for small scripts when you need to simulate a request from an URL. + Do not use this method for unittesting, there is a full featured client + object (:class:`Client`) that allows to create multipart requests, + support for cookies etc. + + This accepts the same options as the + :class:`~werkzeug.test.EnvironBuilder`. + + .. versionchanged:: 0.5 + This method now accepts the same arguments as + :class:`~werkzeug.test.EnvironBuilder`. Because of this the + `environ` parameter is now called `environ_overrides`. + + :return: request object + """ + from ..test import EnvironBuilder + + builder = EnvironBuilder(*args, **kwargs) + try: + return builder.get_request(cls) + finally: + builder.close() + + @classmethod + def application(cls, f: t.Callable[[Request], WSGIApplication]) -> WSGIApplication: + """Decorate a function as responder that accepts the request as + the last argument. This works like the :func:`responder` + decorator but the function is passed the request object as the + last argument and the request object will be closed + automatically:: + + @Request.application + def my_wsgi_app(request): + return Response('Hello World!') + + As of Werkzeug 0.14 HTTP exceptions are automatically caught and + converted to responses instead of failing. + + :param f: the WSGI callable to decorate + :return: a new WSGI callable + """ + #: return a callable that wraps the -2nd argument with the request + #: and calls the function with all the arguments up to that one and + #: the request. The return value is then called with the latest + #: two arguments. This makes it possible to use this decorator for + #: both standalone WSGI functions as well as bound methods and + #: partially applied functions. + from ..exceptions import HTTPException + + @functools.wraps(f) + def application(*args: t.Any) -> cabc.Iterable[bytes]: + request = cls(args[-2]) + with request: + try: + resp = f(*args[:-2] + (request,)) + except HTTPException as e: + resp = t.cast("WSGIApplication", e.get_response(args[-2])) + return resp(*args[-2:]) + + return t.cast("WSGIApplication", application) + + def _get_file_stream( + self, + total_content_length: int | None, + content_type: str | None, + filename: str | None = None, + content_length: int | None = None, + ) -> t.IO[bytes]: + """Called to get a stream for the file upload. + + This must provide a file-like class with `read()`, `readline()` + and `seek()` methods that is both writeable and readable. + + The default implementation returns a temporary file if the total + content length is higher than 500KB. Because many browsers do not + provide a content length for the files only the total content + length matters. + + :param total_content_length: the total content length of all the + data in the request combined. This value + is guaranteed to be there. + :param content_type: the mimetype of the uploaded file. + :param filename: the filename of the uploaded file. May be `None`. + :param content_length: the length of this file. This value is usually + not provided because webbrowsers do not provide + this value. + """ + return default_stream_factory( + total_content_length=total_content_length, + filename=filename, + content_type=content_type, + content_length=content_length, + ) + + @property + def want_form_data_parsed(self) -> bool: + """``True`` if the request method carries content. By default + this is true if a ``Content-Type`` is sent. + + .. versionadded:: 0.8 + """ + return bool(self.environ.get("CONTENT_TYPE")) + + def make_form_data_parser(self) -> FormDataParser: + """Creates the form data parser. Instantiates the + :attr:`form_data_parser_class` with some parameters. + + .. versionadded:: 0.8 + """ + return self.form_data_parser_class( + stream_factory=self._get_file_stream, + max_form_memory_size=self.max_form_memory_size, + max_content_length=self.max_content_length, + max_form_parts=self.max_form_parts, + cls=self.parameter_storage_class, + ) + + def _load_form_data(self) -> None: + """Method used internally to retrieve submitted data. After calling + this sets `form` and `files` on the request object to multi dicts + filled with the incoming form data. As a matter of fact the input + stream will be empty afterwards. You can also call this method to + force the parsing of the form data. + + .. versionadded:: 0.8 + """ + # abort early if we have already consumed the stream + if "form" in self.__dict__: + return + + if self.want_form_data_parsed: + parser = self.make_form_data_parser() + data = parser.parse( + self._get_stream_for_parsing(), + self.mimetype, + self.content_length, + self.mimetype_params, + ) + else: + data = ( + self.stream, + self.parameter_storage_class(), + self.parameter_storage_class(), + ) + + # inject the values into the instance dict so that we bypass + # our cached_property non-data descriptor. + d = self.__dict__ + d["stream"], d["form"], d["files"] = data + + def _get_stream_for_parsing(self) -> t.IO[bytes]: + """This is the same as accessing :attr:`stream` with the difference + that if it finds cached data from calling :meth:`get_data` first it + will create a new stream out of the cached data. + + .. versionadded:: 0.9.3 + """ + cached_data = getattr(self, "_cached_data", None) + if cached_data is not None: + return BytesIO(cached_data) + return self.stream + + def close(self) -> None: + """Closes associated resources of this request object. This + closes all file handles explicitly. You can also use the request + object in a with statement which will automatically close it. + + .. versionadded:: 0.9 + """ + files = self.__dict__.get("files") + for _key, value in iter_multi_items(files or ()): + value.close() + + def __enter__(self) -> Request: + return self + + def __exit__(self, exc_type, exc_value, tb) -> None: # type: ignore + self.close() + + @cached_property + def stream(self) -> t.IO[bytes]: + """The WSGI input stream, with safety checks. This stream can only be consumed + once. + + Use :meth:`get_data` to get the full data as bytes or text. The :attr:`data` + attribute will contain the full bytes only if they do not represent form data. + The :attr:`form` attribute will contain the parsed form data in that case. + + Unlike :attr:`input_stream`, this stream guards against infinite streams or + reading past :attr:`content_length` or :attr:`max_content_length`. + + If ``max_content_length`` is set, it can be enforced on streams if + ``wsgi.input_terminated`` is set. Otherwise, an empty stream is returned. + + If the limit is reached before the underlying stream is exhausted (such as a + file that is too large, or an infinite stream), the remaining contents of the + stream cannot be read safely. Depending on how the server handles this, clients + may show a "connection reset" failure instead of seeing the 413 response. + + .. versionchanged:: 2.3 + Check ``max_content_length`` preemptively and while reading. + + .. versionchanged:: 0.9 + The stream is always set (but may be consumed) even if form parsing was + accessed first. + """ + if self.shallow: + raise RuntimeError( + "This request was created with 'shallow=True', reading" + " from the input stream is disabled." + ) + + return get_input_stream( + self.environ, max_content_length=self.max_content_length + ) + + input_stream = environ_property[t.IO[bytes]]( + "wsgi.input", + doc="""The raw WSGI input stream, without any safety checks. + + This is dangerous to use. It does not guard against infinite streams or reading + past :attr:`content_length` or :attr:`max_content_length`. + + Use :attr:`stream` instead. + """, + ) + + @cached_property + def data(self) -> bytes: + """The raw data read from :attr:`stream`. Will be empty if the request + represents form data. + + To get the raw data even if it represents form data, use :meth:`get_data`. + """ + return self.get_data(parse_form_data=True) + + @t.overload + def get_data( + self, + cache: bool = True, + as_text: t.Literal[False] = False, + parse_form_data: bool = False, + ) -> bytes: ... + + @t.overload + def get_data( + self, + cache: bool = True, + as_text: t.Literal[True] = ..., + parse_form_data: bool = False, + ) -> str: ... + + def get_data( + self, cache: bool = True, as_text: bool = False, parse_form_data: bool = False + ) -> bytes | str: + """This reads the buffered incoming data from the client into one + bytes object. By default this is cached but that behavior can be + changed by setting `cache` to `False`. + + Usually it's a bad idea to call this method without checking the + content length first as a client could send dozens of megabytes or more + to cause memory problems on the server. + + Note that if the form data was already parsed this method will not + return anything as form data parsing does not cache the data like + this method does. To implicitly invoke form data parsing function + set `parse_form_data` to `True`. When this is done the return value + of this method will be an empty string if the form parser handles + the data. This generally is not necessary as if the whole data is + cached (which is the default) the form parser will used the cached + data to parse the form data. Please be generally aware of checking + the content length first in any case before calling this method + to avoid exhausting server memory. + + If `as_text` is set to `True` the return value will be a decoded + string. + + .. versionadded:: 0.9 + """ + rv = getattr(self, "_cached_data", None) + if rv is None: + if parse_form_data: + self._load_form_data() + rv = self.stream.read() + if cache: + self._cached_data = rv + if as_text: + rv = rv.decode(errors="replace") + return rv + + @cached_property + def form(self) -> ImmutableMultiDict[str, str]: + """The form parameters. By default an + :class:`~werkzeug.datastructures.ImmutableMultiDict` + is returned from this function. This can be changed by setting + :attr:`parameter_storage_class` to a different type. This might + be necessary if the order of the form data is important. + + Please keep in mind that file uploads will not end up here, but instead + in the :attr:`files` attribute. + + .. versionchanged:: 0.9 + + Previous to Werkzeug 0.9 this would only contain form data for POST + and PUT requests. + """ + self._load_form_data() + return self.form + + @cached_property + def values(self) -> CombinedMultiDict[str, str]: + """A :class:`werkzeug.datastructures.CombinedMultiDict` that + combines :attr:`args` and :attr:`form`. + + For GET requests, only ``args`` are present, not ``form``. + + .. versionchanged:: 2.0 + For GET requests, only ``args`` are present, not ``form``. + """ + sources = [self.args] + + if self.method != "GET": + # GET requests can have a body, and some caching proxies + # might not treat that differently than a normal GET + # request, allowing form data to "invisibly" affect the + # cache without indication in the query string / URL. + sources.append(self.form) + + args = [] + + for d in sources: + if not isinstance(d, MultiDict): + d = MultiDict(d) + + args.append(d) + + return CombinedMultiDict(args) + + @cached_property + def files(self) -> ImmutableMultiDict[str, FileStorage]: + """:class:`~werkzeug.datastructures.MultiDict` object containing + all uploaded files. Each key in :attr:`files` is the name from the + ````. Each value in :attr:`files` is a + Werkzeug :class:`~werkzeug.datastructures.FileStorage` object. + + It basically behaves like a standard file object you know from Python, + with the difference that it also has a + :meth:`~werkzeug.datastructures.FileStorage.save` function that can + store the file on the filesystem. + + Note that :attr:`files` will only contain data if the request method was + POST, PUT or PATCH and the ``

    `` that posted to the request had + ``enctype="multipart/form-data"``. It will be empty otherwise. + + See the :class:`~werkzeug.datastructures.MultiDict` / + :class:`~werkzeug.datastructures.FileStorage` documentation for + more details about the used data structure. + """ + self._load_form_data() + return self.files + + @property + def script_root(self) -> str: + """Alias for :attr:`self.root_path`. ``environ["SCRIPT_NAME"]`` + without a trailing slash. + """ + return self.root_path + + @cached_property + def url_root(self) -> str: + """Alias for :attr:`root_url`. The URL with scheme, host, and + root path. For example, ``https://example.com/app/``. + """ + return self.root_url + + remote_user = environ_property[str]( + "REMOTE_USER", + doc="""If the server supports user authentication, and the + script is protected, this attribute contains the username the + user has authenticated as.""", + ) + is_multithread = environ_property[bool]( + "wsgi.multithread", + doc="""boolean that is `True` if the application is served by a + multithreaded WSGI server.""", + ) + is_multiprocess = environ_property[bool]( + "wsgi.multiprocess", + doc="""boolean that is `True` if the application is served by a + WSGI server that spawns multiple processes.""", + ) + is_run_once = environ_property[bool]( + "wsgi.run_once", + doc="""boolean that is `True` if the application will be + executed only once in a process lifetime. This is the case for + CGI for example, but it's not guaranteed that the execution only + happens one time.""", + ) + + # JSON + + #: A module or other object that has ``dumps`` and ``loads`` + #: functions that match the API of the built-in :mod:`json` module. + json_module = json + + @property + def json(self) -> t.Any: + """The parsed JSON data if :attr:`mimetype` indicates JSON + (:mimetype:`application/json`, see :attr:`is_json`). + + Calls :meth:`get_json` with default arguments. + + If the request content type is not ``application/json``, this + will raise a 415 Unsupported Media Type error. + + .. versionchanged:: 2.3 + Raise a 415 error instead of 400. + + .. versionchanged:: 2.1 + Raise a 400 error if the content type is incorrect. + """ + return self.get_json() + + # Cached values for ``(silent=False, silent=True)``. Initialized + # with sentinel values. + _cached_json: tuple[t.Any, t.Any] = (Ellipsis, Ellipsis) + + @t.overload + def get_json( + self, force: bool = ..., silent: t.Literal[False] = ..., cache: bool = ... + ) -> t.Any: ... + + @t.overload + def get_json( + self, force: bool = ..., silent: bool = ..., cache: bool = ... + ) -> t.Any | None: ... + + def get_json( + self, force: bool = False, silent: bool = False, cache: bool = True + ) -> t.Any | None: + """Parse :attr:`data` as JSON. + + If the mimetype does not indicate JSON + (:mimetype:`application/json`, see :attr:`is_json`), or parsing + fails, :meth:`on_json_loading_failed` is called and + its return value is used as the return value. By default this + raises a 415 Unsupported Media Type resp. + + :param force: Ignore the mimetype and always try to parse JSON. + :param silent: Silence mimetype and parsing errors, and + return ``None`` instead. + :param cache: Store the parsed JSON to return for subsequent + calls. + + .. versionchanged:: 2.3 + Raise a 415 error instead of 400. + + .. versionchanged:: 2.1 + Raise a 400 error if the content type is incorrect. + """ + if cache and self._cached_json[silent] is not Ellipsis: + return self._cached_json[silent] + + if not (force or self.is_json): + if not silent: + return self.on_json_loading_failed(None) + else: + return None + + data = self.get_data(cache=cache) + + try: + rv = self.json_module.loads(data) + except ValueError as e: + if silent: + rv = None + + if cache: + normal_rv, _ = self._cached_json + self._cached_json = (normal_rv, rv) + else: + rv = self.on_json_loading_failed(e) + + if cache: + _, silent_rv = self._cached_json + self._cached_json = (rv, silent_rv) + else: + if cache: + self._cached_json = (rv, rv) + + return rv + + def on_json_loading_failed(self, e: ValueError | None) -> t.Any: + """Called if :meth:`get_json` fails and isn't silenced. + + If this method returns a value, it is used as the return value + for :meth:`get_json`. The default implementation raises + :exc:`~werkzeug.exceptions.BadRequest`. + + :param e: If parsing failed, this is the exception. It will be + ``None`` if the content type wasn't ``application/json``. + + .. versionchanged:: 2.3 + Raise a 415 error instead of 400. + """ + if e is not None: + raise BadRequest(f"Failed to decode JSON object: {e}") + + raise UnsupportedMediaType( + "Did not attempt to load JSON data because the request" + " Content-Type was not 'application/json'." + ) diff --git a/venv/lib/python3.11/site-packages/werkzeug/wrappers/response.py b/venv/lib/python3.11/site-packages/werkzeug/wrappers/response.py new file mode 100755 index 0000000..4707292 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/wrappers/response.py @@ -0,0 +1,838 @@ +from __future__ import annotations + +import json +import typing as t +from http import HTTPStatus +from urllib.parse import urljoin + +from .._internal import _get_environ +from ..datastructures import Headers +from ..http import generate_etag +from ..http import http_date +from ..http import is_resource_modified +from ..http import parse_etags +from ..http import parse_range_header +from ..http import remove_entity_headers +from ..sansio.response import Response as _SansIOResponse +from ..urls import iri_to_uri +from ..utils import cached_property +from ..wsgi import _RangeWrapper +from ..wsgi import ClosingIterator +from ..wsgi import get_current_url + +if t.TYPE_CHECKING: + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + from .request import Request + + +def _iter_encoded(iterable: t.Iterable[str | bytes]) -> t.Iterator[bytes]: + for item in iterable: + if isinstance(item, str): + yield item.encode() + else: + yield item + + +class Response(_SansIOResponse): + """Represents an outgoing WSGI HTTP response with body, status, and + headers. Has properties and methods for using the functionality + defined by various HTTP specs. + + The response body is flexible to support different use cases. The + simple form is passing bytes, or a string which will be encoded as + UTF-8. Passing an iterable of bytes or strings makes this a + streaming response. A generator is particularly useful for building + a CSV file in memory or using SSE (Server Sent Events). A file-like + object is also iterable, although the + :func:`~werkzeug.utils.send_file` helper should be used in that + case. + + The response object is itself a WSGI application callable. When + called (:meth:`__call__`) with ``environ`` and ``start_response``, + it will pass its status and headers to ``start_response`` then + return its body as an iterable. + + .. code-block:: python + + from werkzeug.wrappers.response import Response + + def index(): + return Response("Hello, World!") + + def application(environ, start_response): + path = environ.get("PATH_INFO") or "/" + + if path == "/": + response = index() + else: + response = Response("Not Found", status=404) + + return response(environ, start_response) + + :param response: The data for the body of the response. A string or + bytes, or tuple or list of strings or bytes, for a fixed-length + response, or any other iterable of strings or bytes for a + streaming response. Defaults to an empty body. + :param status: The status code for the response. Either an int, in + which case the default status message is added, or a string in + the form ``{code} {message}``, like ``404 Not Found``. Defaults + to 200. + :param headers: A :class:`~werkzeug.datastructures.Headers` object, + or a list of ``(key, value)`` tuples that will be converted to a + ``Headers`` object. + :param mimetype: The mime type (content type without charset or + other parameters) of the response. If the value starts with + ``text/`` (or matches some other special cases), the charset + will be added to create the ``content_type``. + :param content_type: The full content type of the response. + Overrides building the value from ``mimetype``. + :param direct_passthrough: Pass the response body directly through + as the WSGI iterable. This can be used when the body is a binary + file or other iterator of bytes, to skip some unnecessary + checks. Use :func:`~werkzeug.utils.send_file` instead of setting + this manually. + + .. versionchanged:: 2.1 + Old ``BaseResponse`` and mixin classes were removed. + + .. versionchanged:: 2.0 + Combine ``BaseResponse`` and mixins into a single ``Response`` + class. + + .. versionchanged:: 0.5 + The ``direct_passthrough`` parameter was added. + """ + + #: if set to `False` accessing properties on the response object will + #: not try to consume the response iterator and convert it into a list. + #: + #: .. versionadded:: 0.6.2 + #: + #: That attribute was previously called `implicit_seqence_conversion`. + #: (Notice the typo). If you did use this feature, you have to adapt + #: your code to the name change. + implicit_sequence_conversion = True + + #: If a redirect ``Location`` header is a relative URL, make it an + #: absolute URL, including scheme and domain. + #: + #: .. versionchanged:: 2.1 + #: This is disabled by default, so responses will send relative + #: redirects. + #: + #: .. versionadded:: 0.8 + autocorrect_location_header = False + + #: Should this response object automatically set the content-length + #: header if possible? This is true by default. + #: + #: .. versionadded:: 0.8 + automatically_set_content_length = True + + #: The response body to send as the WSGI iterable. A list of strings + #: or bytes represents a fixed-length response, any other iterable + #: is a streaming response. Strings are encoded to bytes as UTF-8. + #: + #: Do not set to a plain string or bytes, that will cause sending + #: the response to be very inefficient as it will iterate one byte + #: at a time. + response: t.Iterable[str] | t.Iterable[bytes] + + def __init__( + self, + response: t.Iterable[bytes] | bytes | t.Iterable[str] | str | None = None, + status: int | str | HTTPStatus | None = None, + headers: t.Mapping[str, str | t.Iterable[str]] + | t.Iterable[tuple[str, str]] + | None = None, + mimetype: str | None = None, + content_type: str | None = None, + direct_passthrough: bool = False, + ) -> None: + super().__init__( + status=status, + headers=headers, + mimetype=mimetype, + content_type=content_type, + ) + + #: Pass the response body directly through as the WSGI iterable. + #: This can be used when the body is a binary file or other + #: iterator of bytes, to skip some unnecessary checks. Use + #: :func:`~werkzeug.utils.send_file` instead of setting this + #: manually. + self.direct_passthrough = direct_passthrough + self._on_close: list[t.Callable[[], t.Any]] = [] + + # we set the response after the headers so that if a class changes + # the charset attribute, the data is set in the correct charset. + if response is None: + self.response = [] + elif isinstance(response, (str, bytes, bytearray)): + self.set_data(response) + else: + self.response = response + + def call_on_close(self, func: t.Callable[[], t.Any]) -> t.Callable[[], t.Any]: + """Adds a function to the internal list of functions that should + be called as part of closing down the response. Since 0.7 this + function also returns the function that was passed so that this + can be used as a decorator. + + .. versionadded:: 0.6 + """ + self._on_close.append(func) + return func + + def __repr__(self) -> str: + if self.is_sequence: + body_info = f"{sum(map(len, self.iter_encoded()))} bytes" + else: + body_info = "streamed" if self.is_streamed else "likely-streamed" + return f"<{type(self).__name__} {body_info} [{self.status}]>" + + @classmethod + def force_type( + cls, response: Response, environ: WSGIEnvironment | None = None + ) -> Response: + """Enforce that the WSGI response is a response object of the current + type. Werkzeug will use the :class:`Response` internally in many + situations like the exceptions. If you call :meth:`get_response` on an + exception you will get back a regular :class:`Response` object, even + if you are using a custom subclass. + + This method can enforce a given response type, and it will also + convert arbitrary WSGI callables into response objects if an environ + is provided:: + + # convert a Werkzeug response object into an instance of the + # MyResponseClass subclass. + response = MyResponseClass.force_type(response) + + # convert any WSGI application into a response object + response = MyResponseClass.force_type(response, environ) + + This is especially useful if you want to post-process responses in + the main dispatcher and use functionality provided by your subclass. + + Keep in mind that this will modify response objects in place if + possible! + + :param response: a response object or wsgi application. + :param environ: a WSGI environment object. + :return: a response object. + """ + if not isinstance(response, Response): + if environ is None: + raise TypeError( + "cannot convert WSGI application into response" + " objects without an environ" + ) + + from ..test import run_wsgi_app + + response = Response(*run_wsgi_app(response, environ)) + + response.__class__ = cls + return response + + @classmethod + def from_app( + cls, app: WSGIApplication, environ: WSGIEnvironment, buffered: bool = False + ) -> Response: + """Create a new response object from an application output. This + works best if you pass it an application that returns a generator all + the time. Sometimes applications may use the `write()` callable + returned by the `start_response` function. This tries to resolve such + edge cases automatically. But if you don't get the expected output + you should set `buffered` to `True` which enforces buffering. + + :param app: the WSGI application to execute. + :param environ: the WSGI environment to execute against. + :param buffered: set to `True` to enforce buffering. + :return: a response object. + """ + from ..test import run_wsgi_app + + return cls(*run_wsgi_app(app, environ, buffered)) + + @t.overload + def get_data(self, as_text: t.Literal[False] = False) -> bytes: ... + + @t.overload + def get_data(self, as_text: t.Literal[True]) -> str: ... + + def get_data(self, as_text: bool = False) -> bytes | str: + """The string representation of the response body. Whenever you call + this property the response iterable is encoded and flattened. This + can lead to unwanted behavior if you stream big data. + + This behavior can be disabled by setting + :attr:`implicit_sequence_conversion` to `False`. + + If `as_text` is set to `True` the return value will be a decoded + string. + + .. versionadded:: 0.9 + """ + self._ensure_sequence() + rv = b"".join(self.iter_encoded()) + + if as_text: + return rv.decode() + + return rv + + def set_data(self, value: bytes | str) -> None: + """Sets a new string as response. The value must be a string or + bytes. If a string is set it's encoded to the charset of the + response (utf-8 by default). + + .. versionadded:: 0.9 + """ + if isinstance(value, str): + value = value.encode() + self.response = [value] + if self.automatically_set_content_length: + self.headers["Content-Length"] = str(len(value)) + + data = property( + get_data, + set_data, + doc="A descriptor that calls :meth:`get_data` and :meth:`set_data`.", + ) + + def calculate_content_length(self) -> int | None: + """Returns the content length if available or `None` otherwise.""" + try: + self._ensure_sequence() + except RuntimeError: + return None + return sum(len(x) for x in self.iter_encoded()) + + def _ensure_sequence(self, mutable: bool = False) -> None: + """This method can be called by methods that need a sequence. If + `mutable` is true, it will also ensure that the response sequence + is a standard Python list. + + .. versionadded:: 0.6 + """ + if self.is_sequence: + # if we need a mutable object, we ensure it's a list. + if mutable and not isinstance(self.response, list): + self.response = list(self.response) # type: ignore + return + if self.direct_passthrough: + raise RuntimeError( + "Attempted implicit sequence conversion but the" + " response object is in direct passthrough mode." + ) + if not self.implicit_sequence_conversion: + raise RuntimeError( + "The response object required the iterable to be a" + " sequence, but the implicit conversion was disabled." + " Call make_sequence() yourself." + ) + self.make_sequence() + + def make_sequence(self) -> None: + """Converts the response iterator in a list. By default this happens + automatically if required. If `implicit_sequence_conversion` is + disabled, this method is not automatically called and some properties + might raise exceptions. This also encodes all the items. + + .. versionadded:: 0.6 + """ + if not self.is_sequence: + # if we consume an iterable we have to ensure that the close + # method of the iterable is called if available when we tear + # down the response + close = getattr(self.response, "close", None) + self.response = list(self.iter_encoded()) + if close is not None: + self.call_on_close(close) + + def iter_encoded(self) -> t.Iterator[bytes]: + """Iter the response encoded with the encoding of the response. + If the response object is invoked as WSGI application the return + value of this method is used as application iterator unless + :attr:`direct_passthrough` was activated. + """ + # Encode in a separate function so that self.response is fetched + # early. This allows us to wrap the response with the return + # value from get_app_iter or iter_encoded. + return _iter_encoded(self.response) + + @property + def is_streamed(self) -> bool: + """If the response is streamed (the response is not an iterable with + a length information) this property is `True`. In this case streamed + means that there is no information about the number of iterations. + This is usually `True` if a generator is passed to the response object. + + This is useful for checking before applying some sort of post + filtering that should not take place for streamed responses. + """ + try: + len(self.response) # type: ignore + except (TypeError, AttributeError): + return True + return False + + @property + def is_sequence(self) -> bool: + """If the iterator is buffered, this property will be `True`. A + response object will consider an iterator to be buffered if the + response attribute is a list or tuple. + + .. versionadded:: 0.6 + """ + return isinstance(self.response, (tuple, list)) + + def close(self) -> None: + """Close the wrapped response if possible. You can also use the object + in a with statement which will automatically close it. + + .. versionadded:: 0.9 + Can now be used in a with statement. + """ + if hasattr(self.response, "close"): + self.response.close() + for func in self._on_close: + func() + + def __enter__(self) -> Response: + return self + + def __exit__(self, exc_type, exc_value, tb): # type: ignore + self.close() + + def freeze(self) -> None: + """Make the response object ready to be pickled. Does the + following: + + * Buffer the response into a list, ignoring + :attr:`implicity_sequence_conversion` and + :attr:`direct_passthrough`. + * Set the ``Content-Length`` header. + * Generate an ``ETag`` header if one is not already set. + + .. versionchanged:: 2.1 + Removed the ``no_etag`` parameter. + + .. versionchanged:: 2.0 + An ``ETag`` header is always added. + + .. versionchanged:: 0.6 + The ``Content-Length`` header is set. + """ + # Always freeze the encoded response body, ignore + # implicit_sequence_conversion and direct_passthrough. + self.response = list(self.iter_encoded()) + self.headers["Content-Length"] = str(sum(map(len, self.response))) + self.add_etag() + + def get_wsgi_headers(self, environ: WSGIEnvironment) -> Headers: + """This is automatically called right before the response is started + and returns headers modified for the given environment. It returns a + copy of the headers from the response with some modifications applied + if necessary. + + For example the location header (if present) is joined with the root + URL of the environment. Also the content length is automatically set + to zero here for certain status codes. + + .. versionchanged:: 0.6 + Previously that function was called `fix_headers` and modified + the response object in place. Also since 0.6, IRIs in location + and content-location headers are handled properly. + + Also starting with 0.6, Werkzeug will attempt to set the content + length if it is able to figure it out on its own. This is the + case if all the strings in the response iterable are already + encoded and the iterable is buffered. + + :param environ: the WSGI environment of the request. + :return: returns a new :class:`~werkzeug.datastructures.Headers` + object. + """ + headers = Headers(self.headers) + location: str | None = None + content_location: str | None = None + content_length: str | int | None = None + status = self.status_code + + # iterate over the headers to find all values in one go. Because + # get_wsgi_headers is used each response that gives us a tiny + # speedup. + for key, value in headers: + ikey = key.lower() + if ikey == "location": + location = value + elif ikey == "content-location": + content_location = value + elif ikey == "content-length": + content_length = value + + if location is not None: + location = iri_to_uri(location) + + if self.autocorrect_location_header: + # Make the location header an absolute URL. + current_url = get_current_url(environ, strip_querystring=True) + current_url = iri_to_uri(current_url) + location = urljoin(current_url, location) + + headers["Location"] = location + + # make sure the content location is a URL + if content_location is not None: + headers["Content-Location"] = iri_to_uri(content_location) + + if 100 <= status < 200 or status == 204: + # Per section 3.3.2 of RFC 7230, "a server MUST NOT send a + # Content-Length header field in any response with a status + # code of 1xx (Informational) or 204 (No Content)." + headers.remove("Content-Length") + elif status == 304: + remove_entity_headers(headers) + + # if we can determine the content length automatically, we + # should try to do that. But only if this does not involve + # flattening the iterator or encoding of strings in the + # response. We however should not do that if we have a 304 + # response. + if ( + self.automatically_set_content_length + and self.is_sequence + and content_length is None + and status not in (204, 304) + and not (100 <= status < 200) + ): + content_length = sum(len(x) for x in self.iter_encoded()) + headers["Content-Length"] = str(content_length) + + return headers + + def get_app_iter(self, environ: WSGIEnvironment) -> t.Iterable[bytes]: + """Returns the application iterator for the given environ. Depending + on the request method and the current status code the return value + might be an empty response rather than the one from the response. + + If the request method is `HEAD` or the status code is in a range + where the HTTP specification requires an empty response, an empty + iterable is returned. + + .. versionadded:: 0.6 + + :param environ: the WSGI environment of the request. + :return: a response iterable. + """ + status = self.status_code + if ( + environ["REQUEST_METHOD"] == "HEAD" + or 100 <= status < 200 + or status in (204, 304) + ): + iterable: t.Iterable[bytes] = () + elif self.direct_passthrough: + return self.response # type: ignore + else: + iterable = self.iter_encoded() + return ClosingIterator(iterable, self.close) + + def get_wsgi_response( + self, environ: WSGIEnvironment + ) -> tuple[t.Iterable[bytes], str, list[tuple[str, str]]]: + """Returns the final WSGI response as tuple. The first item in + the tuple is the application iterator, the second the status and + the third the list of headers. The response returned is created + specially for the given environment. For example if the request + method in the WSGI environment is ``'HEAD'`` the response will + be empty and only the headers and status code will be present. + + .. versionadded:: 0.6 + + :param environ: the WSGI environment of the request. + :return: an ``(app_iter, status, headers)`` tuple. + """ + headers = self.get_wsgi_headers(environ) + app_iter = self.get_app_iter(environ) + return app_iter, self.status, headers.to_wsgi_list() + + def __call__( + self, environ: WSGIEnvironment, start_response: StartResponse + ) -> t.Iterable[bytes]: + """Process this response as WSGI application. + + :param environ: the WSGI environment. + :param start_response: the response callable provided by the WSGI + server. + :return: an application iterator + """ + app_iter, status, headers = self.get_wsgi_response(environ) + start_response(status, headers) + return app_iter + + # JSON + + #: A module or other object that has ``dumps`` and ``loads`` + #: functions that match the API of the built-in :mod:`json` module. + json_module = json + + @property + def json(self) -> t.Any | None: + """The parsed JSON data if :attr:`mimetype` indicates JSON + (:mimetype:`application/json`, see :attr:`is_json`). + + Calls :meth:`get_json` with default arguments. + """ + return self.get_json() + + @t.overload + def get_json(self, force: bool = ..., silent: t.Literal[False] = ...) -> t.Any: ... + + @t.overload + def get_json(self, force: bool = ..., silent: bool = ...) -> t.Any | None: ... + + def get_json(self, force: bool = False, silent: bool = False) -> t.Any | None: + """Parse :attr:`data` as JSON. Useful during testing. + + If the mimetype does not indicate JSON + (:mimetype:`application/json`, see :attr:`is_json`), this + returns ``None``. + + Unlike :meth:`Request.get_json`, the result is not cached. + + :param force: Ignore the mimetype and always try to parse JSON. + :param silent: Silence parsing errors and return ``None`` + instead. + """ + if not (force or self.is_json): + return None + + data = self.get_data() + + try: + return self.json_module.loads(data) + except ValueError: + if not silent: + raise + + return None + + # Stream + + @cached_property + def stream(self) -> ResponseStream: + """The response iterable as write-only stream.""" + return ResponseStream(self) + + def _wrap_range_response(self, start: int, length: int) -> None: + """Wrap existing Response in case of Range Request context.""" + if self.status_code == 206: + self.response = _RangeWrapper(self.response, start, length) # type: ignore + + def _is_range_request_processable(self, environ: WSGIEnvironment) -> bool: + """Return ``True`` if `Range` header is present and if underlying + resource is considered unchanged when compared with `If-Range` header. + """ + return ( + "HTTP_IF_RANGE" not in environ + or not is_resource_modified( + environ, + self.headers.get("etag"), + None, + self.headers.get("last-modified"), + ignore_if_range=False, + ) + ) and "HTTP_RANGE" in environ + + def _process_range_request( + self, + environ: WSGIEnvironment, + complete_length: int | None, + accept_ranges: bool | str, + ) -> bool: + """Handle Range Request related headers (RFC7233). If `Accept-Ranges` + header is valid, and Range Request is processable, we set the headers + as described by the RFC, and wrap the underlying response in a + RangeWrapper. + + Returns ``True`` if Range Request can be fulfilled, ``False`` otherwise. + + :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` + if `Range` header could not be parsed or satisfied. + + .. versionchanged:: 3.2 + Adds the ``Accept-Ranges`` header if ``accept_ranges`` is passed, + even if this is not a satisfiable range request. + + .. versionchanged:: 2.0 + Returns ``False`` if the length is 0. + """ + from ..exceptions import RequestedRangeNotSatisfiable + + if not accept_ranges: + return False + + if accept_ranges is True: + accept_ranges = "bytes" + + self.accept_ranges = accept_ranges + + if not (complete_length and self._is_range_request_processable(environ)): + return False + + parsed_range = parse_range_header(environ.get("HTTP_RANGE")) + + if parsed_range is None: + raise RequestedRangeNotSatisfiable(complete_length) + + range_tuple = parsed_range.range_for_length(complete_length) + content_range_header = parsed_range.to_content_range_header(complete_length) + + if range_tuple is None or content_range_header is None: + raise RequestedRangeNotSatisfiable(complete_length) + + content_length = range_tuple[1] - range_tuple[0] + self.content_length = content_length + self.content_range = content_range_header + self.status_code = 206 + self._wrap_range_response(range_tuple[0], content_length) + return True + + def make_conditional( + self, + request_or_environ: WSGIEnvironment | Request, + accept_ranges: bool | str = False, + complete_length: int | None = None, + ) -> Response: + """Make the response conditional to the request. This method works + best if an etag was defined for the response already. The `add_etag` + method can be used to do that. If called without etag just the date + header is set. + + This does nothing if the request method in the request or environ is + anything but GET or HEAD. + + For optimal performance when handling range requests, it's recommended + that your response data object implements `seekable`, `seek` and `tell` + methods as described by :py:class:`io.IOBase`. Objects returned by + :meth:`~werkzeug.wsgi.wrap_file` automatically implement those methods. + + It does not remove the body of the response because that's something + the :meth:`__call__` function does for us automatically. + + Returns self so that you can do ``return resp.make_conditional(req)`` + but modifies the object in-place. + + :param request_or_environ: a request object or WSGI environment to be + used to make the response conditional + against. + :param accept_ranges: This parameter dictates the value of + `Accept-Ranges` header. If ``False`` (default), + the header is not set. If ``True``, it will be set + to ``"bytes"``. If it's a string, it will use this + value. + :param complete_length: Will be used only in valid Range Requests. + It will set `Content-Range` complete length + value and compute `Content-Length` real value. + This parameter is mandatory for successful + Range Requests completion. + :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` + if `Range` header could not be parsed or satisfied. + + .. versionchangedd: 3.2 + Adds the ``Accept-Ranges`` header if ``accept_ranges`` is passed, + even if this is not a satisfiable range request. + + .. versionchanged:: 2.0 + Range processing is skipped if length is 0 instead of + raising a 416 Range Not Satisfiable error. + """ + environ = _get_environ(request_or_environ) + if environ["REQUEST_METHOD"] in ("GET", "HEAD"): + # if the date is not in the headers, add it now. We however + # will not override an already existing header. Unfortunately + # this header will be overridden by many WSGI servers including + # wsgiref. + if "date" not in self.headers: + self.headers["Date"] = http_date() + is206 = self._process_range_request(environ, complete_length, accept_ranges) + if not is206 and not is_resource_modified( + environ, + self.headers.get("etag"), + None, + self.headers.get("last-modified"), + ): + if parse_etags(environ.get("HTTP_IF_MATCH")): + self.status_code = 412 + else: + self.status_code = 304 + if ( + self.automatically_set_content_length + and "content-length" not in self.headers + ): + length = self.calculate_content_length() + if length is not None: + self.headers["Content-Length"] = str(length) + return self + + def add_etag(self, overwrite: bool = False, weak: bool = False) -> None: + """Add an etag for the current response if there is none yet. + + .. versionchanged:: 2.0 + SHA-1 is used to generate the value. MD5 may not be + available in some environments. + """ + if overwrite or "etag" not in self.headers: + self.set_etag(generate_etag(self.get_data()), weak) + + +class ResponseStream: + """A file descriptor like object used by :meth:`Response.stream` to + represent the body of the stream. It directly pushes into the + response iterable of the response object. + """ + + mode = "wb+" + + def __init__(self, response: Response): + self.response = response + self.closed = False + + def write(self, value: bytes) -> int: + if self.closed: + raise ValueError("I/O operation on closed file") + self.response._ensure_sequence(mutable=True) + self.response.response.append(value) # type: ignore + self.response.headers.pop("Content-Length", None) + return len(value) + + def writelines(self, seq: t.Iterable[bytes]) -> None: + for item in seq: + self.write(item) + + def close(self) -> None: + self.closed = True + + def flush(self) -> None: + if self.closed: + raise ValueError("I/O operation on closed file") + + def isatty(self) -> bool: + if self.closed: + raise ValueError("I/O operation on closed file") + return False + + def tell(self) -> int: + self.response._ensure_sequence() + return sum(map(len, self.response.response)) + + @property + def encoding(self) -> str: + return "utf-8" diff --git a/venv/lib/python3.11/site-packages/werkzeug/wsgi.py b/venv/lib/python3.11/site-packages/werkzeug/wsgi.py new file mode 100755 index 0000000..8aa1b44 --- /dev/null +++ b/venv/lib/python3.11/site-packages/werkzeug/wsgi.py @@ -0,0 +1,609 @@ +from __future__ import annotations + +import io +import typing as t +from functools import partial +from functools import update_wrapper + +from .exceptions import ClientDisconnected +from .exceptions import RequestEntityTooLarge +from .sansio import utils as _sansio_utils +from .sansio.utils import host_is_trusted # noqa: F401 # Imported as part of API + +if t.TYPE_CHECKING: + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +def responder(f: t.Callable[..., WSGIApplication]) -> WSGIApplication: + """Marks a function as responder. Decorate a function with it and it + will automatically call the return value as WSGI application. + + Example:: + + @responder + def application(environ, start_response): + return Response('Hello World!') + """ + return update_wrapper(lambda *a: f(*a)(*a[-2:]), f) + + +def get_current_url( + environ: WSGIEnvironment, + root_only: bool = False, + strip_querystring: bool = False, + host_only: bool = False, + trusted_hosts: t.Collection[str] | None = None, +) -> str: + """Recreate the URL for a request from the parts in a WSGI + environment. + + The URL is an IRI, not a URI, so it may contain Unicode characters. + Use :func:`~werkzeug.urls.iri_to_uri` to convert it to ASCII. + + :param environ: The WSGI environment to get the URL parts from. + :param root_only: Only build the root path, don't include the + remaining path or query string. + :param strip_querystring: Don't include the query string. + :param host_only: Only build the scheme and host. + :param trusted_hosts: A list of trusted host names to validate the + host against. + """ + parts = { + "scheme": environ["wsgi.url_scheme"], + "host": get_host(environ, trusted_hosts), + } + + if not host_only: + parts["root_path"] = environ.get("SCRIPT_NAME", "") + + if not root_only: + parts["path"] = environ.get("PATH_INFO", "") + + if not strip_querystring: + parts["query_string"] = environ.get("QUERY_STRING", "").encode("latin1") + + return _sansio_utils.get_current_url(**parts) + + +def _get_server( + environ: WSGIEnvironment, +) -> tuple[str, int | None] | None: + name = environ.get("SERVER_NAME") + + if name is None: + return None + + try: + port: int | None = int(environ.get("SERVER_PORT", None)) # type: ignore[arg-type] + except (TypeError, ValueError): + # unix socket + port = None + + return name, port + + +def get_host( + environ: WSGIEnvironment, trusted_hosts: t.Collection[str] | None = None +) -> str: + """Get and validate a request's ``host:port`` based on the values in the + given WSGI environ. + + The ``Host`` header sent by the client is preferred. Otherwise, the server's + configured address is used. If the server address is a Unix socket, it is + ignored. The port is omitted if it matches the standard HTTP or HTTPS ports. + + The value is passed through :func:`host_is_trusted`. The host must be made + up of valid characters, but this does not check validity beyond that. If a + list of trusted domains is given, the domain must match one. + + :param environ: The WSGI environ. + :param trusted_hosts: A list of trusted domains to match. These should + already be IDNA encoded, but will be encoded if needed. The port is + ignored for this check. If a name starts with a dot it will match as a + suffix, accepting all subdomains. If empty or ``None``, all domains are + allowed. + + :return: Host, with port if necessary. + :raise .SecurityError: If the host is not trusted. + + .. versionchanged:: 3.2 + The characters of the host value are validated. The empty string is no + longer allowed if no header value is available. + + .. versionchanged:: 3.2 + When using the server address, Unix sockets are ignored. + + .. versionchanged:: 3.1.3 + If ``SERVER_NAME`` is IPv6, it is wrapped in ``[]``. + """ + return _sansio_utils.get_host( + environ["wsgi.url_scheme"], + environ.get("HTTP_HOST"), + _get_server(environ), + trusted_hosts, + ) + + +def get_content_length(environ: WSGIEnvironment) -> int | None: + """Return the ``Content-Length`` header value as an int. If the header is not given + or the ``Transfer-Encoding`` header is ``chunked``, ``None`` is returned to indicate + a streaming request. If the value is not an integer, or negative, 0 is returned. + + :param environ: The WSGI environ to get the content length from. + + .. versionadded:: 0.9 + """ + return _sansio_utils.get_content_length( + http_content_length=environ.get("CONTENT_LENGTH"), + http_transfer_encoding=environ.get("HTTP_TRANSFER_ENCODING"), + ) + + +def get_input_stream( + environ: WSGIEnvironment, + safe_fallback: bool = True, + max_content_length: int | None = None, +) -> t.IO[bytes]: + """Return the WSGI input stream, wrapped so that it may be read safely without going + past the ``Content-Length`` header value or ``max_content_length``. + + If ``Content-Length`` exceeds ``max_content_length``, a + :exc:`RequestEntityTooLarge`` ``413 Content Too Large`` error is raised. + + If the WSGI server sets ``environ["wsgi.input_terminated"]``, it indicates that the + server handles terminating the stream, so it is safe to read directly. For example, + a server that knows how to handle chunked requests safely would set this. + + If ``max_content_length`` is set, it can be enforced on streams if + ``wsgi.input_terminated`` is set. Otherwise, an empty stream is returned unless the + user explicitly disables this safe fallback. + + If the limit is reached before the underlying stream is exhausted (such as a file + that is too large, or an infinite stream), the remaining contents of the stream + cannot be read safely. Depending on how the server handles this, clients may show a + "connection reset" failure instead of seeing the 413 response. + + :param environ: The WSGI environ containing the stream. + :param safe_fallback: Return an empty stream when ``Content-Length`` is not set. + Disabling this allows infinite streams, which can be a denial-of-service risk. + :param max_content_length: The maximum length that content-length or streaming + requests may not exceed. + + .. versionchanged:: 2.3.2 + ``max_content_length`` is only applied to streaming requests if the server sets + ``wsgi.input_terminated``. + + .. versionchanged:: 2.3 + Check ``max_content_length`` and raise an error if it is exceeded. + + .. versionadded:: 0.9 + """ + stream = t.cast(t.IO[bytes], environ["wsgi.input"]) + content_length = get_content_length(environ) + + if content_length is not None and max_content_length is not None: + if content_length > max_content_length: + raise RequestEntityTooLarge() + + # A WSGI server can set this to indicate that it terminates the input stream. In + # that case the stream is safe without wrapping, or can enforce a max length. + if "wsgi.input_terminated" in environ: + if max_content_length is not None: + # If this is moved above, it can cause the stream to hang if a read attempt + # is made when the client sends no data. For example, the development server + # does not handle buffering except for chunked encoding. + return t.cast( + t.IO[bytes], LimitedStream(stream, max_content_length, is_max=True) + ) + + return stream + + # No limit given, return an empty stream unless the user explicitly allows the + # potentially infinite stream. An infinite stream is dangerous if it's not expected, + # as it can tie up a worker indefinitely. + if content_length is None: + return io.BytesIO() if safe_fallback else stream + + return t.cast(t.IO[bytes], LimitedStream(stream, content_length)) + + +def get_path_info(environ: WSGIEnvironment) -> str: + """Return ``PATH_INFO`` from the WSGI environment. + + :param environ: WSGI environment to get the path from. + + .. versionchanged:: 3.0 + The ``charset`` and ``errors`` parameters were removed. + + .. versionadded:: 0.9 + """ + path: bytes = environ.get("PATH_INFO", "").encode("latin1") + return path.decode(errors="replace") + + +class ClosingIterator: + """The WSGI specification requires that all middlewares and gateways + respect the `close` callback of the iterable returned by the application. + Because it is useful to add another close action to a returned iterable + and adding a custom iterable is a boring task this class can be used for + that:: + + return ClosingIterator(app(environ, start_response), [cleanup_session, + cleanup_locals]) + + If there is just one close function it can be passed instead of the list. + + A closing iterator is not needed if the application uses response objects + and finishes the processing if the response is started:: + + try: + return response(environ, start_response) + finally: + cleanup_session() + cleanup_locals() + """ + + def __init__( + self, + iterable: t.Iterable[bytes], + callbacks: None + | (t.Callable[[], None] | t.Iterable[t.Callable[[], None]]) = None, + ) -> None: + iterator = iter(iterable) + self._next = t.cast(t.Callable[[], bytes], partial(next, iterator)) + if callbacks is None: + callbacks = [] + elif callable(callbacks): + callbacks = [callbacks] + else: + callbacks = list(callbacks) + iterable_close = getattr(iterable, "close", None) + if iterable_close: + callbacks.insert(0, iterable_close) + self._callbacks = callbacks + + def __iter__(self) -> ClosingIterator: + return self + + def __next__(self) -> bytes: + return self._next() + + def close(self) -> None: + for callback in self._callbacks: + callback() + + +def wrap_file( + environ: WSGIEnvironment, file: t.IO[bytes], buffer_size: int = 8192 +) -> t.Iterable[bytes]: + """Wraps a file. This uses the WSGI server's file wrapper if available + or otherwise the generic :class:`FileWrapper`. + + .. versionadded:: 0.5 + + If the file wrapper from the WSGI server is used it's important to not + iterate over it from inside the application but to pass it through + unchanged. If you want to pass out a file wrapper inside a response + object you have to set :attr:`Response.direct_passthrough` to `True`. + + More information about file wrappers are available in :pep:`333`. + + :param file: a :class:`file`-like object with a :meth:`~file.read` method. + :param buffer_size: number of bytes for one iteration. + """ + return environ.get("wsgi.file_wrapper", FileWrapper)( # type: ignore + file, buffer_size + ) + + +class FileWrapper: + """This class can be used to convert a :class:`file`-like object into + an iterable. It yields `buffer_size` blocks until the file is fully + read. + + You should not use this class directly but rather use the + :func:`wrap_file` function that uses the WSGI server's file wrapper + support if it's available. + + .. versionadded:: 0.5 + + If you're using this object together with a :class:`Response` you have + to use the `direct_passthrough` mode. + + :param file: a :class:`file`-like object with a :meth:`~file.read` method. + :param buffer_size: number of bytes for one iteration. + """ + + def __init__(self, file: t.IO[bytes], buffer_size: int = 8192) -> None: + self.file = file + self.buffer_size = buffer_size + + def close(self) -> None: + if hasattr(self.file, "close"): + self.file.close() + + def seekable(self) -> bool: + if hasattr(self.file, "seekable"): + return self.file.seekable() + if hasattr(self.file, "seek"): + return True + return False + + def seek(self, *args: t.Any) -> None: + if hasattr(self.file, "seek"): + self.file.seek(*args) + + def tell(self) -> int | None: + if hasattr(self.file, "tell"): + return self.file.tell() + return None + + def __iter__(self) -> FileWrapper: + return self + + def __next__(self) -> bytes: + data = self.file.read(self.buffer_size) + if data: + return data + raise StopIteration() + + +class _RangeWrapper: + # private for now, but should we make it public in the future ? + + """This class can be used to convert an iterable object into + an iterable that will only yield a piece of the underlying content. + It yields blocks until the underlying stream range is fully read. + The yielded blocks will have a size that can't exceed the original + iterator defined block size, but that can be smaller. + + If you're using this object together with a :class:`Response` you have + to use the `direct_passthrough` mode. + + :param iterable: an iterable object with a :meth:`__next__` method. + :param start_byte: byte from which read will start. + :param byte_range: how many bytes to read. + """ + + def __init__( + self, + iterable: t.Iterable[bytes] | t.IO[bytes], + start_byte: int = 0, + byte_range: int | None = None, + ): + self.iterable = iter(iterable) + self.byte_range = byte_range + self.start_byte = start_byte + self.end_byte = None + + if byte_range is not None: + self.end_byte = start_byte + byte_range + + self.read_length = 0 + self.seekable = hasattr(iterable, "seekable") and iterable.seekable() + self.end_reached = False + + def __iter__(self) -> _RangeWrapper: + return self + + def _next_chunk(self) -> bytes: + try: + chunk = next(self.iterable) + self.read_length += len(chunk) + return chunk + except StopIteration: + self.end_reached = True + raise + + def _first_iteration(self) -> tuple[bytes | None, int]: + chunk = None + if self.seekable: + self.iterable.seek(self.start_byte) # type: ignore + self.read_length = self.iterable.tell() # type: ignore + contextual_read_length = self.read_length + else: + while self.read_length <= self.start_byte: + chunk = self._next_chunk() + if chunk is not None: + chunk = chunk[self.start_byte - self.read_length :] + contextual_read_length = self.start_byte + return chunk, contextual_read_length + + def _next(self) -> bytes: + if self.end_reached: + raise StopIteration() + chunk = None + contextual_read_length = self.read_length + if self.read_length == 0: + chunk, contextual_read_length = self._first_iteration() + if chunk is None: + chunk = self._next_chunk() + if self.end_byte is not None and self.read_length >= self.end_byte: + self.end_reached = True + return chunk[: self.end_byte - contextual_read_length] + return chunk + + def __next__(self) -> bytes: + chunk = self._next() + if chunk: + return chunk + self.end_reached = True + raise StopIteration() + + def close(self) -> None: + if hasattr(self.iterable, "close"): + self.iterable.close() + + +class LimitedStream(io.RawIOBase): + """Wrap a stream so that it doesn't read more than a given limit. This is used to + limit ``wsgi.input`` to the ``Content-Length`` header value or + :attr:`.Request.max_content_length`. + + When attempting to read after the limit has been reached, :meth:`on_exhausted` is + called. When the limit is a maximum, this raises :exc:`.RequestEntityTooLarge`. + + If reading from the stream returns zero bytes or raises an error, + :meth:`on_disconnect` is called, which raises :exc:`.ClientDisconnected`. When the + limit is a maximum and zero bytes were read, no error is raised, since it may be the + end of the stream. + + If the limit is reached before the underlying stream is exhausted (such as a file + that is too large, or an infinite stream), the remaining contents of the stream + cannot be read safely. Depending on how the server handles this, clients may show a + "connection reset" failure instead of seeing the 413 response. + + :param stream: The stream to read from. Must be a readable binary IO object. + :param limit: The limit in bytes to not read past. Should be either the + ``Content-Length`` header value or ``request.max_content_length``. + :param is_max: Whether the given ``limit`` is ``request.max_content_length`` instead + of the ``Content-Length`` header value. This changes how exhausted and + disconnect events are handled. + + .. versionchanged:: 2.3 + Handle ``max_content_length`` differently than ``Content-Length``. + + .. versionchanged:: 2.3 + Implements ``io.RawIOBase`` rather than ``io.IOBase``. + """ + + def __init__(self, stream: t.IO[bytes], limit: int, is_max: bool = False) -> None: + self._stream = stream + self._pos = 0 + self.limit = limit + self._limit_is_max = is_max + + @property + def is_exhausted(self) -> bool: + """Whether the current stream position has reached the limit.""" + return self._pos >= self.limit + + def on_exhausted(self) -> None: + """Called when attempting to read after the limit has been reached. + + The default behavior is to do nothing, unless the limit is a maximum, in which + case it raises :exc:`.RequestEntityTooLarge`. + + .. versionchanged:: 2.3 + Raises ``RequestEntityTooLarge`` if the limit is a maximum. + + .. versionchanged:: 2.3 + Any return value is ignored. + """ + if self._limit_is_max: + raise RequestEntityTooLarge() + + def on_disconnect(self, error: Exception | None = None) -> None: + """Called when an attempted read receives zero bytes before the limit was + reached. This indicates that the client disconnected before sending the full + request body. + + The default behavior is to raise :exc:`.ClientDisconnected`, unless the limit is + a maximum and no error was raised. + + .. versionchanged:: 2.3 + Added the ``error`` parameter. Do nothing if the limit is a maximum and no + error was raised. + + .. versionchanged:: 2.3 + Any return value is ignored. + """ + if not self._limit_is_max or error is not None: + raise ClientDisconnected() + + # If the limit is a maximum, then we may have read zero bytes because the + # streaming body is complete. There's no way to distinguish that from the + # client disconnecting early. + + def exhaust(self) -> bytes: + """Exhaust the stream by reading until the limit is reached or the client + disconnects, returning the remaining data. + + .. versionchanged:: 2.3 + Return the remaining data. + + .. versionchanged:: 2.2.3 + Handle case where wrapped stream returns fewer bytes than requested. + """ + if not self.is_exhausted: + return self.readall() + + return b"" + + def readinto(self, b: bytearray) -> int | None: # type: ignore[override] + size = len(b) + remaining = self.limit - self._pos + + if remaining <= 0: + self.on_exhausted() + return 0 + + if hasattr(self._stream, "readinto"): + # Use stream.readinto if it's available. + if size <= remaining: + # The size fits in the remaining limit, use the buffer directly. + try: + out_size: int | None = self._stream.readinto(b) + except (OSError, ValueError) as e: + self.on_disconnect(error=e) + return 0 + else: + # Use a temp buffer with the remaining limit as the size. + temp_b = bytearray(remaining) + + try: + out_size = self._stream.readinto(temp_b) + except (OSError, ValueError) as e: + self.on_disconnect(error=e) + return 0 + + if out_size: + b[:out_size] = temp_b + else: + # WSGI requires that stream.read is available. + try: + data = self._stream.read(min(size, remaining)) + except (OSError, ValueError) as e: + self.on_disconnect(error=e) + return 0 + + out_size = len(data) + b[:out_size] = data + + if not out_size: + # Read zero bytes from the stream. + self.on_disconnect() + return 0 + + self._pos += out_size + return out_size + + def readall(self) -> bytes: + if self.is_exhausted: + self.on_exhausted() + return b"" + + out = bytearray() + + # The parent implementation uses "while True", which results in an extra read. + while not self.is_exhausted: + data = self.read(1024 * 64) + + # Stream may return empty before a max limit is reached. + if not data: + break + + out.extend(data) + + return bytes(out) + + def tell(self) -> int: + """Return the current stream position. + + .. versionadded:: 0.9 + """ + return self._pos + + def readable(self) -> bool: + return True diff --git a/venv/pyvenv.cfg b/venv/pyvenv.cfg new file mode 100755 index 0000000..8a88175 --- /dev/null +++ b/venv/pyvenv.cfg @@ -0,0 +1,5 @@ +home = /Library/Frameworks/Python.framework/Versions/3.11/bin +include-system-site-packages = false +version = 3.11.9 +executable = /Library/Frameworks/Python.framework/Versions/3.11/bin/python3.11 +command = /Library/Frameworks/Python.framework/Versions/3.11/bin/python3 -m venv /Volumes/sandisk128/flask/pyfleet/venv
  • g#Jz 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 J2VnmAe*<#dBpUz# literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/formatting/formatting.py b/venv/lib/python3.11/site-packages/openpyxl/formatting/formatting.py new file mode 100755 index 0000000..bf622bf --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/formatting/formatting.py @@ -0,0 +1,114 @@ +# Copyright (c) 2010-2024 openpyxl + +from collections import OrderedDict + +from openpyxl.descriptors import ( + Bool, + Sequence, + Alias, + Convertible, +) +from openpyxl.descriptors.serialisable import Serialisable + +from .rule import Rule + +from openpyxl.worksheet.cell_range import MultiCellRange + +class ConditionalFormatting(Serialisable): + + tagname = "conditionalFormatting" + + sqref = Convertible(expected_type=MultiCellRange) + cells = Alias("sqref") + pivot = Bool(allow_none=True) + cfRule = Sequence(expected_type=Rule) + rules = Alias("cfRule") + + + def __init__(self, sqref=(), pivot=None, cfRule=(), extLst=None): + self.sqref = sqref + self.pivot = pivot + self.cfRule = cfRule + + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + return self.sqref == other.sqref + + + def __hash__(self): + return hash(self.sqref) + + + def __repr__(self): + return "<{cls} {cells}>".format(cls=self.__class__.__name__, cells=self.sqref) + + + def __contains__(self, coord): + """ + Check whether a certain cell is affected by the formatting + """ + return coord in self.sqref + + +class ConditionalFormattingList: + """Conditional formatting rules.""" + + + def __init__(self): + self._cf_rules = OrderedDict() + self.max_priority = 0 + + + def add(self, range_string, cfRule): + """Add a rule such as ColorScaleRule, FormulaRule or CellIsRule + + The priority will be added automatically. + """ + cf = range_string + if isinstance(range_string, str): + cf = ConditionalFormatting(range_string) + if not isinstance(cfRule, Rule): + raise ValueError("Only instances of openpyxl.formatting.rule.Rule may be added") + rule = cfRule + self.max_priority += 1 + if not rule.priority: + rule.priority = self.max_priority + + self._cf_rules.setdefault(cf, []).append(rule) + + + def __bool__(self): + return bool(self._cf_rules) + + + def __len__(self): + return len(self._cf_rules) + + + def __iter__(self): + for cf, rules in self._cf_rules.items(): + cf.rules = rules + yield cf + + + def __getitem__(self, key): + """ + Get the rules for a cell range + """ + if isinstance(key, str): + key = ConditionalFormatting(sqref=key) + return self._cf_rules[key] + + + def __delitem__(self, key): + key = ConditionalFormatting(sqref=key) + del self._cf_rules[key] + + + def __setitem__(self, key, rule): + """ + Add a rule for a cell range + """ + self.add(key, rule) diff --git a/venv/lib/python3.11/site-packages/openpyxl/formatting/rule.py b/venv/lib/python3.11/site-packages/openpyxl/formatting/rule.py new file mode 100755 index 0000000..c4ba7f8 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/formatting/rule.py @@ -0,0 +1,291 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, + String, + Sequence, + Bool, + NoneSet, + Set, + Integer, + Float, +) +from openpyxl.descriptors.excel import ExtensionList +from openpyxl.styles.colors import Color, ColorDescriptor +from openpyxl.styles.differential import DifferentialStyle + +from openpyxl.utils.cell import COORD_RE + + +class ValueDescriptor(Float): + """ + Expected type depends upon type attribute of parent :-( + + Most values should be numeric BUT they can also be cell references + """ + + def __set__(self, instance, value): + ref = None + if value is not None and isinstance(value, str): + ref = COORD_RE.match(value) + if instance.type == "formula" or ref: + self.expected_type = str + else: + self.expected_type = float + super().__set__(instance, value) + + +class FormatObject(Serialisable): + + tagname = "cfvo" + + type = Set(values=(['num', 'percent', 'max', 'min', 'formula', 'percentile'])) + val = ValueDescriptor(allow_none=True) + gte = Bool(allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + + __elements__ = () + + def __init__(self, + type, + val=None, + gte=None, + extLst=None, + ): + self.type = type + self.val = val + self.gte = gte + + +class RuleType(Serialisable): + + cfvo = Sequence(expected_type=FormatObject) + + +class IconSet(RuleType): + + tagname = "iconSet" + + iconSet = NoneSet(values=(['3Arrows', '3ArrowsGray', '3Flags', + '3TrafficLights1', '3TrafficLights2', '3Signs', '3Symbols', '3Symbols2', + '4Arrows', '4ArrowsGray', '4RedToBlack', '4Rating', '4TrafficLights', + '5Arrows', '5ArrowsGray', '5Rating', '5Quarters'])) + showValue = Bool(allow_none=True) + percent = Bool(allow_none=True) + reverse = Bool(allow_none=True) + + __elements__ = ("cfvo",) + + def __init__(self, + iconSet=None, + showValue=None, + percent=None, + reverse=None, + cfvo=None, + ): + self.iconSet = iconSet + self.showValue = showValue + self.percent = percent + self.reverse = reverse + self.cfvo = cfvo + + +class DataBar(RuleType): + + tagname = "dataBar" + + minLength = Integer(allow_none=True) + maxLength = Integer(allow_none=True) + showValue = Bool(allow_none=True) + color = ColorDescriptor() + + __elements__ = ('cfvo', 'color') + + def __init__(self, + minLength=None, + maxLength=None, + showValue=None, + cfvo=None, + color=None, + ): + self.minLength = minLength + self.maxLength = maxLength + self.showValue = showValue + self.cfvo = cfvo + self.color = color + + +class ColorScale(RuleType): + + tagname = "colorScale" + + color = Sequence(expected_type=Color) + + __elements__ = ('cfvo', 'color') + + def __init__(self, + cfvo=None, + color=None, + ): + self.cfvo = cfvo + self.color = color + + +class Rule(Serialisable): + + tagname = "cfRule" + + type = Set(values=(['expression', 'cellIs', 'colorScale', 'dataBar', + 'iconSet', 'top10', 'uniqueValues', 'duplicateValues', 'containsText', + 'notContainsText', 'beginsWith', 'endsWith', 'containsBlanks', + 'notContainsBlanks', 'containsErrors', 'notContainsErrors', 'timePeriod', + 'aboveAverage'])) + dxfId = Integer(allow_none=True) + priority = Integer() + stopIfTrue = Bool(allow_none=True) + aboveAverage = Bool(allow_none=True) + percent = Bool(allow_none=True) + bottom = Bool(allow_none=True) + operator = NoneSet(values=(['lessThan', 'lessThanOrEqual', 'equal', + 'notEqual', 'greaterThanOrEqual', 'greaterThan', 'between', 'notBetween', + 'containsText', 'notContains', 'beginsWith', 'endsWith'])) + text = String(allow_none=True) + timePeriod = NoneSet(values=(['today', 'yesterday', 'tomorrow', 'last7Days', + 'thisMonth', 'lastMonth', 'nextMonth', 'thisWeek', 'lastWeek', + 'nextWeek'])) + rank = Integer(allow_none=True) + stdDev = Integer(allow_none=True) + equalAverage = Bool(allow_none=True) + formula = Sequence(expected_type=str) + colorScale = Typed(expected_type=ColorScale, allow_none=True) + dataBar = Typed(expected_type=DataBar, allow_none=True) + iconSet = Typed(expected_type=IconSet, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + dxf = Typed(expected_type=DifferentialStyle, allow_none=True) + + __elements__ = ('colorScale', 'dataBar', 'iconSet', 'formula') + __attrs__ = ('type', 'rank', 'priority', 'equalAverage', 'operator', + 'aboveAverage', 'dxfId', 'stdDev', 'stopIfTrue', 'timePeriod', 'text', + 'percent', 'bottom') + + + def __init__(self, + type, + dxfId=None, + priority=0, + stopIfTrue=None, + aboveAverage=None, + percent=None, + bottom=None, + operator=None, + text=None, + timePeriod=None, + rank=None, + stdDev=None, + equalAverage=None, + formula=(), + colorScale=None, + dataBar=None, + iconSet=None, + extLst=None, + dxf=None, + ): + self.type = type + self.dxfId = dxfId + self.priority = priority + self.stopIfTrue = stopIfTrue + self.aboveAverage = aboveAverage + self.percent = percent + self.bottom = bottom + self.operator = operator + self.text = text + self.timePeriod = timePeriod + self.rank = rank + self.stdDev = stdDev + self.equalAverage = equalAverage + self.formula = formula + self.colorScale = colorScale + self.dataBar = dataBar + self.iconSet = iconSet + self.dxf = dxf + + +def ColorScaleRule(start_type=None, + start_value=None, + start_color=None, + mid_type=None, + mid_value=None, + mid_color=None, + end_type=None, + end_value=None, + end_color=None): + + """Backwards compatibility""" + formats = [] + if start_type is not None: + formats.append(FormatObject(type=start_type, val=start_value)) + if mid_type is not None: + formats.append(FormatObject(type=mid_type, val=mid_value)) + if end_type is not None: + formats.append(FormatObject(type=end_type, val=end_value)) + colors = [] + for v in (start_color, mid_color, end_color): + if v is not None: + if not isinstance(v, Color): + v = Color(v) + colors.append(v) + cs = ColorScale(cfvo=formats, color=colors) + rule = Rule(type="colorScale", colorScale=cs) + return rule + + +def FormulaRule(formula=None, stopIfTrue=None, font=None, border=None, + fill=None): + """ + Conditional formatting with custom differential style + """ + rule = Rule(type="expression", formula=formula, stopIfTrue=stopIfTrue) + rule.dxf = DifferentialStyle(font=font, border=border, fill=fill) + return rule + + +def CellIsRule(operator=None, formula=None, stopIfTrue=None, font=None, border=None, fill=None): + """ + Conditional formatting rule based on cell contents. + """ + # Excel doesn't use >, >=, etc, but allow for ease of python development + expand = {">": "greaterThan", ">=": "greaterThanOrEqual", "<": "lessThan", "<=": "lessThanOrEqual", + "=": "equal", "==": "equal", "!=": "notEqual"} + + operator = expand.get(operator, operator) + + rule = Rule(type='cellIs', operator=operator, formula=formula, stopIfTrue=stopIfTrue) + rule.dxf = DifferentialStyle(font=font, border=border, fill=fill) + + return rule + + +def IconSetRule(icon_style=None, type=None, values=None, showValue=None, percent=None, reverse=None): + """ + Convenience function for creating icon set rules + """ + cfvo = [] + for val in values: + cfvo.append(FormatObject(type, val)) + icon_set = IconSet(iconSet=icon_style, cfvo=cfvo, showValue=showValue, + percent=percent, reverse=reverse) + rule = Rule(type='iconSet', iconSet=icon_set) + + return rule + + +def DataBarRule(start_type=None, start_value=None, end_type=None, + end_value=None, color=None, showValue=None, minLength=None, maxLength=None): + start = FormatObject(start_type, start_value) + end = FormatObject(end_type, end_value) + data_bar = DataBar(cfvo=[start, end], color=color, showValue=showValue, + minLength=minLength, maxLength=maxLength) + rule = Rule(type='dataBar', dataBar=data_bar) + + return rule diff --git a/venv/lib/python3.11/site-packages/openpyxl/formula/__init__.py b/venv/lib/python3.11/site-packages/openpyxl/formula/__init__.py new file mode 100755 index 0000000..a98a0c4 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/formula/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2010-2024 openpyxl + +from .tokenizer import Tokenizer diff --git a/venv/lib/python3.11/site-packages/openpyxl/formula/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/formula/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..cce9a40f94924554e2d371f460c0bc51cdd2d3a0 GIT binary patch literal 264 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/formula/__pycache__/translate.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/formula/__pycache__/translate.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..67a5d58a4bc3ce654ac4a47ecb61576ba78ce6f0 GIT binary patch literal 8154 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 PwKaUk#$RlMWt{wPe3`8m literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/formula/tokenizer.py b/venv/lib/python3.11/site-packages/openpyxl/formula/tokenizer.py new file mode 100755 index 0000000..9bf2624 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/formula/tokenizer.py @@ -0,0 +1,446 @@ +""" +This module contains a tokenizer for Excel formulae. + +The tokenizer is based on the Javascript tokenizer found at +http://ewbi.blogs.com/develops/2004/12/excel_formula_p.html written by Eric +Bachtal +""" + +import re + + +class TokenizerError(Exception): + """Base class for all Tokenizer errors.""" + + +class Tokenizer: + + """ + A tokenizer for Excel worksheet formulae. + + Converts a str string representing an Excel formula (in A1 notation) + into a sequence of `Token` objects. + + `formula`: The str string to tokenize + + Tokenizer defines a method `._parse()` to parse the formula into tokens, + which can then be accessed through the `.items` attribute. + + """ + + SN_RE = re.compile("^[1-9](\\.[0-9]+)?[Ee]$") # Scientific notation + WSPACE_RE = re.compile(r"[ \n]+") + STRING_REGEXES = { + # Inside a string, all characters are treated as literals, except for + # the quote character used to start the string. That character, when + # doubled is treated as a single character in the string. If an + # unmatched quote appears, the string is terminated. + '"': re.compile('"(?:[^"]*"")*[^"]*"(?!")'), + "'": re.compile("'(?:[^']*'')*[^']*'(?!')"), + } + ERROR_CODES = ("#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", + "#NUM!", "#N/A", "#GETTING_DATA") + TOKEN_ENDERS = ',;}) +-*/^&=><%' # Each of these characters, marks the + # end of an operand token + + def __init__(self, formula): + self.formula = formula + self.items = [] + self.token_stack = [] # Used to keep track of arrays, functions, and + # parentheses + self.offset = 0 # How many chars have we read + self.token = [] # Used to build up token values char by char + self._parse() + + def _parse(self): + """Populate self.items with the tokens from the formula.""" + if self.offset: + return # Already parsed! + if not self.formula: + return + elif self.formula[0] == '=': + self.offset += 1 + else: + self.items.append(Token(self.formula, Token.LITERAL)) + return + consumers = ( + ('"\'', self._parse_string), + ('[', self._parse_brackets), + ('#', self._parse_error), + (' ', self._parse_whitespace), + ('\n', self._parse_whitespace), + ('+-*/^&=><%', self._parse_operator), + ('{(', self._parse_opener), + (')}', self._parse_closer), + (';,', self._parse_separator), + ) + dispatcher = {} # maps chars to the specific parsing function + for chars, consumer in consumers: + dispatcher.update(dict.fromkeys(chars, consumer)) + while self.offset < len(self.formula): + if self.check_scientific_notation(): # May consume one character + continue + curr_char = self.formula[self.offset] + if curr_char in self.TOKEN_ENDERS: + self.save_token() + if curr_char in dispatcher: + self.offset += dispatcher[curr_char]() + else: + # TODO: this can probably be sped up using a regex to get to + # the next interesting character + self.token.append(curr_char) + self.offset += 1 + self.save_token() + + def _parse_string(self): + """ + Parse a "-delimited string or '-delimited link. + + The offset must be pointing to either a single quote ("'") or double + quote ('"') character. The strings are parsed according to Excel + rules where to escape the delimiter you just double it up. E.g., + "abc""def" in Excel is parsed as 'abc"def' in Python. + + Returns the number of characters matched. (Does not update + self.offset) + + """ + self.assert_empty_token(can_follow=':') + delim = self.formula[self.offset] + assert delim in ('"', "'") + regex = self.STRING_REGEXES[delim] + match = regex.match(self.formula[self.offset:]) + if match is None: + subtype = "string" if delim == '"' else 'link' + raise TokenizerError(f"Reached end of formula while parsing {subtype} in {self.formula}") + match = match.group(0) + if delim == '"': + self.items.append(Token.make_operand(match)) + else: + self.token.append(match) + return len(match) + + def _parse_brackets(self): + """ + Consume all the text between square brackets []. + + Returns the number of characters matched. (Does not update + self.offset) + + """ + assert self.formula[self.offset] == '[' + lefts = [(t.start(), 1) for t in + re.finditer(r"\[", self.formula[self.offset:])] + rights = [(t.start(), -1) for t in + re.finditer(r"\]", self.formula[self.offset:])] + + open_count = 0 + for idx, open_close in sorted(lefts + rights): + open_count += open_close + if open_count == 0: + outer_right = idx + 1 + self.token.append( + self.formula[self.offset:self.offset + outer_right]) + return outer_right + + raise TokenizerError(f"Encountered unmatched '[' in {self.formula}") + + def _parse_error(self): + """ + Consume the text following a '#' as an error. + + Looks for a match in self.ERROR_CODES and returns the number of + characters matched. (Does not update self.offset) + + """ + self.assert_empty_token(can_follow='!') + assert self.formula[self.offset] == '#' + subformula = self.formula[self.offset:] + for err in self.ERROR_CODES: + if subformula.startswith(err): + self.items.append(Token.make_operand(''.join(self.token) + err)) + del self.token[:] + return len(err) + raise TokenizerError(f"Invalid error code at position {self.offset} in '{self.formula}'") + + def _parse_whitespace(self): + """ + Consume a string of consecutive spaces. + + Returns the number of spaces found. (Does not update self.offset). + + """ + assert self.formula[self.offset] in (' ', '\n') + self.items.append(Token(self.formula[self.offset], Token.WSPACE)) + return self.WSPACE_RE.match(self.formula[self.offset:]).end() + + def _parse_operator(self): + """ + Consume the characters constituting an operator. + + Returns the number of characters consumed. (Does not update + self.offset) + + """ + if self.formula[self.offset:self.offset + 2] in ('>=', '<=', '<>'): + self.items.append(Token( + self.formula[self.offset:self.offset + 2], + Token.OP_IN + )) + return 2 + curr_char = self.formula[self.offset] # guaranteed to be 1 char + assert curr_char in '%*/^&=><+-' + if curr_char == '%': + token = Token('%', Token.OP_POST) + elif curr_char in "*/^&=><": + token = Token(curr_char, Token.OP_IN) + # From here on, curr_char is guaranteed to be in '+-' + elif not self.items: + token = Token(curr_char, Token.OP_PRE) + else: + prev = next((i for i in reversed(self.items) + if i.type != Token.WSPACE), None) + is_infix = prev and ( + prev.subtype == Token.CLOSE + or prev.type == Token.OP_POST + or prev.type == Token.OPERAND + ) + if is_infix: + token = Token(curr_char, Token.OP_IN) + else: + token = Token(curr_char, Token.OP_PRE) + self.items.append(token) + return 1 + + def _parse_opener(self): + """ + Consumes a ( or { character. + + Returns the number of characters consumed. (Does not update + self.offset) + + """ + assert self.formula[self.offset] in ('(', '{') + if self.formula[self.offset] == '{': + self.assert_empty_token() + token = Token.make_subexp("{") + elif self.token: + token_value = "".join(self.token) + '(' + del self.token[:] + token = Token.make_subexp(token_value) + else: + token = Token.make_subexp("(") + self.items.append(token) + self.token_stack.append(token) + return 1 + + def _parse_closer(self): + """ + Consumes a } or ) character. + + Returns the number of characters consumed. (Does not update + self.offset) + + """ + assert self.formula[self.offset] in (')', '}') + token = self.token_stack.pop().get_closer() + if token.value != self.formula[self.offset]: + raise TokenizerError( + "Mismatched ( and { pair in '%s'" % self.formula) + self.items.append(token) + return 1 + + def _parse_separator(self): + """ + Consumes a ; or , character. + + Returns the number of characters consumed. (Does not update + self.offset) + + """ + curr_char = self.formula[self.offset] + assert curr_char in (';', ',') + if curr_char == ';': + token = Token.make_separator(";") + else: + try: + top_type = self.token_stack[-1].type + except IndexError: + token = Token(",", Token.OP_IN) # Range Union operator + else: + if top_type == Token.PAREN: + token = Token(",", Token.OP_IN) # Range Union operator + else: + token = Token.make_separator(",") + self.items.append(token) + return 1 + + def check_scientific_notation(self): + """ + Consumes a + or - character if part of a number in sci. notation. + + Returns True if the character was consumed and self.offset was + updated, False otherwise. + + """ + curr_char = self.formula[self.offset] + if (curr_char in '+-' + and len(self.token) >= 1 + and self.SN_RE.match("".join(self.token))): + self.token.append(curr_char) + self.offset += 1 + return True + return False + + def assert_empty_token(self, can_follow=()): + """ + Ensure that there's no token currently being parsed. + + Or if there is a token being parsed, it must end with a character in + can_follow. + + If there are unconsumed token contents, it means we hit an unexpected + token transition. In this case, we raise a TokenizerError + + """ + if self.token and self.token[-1] not in can_follow: + raise TokenizerError(f"Unexpected character at position {self.offset} in '{self.formula}'") + + def save_token(self): + """If there's a token being parsed, add it to the item list.""" + if self.token: + self.items.append(Token.make_operand("".join(self.token))) + del self.token[:] + + def render(self): + """Convert the parsed tokens back to a string.""" + if not self.items: + return "" + elif self.items[0].type == Token.LITERAL: + return self.items[0].value + return "=" + "".join(token.value for token in self.items) + + +class Token: + + """ + A token in an Excel formula. + + Tokens have three attributes: + + * `value`: The string value parsed that led to this token + * `type`: A string identifying the type of token + * `subtype`: A string identifying subtype of the token (optional, and + defaults to "") + + """ + + __slots__ = ['value', 'type', 'subtype'] + + LITERAL = "LITERAL" + OPERAND = "OPERAND" + FUNC = "FUNC" + ARRAY = "ARRAY" + PAREN = "PAREN" + SEP = "SEP" + OP_PRE = "OPERATOR-PREFIX" + OP_IN = "OPERATOR-INFIX" + OP_POST = "OPERATOR-POSTFIX" + WSPACE = "WHITE-SPACE" + + def __init__(self, value, type_, subtype=""): + self.value = value + self.type = type_ + self.subtype = subtype + + # Literal operands: + # + # Literal operands are always of type 'OPERAND' and can be of subtype + # 'TEXT' (for text strings), 'NUMBER' (for all numeric types), 'LOGICAL' + # (for TRUE and FALSE), 'ERROR' (for literal error values), or 'RANGE' + # (for all range references). + + TEXT = 'TEXT' + NUMBER = 'NUMBER' + LOGICAL = 'LOGICAL' + ERROR = 'ERROR' + RANGE = 'RANGE' + + def __repr__(self): + return u"{0} {1} {2}:".format(self.type, self.subtype, self.value) + + @classmethod + def make_operand(cls, value): + """Create an operand token.""" + if value.startswith('"'): + subtype = cls.TEXT + elif value.startswith('#'): + subtype = cls.ERROR + elif value in ('TRUE', 'FALSE'): + subtype = cls.LOGICAL + else: + try: + float(value) + subtype = cls.NUMBER + except ValueError: + subtype = cls.RANGE + return cls(value, cls.OPERAND, subtype) + + + # Subexpresssions + # + # There are 3 types of `Subexpressions`: functions, array literals, and + # parentheticals. Subexpressions have 'OPEN' and 'CLOSE' tokens. 'OPEN' + # is used when parsing the initial expression token (i.e., '(' or '{') + # and 'CLOSE' is used when parsing the closing expression token ('}' or + # ')'). + + OPEN = "OPEN" + CLOSE = "CLOSE" + + @classmethod + def make_subexp(cls, value, func=False): + """ + Create a subexpression token. + + `value`: The value of the token + `func`: If True, force the token to be of type FUNC + + """ + assert value[-1] in ('{', '}', '(', ')') + if func: + assert re.match('.+\\(|\\)', value) + type_ = Token.FUNC + elif value in '{}': + type_ = Token.ARRAY + elif value in '()': + type_ = Token.PAREN + else: + type_ = Token.FUNC + subtype = cls.CLOSE if value in ')}' else cls.OPEN + return cls(value, type_, subtype) + + def get_closer(self): + """Return a closing token that matches this token's type.""" + assert self.type in (self.FUNC, self.ARRAY, self.PAREN) + assert self.subtype == self.OPEN + value = "}" if self.type == self.ARRAY else ")" + return self.make_subexp(value, func=self.type == self.FUNC) + + # Separator tokens + # + # Argument separators always have type 'SEP' and can have one of two + # subtypes: 'ARG', 'ROW'. 'ARG' is used for the ',' token, when used to + # delimit either function arguments or array elements. 'ROW' is used for + # the ';' token, which is always used to delimit rows in an array + # literal. + + ARG = "ARG" + ROW = "ROW" + + @classmethod + def make_separator(cls, value): + """Create a separator token""" + assert value in (',', ';') + subtype = cls.ARG if value == ',' else cls.ROW + return cls(value, cls.SEP, subtype) diff --git a/venv/lib/python3.11/site-packages/openpyxl/formula/translate.py b/venv/lib/python3.11/site-packages/openpyxl/formula/translate.py new file mode 100755 index 0000000..a7e90ec --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/formula/translate.py @@ -0,0 +1,166 @@ +""" +This module contains code to translate formulae across cells in a worksheet. + +The idea is that if A1 has formula "=B1+C1", then translating it to cell A2 +results in formula "=B2+C2". The algorithm relies on the formula tokenizer +to identify the parts of the formula that need to change. + +""" + +import re +from .tokenizer import Tokenizer, Token +from openpyxl.utils import ( + coordinate_to_tuple, + column_index_from_string, + get_column_letter +) + +class TranslatorError(Exception): + """ + Raised when a formula can't be translated across cells. + + This error arises when a formula's references would be translated outside + the worksheet's bounds on the top or left. Excel represents these + situations with a #REF! literal error. E.g., if the formula at B2 is + '=A1', attempting to translate the formula to B1 raises TranslatorError, + since there's no cell above A1. Similarly, translating the same formula + from B2 to A2 raises TranslatorError, since there's no cell to the left of + A1. + + """ + + +class Translator: + + """ + Modifies a formula so that it can be translated from one cell to another. + + `formula`: The str string to translate. Must include the leading '=' + character. + `origin`: The cell address (in A1 notation) where this formula was + defined (excluding the worksheet name). + + """ + + def __init__(self, formula, origin): + # Excel errors out when a workbook has formulae in R1C1 notation, + # regardless of the calcPr:refMode setting, so I'm assuming the + # formulae stored in the workbook must be in A1 notation. + self.row, self.col = coordinate_to_tuple(origin) + self.tokenizer = Tokenizer(formula) + + def get_tokens(self): + "Returns a list with the tokens comprising the formula." + return self.tokenizer.items + + ROW_RANGE_RE = re.compile(r"(\$?[1-9][0-9]{0,6}):(\$?[1-9][0-9]{0,6})$") + COL_RANGE_RE = re.compile(r"(\$?[A-Za-z]{1,3}):(\$?[A-Za-z]{1,3})$") + CELL_REF_RE = re.compile(r"(\$?[A-Za-z]{1,3})(\$?[1-9][0-9]{0,6})$") + + @staticmethod + def translate_row(row_str, rdelta): + """ + Translate a range row-snippet by the given number of rows. + """ + if row_str.startswith('$'): + return row_str + else: + new_row = int(row_str) + rdelta + if new_row <= 0: + raise TranslatorError("Formula out of range") + return str(new_row) + + @staticmethod + def translate_col(col_str, cdelta): + """ + Translate a range col-snippet by the given number of columns + """ + if col_str.startswith('$'): + return col_str + else: + try: + return get_column_letter( + column_index_from_string(col_str) + cdelta) + except ValueError: + raise TranslatorError("Formula out of range") + + @staticmethod + def strip_ws_name(range_str): + "Splits out the worksheet reference, if any, from a range reference." + # This code assumes that named ranges cannot contain any exclamation + # marks. Excel refuses to create these (even using VBA), and + # complains of a corrupt workbook when there are names with + # exclamation marks. The ECMA spec only states that named ranges will + # be of `ST_Xstring` type, which in theory allows '!' (char code + # 0x21) per http://www.w3.org/TR/xml/#charsets + if '!' in range_str: + sheet, range_str = range_str.rsplit('!', 1) + return sheet + "!", range_str + return "", range_str + + @classmethod + def translate_range(cls, range_str, rdelta, cdelta): + """ + Translate an A1-style range reference to the destination cell. + + `rdelta`: the row offset to add to the range + `cdelta`: the column offset to add to the range + `range_str`: an A1-style reference to a range. Potentially includes + the worksheet reference. Could also be a named range. + + """ + ws_part, range_str = cls.strip_ws_name(range_str) + match = cls.ROW_RANGE_RE.match(range_str) # e.g. `3:4` + if match is not None: + return (ws_part + cls.translate_row(match.group(1), rdelta) + ":" + + cls.translate_row(match.group(2), rdelta)) + match = cls.COL_RANGE_RE.match(range_str) # e.g. `A:BC` + if match is not None: + return (ws_part + cls.translate_col(match.group(1), cdelta) + ':' + + cls.translate_col(match.group(2), cdelta)) + if ':' in range_str: # e.g. `A1:B5` + # The check is necessarily general because range references can + # have one or both endpoints specified by named ranges. I.e., + # `named_range:C2`, `C2:named_range`, and `name1:name2` are all + # valid references. Further, Excel allows chaining multiple + # colons together (with unclear meaning) + return ws_part + ":".join( + cls.translate_range(piece, rdelta, cdelta) + for piece in range_str.split(':')) + match = cls.CELL_REF_RE.match(range_str) + if match is None: # Must be a named range + return range_str + return (ws_part + cls.translate_col(match.group(1), cdelta) + + cls.translate_row(match.group(2), rdelta)) + + def translate_formula(self, dest=None, row_delta=0, col_delta=0): + """ + Convert the formula into A1 notation, or as row and column coordinates + + The formula is converted into A1 assuming it is assigned to the cell + whose address is `dest` (no worksheet name). + + """ + tokens = self.get_tokens() + if not tokens: + return "" + elif tokens[0].type == Token.LITERAL: + return tokens[0].value + out = ['='] + # per the spec: + # A compliant producer or consumer considers a defined name in the + # range A1-XFD1048576 to be an error. All other names outside this + # range can be defined as names and overrides a cell reference if an + # ambiguity exists. (I.18.2.5) + if dest: + row, col = coordinate_to_tuple(dest) + row_delta = row - self.row + col_delta = col - self.col + for token in tokens: + if (token.type == Token.OPERAND + and token.subtype == Token.RANGE): + out.append(self.translate_range(token.value, row_delta, + col_delta)) + else: + out.append(token.value) + return "".join(out) diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/__init__.py b/venv/lib/python3.11/site-packages/openpyxl/packaging/__init__.py new file mode 100755 index 0000000..c3085ee --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/packaging/__init__.py @@ -0,0 +1,3 @@ +""" +Stuff related to Office OpenXML packaging: relationships, archive, content types. +""" diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..b7a07b8a0684c54c7b8ac5e53480560158fe85f3 GIT binary patch literal 312 zcmY*UyH3L}6tzPIC{i~THm^k`R$xI0@dZGKN)_s2x$$*l;@Vd1M1&vdCm?=_l^=-I ztrLz4NZjGv*SR|9zK_Q#ig9+aeObo*H8j70e~R5e*&>0KNZ>h|ByaO{9vUf04VniK zBv>+&QWZdE4$Sl8197~l_*$9u?SZ7M@uhNpN_btAs)Z>jtO;NO37rF5yrSr5`we+2TGIdk literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/core.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/core.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..2e2e8f0a0942b0e5329d198b511e2f768d7a6cfb GIT binary patch literal 4990 zcmbUlOKcm*b(gy&mlU~_XiBoJ-`Y~*(5a;=PGdWYKu%fE!fK?Yjv=)IdyBMkEoMBL`v96bLk4DK-sqp%v2!rr5?Sx?H7 zdoSWy7g(R!oW6NGifI9%hD7 z{2w!lKs?0%fM=M8@N-(KlTrgf4U*0W9MIsmN$aAt4xojIcLy!1ut_E!{wFR?#67k! zl{U$|nkBaPyr!m&IBSQJL|4oAlALLKuO!l066fvE z?{YxW^DC#VSn7L%5q; zSK$>-@qEmtyi{!779Ck!p%aFCC^81l|1XN=q`KOE6gK)$9fN}-NtWgx#E4~ zYhSDQi$E^%a_dGVJ_$Ai+7c3WAP3LdSWah%&3UEefZ{%~wN5{v<4AmsZK>AzhCD@u@Cb{L+6>ZF!QFBXUnY>O$msdfAylm=(6nokg zJ-RvH2a*`80LskMSl|7r_1CMb_1GyZcB&F+bi`^M5_}tnUtf=}$Eyp~g<8+ADl<>R zv9*PIc)$t|R6LE2&RR!*BX;24?B}!9*xGD8HfqI2E7OghzI*x4^VQY0e7)zC)pKfN zvfgvHGV$q5V_$dWQq#|b24LrNIGp*KOC%C;pDoBTJ}_CfgR-2>D+LY5AzA)?A+2pv z1O+?{6=R3V3g`x0Nj6uPiGBzfG5TTXbP0jzf?gOHzXVWjeV)bot=KE&*(NV|dz#E1 zz+r}bGVp6P*957j{c)SGDQt>U_zJTK4)Adx1)~-4H844^-E{@7pf0LJahEP7LHF&&0hdZ@frnC zIn}w%!Ikw6;He7;LIC1Ey&uN|2nG?L^XWqX?0_t1z{3n#Hc(J}hEmzF7&M{cffqF8 zddurTHl_gl2izqb{nNsy3!llK$oCi4N%gn&@Chq?0vtjJe&+kcS1EpZp&mK>)$}(< zAK$2toV7;I)`fGHaIPktYec##0mrt6fg1=r0-gQ}f>#09epy!X8CiDj7v2;Y%tDjp zIIE*68>p&tj@T%djsQ0sGXOw9_tWHAZ(ox^;N!f}Ci6c4M@Hn_X8#z!us#152(guE zsP%hNJn^P{9)|ddpl}ev+jN`?>`4jkN$J>=5&}vXPVu$}|CG4rj>w)AC;>>9vLlV8 zqV9UK?~%XV2U4+@(7Inj>v;*S_a(IbFQFX(+ChaQeUF44PrQFm%779`4F;H(eUz{g zf_h;{34$+*c62JAfpnEK=XA(Ax~USQICoK9x^YY+w;^gRx2C1M6SBaL>4s4ntft7K znj?w?A#Hkc_WZHqC*G3g()t_H`CN{yNKhVXLOP_^SbRdRZ}B&heC{ut}bIxh0I^L zeiIUk9aI&#BC^zNK}+YB3Xo?v_Y%bxAT!bP^b;t8kb#7>l-F17Fcc0Z>`X$LP%v!& zZK4~%*PN?XYX80H%X^8N)e!kTbKwKCT7}7LBQa(ViW5Cto0mAA;7v? zG!C$63u6J>=VG)tk@d;V1#5p;AEt}C4?-7o*Sd@jj=*fh<+sV!=_=t$m}ahc1j@$#>C-6`&`+*~&vn>F!tT|8}xr$LA#5q_P>Zx2_Pd=Xi_F65JsD~0(C{dnn zxGdY(M*G)}R*!GI`Q&6RI$w{@ThVzCsjF}8V0Cz7}#bms^595o(bu z^~e<~a;1FnnK)DvhpKOGyj>G7)Wr*ycmYI+NVSMmo!Youi_Fv`Ggf4#e6h)Mv7YjK zO_AvvY77lG4h}Y?k;cFw92^*+-(f`iC7f|4d;6M0lJ`)P*#kJbMYYEFIbkQ}W`$8V zP33h%$Bdv;Ydf?Xebm_YcY}_B+V0zRU5@?@p;JrmX{}hvYNLyVT!y}j&^KLLRom?= zAki6SI%gU>bs1{p7`til?YwwVtENWUZn!@Qr=2&uclF=E4zOFs_yAy&V_6pLfbA?t z@B@#S^+2`yvp`_jcWTVr+rJIwjavJ+>G^p^^en-P2mXJcGsMEXvpc-s{{yA`xCfmY)qeqq{guT4 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/custom.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/custom.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..9eae69ba396d43de498745842ea023d03714cfe2 GIT binary patch literal 12959 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 W{}r`$3luHFbLS(npO#D+?Oy=m*}gLX literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/manifest.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/packaging/__pycache__/manifest.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..d5fe37b13698e761988aef19c09755454d863436 GIT binary patch literal 9719 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 Kr(^UKjs6$qwU2iI literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/core.py b/venv/lib/python3.11/site-packages/openpyxl/packaging/core.py new file mode 100755 index 0000000..4515373 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/packaging/core.py @@ -0,0 +1,115 @@ +# Copyright (c) 2010-2024 openpyxl + +import datetime + +from openpyxl.descriptors import ( + DateTime, + Alias, +) +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors.nested import NestedText +from openpyxl.xml.functions import ( + Element, + QName, +) +from openpyxl.xml.constants import ( + COREPROPS_NS, + DCORE_NS, + XSI_NS, + DCTERMS_NS, +) + + +class NestedDateTime(DateTime, NestedText): + + expected_type = datetime.datetime + + def to_tree(self, tagname=None, value=None, namespace=None): + namespace = getattr(self, "namespace", namespace) + if namespace is not None: + tagname = "{%s}%s" % (namespace, tagname) + el = Element(tagname) + if value is not None: + value = value.replace(tzinfo=None) + el.text = value.isoformat(timespec="seconds") + 'Z' + return el + + +class QualifiedDateTime(NestedDateTime): + + """In certain situations Excel will complain if the additional type + attribute isn't set""" + + def to_tree(self, tagname=None, value=None, namespace=None): + el = super().to_tree(tagname, value, namespace) + el.set("{%s}type" % XSI_NS, QName(DCTERMS_NS, "W3CDTF")) + return el + + +class DocumentProperties(Serialisable): + """High-level properties of the document. + Defined in ECMA-376 Par2 Annex D + """ + + tagname = "coreProperties" + namespace = COREPROPS_NS + + category = NestedText(expected_type=str, allow_none=True) + contentStatus = NestedText(expected_type=str, allow_none=True) + keywords = NestedText(expected_type=str, allow_none=True) + lastModifiedBy = NestedText(expected_type=str, allow_none=True) + lastPrinted = NestedDateTime(allow_none=True) + revision = NestedText(expected_type=str, allow_none=True) + version = NestedText(expected_type=str, allow_none=True) + last_modified_by = Alias("lastModifiedBy") + + # Dublin Core Properties + subject = NestedText(expected_type=str, allow_none=True, namespace=DCORE_NS) + title = NestedText(expected_type=str, allow_none=True, namespace=DCORE_NS) + creator = NestedText(expected_type=str, allow_none=True, namespace=DCORE_NS) + description = NestedText(expected_type=str, allow_none=True, namespace=DCORE_NS) + identifier = NestedText(expected_type=str, allow_none=True, namespace=DCORE_NS) + language = NestedText(expected_type=str, allow_none=True, namespace=DCORE_NS) + # Dublin Core Terms + created = QualifiedDateTime(allow_none=True, namespace=DCTERMS_NS) # assumed to be UTC + modified = QualifiedDateTime(allow_none=True, namespace=DCTERMS_NS) # assumed to be UTC + + __elements__ = ("creator", "title", "description", "subject","identifier", + "language", "created", "modified", "lastModifiedBy", "category", + "contentStatus", "version", "revision", "keywords", "lastPrinted", + ) + + + def __init__(self, + category=None, + contentStatus=None, + keywords=None, + lastModifiedBy=None, + lastPrinted=None, + revision=None, + version=None, + created=None, + creator="openpyxl", + description=None, + identifier=None, + language=None, + modified=None, + subject=None, + title=None, + ): + now = datetime.datetime.now(tz=datetime.timezone.utc).replace(tzinfo=None) + self.contentStatus = contentStatus + self.lastPrinted = lastPrinted + self.revision = revision + self.version = version + self.creator = creator + self.lastModifiedBy = lastModifiedBy + self.modified = modified or now + self.created = created or now + self.title = title + self.subject = subject + self.description = description + self.identifier = identifier + self.language = language + self.keywords = keywords + self.category = category diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/custom.py b/venv/lib/python3.11/site-packages/openpyxl/packaging/custom.py new file mode 100755 index 0000000..7e253d7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/packaging/custom.py @@ -0,0 +1,289 @@ +# Copyright (c) 2010-2024 openpyxl + +"""Implementation of custom properties see § 22.3 in the specification""" + + +from warnings import warn + +from openpyxl.descriptors import Strict +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors.sequence import Sequence +from openpyxl.descriptors import ( + Alias, + String, + Integer, + Float, + DateTime, + Bool, +) +from openpyxl.descriptors.nested import ( + NestedText, +) + +from openpyxl.xml.constants import ( + CUSTPROPS_NS, + VTYPES_NS, + CPROPS_FMTID, +) + +from .core import NestedDateTime + + +class NestedBoolText(Bool, NestedText): + """ + Descriptor for handling nested elements with the value stored in the text part + """ + + pass + + +class _CustomDocumentProperty(Serialisable): + + """ + Low-level representation of a Custom Document Property. + Not used directly + Must always contain a child element, even if this is empty + """ + + tagname = "property" + _typ = None + + name = String(allow_none=True) + lpwstr = NestedText(expected_type=str, allow_none=True, namespace=VTYPES_NS) + i4 = NestedText(expected_type=int, allow_none=True, namespace=VTYPES_NS) + r8 = NestedText(expected_type=float, allow_none=True, namespace=VTYPES_NS) + filetime = NestedDateTime(allow_none=True, namespace=VTYPES_NS) + bool = NestedBoolText(expected_type=bool, allow_none=True, namespace=VTYPES_NS) + linkTarget = String(expected_type=str, allow_none=True) + fmtid = String() + pid = Integer() + + def __init__(self, + name=None, + pid=0, + fmtid=CPROPS_FMTID, + linkTarget=None, + **kw): + self.fmtid = fmtid + self.pid = pid + self.name = name + self._typ = None + self.linkTarget = linkTarget + + for k, v in kw.items(): + setattr(self, k, v) + setattr(self, "_typ", k) # ugh! + for e in self.__elements__: + if e not in kw: + setattr(self, e, None) + + + @property + def type(self): + if self._typ is not None: + return self._typ + for a in self.__elements__: + if getattr(self, a) is not None: + return a + if self.linkTarget is not None: + return "linkTarget" + + + def to_tree(self, tagname=None, idx=None, namespace=None): + child = getattr(self, self._typ, None) + if child is None: + setattr(self, self._typ, "") + + return super().to_tree(tagname=None, idx=None, namespace=None) + + +class _CustomDocumentPropertyList(Serialisable): + + """ + Parses and seriliases property lists but is not used directly + """ + + tagname = "Properties" + + property = Sequence(expected_type=_CustomDocumentProperty, namespace=CUSTPROPS_NS) + customProps = Alias("property") + + + def __init__(self, property=()): + self.property = property + + + def __len__(self): + return len(self.property) + + + def to_tree(self, tagname=None, idx=None, namespace=None): + for idx, p in enumerate(self.property, 2): + p.pid = idx + tree = super().to_tree(tagname, idx, namespace) + tree.set("xmlns", CUSTPROPS_NS) + + return tree + + +class _TypedProperty(Strict): + + name = String() + + def __init__(self, + name, + value): + self.name = name + self.value = value + + + def __eq__(self, other): + return self.name == other.name and self.value == other.value + + + def __repr__(self): + return f"{self.__class__.__name__}, name={self.name}, value={self.value}" + + +class IntProperty(_TypedProperty): + + value = Integer() + + +class FloatProperty(_TypedProperty): + + value = Float() + + +class StringProperty(_TypedProperty): + + value = String(allow_none=True) + + +class DateTimeProperty(_TypedProperty): + + value = DateTime() + + +class BoolProperty(_TypedProperty): + + value = Bool() + + +class LinkProperty(_TypedProperty): + + value = String() + + +# from Python +CLASS_MAPPING = { + StringProperty: "lpwstr", + IntProperty: "i4", + FloatProperty: "r8", + DateTimeProperty: "filetime", + BoolProperty: "bool", + LinkProperty: "linkTarget" +} + +XML_MAPPING = {v:k for k,v in CLASS_MAPPING.items()} + + +class CustomPropertyList(Strict): + + + props = Sequence(expected_type=_TypedProperty) + + def __init__(self): + self.props = [] + + + @classmethod + def from_tree(cls, tree): + """ + Create list from OOXML element + """ + prop_list = _CustomDocumentPropertyList.from_tree(tree) + props = [] + + for prop in prop_list.property: + attr = prop.type + + typ = XML_MAPPING.get(attr, None) + if not typ: + warn(f"Unknown type for {prop.name}") + continue + value = getattr(prop, attr) + link = prop.linkTarget + if link is not None: + typ = LinkProperty + value = prop.linkTarget + + new_prop = typ(name=prop.name, value=value) + props.append(new_prop) + + new_prop_list = cls() + new_prop_list.props = props + return new_prop_list + + + def append(self, prop): + if prop.name in self.names: + raise ValueError(f"Property with name {prop.name} already exists") + + self.props.append(prop) + + + def to_tree(self): + props = [] + + for p in self.props: + attr = CLASS_MAPPING.get(p.__class__, None) + if not attr: + raise TypeError("Unknown adapter for {p}") + np = _CustomDocumentProperty(name=p.name, **{attr:p.value}) + if isinstance(p, LinkProperty): + np._typ = "lpwstr" + #np.lpwstr = "" + props.append(np) + + prop_list = _CustomDocumentPropertyList(property=props) + return prop_list.to_tree() + + + def __len__(self): + return len(self.props) + + + @property + def names(self): + """List of property names""" + return [p.name for p in self.props] + + + def __getitem__(self, name): + """ + Get property by name + """ + for p in self.props: + if p.name == name: + return p + raise KeyError(f"Property with name {name} not found") + + + def __delitem__(self, name): + """ + Delete a propery by name + """ + for idx, p in enumerate(self.props): + if p.name == name: + self.props.pop(idx) + return + raise KeyError(f"Property with name {name} not found") + + + def __repr__(self): + return f"{self.__class__.__name__} containing {self.props}" + + + def __iter__(self): + return iter(self.props) diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/extended.py b/venv/lib/python3.11/site-packages/openpyxl/packaging/extended.py new file mode 100755 index 0000000..fbd794a --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/packaging/extended.py @@ -0,0 +1,137 @@ +# Copyright (c) 2010-2024 openpyxl + + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Typed, +) +from openpyxl.descriptors.nested import ( + NestedText, +) + +from openpyxl.xml.constants import XPROPS_NS +from openpyxl import __version__ + + +class DigSigBlob(Serialisable): + + __elements__ = __attrs__ = () + + +class VectorLpstr(Serialisable): + + __elements__ = __attrs__ = () + + +class VectorVariant(Serialisable): + + __elements__ = __attrs__ = () + + +class ExtendedProperties(Serialisable): + + """ + See 22.2 + + Most of this is irrelevant but Excel is very picky about the version number + + It uses XX.YYYY (Version.Build) and expects everyone else to + + We provide Major.Minor and the full version in the application name + """ + + tagname = "Properties" + + Template = NestedText(expected_type=str, allow_none=True) + Manager = NestedText(expected_type=str, allow_none=True) + Company = NestedText(expected_type=str, allow_none=True) + Pages = NestedText(expected_type=int, allow_none=True) + Words = NestedText(expected_type=int,allow_none=True) + Characters = NestedText(expected_type=int, allow_none=True) + PresentationFormat = NestedText(expected_type=str, allow_none=True) + Lines = NestedText(expected_type=int, allow_none=True) + Paragraphs = NestedText(expected_type=int, allow_none=True) + Slides = NestedText(expected_type=int, allow_none=True) + Notes = NestedText(expected_type=int, allow_none=True) + TotalTime = NestedText(expected_type=int, allow_none=True) + HiddenSlides = NestedText(expected_type=int, allow_none=True) + MMClips = NestedText(expected_type=int, allow_none=True) + ScaleCrop = NestedText(expected_type=bool, allow_none=True) + HeadingPairs = Typed(expected_type=VectorVariant, allow_none=True) + TitlesOfParts = Typed(expected_type=VectorLpstr, allow_none=True) + LinksUpToDate = NestedText(expected_type=bool, allow_none=True) + CharactersWithSpaces = NestedText(expected_type=int, allow_none=True) + SharedDoc = NestedText(expected_type=bool, allow_none=True) + HyperlinkBase = NestedText(expected_type=str, allow_none=True) + HLinks = Typed(expected_type=VectorVariant, allow_none=True) + HyperlinksChanged = NestedText(expected_type=bool, allow_none=True) + DigSig = Typed(expected_type=DigSigBlob, allow_none=True) + Application = NestedText(expected_type=str, allow_none=True) + AppVersion = NestedText(expected_type=str, allow_none=True) + DocSecurity = NestedText(expected_type=int, allow_none=True) + + __elements__ = ('Application', 'AppVersion', 'DocSecurity', 'ScaleCrop', + 'LinksUpToDate', 'SharedDoc', 'HyperlinksChanged') + + def __init__(self, + Template=None, + Manager=None, + Company=None, + Pages=None, + Words=None, + Characters=None, + PresentationFormat=None, + Lines=None, + Paragraphs=None, + Slides=None, + Notes=None, + TotalTime=None, + HiddenSlides=None, + MMClips=None, + ScaleCrop=None, + HeadingPairs=None, + TitlesOfParts=None, + LinksUpToDate=None, + CharactersWithSpaces=None, + SharedDoc=None, + HyperlinkBase=None, + HLinks=None, + HyperlinksChanged=None, + DigSig=None, + Application=None, + AppVersion=None, + DocSecurity=None, + ): + self.Template = Template + self.Manager = Manager + self.Company = Company + self.Pages = Pages + self.Words = Words + self.Characters = Characters + self.PresentationFormat = PresentationFormat + self.Lines = Lines + self.Paragraphs = Paragraphs + self.Slides = Slides + self.Notes = Notes + self.TotalTime = TotalTime + self.HiddenSlides = HiddenSlides + self.MMClips = MMClips + self.ScaleCrop = ScaleCrop + self.HeadingPairs = None + self.TitlesOfParts = None + self.LinksUpToDate = LinksUpToDate + self.CharactersWithSpaces = CharactersWithSpaces + self.SharedDoc = SharedDoc + self.HyperlinkBase = HyperlinkBase + self.HLinks = None + self.HyperlinksChanged = HyperlinksChanged + self.DigSig = None + self.Application = f"Microsoft Excel Compatible / Openpyxl {__version__}" + self.AppVersion = ".".join(__version__.split(".")[:-1]) + self.DocSecurity = DocSecurity + + + def to_tree(self): + tree = super().to_tree() + tree.set("xmlns", XPROPS_NS) + return tree diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/interface.py b/venv/lib/python3.11/site-packages/openpyxl/packaging/interface.py new file mode 100755 index 0000000..cacc046 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/packaging/interface.py @@ -0,0 +1,56 @@ +# Copyright (c) 2010-2024 openpyxl + +from abc import abstractproperty +from openpyxl.compat.abc import ABC + + +class ISerialisableFile(ABC): + + """ + Interface for Serialisable classes that represent files in the archive + """ + + + @abstractproperty + def id(self): + """ + Object id making it unique + """ + pass + + + @abstractproperty + def _path(self): + """ + File path in the archive + """ + pass + + + @abstractproperty + def _namespace(self): + """ + Qualified namespace when serialised + """ + pass + + + @abstractproperty + def _type(self): + """ + The content type for the manifest + """ + + + @abstractproperty + def _rel_type(self): + """ + The content type for relationships + """ + + + @abstractproperty + def _rel_id(self): + """ + Links object with parent + """ diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/manifest.py b/venv/lib/python3.11/site-packages/openpyxl/packaging/manifest.py new file mode 100755 index 0000000..41da07f --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/packaging/manifest.py @@ -0,0 +1,194 @@ +# Copyright (c) 2010-2024 openpyxl + +""" +File manifest +""" +from mimetypes import MimeTypes +import os.path + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import String, Sequence +from openpyxl.xml.functions import fromstring +from openpyxl.xml.constants import ( + ARC_CONTENT_TYPES, + ARC_THEME, + ARC_STYLE, + THEME_TYPE, + STYLES_TYPE, + CONTYPES_NS, + ACTIVEX, + CTRL, + VBA, +) +from openpyxl.xml.functions import tostring + +# initialise mime-types +mimetypes = MimeTypes() +mimetypes.add_type('application/xml', ".xml") +mimetypes.add_type('application/vnd.openxmlformats-package.relationships+xml', ".rels") +mimetypes.add_type("application/vnd.ms-office.vbaProject", ".bin") +mimetypes.add_type("application/vnd.openxmlformats-officedocument.vmlDrawing", ".vml") +mimetypes.add_type("image/x-emf", ".emf") + + +class FileExtension(Serialisable): + + tagname = "Default" + + Extension = String() + ContentType = String() + + def __init__(self, Extension, ContentType): + self.Extension = Extension + self.ContentType = ContentType + + +class Override(Serialisable): + + tagname = "Override" + + PartName = String() + ContentType = String() + + def __init__(self, PartName, ContentType): + self.PartName = PartName + self.ContentType = ContentType + + +DEFAULT_TYPES = [ + FileExtension("rels", "application/vnd.openxmlformats-package.relationships+xml"), + FileExtension("xml", "application/xml"), +] + +DEFAULT_OVERRIDE = [ + Override("/" + ARC_STYLE, STYLES_TYPE), # Styles + Override("/" + ARC_THEME, THEME_TYPE), # Theme + Override("/docProps/core.xml", "application/vnd.openxmlformats-package.core-properties+xml"), + Override("/docProps/app.xml", "application/vnd.openxmlformats-officedocument.extended-properties+xml") +] + + +class Manifest(Serialisable): + + tagname = "Types" + + Default = Sequence(expected_type=FileExtension, unique=True) + Override = Sequence(expected_type=Override, unique=True) + path = "[Content_Types].xml" + + __elements__ = ("Default", "Override") + + def __init__(self, + Default=(), + Override=(), + ): + if not Default: + Default = DEFAULT_TYPES + self.Default = Default + if not Override: + Override = DEFAULT_OVERRIDE + self.Override = Override + + + @property + def filenames(self): + return [part.PartName for part in self.Override] + + + @property + def extensions(self): + """ + Map content types to file extensions + Skip parts without extensions + """ + exts = {os.path.splitext(part.PartName)[-1] for part in self.Override} + return [(ext[1:], mimetypes.types_map[True][ext]) for ext in sorted(exts) if ext] + + + def to_tree(self): + """ + Custom serialisation method to allow setting a default namespace + """ + defaults = [t.Extension for t in self.Default] + for ext, mime in self.extensions: + if ext not in defaults: + mime = FileExtension(ext, mime) + self.Default.append(mime) + tree = super().to_tree() + tree.set("xmlns", CONTYPES_NS) + return tree + + + def __contains__(self, content_type): + """ + Check whether a particular content type is contained + """ + for t in self.Override: + if t.ContentType == content_type: + return True + + + def find(self, content_type): + """ + Find specific content-type + """ + try: + return next(self.findall(content_type)) + except StopIteration: + return + + + def findall(self, content_type): + """ + Find all elements of a specific content-type + """ + for t in self.Override: + if t.ContentType == content_type: + yield t + + + def append(self, obj): + """ + Add content object to the package manifest + # needs a contract... + """ + ct = Override(PartName=obj.path, ContentType=obj.mime_type) + self.Override.append(ct) + + + def _write(self, archive, workbook): + """ + Write manifest to the archive + """ + self.append(workbook) + self._write_vba(workbook) + self._register_mimetypes(filenames=archive.namelist()) + archive.writestr(self.path, tostring(self.to_tree())) + + + def _register_mimetypes(self, filenames): + """ + Make sure that the mime type for all file extensions is registered + """ + for fn in filenames: + ext = os.path.splitext(fn)[-1] + if not ext: + continue + mime = mimetypes.types_map[True][ext] + fe = FileExtension(ext[1:], mime) + self.Default.append(fe) + + + def _write_vba(self, workbook): + """ + Add content types from cached workbook when keeping VBA + """ + if workbook.vba_archive: + node = fromstring(workbook.vba_archive.read(ARC_CONTENT_TYPES)) + mf = Manifest.from_tree(node) + filenames = self.filenames + for override in mf.Override: + if override.PartName not in (ACTIVEX, CTRL, VBA): + continue + if override.PartName not in filenames: + self.Override.append(override) diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/relationship.py b/venv/lib/python3.11/site-packages/openpyxl/packaging/relationship.py new file mode 100755 index 0000000..4318282 --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/packaging/relationship.py @@ -0,0 +1,158 @@ +# Copyright (c) 2010-2024 openpyxl + +import posixpath +from warnings import warn + +from openpyxl.descriptors import ( + String, + Alias, + Sequence, +) +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors.container import ElementList + +from openpyxl.xml.constants import REL_NS, PKG_REL_NS +from openpyxl.xml.functions import ( + Element, + fromstring, +) + + +class Relationship(Serialisable): + """Represents many kinds of relationships.""" + + tagname = "Relationship" + + Type = String() + Target = String() + target = Alias("Target") + TargetMode = String(allow_none=True) + Id = String(allow_none=True) + id = Alias("Id") + + + def __init__(self, + Id=None, + Type=None, + type=None, + Target=None, + TargetMode=None + ): + """ + `type` can be used as a shorthand with the default relationships namespace + otherwise the `Type` must be a fully qualified URL + """ + if type is not None: + Type = "{0}/{1}".format(REL_NS, type) + self.Type = Type + self.Target = Target + self.TargetMode = TargetMode + self.Id = Id + + +class RelationshipList(ElementList): + + tagname = "Relationships" + expected_type = Relationship + + + def append(self, value): + super().append(value) + if not value.Id: + value.Id = f"rId{len(self)}" + + + def find(self, content_type): + """ + Find relationships by content-type + NB. these content-types namespaced objects and different to the MIME-types + in the package manifest :-( + """ + for r in self: + if r.Type == content_type: + yield r + + + def get(self, key): + for r in self: + if r.Id == key: + return r + raise KeyError("Unknown relationship: {0}".format(key)) + + + def to_dict(self): + """Return a dictionary of relations keyed by id""" + return {r.id:r for r in self} + + + def to_tree(self): + tree = super().to_tree() + tree.set("xmlns", PKG_REL_NS) + return tree + + +def get_rels_path(path): + """ + Convert relative path to absolutes that can be loaded from a zip + archive. + The path to be passed in is that of containing object (workbook, + worksheet, etc.) + """ + folder, obj = posixpath.split(path) + filename = posixpath.join(folder, '_rels', '{0}.rels'.format(obj)) + return filename + + +def get_dependents(archive, filename): + """ + Normalise dependency file paths to absolute ones + + Relative paths are relative to parent object + """ + src = archive.read(filename) + node = fromstring(src) + try: + rels = RelationshipList.from_tree(node) + except TypeError: + msg = "{0} contains invalid dependency definitions".format(filename) + warn(msg) + rels = RelationshipList() + folder = posixpath.dirname(filename) + parent = posixpath.split(folder)[0] + for r in rels: + if r.TargetMode == "External": + continue + elif r.target.startswith("/"): + r.target = r.target[1:] + else: + pth = posixpath.join(parent, r.target) + r.target = posixpath.normpath(pth) + return rels + + +def get_rel(archive, deps, id=None, cls=None): + """ + Get related object based on id or rel_type + """ + if not any([id, cls]): + raise ValueError("Either the id or the content type are required") + if id is not None: + rel = deps.get(id) + else: + try: + rel = next(deps.find(cls.rel_type)) + except StopIteration: # no known dependency + return + + path = rel.target + src = archive.read(path) + tree = fromstring(src) + obj = cls.from_tree(tree) + + rels_path = get_rels_path(path) + try: + obj.deps = get_dependents(archive, rels_path) + except KeyError: + obj.deps = [] + + return obj diff --git a/venv/lib/python3.11/site-packages/openpyxl/packaging/workbook.py b/venv/lib/python3.11/site-packages/openpyxl/packaging/workbook.py new file mode 100755 index 0000000..a6413cd --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/packaging/workbook.py @@ -0,0 +1,185 @@ +# Copyright (c) 2010-2024 openpyxl + +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.descriptors import ( + Alias, + Typed, + String, + Integer, + Bool, + NoneSet, +) +from openpyxl.descriptors.excel import ExtensionList, Relation +from openpyxl.descriptors.sequence import NestedSequence +from openpyxl.descriptors.nested import NestedString + +from openpyxl.xml.constants import SHEET_MAIN_NS + +from openpyxl.workbook.defined_name import DefinedNameList +from openpyxl.workbook.external_reference import ExternalReference +from openpyxl.workbook.function_group import FunctionGroupList +from openpyxl.workbook.properties import WorkbookProperties, CalcProperties, FileVersion +from openpyxl.workbook.protection import WorkbookProtection, FileSharing +from openpyxl.workbook.smart_tags import SmartTagList, SmartTagProperties +from openpyxl.workbook.views import CustomWorkbookView, BookView +from openpyxl.workbook.web import WebPublishing, WebPublishObjectList + + +class FileRecoveryProperties(Serialisable): + + tagname = "fileRecoveryPr" + + autoRecover = Bool(allow_none=True) + crashSave = Bool(allow_none=True) + dataExtractLoad = Bool(allow_none=True) + repairLoad = Bool(allow_none=True) + + def __init__(self, + autoRecover=None, + crashSave=None, + dataExtractLoad=None, + repairLoad=None, + ): + self.autoRecover = autoRecover + self.crashSave = crashSave + self.dataExtractLoad = dataExtractLoad + self.repairLoad = repairLoad + + +class ChildSheet(Serialisable): + """ + Represents a reference to a worksheet or chartsheet in workbook.xml + + It contains the title, order and state but only an indirect reference to + the objects themselves. + """ + + tagname = "sheet" + + name = String() + sheetId = Integer() + state = NoneSet(values=(['visible', 'hidden', 'veryHidden'])) + id = Relation() + + def __init__(self, + name=None, + sheetId=None, + state="visible", + id=None, + ): + self.name = name + self.sheetId = sheetId + self.state = state + self.id = id + + +class PivotCache(Serialisable): + + tagname = "pivotCache" + + cacheId = Integer() + id = Relation() + + def __init__(self, + cacheId=None, + id=None + ): + self.cacheId = cacheId + self.id = id + + +class WorkbookPackage(Serialisable): + + """ + Represent the workbook file in the archive + """ + + tagname = "workbook" + + conformance = NoneSet(values=['strict', 'transitional']) + fileVersion = Typed(expected_type=FileVersion, allow_none=True) + fileSharing = Typed(expected_type=FileSharing, allow_none=True) + workbookPr = Typed(expected_type=WorkbookProperties, allow_none=True) + properties = Alias("workbookPr") + workbookProtection = Typed(expected_type=WorkbookProtection, allow_none=True) + bookViews = NestedSequence(expected_type=BookView) + sheets = NestedSequence(expected_type=ChildSheet) + functionGroups = Typed(expected_type=FunctionGroupList, allow_none=True) + externalReferences = NestedSequence(expected_type=ExternalReference) + definedNames = Typed(expected_type=DefinedNameList, allow_none=True) + calcPr = Typed(expected_type=CalcProperties, allow_none=True) + oleSize = NestedString(allow_none=True, attribute="ref") + customWorkbookViews = NestedSequence(expected_type=CustomWorkbookView) + pivotCaches = NestedSequence(expected_type=PivotCache, allow_none=True) + smartTagPr = Typed(expected_type=SmartTagProperties, allow_none=True) + smartTagTypes = Typed(expected_type=SmartTagList, allow_none=True) + webPublishing = Typed(expected_type=WebPublishing, allow_none=True) + fileRecoveryPr = Typed(expected_type=FileRecoveryProperties, allow_none=True) + webPublishObjects = Typed(expected_type=WebPublishObjectList, allow_none=True) + extLst = Typed(expected_type=ExtensionList, allow_none=True) + Ignorable = NestedString(namespace="http://schemas.openxmlformats.org/markup-compatibility/2006", allow_none=True) + + __elements__ = ('fileVersion', 'fileSharing', 'workbookPr', + 'workbookProtection', 'bookViews', 'sheets', 'functionGroups', + 'externalReferences', 'definedNames', 'calcPr', 'oleSize', + 'customWorkbookViews', 'pivotCaches', 'smartTagPr', 'smartTagTypes', + 'webPublishing', 'fileRecoveryPr', 'webPublishObjects') + + def __init__(self, + conformance=None, + fileVersion=None, + fileSharing=None, + workbookPr=None, + workbookProtection=None, + bookViews=(), + sheets=(), + functionGroups=None, + externalReferences=(), + definedNames=None, + calcPr=None, + oleSize=None, + customWorkbookViews=(), + pivotCaches=(), + smartTagPr=None, + smartTagTypes=None, + webPublishing=None, + fileRecoveryPr=None, + webPublishObjects=None, + extLst=None, + Ignorable=None, + ): + self.conformance = conformance + self.fileVersion = fileVersion + self.fileSharing = fileSharing + if workbookPr is None: + workbookPr = WorkbookProperties() + self.workbookPr = workbookPr + self.workbookProtection = workbookProtection + self.bookViews = bookViews + self.sheets = sheets + self.functionGroups = functionGroups + self.externalReferences = externalReferences + self.definedNames = definedNames + self.calcPr = calcPr + self.oleSize = oleSize + self.customWorkbookViews = customWorkbookViews + self.pivotCaches = pivotCaches + self.smartTagPr = smartTagPr + self.smartTagTypes = smartTagTypes + self.webPublishing = webPublishing + self.fileRecoveryPr = fileRecoveryPr + self.webPublishObjects = webPublishObjects + + + def to_tree(self): + tree = super().to_tree() + tree.set("xmlns", SHEET_MAIN_NS) + return tree + + + @property + def active(self): + for view in self.bookViews: + if view.activeTab is not None: + return view.activeTab + return 0 diff --git a/venv/lib/python3.11/site-packages/openpyxl/pivot/__init__.py b/venv/lib/python3.11/site-packages/openpyxl/pivot/__init__.py new file mode 100755 index 0000000..ab6cdea --- /dev/null +++ b/venv/lib/python3.11/site-packages/openpyxl/pivot/__init__.py @@ -0,0 +1 @@ +# Copyright (c) 2010-2024 openpyxl diff --git a/venv/lib/python3.11/site-packages/openpyxl/pivot/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/pivot/__pycache__/__init__.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..eef23bc3e5f1e65ed2def9959366abb5dc939609 GIT binary patch literal 203 zcmZ3^%ge<81R`3~vy_4KV-N=h7@>^MY(U0zh7^Wi22Do4l?+8pK>lZt73T z+|*+I;>5g^%;IcABMbesoW$a6{esH0oYd43{j$`&GX0#)B%nY^Mt+{Lo}rIre0*kJW=VX!UP0wA4x8Nkl+v73yCPPgbsz^7 U^8<+w%#4hT9~fXn5i?K>08R)rd;kCd literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/pivot/__pycache__/cache.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/pivot/__pycache__/cache.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..c8d123c5bf164d1319bd567d1af054cddbebae6b GIT binary patch literal 34010 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 Xu}&V7z|42UgT2p@`mzg482^6&y)I0f literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/pivot/__pycache__/table.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/pivot/__pycache__/table.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..3de676e1033655c0a0772e4a607071728caa3785 GIT binary patch literal 44829 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/colors.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/colors.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..ae37814aa19565cb8270ce2f1afb6220c7a5186e GIT binary patch literal 7420 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/differential.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/differential.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..cdc8088c71ac49c0cf6a3f338f24f73f45518f0a GIT binary patch literal 4016 zcmb_fO>7&-6`m!z;C_gk3@jl`K-0bg3NDL*=j@ zmar{kMar@+3ps2>%P~DxR&=Et*W=}co+u~vBJ^o|Z_6+#)pkkkA;DABPEf z3Xfm(KA}@U7eAp>X<~`wl3!uhT-cM}UavChDNF4ARaPl7PoA^Pf|HZH)Dq)n!7`n~ zvc+<;7g?|?E}&^yUi5~|DdS!oI^V6787LAz<+jU;u4z}kl5lJoVR5y*%=m)M%LTXS z&&|ikVdda&AnX!Gbcqr@L?t~;LwY1cn9QOy{Bh)Q2o?s9U-X#JC_OZBp-J@6B!wo` zLz5Poz8)G?Xfi!C{c+O$p)sI9(z8?srz&3myjdzS4*meoExGF!^TKqkl#69~c$8!WN4VWuXltK}MWB?ILNiy6!24VOC7nFg8X`@Hg4fX*jp505#IilEE`uk?nYEXbgUmty9CI zcIF)X^mQ6XErhL;Th9i5R=e{onc14zb3cjHlQWIvOfxxCn{TDFTkq_TeR`puo^7OOo9Wrw zLaSH5%;1i^e;fK`W*eE=W@ff_+qWJ1WWJuh+DKn*rmuo+|Ip6hzW(Way??IJKiBM^ ztNpkgC8tMQ!(*+Xk=E!q3S$~zTUF(=ZSoTESBDEbmV7$le()R6ye#>A9DWR2=4r5P zMCws!g@)+Ls6du3m{WJzCL-htv zgxnp|aW}r7z%4M(=xP=7uU3TgQ7|ivYbBd&-4U$$Q9UUPya=Ql$lm-kyoP50AP>t$ zd$r>7i%?rEc2=HL%fk0|=yLui!9-Iqqkgf=vvMz3r z!*a~(7_%GD<2b9ol`w(ci*#%s5FVnTCDPrt-}RJDzyIgqVUBM1gdUJ&p z?`y8DIgDu^tT1;4I29CX1&gx+UDwzeM1Z3~!qW;>$X!%3UCk_M)Mk!Wv0a~P9Bd=r zIUuw}IAjv0V^$ou0Oz>a&t4o)_cuAWxfga^?nV7r@uL2?PeMnOI_TC8nXiGoG1i+* z-}DCbaFzjTcrTwlrIcysdv94V7T^B4FtOM6wg31e9tIIjZ!?=?OLSAIqwk@%aCz6OA2M704 z0G?;4hI90#dBE4d12zsGS2gmbI=FQoFCa<*raR6yqq+QyUc~_K^dkw(c9ZyU48*$Ie3CV#zGJ8O*d7H%>TP%!xpRf zsr3i=$|J9eRJ$?Sd!{0>{}K%_L)XYZ)$GpekFI?5;r54hWlT&GJRuT)F3UCO!zU2V z0eCUPpmq^16X&rhf`BXaXMyR>kJq?i6kM0%tpjtsAIYzybOqrJ08fEyYn5?#UCdUz zP`unf8orJF5H7>x{28DYeA=Oqth5P&Le#<9t!Ihs)_3X?m+Oh?Mq;{|n6BLvmxP^} zkKWsU4{isUk=pHcRFY3ao;e1JB5Q3Dz>q9|t4#vPNb&?)9D*WY=KvHE?Q4f5yi5Q* z4@33g&yN~JtG^;#$6_wyo$A~wCn*qa3wm>o9NYP(&_qR#qq53)S#cA zp#7_zxXX#lo4Cv2<;{!1KM43w<#2K36MPBxBF9HA|3>+df1kX@-vk9llLLP*W9!#FRKiLB29Rro9smFU literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/fills.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/fills.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..f255af5024022e2f032597fd35eb41809f526173 GIT binary patch literal 10573 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 QO$skP!_wz_R8b}UU&SERy8r+H literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/fonts.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/fonts.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..efd412c0ebebb9b09c63b36123372cf6a91d3c56 GIT binary patch literal 4765 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 Dec_o< literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/numbers.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/numbers.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..75df6e44ed60a8ee3942dd6aa8357223fa761c40 GIT binary patch literal 8800 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 VZkb>a|EjO6zYP2P7S~k*e*hNG^nCyT literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/proxy.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/proxy.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..a7953992bc4b80ddbe67b84d63e942c454c9ef0e GIT binary patch literal 3114 zcmb7G-D?|15Z^uN_M@LtO#T@;7#a=&h0=$ zB$FKkM&H?unN5|D-;rsIcu4GB1Y(15!l^}yBu6OHibab`PN760UlJZ$COrN`A>=9i zf{}}Hb(~}peMr_9qmKfnP9q$1-^W1OuJN>x3Vre!OfP?4I`xr9;09vJY8Q%@0&Ez z5T?KcHwmyro*z545?@WOz-JGSlaFEm3?5k?`z#O}#A|w2B{LD%8oO~K+F?4LTR`fF zPGGjF=z@ofOPJ^eL<{lt0Sg0R8fW(cERh$f^xBQ}Z+21xyQzViHXwRH+!7tkd}-!6 zAl_|em9}R5zM*XpZ^)Iv){G);_2VcBqZOFksq5iHu)4p+uaW#HnBZcTpyB;%-umJe z-$@PcriN?Ua9}!`+8B}Pb0GPdVrp?ZD`$vQv%k60>g6A(*R)S-t!y=?ZbK6$t|w#1 zW(JepBj$IHffEZ8WzYOV2uJv;TP~Tx2T!_z%XK{ym;M&$IbWSKtg`91>v|qa!G&q) zAt>r483J(vxVKy%ZFC&oxwioRg0${T)zU-HI)`eVLoa$+ozQ`6^d+I`>-3dGkR-3u zKeXhdw$-*@wd2pU_KquoRY zXxI*GPnCPL6knUJ8=S*Qds_-m$}+IjJp!;q>UhxA#m(|g>U2#zEd#i4?pqfXmnuVW z6=awrSl+a(5n$M*eR7ydtt}le0h?k2+gk>BcWY^_%|)e353j-2I=w;e_um7rFUA(* zUK=O~M^&lDs_`cf_NN$nIVf2@T2*8OZvL12VPBh-hmPP3E;AR3(z5WXD?v?x>%D2= zl&7Yl@}ku8Rk&D+uHP1xQ$`KCpfdZ=SMnvF&iZuDh5sB_j4bHka`i&0DIVzKk6?~_ z6JUwFPLS^2wbSe8cam&3$ySu-ef=9ZAK(1x*7_|d!1hxT9^F_OTY2!JE4_AYlWvag zbe-JoI$4w7=cywr?FSovl&Qx+&D)tei*F%Uia z;{6CcB$ZxW+)|&V25Z{jKNx}c5gJjYf$FY?@@;acX4^cV8AX?xG^dYle){-QEyZdY zlbSOtKzAHhL;&m{vLSSnM9)&L)^mABy|SxbsVl15 zTPFZ7V%~ts{&tN(Gb{u+6&`TH9=Q)~U!6Bj5LcMx8p?A0MJr24-B^N+~@ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/styleable.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/styleable.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..a0721f4ffbedb8cd6e1e29d7b39a40693d1d5af9 GIT binary patch literal 8247 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 F{{dpJAff;O literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/table.cpython-311.pyc b/venv/lib/python3.11/site-packages/openpyxl/styles/__pycache__/table.cpython-311.pyc new file mode 100755 index 0000000000000000000000000000000000000000..2d8a438781c24345b1ce1bf3534e61abfdcf7df6 GIT binary patch literal 3816 zcmcIn&2JmW6`v({$>nlMiu$l<*>x>TIWTC&%5oj&qm5h3b{r^dYY9fMFtAv0MiS#C zmziDKmZ1X=J}5;FJ`|A9Lk~TuF`Pf3e?pHGpaU@{14RzGQLs-r<-J*ciu9p}4tIb1 z=DnHOH?!~eX85mE${6L_)s2G+3?V?n5lNHl46%rwL3Duqx8e_^)l#o|&hs8=sTO4fq zh%GH`39uO>whT?Klf3yO4wF}exz2dmam&85>9V{ow2j>wqe8pmdQKqJKYE@kqU$UW z@q5*PZ8I+7MX$xw4i+SFcos;W|Az zEe+5FSER;7#%Cq3O8biJK+jH_$*@g0TDPBU_L+S3E#|r+jV~Fj%LW_hkhG`J-mgwc z^Ll+#y4-PeI(*R??NqQ+=JbqmVyHh(IXm1LRTD!!QKN6VPW2H=Gjf2=oa&pnh!`Q~ zhUVJW&&Z)hnor76U_5ZIJH%8t#ISNw_8-<|YR)#hQ)Vt*b2gdli@xH40+rHr5Jq?xRGsdegkko_LMzhgA|s%2-JFUx)+5SwwHyHb@Eav z=A%LlfJ;L4%g>n5=+muxG_OLHxm)}yH03J@*8qHc@ntAKJuE!H@M31VympRacglmkWM5V85<8rAIJ#zu?tawYK}zE%+Go zenAHNQf*i0wq3541KWN!H^PafuI&ms^b3FnX&Yqb{J#2aqBWh9kC{1m82j*h0}V(% zS}Ydx298^GD$KTpVcQjt)?JiM+y1)lxE)J8aJEt8ap)M%Uq`982>b)6z9jqxYOfiJsd~&Y<}~IVC#aTZxU;_9QW<_CGkJ&E&#ya^WPo z&{%DO=I&w8G#8J}#S?R}al0KOvlm+D=328C+VQw{p-tWap_l03_%!zqu#Bd;BhbEr zJ1m{_78yxyY*mbX0GEKFLh5s7DZnuX>?qrKo15!=xw^V}k0C7&9_48p7xY zfiPr{$RxSJm%zc75s_j~YpfJ7YGWYt0%-FJpMXb^{|>Me1LzifspQKV2>%OT_EcaG z_LOB$gBsF77UU9N1~IP*6{AOJwen*x5SnyXXeF;+4Wvu?82>Faw`EnRt7;ev|`b*Fw00y9sO8^8&cL@+ierxzKe|29y(JwXSB|{>w0VBfI$xrYP zVG#Zi!p8`oAmG^{bP^pJ@Kmxvx|>9U41RPRdBnnf%eQUG61n;VMEMjuAp8n$ACDe` zM43aPWcROsbK~0^81xhStB0#ibN<+zKQZSUx5sJD5~G#7e5f}IH~+KI%-uiE-9O3Q zZ>lq|r}B-pkTXD=@LG7UolI)L%6CBMHaa_=Ie!JqD09X{Jsu9!G5Q$j<4hmJh6J#| zpfM}iWdu#pB=EsxDQZ3^NATtWcBW|@jt^;(?uW=)*$+gr&lEqT3jYK21ZLdCM^uKK z$WpfD)ZL)pxu^OwMzCaBaqw*N1*7G99OZ8(ANJY0IeYtNg5CTO5mA>_!pB`rxPBIHkeIX>YTI5AA^FJYA*2`z!&FlWU zNe*L_OPBa(Ac=%+J3+v^EEal=!&c3M-7rhx-~*)o9IFVJ$3{qf0Z5&@bQt??v6(9z z=L#pe0uZt_MwLDPBKMu~@1U7oJ$=Tt6<_7aa<d}q2%}cOK6O7 z;hzU=M-@eZ6;M8Il8*+jb|j%h+T{NW=ZG@bB + + + + + + + + + + + + + + + + + + +

    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 +Password: p4ssw0rd +Database: /db/pyfleet.db + + + pip install -r requirements.txt python app.py # → http://127.0.0.1:5000 +gunicorn -w 2 -b 0.0.0.0:5000 app:app + +Ejecutar con Python en segundo plano +nohup python app.py > flask.log 2>&1 & +Comprobar que esta activo +ps aux | grep python +Para detenerlo +pkill -f "Python app.py" + +Gunicorn en segundo plano. +gunicorn -w 4 -b 0.0.0.0:5000 app:app > gunicorn.log 2>&1 & +nohup gunicorn -w 4 -b 127.0.0.1:5000 app:app > gunicorn.log 2>&1 & +Parar +ps aux | grep gunicorn (averiguar proceso) +pkill -f gunicorn. (nombre proceso) +kill 12345. (Numero proceso) + + + PRODUCCION LINUX GUNICORN pip install gunicorn gunicorn app:app -gunicorn --bind 0.0.0.0:8000 app:app +gunicorn -w 2 -b 0.0.0.0:5000 app:app +gunicorn --bind 0.0.0.0:5000 app:app + +gunicorn -w 4 -b 127.0.0.1:8000 app:app gunicorn --workers 4 --bind 0.0.0.0:8000 app:app gunicorn --workers 4 --bind 0.0.0.0:8000 --timeout 120 app:app @@ -35,6 +66,7 @@ kill 1337144 la primera de la lista pkill -f "gunicorn.*app:app lo elimina de una sola vez + --------------------------------------------------------------- @@ -43,7 +75,7 @@ TABLAS CREATE TABLE "vehiculos" ( "id" INTEGER, "m_oficial" TEXT, - "m_civil" TEXT, + "m_reservada" TEXT, "m_propia" TEXT, "VIN" TEXT, "poliza" TEXT, @@ -54,10 +86,7 @@ CREATE TABLE "vehiculos" ( "tipo" TEXT, "denominacion" TEXT, "color" REAL, - "cilindrada" TEXT, - "potencia" TEXT, "combustible" TEXT, - "neumaticos" TEXT, "plazas" TEXT, "lanzadestellos" INTEGER, "situacion" TEXT, @@ -77,11 +106,53 @@ CREATE TABLE "vehiculos" ( "itv" INTEGER, "observaciones" TEXT, "historial" TEXT, - "notas" TEXT, + "notas" TEXT, pdf TEXT, PRIMARY KEY("id" AUTOINCREMENT) ) + +CREATE TABLE documentos ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + vehiculo_id INTEGER NOT NULL REFERENCES vehiculos(id) ON DELETE CASCADE, + nombre TEXT, + filename TEXT NOT NULL, + fecha DATETIME DEFAULT (datetime('now','localtime')) + ) + +CREATE TABLE "historial" ( + "id" INTEGER, + "vehiculo_id" INTEGER, + "fecha" TEXT, + "matricula" TEXT, + "situacion" TEXT, + "poblacion" TEXT, + "unidad" TEXT, + "grupo" TEXT, + "observaciones" TEXT, + PRIMARY KEY("id" AUTOINCREMENT), + FOREIGN KEY("vehiculo_id") REFERENCES "vehiculos"("id") +) + +CREATE TABLE mensajes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + texto TEXT NOT NULL, + autor TEXT, + fecha DATETIME DEFAULT (datetime('now','localtime')) + ) + + ----------------------------------------- +Cambiar nombre de columna + +ALTER TABLE nombre_tabla +RENAME COLUMN nombre_actual TO nombre_nuevo; + +Eliminar columna (hay que hacerlo de una en una (SQLite no permite varias a la vez) +ALTER TABLE usuarios +DROP COLUMN nombre; + + + Cambiar None por Null table vehiculos UPDATE vehiculos diff --git a/static/bootstrap-icons-1.13.1.zip b/static/bootstrap-icons-1.13.1.zip deleted file mode 100755 index 8f595bf0c5a72774a4cc9960883dea5c7f85bb4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1694584 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