From 75dad86ba48137820342a2c4dbcfb483a289ea7e Mon Sep 17 00:00:00 2001 From: Michele Scandura Date: Thu, 23 Sep 2021 09:44:56 +0100 Subject: [PATCH] New campaign system --- .dockerignore | 12 + .drone.yml | 60 + .editorconfig | 8 + .gitignore | 367 + .vscode/launch.json | 59 + .vscode/settings.json | 3 + .vscode/tasks.json | 81 + Assets/overlays/allied-star.png | Bin 0 -> 2291 bytes Assets/overlays/american-shield.png | Bin 0 -> 2387 bytes Assets/overlays/ammonite.png | Bin 0 -> 2991 bytes Assets/overlays/ancient-columns.png | Bin 0 -> 571 bytes Assets/overlays/ancient-sword.png | Bin 0 -> 2083 bytes Assets/overlays/anvil-impact.png | Bin 0 -> 1606 bytes Assets/overlays/anvil.png | Bin 0 -> 880 bytes Assets/overlays/arrow-flights.png | Bin 0 -> 2076 bytes Assets/overlays/assassin-pocket.png | Bin 0 -> 1903 bytes Assets/overlays/bandaged.png | Bin 0 -> 1717 bytes Assets/overlays/barbed-wire.png | Bin 0 -> 3161 bytes Assets/overlays/barbute.png | Bin 0 -> 1853 bytes Assets/overlays/battle-axe.png | Bin 0 -> 2159 bytes Assets/overlays/black-book.png | Bin 0 -> 2411 bytes Assets/overlays/black-flag.png | Bin 0 -> 2159 bytes Assets/overlays/boiling-bubbles.png | Bin 0 -> 2706 bytes Assets/overlays/bolt-saw.png | Bin 0 -> 2165 bytes Assets/overlays/boot-prints.png | Bin 0 -> 1780 bytes Assets/overlays/bowie-knife.png | Bin 0 -> 1160 bytes Assets/overlays/breastplate.png | Bin 0 -> 2360 bytes Assets/overlays/broad-dagger.png | Bin 0 -> 1967 bytes Assets/overlays/broadhead-arrow.png | Bin 0 -> 2005 bytes Assets/overlays/broadsword.png | Bin 0 -> 1229 bytes Assets/overlays/broken-arrow.png | Bin 0 -> 1146 bytes Assets/overlays/brutal-helm.png | Bin 0 -> 2568 bytes Assets/overlays/brute.png | Bin 0 -> 1857 bytes Assets/overlays/bubbling-bowl.png | Bin 0 -> 2826 bytes Assets/overlays/bubbling-flask.png | Bin 0 -> 2358 bytes Assets/overlays/bugle-call.png | Bin 0 -> 1919 bytes Assets/overlays/bull.png | Bin 0 -> 1332 bytes Assets/overlays/bully-minion.png | Bin 0 -> 2577 bytes Assets/overlays/burning-dot.png | Bin 0 -> 1999 bytes Assets/overlays/burning-embers.png | Bin 0 -> 2572 bytes Assets/overlays/caltrops.png | Bin 0 -> 1780 bytes Assets/overlays/campfire.png | Bin 0 -> 2584 bytes Assets/overlays/candle-flame.png | Bin 0 -> 1659 bytes Assets/overlays/candle-holder.png | Bin 0 -> 1379 bytes Assets/overlays/candlebright.png | Bin 0 -> 1652 bytes Assets/overlays/carnivore-mouth.png | Bin 0 -> 2133 bytes Assets/overlays/cash.png | Bin 0 -> 3011 bytes Assets/overlays/cauldron.png | Bin 0 -> 2283 bytes Assets/overlays/cellar-barrels.png | Bin 0 -> 3061 bytes Assets/overlays/centipede.png | Bin 0 -> 2087 bytes Assets/overlays/chemical-bolt.png | Bin 0 -> 2033 bytes Assets/overlays/chemical-drop.png | Bin 0 -> 1853 bytes Assets/overlays/chest.png | Bin 0 -> 996 bytes Assets/overlays/circle.png | Bin 0 -> 1542 bytes Assets/overlays/circular-sawblade.png | Bin 0 -> 3199 bytes Assets/overlays/cleaver.png | Bin 0 -> 2031 bytes Assets/overlays/cliff-crossing.png | Bin 0 -> 1673 bytes Assets/overlays/cloak-dagger.png | Bin 0 -> 2062 bytes Assets/overlays/clover.png | Bin 0 -> 1981 bytes Assets/overlays/cobweb.png | Bin 0 -> 3402 bytes Assets/overlays/coffin.png | Bin 0 -> 1577 bytes Assets/overlays/coins.png | Bin 0 -> 1741 bytes Assets/overlays/confirmed.png | Bin 0 -> 2143 bytes Assets/overlays/cracked-glass.png | Bin 0 -> 2938 bytes Assets/overlays/croc-jaws.png | Bin 0 -> 2798 bytes Assets/overlays/crossbow.png | Bin 0 -> 2442 bytes Assets/overlays/crossed-bones.png | Bin 0 -> 2002 bytes Assets/overlays/crossed-chains.png | Bin 0 -> 2703 bytes Assets/overlays/crown-coin.png | Bin 0 -> 3084 bytes Assets/overlays/crown-of-thorns.png | Bin 0 -> 2270 bytes Assets/overlays/crown.png | Bin 0 -> 2028 bytes Assets/overlays/crystal-bars.png | Bin 0 -> 3163 bytes Assets/overlays/crystal-growth.png | Bin 0 -> 3034 bytes Assets/overlays/cubes.png | Bin 0 -> 2287 bytes Assets/overlays/cultist.png | Bin 0 -> 1967 bytes Assets/overlays/curled-tentacle.png | Bin 0 -> 2235 bytes Assets/overlays/curling-vines.png | Bin 0 -> 3383 bytes Assets/overlays/curvy-knife.png | Bin 0 -> 1679 bytes Assets/overlays/cut-diamond.png | Bin 0 -> 1918 bytes Assets/overlays/dark-squad.png | Bin 0 -> 3095 bytes Assets/overlays/death-juice.png | Bin 0 -> 1790 bytes Assets/overlays/decapitation.png | Bin 0 -> 1512 bytes Assets/overlays/dice-six-faces-five.png | Bin 0 -> 1492 bytes Assets/overlays/dice-six-faces-four.png | Bin 0 -> 1232 bytes Assets/overlays/dice-six-faces-one.png | Bin 0 -> 725 bytes Assets/overlays/dice-six-faces-six.png | Bin 0 -> 1651 bytes Assets/overlays/dice-six-faces-three.png | Bin 0 -> 1222 bytes Assets/overlays/dice-six-faces-two.png | Bin 0 -> 971 bytes Assets/overlays/dice-twenty-faces-one.png | Bin 0 -> 3153 bytes Assets/overlays/dig-dug.png | Bin 0 -> 1963 bytes Assets/overlays/dinosaur-rex.png | Bin 0 -> 2002 bytes Assets/overlays/dolmen.png | Bin 0 -> 2148 bytes Assets/overlays/door.png | Bin 0 -> 518 bytes Assets/overlays/doorway.png | Bin 0 -> 1704 bytes Assets/overlays/double-dragon.png | Bin 0 -> 2219 bytes Assets/overlays/dragon-head.png | Bin 0 -> 2371 bytes Assets/overlays/dread.png | Bin 0 -> 2418 bytes Assets/overlays/drop.png | Bin 0 -> 1279 bytes Assets/overlays/droplet-splash.png | Bin 0 -> 1834 bytes Assets/overlays/droplets.png | Bin 0 -> 2584 bytes Assets/overlays/duck.png | Bin 0 -> 1820 bytes Assets/overlays/earth-crack.png | Bin 0 -> 2790 bytes Assets/overlays/earth-spit.png | Bin 0 -> 1891 bytes Assets/overlays/earwig.png | Bin 0 -> 2548 bytes Assets/overlays/evil-bat.png | Bin 0 -> 3066 bytes Assets/overlays/evil-minion.png | Bin 0 -> 2149 bytes Assets/overlays/fangs.png | Bin 0 -> 2105 bytes Assets/overlays/feather.png | Bin 0 -> 1844 bytes Assets/overlays/fire-ring.png | Bin 0 -> 2366 bytes Assets/overlays/fireplace.png | Bin 0 -> 1538 bytes Assets/overlays/fishing-net.png | Bin 0 -> 3668 bytes Assets/overlays/fist.png | Bin 0 -> 1767 bytes Assets/overlays/flame.png | Bin 0 -> 1968 bytes Assets/overlays/flamer.png | Bin 0 -> 1387 bytes Assets/overlays/flat-paw-print.png | Bin 0 -> 1981 bytes Assets/overlays/floating-tentacles.png | Bin 0 -> 3246 bytes Assets/overlays/floor-hatch.png | Bin 0 -> 1941 bytes Assets/overlays/flying-flag.png | Bin 0 -> 1687 bytes Assets/overlays/footprint.png | Bin 0 -> 1641 bytes Assets/overlays/footsteps.png | Bin 0 -> 1124 bytes Assets/overlays/gargoyle.png | Bin 0 -> 3028 bytes Assets/overlays/gecko.png | Bin 0 -> 2139 bytes Assets/overlays/ghost.png | Bin 0 -> 2081 bytes Assets/overlays/giant-squid.png | Bin 0 -> 2950 bytes Assets/overlays/goblin-camp.png | Bin 0 -> 3355 bytes Assets/overlays/goblin-head.png | Bin 0 -> 2489 bytes Assets/overlays/goose.png | Bin 0 -> 1719 bytes Assets/overlays/grim-reaper.png | Bin 0 -> 1574 bytes Assets/overlays/guillotine.png | Bin 0 -> 1123 bytes Assets/overlays/handcuffed.png | Bin 0 -> 2008 bytes Assets/overlays/hanging-spider.png | Bin 0 -> 2465 bytes Assets/overlays/harp.png | Bin 0 -> 2039 bytes Assets/overlays/harpy.png | Bin 0 -> 2716 bytes Assets/overlays/heavy-helm.png | Bin 0 -> 2522 bytes Assets/overlays/hobbit-door.png | Bin 0 -> 2398 bytes Assets/overlays/hole-ladder.png | Bin 0 -> 2334 bytes Assets/overlays/hole.png | Bin 0 -> 1117 bytes Assets/overlays/hydra.png | Bin 0 -> 2472 bytes Assets/overlays/imp.png | Bin 0 -> 2272 bytes Assets/overlays/imprisoned.png | Bin 0 -> 2189 bytes Assets/overlays/invisible.png | Bin 0 -> 1650 bytes Assets/overlays/jellyfish.png | Bin 0 -> 3074 bytes Assets/overlays/lamellar.png | Bin 0 -> 2426 bytes Assets/overlays/lever.png | Bin 0 -> 2154 bytes Assets/overlays/lightning-flame.png | Bin 0 -> 2046 bytes Assets/overlays/lit-candelabra.png | Bin 0 -> 1557 bytes Assets/overlays/locked-chest.png | Bin 0 -> 2424 bytes Assets/overlays/magic-gate.png | Bin 0 -> 2953 bytes Assets/overlays/manacles.png | Bin 0 -> 2789 bytes Assets/overlays/mantrap.png | Bin 0 -> 2044 bytes Assets/overlays/masked-spider.png | Bin 0 -> 3004 bytes Assets/overlays/meeple.png | Bin 0 -> 1379 bytes Assets/overlays/metal-bar.png | Bin 0 -> 1668 bytes Assets/overlays/minefield.png | Bin 0 -> 1494 bytes Assets/overlays/minerals.png | Bin 0 -> 2495 bytes Assets/overlays/minions.png | Bin 0 -> 2288 bytes Assets/overlays/minotaur.png | Bin 0 -> 2362 bytes Assets/overlays/mite-alt.png | Bin 0 -> 2721 bytes Assets/overlays/mite.png | Bin 0 -> 2703 bytes Assets/overlays/money-stack.png | Bin 0 -> 2799 bytes Assets/overlays/moon-claws.png | Bin 0 -> 2281 bytes Assets/overlays/mouse.png | Bin 0 -> 1358 bytes Assets/overlays/mummy-head.png | Bin 0 -> 2741 bytes Assets/overlays/mushroom.png | Bin 0 -> 1582 bytes Assets/overlays/mushrooms.png | Bin 0 -> 1762 bytes Assets/overlays/nails.png | Bin 0 -> 1240 bytes Assets/overlays/nest-eggs.png | Bin 0 -> 2379 bytes Assets/overlays/nested-hexagons.png | Bin 0 -> 1788 bytes Assets/overlays/octopus.png | Bin 0 -> 2462 bytes Assets/overlays/open-chest.png | Bin 0 -> 2264 bytes Assets/overlays/open-treasure-chest.png | Bin 0 -> 2964 bytes Assets/overlays/overlay01.png | Bin 0 -> 1999 bytes Assets/overlays/overlay02.png | Bin 0 -> 1783 bytes Assets/overlays/packed-planks.png | Bin 0 -> 549 bytes Assets/overlays/pentacle.png | Bin 0 -> 2498 bytes Assets/overlays/pentagram-rose.png | Bin 0 -> 3449 bytes Assets/overlays/perspective-dice-five.png | Bin 0 -> 2200 bytes Assets/overlays/perspective-dice-four.png | Bin 0 -> 2241 bytes Assets/overlays/perspective-dice-one.png | Bin 0 -> 2197 bytes .../perspective-dice-six-faces-five.png | Bin 0 -> 2418 bytes .../perspective-dice-six-faces-four.png | Bin 0 -> 2469 bytes .../perspective-dice-six-faces-one.png | Bin 0 -> 1924 bytes .../perspective-dice-six-faces-random.png | Bin 0 -> 2122 bytes .../perspective-dice-six-faces-six.png | Bin 0 -> 2448 bytes .../perspective-dice-six-faces-three.png | Bin 0 -> 1899 bytes .../perspective-dice-six-faces-two.png | Bin 0 -> 1896 bytes Assets/overlays/perspective-dice-six.png | Bin 0 -> 2208 bytes Assets/overlays/perspective-dice-three.png | Bin 0 -> 2124 bytes Assets/overlays/perspective-dice-two.png | Bin 0 -> 2114 bytes Assets/overlays/piranha.png | Bin 0 -> 2682 bytes Assets/overlays/pirate-flag.png | Bin 0 -> 2452 bytes Assets/overlays/pirate-grave.png | Bin 0 -> 2684 bytes Assets/overlays/plain-circle.png | Bin 0 -> 1189 bytes Assets/overlays/plain-square.png | Bin 0 -> 307 bytes Assets/overlays/pointy-hat.png | Bin 0 -> 1955 bytes Assets/overlays/polar-bear.png | Bin 0 -> 1880 bytes Assets/overlays/polar-star.png | Bin 0 -> 1759 bytes Assets/overlays/portculis.png | Bin 0 -> 1246 bytes Assets/overlays/powder.png | Bin 0 -> 1886 bytes Assets/overlays/power-ring.png | Bin 0 -> 2650 bytes Assets/overlays/prisoner.png | Bin 0 -> 1414 bytes Assets/overlays/rabbit.png | Bin 0 -> 2148 bytes Assets/overlays/raise-skeleton.png | Bin 0 -> 1689 bytes Assets/overlays/raise-zombie.png | Bin 0 -> 1656 bytes Assets/overlays/rat.png | Bin 0 -> 1849 bytes Assets/overlays/rattlesnake.png | Bin 0 -> 2357 bytes Assets/overlays/robe.png | Bin 0 -> 2078 bytes Assets/overlays/rubble.png | Bin 0 -> 1841 bytes Assets/overlays/saber-tooth.png | Bin 0 -> 2946 bytes Assets/overlays/sad-crab.png | Bin 0 -> 2530 bytes Assets/overlays/scorpion-tail.png | Bin 0 -> 1628 bytes Assets/overlays/scorpion.png | Bin 0 -> 2169 bytes Assets/overlays/sea-dragon.png | Bin 0 -> 2220 bytes Assets/overlays/skull-crack.png | Bin 0 -> 1932 bytes Assets/overlays/skull-crossed-bones.png | Bin 0 -> 2274 bytes Assets/overlays/slipknot.png | Bin 0 -> 1230 bytes Assets/overlays/snail.png | Bin 0 -> 2309 bytes Assets/overlays/snake.png | Bin 0 -> 2296 bytes Assets/overlays/spectre.png | Bin 0 -> 2431 bytes Assets/overlays/spider-alt.png | Bin 0 -> 3019 bytes Assets/overlays/spider-web.png | Bin 0 -> 3983 bytes Assets/overlays/splurt.png | Bin 0 -> 2500 bytes Assets/overlays/squirrel.png | Bin 0 -> 1973 bytes Assets/overlays/stairs1.png | Bin 0 -> 451 bytes Assets/overlays/stairs2.png | Bin 0 -> 437 bytes Assets/overlays/stairs3.png | Bin 0 -> 1669 bytes Assets/overlays/stone-block.png | Bin 0 -> 1879 bytes Assets/overlays/sun-priest.png | Bin 0 -> 2480 bytes Assets/overlays/swap-bag.png | Bin 0 -> 1678 bytes Assets/overlays/sword-in-stone.png | Bin 0 -> 1438 bytes Assets/overlays/swordman.png | Bin 0 -> 2026 bytes Assets/overlays/swords-emblem.png | Bin 0 -> 2142 bytes Assets/overlays/teapot.png | Bin 0 -> 1984 bytes Assets/overlays/tiara.png | Bin 0 -> 2164 bytes Assets/overlays/token.png | Bin 0 -> 1166 bytes Assets/overlays/tombstone.png | Bin 0 -> 1604 bytes Assets/overlays/transparent-slime.png | Bin 0 -> 2717 bytes Assets/overlays/two-coins.png | Bin 0 -> 1852 bytes Assets/overlays/wasp-sting.png | Bin 0 -> 2857 bytes Assets/overlays/wavy-chains.png | Bin 0 -> 3771 bytes Assets/overlays/web-spit.png | Bin 0 -> 2967 bytes Assets/overlays/whirlwind.png | Bin 0 -> 2954 bytes Assets/overlays/window-bars.png | Bin 0 -> 646 bytes Assets/overlays/wolf-howl.png | Bin 0 -> 1732 bytes Assets/overlays/wolf-trap.png | Bin 0 -> 2285 bytes Assets/overlays/wood-beam.png | Bin 0 -> 2346 bytes Assets/overlays/wooden-crate.png | Bin 0 -> 1412 bytes Assets/overlays/wooden-door.png | Bin 0 -> 1499 bytes Assets/overlays/yarn.png | Bin 0 -> 2718 bytes Assets/overlays/zigzag-hieroglyph.png | Bin 0 -> 1924 bytes Assets/sledgemapper.drawio | 1 + Assets/walls.svg | 331 + BaseCompileImage/Dockerfile | 45 + Dockerfile | 29 + README.md | 38 + Sledgemapper.Api/Commands/BaseCommand.cs | 37 + .../Commands/DeleteNoteCommand.cs | 15 + .../Commands/DeleteOverlayCommand.cs | 15 + .../Commands/DeleteTileCommand.cs | 14 + .../Commands/DeleteWallCommand.cs | 15 + .../Commands/GetCampaignMapsCommand.cs | 21 + .../Commands/GetCampaignPlayersCommand.cs | 21 + .../Commands/GetCampaignsCommand.cs | 16 + .../Commands/GetMapSnapshotCommand.cs | 18 + .../Commands/InvitePlayerToCampaignCommand.cs | 21 + .../Commands/NewCampaignCommand.cs | 19 + Sledgemapper.Api/Commands/NewLineCommand.cs | 15 + Sledgemapper.Api/Commands/NewNoteCommand.cs | 15 + .../Commands/NewOverlayCommand.cs | 15 + Sledgemapper.Api/Commands/NewRoomCommand.cs | 15 + .../Commands/NewSessionCommand.cs | 12 + .../Commands/NewSnapshotCommand.cs | 13 + Sledgemapper.Api/Commands/NewTileCommand.cs | 13 + Sledgemapper.Api/Commands/NewWallCommand.cs | 15 + Sledgemapper.Api/Commands/PingCommand.cs | 13 + .../Controllers/AuthManagementController.cs | 185 + .../Controllers/CampaignController.cs | 76 + Sledgemapper.Api/Controllers/MapController.cs | 93 + Sledgemapper.Api/Core/Entities/BaseEntity.cs | 7 + Sledgemapper.Api/Core/Entities/Campaign.cs | 25 + Sledgemapper.Api/Core/Entities/Map.cs | 17 + Sledgemapper.Api/Core/Entities/MapLog.cs | 33 + Sledgemapper.Api/Core/Entities/Session.cs | 24 + Sledgemapper.Api/Core/Entities/SessionUser.cs | 17 + Sledgemapper.Api/Core/Entities/Snapshot.cs | 21 + Sledgemapper.Api/Core/Entities/User.cs | 18 + .../Core/Entities/UserConnection.cs | 16 + .../Handlers/BaseCommandHandler.cs | 76 + .../Handlers/DeleteNoteCommandHandler.cs | 26 + .../Handlers/DeleteOverlayCommandHandler.cs | 26 + .../Handlers/DeleteTileCommandHandler.cs | 26 + .../Handlers/DeleteWallCommandHandler.cs | 26 + .../Handlers/GetCampaignMapsCommandHandler.cs | 56 + .../GetCampaignPlayersCommandHandler.cs | 43 + .../Handlers/GetCampaignsCommandHandler.cs | 43 + .../Handlers/GetMapSnapshotCommandHandler.cs | 115 + .../InvitePlayerToCampaignCommandHandler.cs | 44 + .../Handlers/NewCampaignCommandHandler.cs | 48 + .../Handlers/NewLineCommandHandler.cs | 26 + .../Handlers/NewNoteCommandHandler.cs | 26 + .../Handlers/NewOverlayCommandHandler.cs | 27 + .../Handlers/NewRoomCommandHandler.cs | 25 + .../Handlers/NewSnapshotCommandHandler.cs | 40 + .../Handlers/NewTileCommandHandler.cs | 26 + .../Handlers/NewWallCommandHandler.cs | 26 + .../Handlers/SendDeleteNoteMessage.cs | 22 + .../Handlers/SendDeleteOverlayMessage.cs | 22 + .../Handlers/SendDeleteTileMessage.cs | 22 + .../Handlers/SendDeleteWallMessage.cs | 22 + .../Handlers/SendNewLineMessage.cs | 22 + .../Handlers/SendNewNoteMessage.cs | 22 + .../Handlers/SendNewOverlayMessage.cs | 22 + .../Handlers/SendNewRoomMessage.cs | 22 + .../Handlers/SendNewTileMessage.cs | 23 + .../Handlers/SendNewWallMessage.cs | 22 + .../Handlers/StartNewSessionHandler.cs | 37 + Sledgemapper.Api/Helpers/AppException.cs | 19 + Sledgemapper.Api/Helpers/AutoMapperProfile.cs | 14 + Sledgemapper.Api/Hubs/SledgemapperHub.cs | 180 + .../Data/SledgemapperDbContext.cs | 94 + Sledgemapper.Api/JwtConfig.cs | 7 + Sledgemapper.Api/LICENSE | 21 + .../20210219223114_InitialCreate.Designer.cs | 258 + .../20210219223114_InitialCreate.cs | 218 + ...ding authentication to our Api.Designer.cs | 258 + ...223251_Adding authentication to our Api.cs | 17 + .../20210219230948_rename table.Designer.cs | 505 + .../Migrations/20210219230948_rename table.cs | 315 + ...20210528182730_ChangeCompanyId.Designer.cs | 503 + .../20210528182730_ChangeCompanyId.cs | 110 + ...0210830220131_AddCampaignToMap.Designer.cs | 506 + .../20210830220131_AddCampaignToMap.cs | 24 + ...830220730_AddCampaignToMapGuid.Designer.cs | 506 + .../20210830220730_AddCampaignToMapGuid.cs | 30 + .../20210830222316_StringUserId.Designer.cs | 508 + .../Migrations/20210830222316_StringUserId.cs | 45 + ...10901220553_renameMapToSession.Designer.cs | 507 + .../20210901220553_renameMapToSession.cs | 66 + ...10901223606_uniquesessionindex.Designer.cs | 508 + .../20210901223606_uniquesessionindex.cs | 32 + ...1224103_uniquesessionnameindex.Designer.cs | 508 + .../20210901224103_uniquesessionnameindex.cs | 33 + ...20210916154553_SessionIdToGuid.Designer.cs | 508 + .../20210916154553_SessionIdToGuid.cs | 80 + ...0917091001_SessionIdToGuidAuto.Designer.cs | 508 + .../20210917091001_SessionIdToGuidAuto.cs | 17 + .../20210917112525_UserIdGuid.Designer.cs | 508 + .../Migrations/20210917112525_UserIdGuid.cs | 46 + .../SledgemapperDbContextModelSnapshot.cs | 506 + Sledgemapper.Api/Models/AuthResult.cs | 11 + Sledgemapper.Api/Models/AuthenticateModel.cs | 13 + Sledgemapper.Api/Models/LoginResponse.cs | 9 + Sledgemapper.Api/Models/RegisterModel.cs | 24 + .../Models/RegistrationResponse.cs | 7 + Sledgemapper.Api/Models/UserLoginRequest.cs | 12 + .../Notifications/BaseNotification.cs | 21 + .../Notifications/DeleteNoteNotification.cs | 15 + .../DeleteOverlayNotification.cs | 16 + .../Notifications/DeleteTileNotification.cs | 16 + .../Notifications/DeleteWallNotification.cs | 15 + .../Notifications/NewLineNotification.cs | 16 + .../Notifications/NewNoteNotification.cs | 15 + .../Notifications/NewOverlayNotification.cs | 15 + .../Notifications/NewRoomNotification.cs | 15 + .../Notifications/NewSessionNotification.cs | 10 + .../Notifications/NewTileNotification.cs | 16 + .../Notifications/NewWallNotification.cs | 15 + .../Notifications/PingNotification.cs | 14 + Sledgemapper.Api/Program.cs | 51 + .../Properties/launchSettings.json | 10 + Sledgemapper.Api/README.md | 5 + Sledgemapper.Api/Sledgemapper.Api.csproj | 31 + Sledgemapper.Api/Startup.cs | 143 + Sledgemapper.Api/appsettings.Development.json | 12 + Sledgemapper.Api/appsettings.Production.json | 12 + Sledgemapper.Api/appsettings.json | 16 + Sledgemapper.Api/libman.json | 14 + Sledgemapper.Api/wwwroot/css/site.css | 71 + Sledgemapper.Api/wwwroot/favicon.ico | Bin 0 -> 5430 bytes Sledgemapper.Api/wwwroot/js/chat.js | 29 + .../js/signalr/dist/browser/signalr.js | 4917 +++++++ .../js/signalr/dist/browser/signalr.min.js | 17 + Sledgemapper.Api/wwwroot/js/site.js | 4 + .../wwwroot/lib/bootstrap/LICENSE | 22 + .../lib/bootstrap/dist/css/bootstrap-grid.css | 3719 ++++++ .../bootstrap/dist/css/bootstrap-grid.css.map | 1 + .../bootstrap/dist/css/bootstrap-grid.min.css | 7 + .../dist/css/bootstrap-grid.min.css.map | 1 + .../bootstrap/dist/css/bootstrap-reboot.css | 331 + .../dist/css/bootstrap-reboot.css.map | 1 + .../dist/css/bootstrap-reboot.min.css | 8 + .../dist/css/bootstrap-reboot.min.css.map | 1 + .../lib/bootstrap/dist/css/bootstrap.css | 10038 ++++++++++++++ .../lib/bootstrap/dist/css/bootstrap.css.map | 1 + .../lib/bootstrap/dist/css/bootstrap.min.css | 7 + .../bootstrap/dist/css/bootstrap.min.css.map | 1 + .../lib/bootstrap/dist/js/bootstrap.bundle.js | 7013 ++++++++++ .../bootstrap/dist/js/bootstrap.bundle.js.map | 1 + .../bootstrap/dist/js/bootstrap.bundle.min.js | 7 + .../dist/js/bootstrap.bundle.min.js.map | 1 + .../lib/bootstrap/dist/js/bootstrap.js | 4435 +++++++ .../lib/bootstrap/dist/js/bootstrap.js.map | 1 + .../lib/bootstrap/dist/js/bootstrap.min.js | 7 + .../bootstrap/dist/js/bootstrap.min.js.map | 1 + .../jquery-validation-unobtrusive/LICENSE.txt | 12 + .../jquery.validate.unobtrusive.js | 432 + .../jquery.validate.unobtrusive.min.js | 5 + .../wwwroot/lib/jquery-validation/LICENSE.md | 22 + .../dist/additional-methods.js | 1158 ++ .../dist/additional-methods.min.js | 4 + .../jquery-validation/dist/jquery.validate.js | 1601 +++ .../dist/jquery.validate.min.js | 4 + .../wwwroot/lib/jquery/LICENSE.txt | 36 + .../wwwroot/lib/jquery/dist/jquery.js | 10872 ++++++++++++++++ .../wwwroot/lib/jquery/dist/jquery.min.js | 2 + .../wwwroot/lib/jquery/dist/jquery.min.map | 1 + .../Clients/ISledgemapperClient.cs | 27 + Sledgemapper.Shared/Easings.cs | 450 + .../Entities/AuthenticateModel.cs | 16 + .../Entities/AuthenticateResponse.cs | 12 + Sledgemapper.Shared/Entities/Campaign.cs | 12 + Sledgemapper.Shared/Entities/Note.cs | 11 + Sledgemapper.Shared/Entities/Overlay.cs | 14 + Sledgemapper.Shared/Entities/Player.cs | 14 + Sledgemapper.Shared/Entities/RegisterModel.cs | 24 + Sledgemapper.Shared/Entities/Session.cs | 234 + Sledgemapper.Shared/Entities/Tile.cs | 125 + Sledgemapper.Shared/Entities/Wall.cs | 10 + Sledgemapper.Shared/ExtensionMethods.cs | 25 + .../ObservableConcurrentDictionary.cs | 143 + .../Sledgemapper.Shared.csproj | 7 + Sledgemapper.sln | 37 + Sledgemapper.sln.DotSettings | 2 + Sledgemapper/.vscode/launch.json | 27 + Sledgemapper/.vscode/tasks.json | 42 + .../AuthenticatedHttpClientHandler.cs | 38 + Sledgemapper/CachedContent.cs | 33 + Sledgemapper/ChannelsQueue.cs | 53 + Sledgemapper/CommunicationManager.cs | 310 + Sledgemapper/Content/Content.mgcb | 548 + Sledgemapper/Content/comment.png | Bin 0 -> 2408 bytes Sledgemapper/Content/eye.png | Bin 0 -> 1236 bytes .../Content/fonts/Roboto Condensed.ttf | Bin 0 -> 169848 bytes Sledgemapper/Content/fonts/font08.spritefont | 60 + Sledgemapper/Content/fonts/font12.spritefont | 60 + Sledgemapper/Content/fonts/font20.spritefont | 60 + Sledgemapper/Content/fonts/font28.spritefont | 60 + Sledgemapper/Content/fonts/font36.spritefont | 60 + Sledgemapper/Content/fonts/font42.spritefont | 60 + Sledgemapper/Content/fonts/font60.spritefont | 60 + Sledgemapper/Content/fonts/font99.spritefont | 60 + Sledgemapper/Content/handcursors | Bin 0 -> 4969 bytes Sledgemapper/Content/handcursors.png | Bin 0 -> 349 bytes Sledgemapper/Content/handcursorsIndex | 7 + Sledgemapper/Content/icon_delete.png | Bin 0 -> 871 bytes Sledgemapper/Content/icon_line.png | Bin 0 -> 874 bytes Sledgemapper/Content/icon_room.png | Bin 0 -> 360 bytes Sledgemapper/Content/listBackground.png | Bin 0 -> 697 bytes Sledgemapper/Content/location.png | Bin 0 -> 1371 bytes Sledgemapper/Content/rippleSpriteIndex | 24 + Sledgemapper/Content/rippleSpriteMap | Bin 0 -> 14526 bytes Sledgemapper/Content/shaders/OutlineShader.fx | 101 + Sledgemapper/Content/spriteIndex | 248 + Sledgemapper/Content/sprites | Bin 0 -> 447209 bytes Sledgemapper/Content/tiles/tile01.png | Bin 0 -> 198 bytes Sledgemapper/Content/tiles/tile02.png | Bin 0 -> 197 bytes Sledgemapper/Content/tiles/tile03.png | Bin 0 -> 197 bytes Sledgemapper/Content/tiles/tile04.png | Bin 0 -> 273 bytes Sledgemapper/Content/tiles/tile05.png | Bin 0 -> 200 bytes Sledgemapper/Content/tiles/tile06.png | Bin 0 -> 191 bytes Sledgemapper/Content/tiles/tile07.png | Bin 0 -> 163 bytes Sledgemapper/Content/tiles/tile08.png | Bin 0 -> 166 bytes Sledgemapper/Content/tiles/tile09.png | Bin 0 -> 161 bytes Sledgemapper/Content/tiles/tile10.png | Bin 0 -> 162 bytes Sledgemapper/Content/tiles/tile11.png | Bin 0 -> 159 bytes Sledgemapper/Content/tiles/tile12.png | Bin 0 -> 155 bytes Sledgemapper/Content/tiles/tile13.png | Bin 0 -> 162 bytes Sledgemapper/Content/tiles/tile14.png | Bin 0 -> 164 bytes Sledgemapper/Content/tiles/tile15.png | Bin 0 -> 159 bytes Sledgemapper/Content/tiles/tile16.png | Bin 0 -> 162 bytes Sledgemapper/Content/tiles/tile17.png | Bin 0 -> 244 bytes Sledgemapper/Content/walls/wall01.png | Bin 0 -> 1088 bytes Sledgemapper/Content/walls/wall02.png | Bin 0 -> 1153 bytes Sledgemapper/Content/walls/wall03.png | Bin 0 -> 986 bytes Sledgemapper/Content/walls/wall04.png | Bin 0 -> 1249 bytes Sledgemapper/Content/walls/wall05.png | Bin 0 -> 4859 bytes Sledgemapper/Content/walls/wall06.png | Bin 0 -> 3710 bytes Sledgemapper/Content/walls/wall07.png | Bin 0 -> 1229 bytes Sledgemapper/Content/walls/wall08.png | Bin 0 -> 1219 bytes Sledgemapper/Content/walls/wall09.png | Bin 0 -> 8134 bytes Sledgemapper/Content/walls/wall10.png | Bin 0 -> 1138 bytes Sledgemapper/Content/walls/wall11.png | Bin 0 -> 1195 bytes Sledgemapper/ExtensionMethods.cs | 96 + Sledgemapper/IIdentityApi.cs | 16 + Sledgemapper/IMapApi.cs | 98 + Sledgemapper/Icon.bmp | Bin 0 -> 20790 bytes Sledgemapper/Icon.icns | Bin 0 -> 33068 bytes Sledgemapper/Icon.ico | Bin 0 -> 21662 bytes Sledgemapper/Icon.png | Bin 0 -> 396 bytes Sledgemapper/InsertMode.cs | 14 + .../CampaignSelectedMessage - Copy.cs | 9 + Sledgemapper/Messages/CenterOnTileMessage.cs | 12 + Sledgemapper/Messages/ErrorMessage.cs | 12 + .../Messages/LoginSuccessfulMessage.cs | 12 + Sledgemapper/Messages/MapOpenedMessage.cs | 16 + .../SignalrConnectionUpdateMessage.cs | 9 + Sledgemapper/Program.cs | 18 + Sledgemapper/Settings.cs | 52 + Sledgemapper/Sledgemapper.cs | 1796 +++ Sledgemapper/Sledgemapper.csproj | 92 + Sledgemapper/SpriteSheet.cs | 37 + Sledgemapper/State.cs | 191 + Sledgemapper/TileAction.cs | 8 + Sledgemapper/UI/CampaignList.Custom.cs | 97 + Sledgemapper/UI/CampaignList.Generated.cs | 86 + Sledgemapper/UI/CampaignList.cs | 11 + Sledgemapper/UI/CampaignList.xmmp | 16 + Sledgemapper/UI/CampaignWindow.Custom.cs | 77 + Sledgemapper/UI/CampaignWindow.Generated.cs | 67 + Sledgemapper/UI/CampaignWindow.cs | 11 + Sledgemapper/UI/ErrorWindow.Custom.cs | 17 + Sledgemapper/UI/ErrorWindow.Generated.cs | 42 + Sledgemapper/UI/ErrorWindow.cs | 11 + Sledgemapper/UI/ErrorWindow.xmmp | 7 + Sledgemapper/UI/ListItem.Custom.cs | 8 + Sledgemapper/UI/ListItem.Generated.cs | 45 + Sledgemapper/UI/ListItem.cs | 12 + Sledgemapper/UI/LoginRegisterWindow.Custom.cs | 210 + .../UI/LoginRegisterWindow.Generated.cs | 168 + Sledgemapper/UI/LoginRegisterWindow.cs | 11 + Sledgemapper/UI/LoginRegisterWindow.xmmp | 28 + Sledgemapper/UI/MainWidget.Custom.cs | 440 + Sledgemapper/UI/MainWidget.Generated.cs | 370 + Sledgemapper/UI/MainWidget.cs | 11 + Sledgemapper/UI/MainWidget.xmmp | 92 + Sledgemapper/UI/MapList.Custom.cs | 83 + Sledgemapper/UI/MapList.Custom.xmmp | 16 + Sledgemapper/UI/MapList.Generated.cs | 86 + Sledgemapper/UI/MapList.cs | 11 + Sledgemapper/UI/MapList.xmmp | 16 + Sledgemapper/UI/MapWindow.Custom.cs | 66 + Sledgemapper/UI/MapWindow.Generated.cs | 67 + Sledgemapper/UI/MapWindow.cs | 15 + Sledgemapper/UI/NoteList.Custom.cs | 43 + Sledgemapper/UI/NoteList.Generated.cs | 35 + Sledgemapper/UI/NoteList.cs | 11 + Sledgemapper/UI/NoteListItem.Custom.cs | 8 + Sledgemapper/UI/NoteListItem.Generated.cs | 57 + Sledgemapper/UI/NoteListItem.cs | 11 + Sledgemapper/UI/NoteWindow.Custom.cs | 44 + Sledgemapper/UI/NoteWindow.Generated.cs | 77 + Sledgemapper/UI/NoteWindow.cs | 11 + Sledgemapper/UI/PlayerList.Custom.cs | 44 + Sledgemapper/UI/PlayerList.Generated.cs | 73 + Sledgemapper/UI/PlayerList.cs | 11 + Sledgemapper/UI/PlayerList.xmmp | 13 + Sledgemapper/UI/PlayerWindow.Custom.cs | 41 + Sledgemapper/UI/PlayerWindow.Generated.cs | 67 + Sledgemapper/UI/PlayerWindow.cs | 12 + Sledgemapper/UI/PlayerWindow.xmmp | 14 + Sledgemapper/UI/campaignWindow.xmmp | 17 + Sledgemapper/UI/listItem.xmmp | 6 + Sledgemapper/UI/mapWindow.xmmp | 14 + Sledgemapper/UI/noteList.xmmp | 10 + Sledgemapper/UI/noteListItem.xmmp | 8 + Sledgemapper/UI/noteWindow.xmmp | 19 + Sledgemapper/Utils.cs | 28 + Sledgemapper/app.manifest | 43 + build.sh | 9 + nuget.config | 7 + 570 files changed, 64704 insertions(+) create mode 100644 .dockerignore create mode 100644 .drone.yml create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 Assets/overlays/allied-star.png create mode 100644 Assets/overlays/american-shield.png create mode 100644 Assets/overlays/ammonite.png create mode 100644 Assets/overlays/ancient-columns.png create mode 100644 Assets/overlays/ancient-sword.png create mode 100644 Assets/overlays/anvil-impact.png create mode 100644 Assets/overlays/anvil.png create mode 100644 Assets/overlays/arrow-flights.png create mode 100644 Assets/overlays/assassin-pocket.png create mode 100644 Assets/overlays/bandaged.png create mode 100644 Assets/overlays/barbed-wire.png create mode 100644 Assets/overlays/barbute.png create mode 100644 Assets/overlays/battle-axe.png create mode 100644 Assets/overlays/black-book.png create mode 100644 Assets/overlays/black-flag.png create mode 100644 Assets/overlays/boiling-bubbles.png create mode 100644 Assets/overlays/bolt-saw.png create mode 100644 Assets/overlays/boot-prints.png create mode 100644 Assets/overlays/bowie-knife.png create mode 100644 Assets/overlays/breastplate.png create mode 100644 Assets/overlays/broad-dagger.png create mode 100644 Assets/overlays/broadhead-arrow.png create mode 100644 Assets/overlays/broadsword.png create mode 100644 Assets/overlays/broken-arrow.png create mode 100644 Assets/overlays/brutal-helm.png create mode 100644 Assets/overlays/brute.png create mode 100644 Assets/overlays/bubbling-bowl.png create mode 100644 Assets/overlays/bubbling-flask.png create mode 100644 Assets/overlays/bugle-call.png create mode 100644 Assets/overlays/bull.png create mode 100644 Assets/overlays/bully-minion.png create mode 100644 Assets/overlays/burning-dot.png create mode 100644 Assets/overlays/burning-embers.png create mode 100644 Assets/overlays/caltrops.png create mode 100644 Assets/overlays/campfire.png create mode 100644 Assets/overlays/candle-flame.png create mode 100644 Assets/overlays/candle-holder.png create mode 100644 Assets/overlays/candlebright.png create mode 100644 Assets/overlays/carnivore-mouth.png create mode 100644 Assets/overlays/cash.png create mode 100644 Assets/overlays/cauldron.png create mode 100644 Assets/overlays/cellar-barrels.png create mode 100644 Assets/overlays/centipede.png create mode 100644 Assets/overlays/chemical-bolt.png create mode 100644 Assets/overlays/chemical-drop.png create mode 100644 Assets/overlays/chest.png create mode 100644 Assets/overlays/circle.png create mode 100644 Assets/overlays/circular-sawblade.png create mode 100644 Assets/overlays/cleaver.png create mode 100644 Assets/overlays/cliff-crossing.png create mode 100644 Assets/overlays/cloak-dagger.png create mode 100644 Assets/overlays/clover.png create mode 100644 Assets/overlays/cobweb.png create mode 100644 Assets/overlays/coffin.png create mode 100644 Assets/overlays/coins.png create mode 100644 Assets/overlays/confirmed.png create mode 100644 Assets/overlays/cracked-glass.png create mode 100644 Assets/overlays/croc-jaws.png create mode 100644 Assets/overlays/crossbow.png create mode 100644 Assets/overlays/crossed-bones.png create mode 100644 Assets/overlays/crossed-chains.png create mode 100644 Assets/overlays/crown-coin.png create mode 100644 Assets/overlays/crown-of-thorns.png create mode 100644 Assets/overlays/crown.png create mode 100644 Assets/overlays/crystal-bars.png create mode 100644 Assets/overlays/crystal-growth.png create mode 100644 Assets/overlays/cubes.png create mode 100644 Assets/overlays/cultist.png create mode 100644 Assets/overlays/curled-tentacle.png create mode 100644 Assets/overlays/curling-vines.png create mode 100644 Assets/overlays/curvy-knife.png create mode 100644 Assets/overlays/cut-diamond.png create mode 100644 Assets/overlays/dark-squad.png create mode 100644 Assets/overlays/death-juice.png create mode 100644 Assets/overlays/decapitation.png create mode 100644 Assets/overlays/dice-six-faces-five.png create mode 100644 Assets/overlays/dice-six-faces-four.png create mode 100644 Assets/overlays/dice-six-faces-one.png create mode 100644 Assets/overlays/dice-six-faces-six.png create mode 100644 Assets/overlays/dice-six-faces-three.png create mode 100644 Assets/overlays/dice-six-faces-two.png create mode 100644 Assets/overlays/dice-twenty-faces-one.png create mode 100644 Assets/overlays/dig-dug.png create mode 100644 Assets/overlays/dinosaur-rex.png create mode 100644 Assets/overlays/dolmen.png create mode 100644 Assets/overlays/door.png create mode 100644 Assets/overlays/doorway.png create mode 100644 Assets/overlays/double-dragon.png create mode 100644 Assets/overlays/dragon-head.png create mode 100644 Assets/overlays/dread.png create mode 100644 Assets/overlays/drop.png create mode 100644 Assets/overlays/droplet-splash.png create mode 100644 Assets/overlays/droplets.png create mode 100644 Assets/overlays/duck.png create mode 100644 Assets/overlays/earth-crack.png create mode 100644 Assets/overlays/earth-spit.png create mode 100644 Assets/overlays/earwig.png create mode 100644 Assets/overlays/evil-bat.png create mode 100644 Assets/overlays/evil-minion.png create mode 100644 Assets/overlays/fangs.png create mode 100644 Assets/overlays/feather.png create mode 100644 Assets/overlays/fire-ring.png create mode 100644 Assets/overlays/fireplace.png create mode 100644 Assets/overlays/fishing-net.png create mode 100644 Assets/overlays/fist.png create mode 100644 Assets/overlays/flame.png create mode 100644 Assets/overlays/flamer.png create mode 100644 Assets/overlays/flat-paw-print.png create mode 100644 Assets/overlays/floating-tentacles.png create mode 100644 Assets/overlays/floor-hatch.png create mode 100644 Assets/overlays/flying-flag.png create mode 100644 Assets/overlays/footprint.png create mode 100644 Assets/overlays/footsteps.png create mode 100644 Assets/overlays/gargoyle.png create mode 100644 Assets/overlays/gecko.png create mode 100644 Assets/overlays/ghost.png create mode 100644 Assets/overlays/giant-squid.png create mode 100644 Assets/overlays/goblin-camp.png create mode 100644 Assets/overlays/goblin-head.png create mode 100644 Assets/overlays/goose.png create mode 100644 Assets/overlays/grim-reaper.png create mode 100644 Assets/overlays/guillotine.png create mode 100644 Assets/overlays/handcuffed.png create mode 100644 Assets/overlays/hanging-spider.png create mode 100644 Assets/overlays/harp.png create mode 100644 Assets/overlays/harpy.png create mode 100644 Assets/overlays/heavy-helm.png create mode 100644 Assets/overlays/hobbit-door.png create mode 100644 Assets/overlays/hole-ladder.png create mode 100644 Assets/overlays/hole.png create mode 100644 Assets/overlays/hydra.png create mode 100644 Assets/overlays/imp.png create mode 100644 Assets/overlays/imprisoned.png create mode 100644 Assets/overlays/invisible.png create mode 100644 Assets/overlays/jellyfish.png create mode 100644 Assets/overlays/lamellar.png create mode 100644 Assets/overlays/lever.png create mode 100644 Assets/overlays/lightning-flame.png create mode 100644 Assets/overlays/lit-candelabra.png create mode 100644 Assets/overlays/locked-chest.png create mode 100644 Assets/overlays/magic-gate.png create mode 100644 Assets/overlays/manacles.png create mode 100644 Assets/overlays/mantrap.png create mode 100644 Assets/overlays/masked-spider.png create mode 100644 Assets/overlays/meeple.png create mode 100644 Assets/overlays/metal-bar.png create mode 100644 Assets/overlays/minefield.png create mode 100644 Assets/overlays/minerals.png create mode 100644 Assets/overlays/minions.png create mode 100644 Assets/overlays/minotaur.png create mode 100644 Assets/overlays/mite-alt.png create mode 100644 Assets/overlays/mite.png create mode 100644 Assets/overlays/money-stack.png create mode 100644 Assets/overlays/moon-claws.png create mode 100644 Assets/overlays/mouse.png create mode 100644 Assets/overlays/mummy-head.png create mode 100644 Assets/overlays/mushroom.png create mode 100644 Assets/overlays/mushrooms.png create mode 100644 Assets/overlays/nails.png create mode 100644 Assets/overlays/nest-eggs.png create mode 100644 Assets/overlays/nested-hexagons.png create mode 100644 Assets/overlays/octopus.png create mode 100644 Assets/overlays/open-chest.png create mode 100644 Assets/overlays/open-treasure-chest.png create mode 100644 Assets/overlays/overlay01.png create mode 100644 Assets/overlays/overlay02.png create mode 100644 Assets/overlays/packed-planks.png create mode 100644 Assets/overlays/pentacle.png create mode 100644 Assets/overlays/pentagram-rose.png create mode 100644 Assets/overlays/perspective-dice-five.png create mode 100644 Assets/overlays/perspective-dice-four.png create mode 100644 Assets/overlays/perspective-dice-one.png create mode 100644 Assets/overlays/perspective-dice-six-faces-five.png create mode 100644 Assets/overlays/perspective-dice-six-faces-four.png create mode 100644 Assets/overlays/perspective-dice-six-faces-one.png create mode 100644 Assets/overlays/perspective-dice-six-faces-random.png create mode 100644 Assets/overlays/perspective-dice-six-faces-six.png create mode 100644 Assets/overlays/perspective-dice-six-faces-three.png create mode 100644 Assets/overlays/perspective-dice-six-faces-two.png create mode 100644 Assets/overlays/perspective-dice-six.png create mode 100644 Assets/overlays/perspective-dice-three.png create mode 100644 Assets/overlays/perspective-dice-two.png create mode 100644 Assets/overlays/piranha.png create mode 100644 Assets/overlays/pirate-flag.png create mode 100644 Assets/overlays/pirate-grave.png create mode 100644 Assets/overlays/plain-circle.png create mode 100644 Assets/overlays/plain-square.png create mode 100644 Assets/overlays/pointy-hat.png create mode 100644 Assets/overlays/polar-bear.png create mode 100644 Assets/overlays/polar-star.png create mode 100644 Assets/overlays/portculis.png create mode 100644 Assets/overlays/powder.png create mode 100644 Assets/overlays/power-ring.png create mode 100644 Assets/overlays/prisoner.png create mode 100644 Assets/overlays/rabbit.png create mode 100644 Assets/overlays/raise-skeleton.png create mode 100644 Assets/overlays/raise-zombie.png create mode 100644 Assets/overlays/rat.png create mode 100644 Assets/overlays/rattlesnake.png create mode 100644 Assets/overlays/robe.png create mode 100644 Assets/overlays/rubble.png create mode 100644 Assets/overlays/saber-tooth.png create mode 100644 Assets/overlays/sad-crab.png create mode 100644 Assets/overlays/scorpion-tail.png create mode 100644 Assets/overlays/scorpion.png create mode 100644 Assets/overlays/sea-dragon.png create mode 100644 Assets/overlays/skull-crack.png create mode 100644 Assets/overlays/skull-crossed-bones.png create mode 100644 Assets/overlays/slipknot.png create mode 100644 Assets/overlays/snail.png create mode 100644 Assets/overlays/snake.png create mode 100644 Assets/overlays/spectre.png create mode 100644 Assets/overlays/spider-alt.png create mode 100644 Assets/overlays/spider-web.png create mode 100644 Assets/overlays/splurt.png create mode 100644 Assets/overlays/squirrel.png create mode 100644 Assets/overlays/stairs1.png create mode 100644 Assets/overlays/stairs2.png create mode 100644 Assets/overlays/stairs3.png create mode 100644 Assets/overlays/stone-block.png create mode 100644 Assets/overlays/sun-priest.png create mode 100644 Assets/overlays/swap-bag.png create mode 100644 Assets/overlays/sword-in-stone.png create mode 100644 Assets/overlays/swordman.png create mode 100644 Assets/overlays/swords-emblem.png create mode 100644 Assets/overlays/teapot.png create mode 100644 Assets/overlays/tiara.png create mode 100644 Assets/overlays/token.png create mode 100644 Assets/overlays/tombstone.png create mode 100644 Assets/overlays/transparent-slime.png create mode 100644 Assets/overlays/two-coins.png create mode 100644 Assets/overlays/wasp-sting.png create mode 100644 Assets/overlays/wavy-chains.png create mode 100644 Assets/overlays/web-spit.png create mode 100644 Assets/overlays/whirlwind.png create mode 100644 Assets/overlays/window-bars.png create mode 100644 Assets/overlays/wolf-howl.png create mode 100644 Assets/overlays/wolf-trap.png create mode 100644 Assets/overlays/wood-beam.png create mode 100644 Assets/overlays/wooden-crate.png create mode 100644 Assets/overlays/wooden-door.png create mode 100644 Assets/overlays/yarn.png create mode 100644 Assets/overlays/zigzag-hieroglyph.png create mode 100644 Assets/sledgemapper.drawio create mode 100644 Assets/walls.svg create mode 100644 BaseCompileImage/Dockerfile create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 Sledgemapper.Api/Commands/BaseCommand.cs create mode 100644 Sledgemapper.Api/Commands/DeleteNoteCommand.cs create mode 100644 Sledgemapper.Api/Commands/DeleteOverlayCommand.cs create mode 100644 Sledgemapper.Api/Commands/DeleteTileCommand.cs create mode 100644 Sledgemapper.Api/Commands/DeleteWallCommand.cs create mode 100644 Sledgemapper.Api/Commands/GetCampaignMapsCommand.cs create mode 100644 Sledgemapper.Api/Commands/GetCampaignPlayersCommand.cs create mode 100644 Sledgemapper.Api/Commands/GetCampaignsCommand.cs create mode 100644 Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs create mode 100644 Sledgemapper.Api/Commands/InvitePlayerToCampaignCommand.cs create mode 100644 Sledgemapper.Api/Commands/NewCampaignCommand.cs create mode 100644 Sledgemapper.Api/Commands/NewLineCommand.cs create mode 100644 Sledgemapper.Api/Commands/NewNoteCommand.cs create mode 100644 Sledgemapper.Api/Commands/NewOverlayCommand.cs create mode 100644 Sledgemapper.Api/Commands/NewRoomCommand.cs create mode 100644 Sledgemapper.Api/Commands/NewSessionCommand.cs create mode 100644 Sledgemapper.Api/Commands/NewSnapshotCommand.cs create mode 100644 Sledgemapper.Api/Commands/NewTileCommand.cs create mode 100644 Sledgemapper.Api/Commands/NewWallCommand.cs create mode 100644 Sledgemapper.Api/Commands/PingCommand.cs create mode 100644 Sledgemapper.Api/Controllers/AuthManagementController.cs create mode 100644 Sledgemapper.Api/Controllers/CampaignController.cs create mode 100644 Sledgemapper.Api/Controllers/MapController.cs create mode 100644 Sledgemapper.Api/Core/Entities/BaseEntity.cs create mode 100644 Sledgemapper.Api/Core/Entities/Campaign.cs create mode 100644 Sledgemapper.Api/Core/Entities/Map.cs create mode 100644 Sledgemapper.Api/Core/Entities/MapLog.cs create mode 100644 Sledgemapper.Api/Core/Entities/Session.cs create mode 100644 Sledgemapper.Api/Core/Entities/SessionUser.cs create mode 100644 Sledgemapper.Api/Core/Entities/Snapshot.cs create mode 100644 Sledgemapper.Api/Core/Entities/User.cs create mode 100644 Sledgemapper.Api/Core/Entities/UserConnection.cs create mode 100644 Sledgemapper.Api/Handlers/BaseCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/GetCampaignMapsCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/GetCampaignPlayersCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/GetCampaignsCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/InvitePlayerToCampaignCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/NewCampaignCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/NewLineCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/NewTileCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/NewWallCommandHandler.cs create mode 100644 Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs create mode 100644 Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs create mode 100644 Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs create mode 100644 Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs create mode 100644 Sledgemapper.Api/Handlers/SendNewLineMessage.cs create mode 100644 Sledgemapper.Api/Handlers/SendNewNoteMessage.cs create mode 100644 Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs create mode 100644 Sledgemapper.Api/Handlers/SendNewRoomMessage.cs create mode 100644 Sledgemapper.Api/Handlers/SendNewTileMessage.cs create mode 100644 Sledgemapper.Api/Handlers/SendNewWallMessage.cs create mode 100644 Sledgemapper.Api/Handlers/StartNewSessionHandler.cs create mode 100644 Sledgemapper.Api/Helpers/AppException.cs create mode 100644 Sledgemapper.Api/Helpers/AutoMapperProfile.cs create mode 100644 Sledgemapper.Api/Hubs/SledgemapperHub.cs create mode 100644 Sledgemapper.Api/Infrastructure/Data/SledgemapperDbContext.cs create mode 100644 Sledgemapper.Api/JwtConfig.cs create mode 100644 Sledgemapper.Api/LICENSE create mode 100644 Sledgemapper.Api/Migrations/20210219223114_InitialCreate.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210219223114_InitialCreate.cs create mode 100644 Sledgemapper.Api/Migrations/20210219223251_Adding authentication to our Api.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210219223251_Adding authentication to our Api.cs create mode 100644 Sledgemapper.Api/Migrations/20210219230948_rename table.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210219230948_rename table.cs create mode 100644 Sledgemapper.Api/Migrations/20210528182730_ChangeCompanyId.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210528182730_ChangeCompanyId.cs create mode 100644 Sledgemapper.Api/Migrations/20210830220131_AddCampaignToMap.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210830220131_AddCampaignToMap.cs create mode 100644 Sledgemapper.Api/Migrations/20210830220730_AddCampaignToMapGuid.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210830220730_AddCampaignToMapGuid.cs create mode 100644 Sledgemapper.Api/Migrations/20210830222316_StringUserId.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210830222316_StringUserId.cs create mode 100644 Sledgemapper.Api/Migrations/20210901220553_renameMapToSession.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210901220553_renameMapToSession.cs create mode 100644 Sledgemapper.Api/Migrations/20210901223606_uniquesessionindex.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210901223606_uniquesessionindex.cs create mode 100644 Sledgemapper.Api/Migrations/20210901224103_uniquesessionnameindex.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210901224103_uniquesessionnameindex.cs create mode 100644 Sledgemapper.Api/Migrations/20210916154553_SessionIdToGuid.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210916154553_SessionIdToGuid.cs create mode 100644 Sledgemapper.Api/Migrations/20210917091001_SessionIdToGuidAuto.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210917091001_SessionIdToGuidAuto.cs create mode 100644 Sledgemapper.Api/Migrations/20210917112525_UserIdGuid.Designer.cs create mode 100644 Sledgemapper.Api/Migrations/20210917112525_UserIdGuid.cs create mode 100644 Sledgemapper.Api/Migrations/SledgemapperDbContextModelSnapshot.cs create mode 100644 Sledgemapper.Api/Models/AuthResult.cs create mode 100644 Sledgemapper.Api/Models/AuthenticateModel.cs create mode 100644 Sledgemapper.Api/Models/LoginResponse.cs create mode 100644 Sledgemapper.Api/Models/RegisterModel.cs create mode 100644 Sledgemapper.Api/Models/RegistrationResponse.cs create mode 100644 Sledgemapper.Api/Models/UserLoginRequest.cs create mode 100644 Sledgemapper.Api/Notifications/BaseNotification.cs create mode 100644 Sledgemapper.Api/Notifications/DeleteNoteNotification.cs create mode 100644 Sledgemapper.Api/Notifications/DeleteOverlayNotification.cs create mode 100644 Sledgemapper.Api/Notifications/DeleteTileNotification.cs create mode 100644 Sledgemapper.Api/Notifications/DeleteWallNotification.cs create mode 100644 Sledgemapper.Api/Notifications/NewLineNotification.cs create mode 100644 Sledgemapper.Api/Notifications/NewNoteNotification.cs create mode 100644 Sledgemapper.Api/Notifications/NewOverlayNotification.cs create mode 100644 Sledgemapper.Api/Notifications/NewRoomNotification.cs create mode 100644 Sledgemapper.Api/Notifications/NewSessionNotification.cs create mode 100644 Sledgemapper.Api/Notifications/NewTileNotification.cs create mode 100644 Sledgemapper.Api/Notifications/NewWallNotification.cs create mode 100644 Sledgemapper.Api/Notifications/PingNotification.cs create mode 100644 Sledgemapper.Api/Program.cs create mode 100644 Sledgemapper.Api/Properties/launchSettings.json create mode 100644 Sledgemapper.Api/README.md create mode 100644 Sledgemapper.Api/Sledgemapper.Api.csproj create mode 100644 Sledgemapper.Api/Startup.cs create mode 100644 Sledgemapper.Api/appsettings.Development.json create mode 100644 Sledgemapper.Api/appsettings.Production.json create mode 100644 Sledgemapper.Api/appsettings.json create mode 100644 Sledgemapper.Api/libman.json create mode 100644 Sledgemapper.Api/wwwroot/css/site.css create mode 100644 Sledgemapper.Api/wwwroot/favicon.ico create mode 100644 Sledgemapper.Api/wwwroot/js/chat.js create mode 100644 Sledgemapper.Api/wwwroot/js/signalr/dist/browser/signalr.js create mode 100644 Sledgemapper.Api/wwwroot/js/signalr/dist/browser/signalr.min.js create mode 100644 Sledgemapper.Api/wwwroot/js/site.js create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/LICENSE create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap.css create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/js/bootstrap.js create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js create mode 100644 Sledgemapper.Api/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery-validation/LICENSE.md create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery-validation/dist/additional-methods.js create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery-validation/dist/additional-methods.min.js create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery-validation/dist/jquery.validate.js create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery/LICENSE.txt create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery/dist/jquery.js create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery/dist/jquery.min.js create mode 100644 Sledgemapper.Api/wwwroot/lib/jquery/dist/jquery.min.map create mode 100644 Sledgemapper.Shared/Clients/ISledgemapperClient.cs create mode 100644 Sledgemapper.Shared/Easings.cs create mode 100644 Sledgemapper.Shared/Entities/AuthenticateModel.cs create mode 100644 Sledgemapper.Shared/Entities/AuthenticateResponse.cs create mode 100644 Sledgemapper.Shared/Entities/Campaign.cs create mode 100644 Sledgemapper.Shared/Entities/Note.cs create mode 100644 Sledgemapper.Shared/Entities/Overlay.cs create mode 100644 Sledgemapper.Shared/Entities/Player.cs create mode 100644 Sledgemapper.Shared/Entities/RegisterModel.cs create mode 100644 Sledgemapper.Shared/Entities/Session.cs create mode 100644 Sledgemapper.Shared/Entities/Tile.cs create mode 100644 Sledgemapper.Shared/Entities/Wall.cs create mode 100644 Sledgemapper.Shared/ExtensionMethods.cs create mode 100644 Sledgemapper.Shared/ObservableConcurrentDictionary.cs create mode 100644 Sledgemapper.Shared/Sledgemapper.Shared.csproj create mode 100644 Sledgemapper.sln create mode 100644 Sledgemapper.sln.DotSettings create mode 100644 Sledgemapper/.vscode/launch.json create mode 100644 Sledgemapper/.vscode/tasks.json create mode 100644 Sledgemapper/AuthenticatedHttpClientHandler.cs create mode 100644 Sledgemapper/CachedContent.cs create mode 100644 Sledgemapper/ChannelsQueue.cs create mode 100644 Sledgemapper/CommunicationManager.cs create mode 100644 Sledgemapper/Content/Content.mgcb create mode 100644 Sledgemapper/Content/comment.png create mode 100644 Sledgemapper/Content/eye.png create mode 100644 Sledgemapper/Content/fonts/Roboto Condensed.ttf create mode 100644 Sledgemapper/Content/fonts/font08.spritefont create mode 100644 Sledgemapper/Content/fonts/font12.spritefont create mode 100644 Sledgemapper/Content/fonts/font20.spritefont create mode 100644 Sledgemapper/Content/fonts/font28.spritefont create mode 100644 Sledgemapper/Content/fonts/font36.spritefont create mode 100644 Sledgemapper/Content/fonts/font42.spritefont create mode 100644 Sledgemapper/Content/fonts/font60.spritefont create mode 100644 Sledgemapper/Content/fonts/font99.spritefont create mode 100644 Sledgemapper/Content/handcursors create mode 100644 Sledgemapper/Content/handcursors.png create mode 100644 Sledgemapper/Content/handcursorsIndex create mode 100644 Sledgemapper/Content/icon_delete.png create mode 100644 Sledgemapper/Content/icon_line.png create mode 100644 Sledgemapper/Content/icon_room.png create mode 100644 Sledgemapper/Content/listBackground.png create mode 100644 Sledgemapper/Content/location.png create mode 100644 Sledgemapper/Content/rippleSpriteIndex create mode 100644 Sledgemapper/Content/rippleSpriteMap create mode 100644 Sledgemapper/Content/shaders/OutlineShader.fx create mode 100644 Sledgemapper/Content/spriteIndex create mode 100644 Sledgemapper/Content/sprites create mode 100644 Sledgemapper/Content/tiles/tile01.png create mode 100644 Sledgemapper/Content/tiles/tile02.png create mode 100644 Sledgemapper/Content/tiles/tile03.png create mode 100644 Sledgemapper/Content/tiles/tile04.png create mode 100644 Sledgemapper/Content/tiles/tile05.png create mode 100644 Sledgemapper/Content/tiles/tile06.png create mode 100644 Sledgemapper/Content/tiles/tile07.png create mode 100644 Sledgemapper/Content/tiles/tile08.png create mode 100644 Sledgemapper/Content/tiles/tile09.png create mode 100644 Sledgemapper/Content/tiles/tile10.png create mode 100644 Sledgemapper/Content/tiles/tile11.png create mode 100644 Sledgemapper/Content/tiles/tile12.png create mode 100644 Sledgemapper/Content/tiles/tile13.png create mode 100644 Sledgemapper/Content/tiles/tile14.png create mode 100644 Sledgemapper/Content/tiles/tile15.png create mode 100644 Sledgemapper/Content/tiles/tile16.png create mode 100644 Sledgemapper/Content/tiles/tile17.png create mode 100644 Sledgemapper/Content/walls/wall01.png create mode 100644 Sledgemapper/Content/walls/wall02.png create mode 100644 Sledgemapper/Content/walls/wall03.png create mode 100644 Sledgemapper/Content/walls/wall04.png create mode 100644 Sledgemapper/Content/walls/wall05.png create mode 100644 Sledgemapper/Content/walls/wall06.png create mode 100644 Sledgemapper/Content/walls/wall07.png create mode 100644 Sledgemapper/Content/walls/wall08.png create mode 100644 Sledgemapper/Content/walls/wall09.png create mode 100644 Sledgemapper/Content/walls/wall10.png create mode 100644 Sledgemapper/Content/walls/wall11.png create mode 100644 Sledgemapper/ExtensionMethods.cs create mode 100644 Sledgemapper/IIdentityApi.cs create mode 100644 Sledgemapper/IMapApi.cs create mode 100644 Sledgemapper/Icon.bmp create mode 100644 Sledgemapper/Icon.icns create mode 100644 Sledgemapper/Icon.ico create mode 100644 Sledgemapper/Icon.png create mode 100644 Sledgemapper/InsertMode.cs create mode 100644 Sledgemapper/Messages/CampaignSelectedMessage - Copy.cs create mode 100644 Sledgemapper/Messages/CenterOnTileMessage.cs create mode 100644 Sledgemapper/Messages/ErrorMessage.cs create mode 100644 Sledgemapper/Messages/LoginSuccessfulMessage.cs create mode 100644 Sledgemapper/Messages/MapOpenedMessage.cs create mode 100644 Sledgemapper/Messages/SignalrConnectionUpdateMessage.cs create mode 100644 Sledgemapper/Program.cs create mode 100644 Sledgemapper/Settings.cs create mode 100644 Sledgemapper/Sledgemapper.cs create mode 100644 Sledgemapper/Sledgemapper.csproj create mode 100644 Sledgemapper/SpriteSheet.cs create mode 100644 Sledgemapper/State.cs create mode 100644 Sledgemapper/TileAction.cs create mode 100644 Sledgemapper/UI/CampaignList.Custom.cs create mode 100644 Sledgemapper/UI/CampaignList.Generated.cs create mode 100644 Sledgemapper/UI/CampaignList.cs create mode 100644 Sledgemapper/UI/CampaignList.xmmp create mode 100644 Sledgemapper/UI/CampaignWindow.Custom.cs create mode 100644 Sledgemapper/UI/CampaignWindow.Generated.cs create mode 100644 Sledgemapper/UI/CampaignWindow.cs create mode 100644 Sledgemapper/UI/ErrorWindow.Custom.cs create mode 100644 Sledgemapper/UI/ErrorWindow.Generated.cs create mode 100644 Sledgemapper/UI/ErrorWindow.cs create mode 100644 Sledgemapper/UI/ErrorWindow.xmmp create mode 100644 Sledgemapper/UI/ListItem.Custom.cs create mode 100644 Sledgemapper/UI/ListItem.Generated.cs create mode 100644 Sledgemapper/UI/ListItem.cs create mode 100644 Sledgemapper/UI/LoginRegisterWindow.Custom.cs create mode 100644 Sledgemapper/UI/LoginRegisterWindow.Generated.cs create mode 100644 Sledgemapper/UI/LoginRegisterWindow.cs create mode 100644 Sledgemapper/UI/LoginRegisterWindow.xmmp create mode 100644 Sledgemapper/UI/MainWidget.Custom.cs create mode 100644 Sledgemapper/UI/MainWidget.Generated.cs create mode 100644 Sledgemapper/UI/MainWidget.cs create mode 100644 Sledgemapper/UI/MainWidget.xmmp create mode 100644 Sledgemapper/UI/MapList.Custom.cs create mode 100644 Sledgemapper/UI/MapList.Custom.xmmp create mode 100644 Sledgemapper/UI/MapList.Generated.cs create mode 100644 Sledgemapper/UI/MapList.cs create mode 100644 Sledgemapper/UI/MapList.xmmp create mode 100644 Sledgemapper/UI/MapWindow.Custom.cs create mode 100644 Sledgemapper/UI/MapWindow.Generated.cs create mode 100644 Sledgemapper/UI/MapWindow.cs create mode 100644 Sledgemapper/UI/NoteList.Custom.cs create mode 100644 Sledgemapper/UI/NoteList.Generated.cs create mode 100644 Sledgemapper/UI/NoteList.cs create mode 100644 Sledgemapper/UI/NoteListItem.Custom.cs create mode 100644 Sledgemapper/UI/NoteListItem.Generated.cs create mode 100644 Sledgemapper/UI/NoteListItem.cs create mode 100644 Sledgemapper/UI/NoteWindow.Custom.cs create mode 100644 Sledgemapper/UI/NoteWindow.Generated.cs create mode 100644 Sledgemapper/UI/NoteWindow.cs create mode 100644 Sledgemapper/UI/PlayerList.Custom.cs create mode 100644 Sledgemapper/UI/PlayerList.Generated.cs create mode 100644 Sledgemapper/UI/PlayerList.cs create mode 100644 Sledgemapper/UI/PlayerList.xmmp create mode 100644 Sledgemapper/UI/PlayerWindow.Custom.cs create mode 100644 Sledgemapper/UI/PlayerWindow.Generated.cs create mode 100644 Sledgemapper/UI/PlayerWindow.cs create mode 100644 Sledgemapper/UI/PlayerWindow.xmmp create mode 100644 Sledgemapper/UI/campaignWindow.xmmp create mode 100644 Sledgemapper/UI/listItem.xmmp create mode 100644 Sledgemapper/UI/mapWindow.xmmp create mode 100644 Sledgemapper/UI/noteList.xmmp create mode 100644 Sledgemapper/UI/noteListItem.xmmp create mode 100644 Sledgemapper/UI/noteWindow.xmmp create mode 100644 Sledgemapper/Utils.cs create mode 100644 Sledgemapper/app.manifest create mode 100755 build.sh create mode 100644 nuget.config diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ef8d40f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +# directories +**/bin/ +**/obj/ +**/out/ + +# files +Dockerfile* +**/*.trx +**/*.md +**/*.ps1 +**/*.cmd +#**/*.sh \ No newline at end of file diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..7891f20 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,60 @@ +kind: pipeline +name: default + +steps: +- name: backend + image: plugins/docker + settings: + repo: privateregistry.michelescandura.com/michele/sledgemapper + registry: privateregistry.michelescandura.com + auto_tag: true + +- name: frontend + image: privateregistry.michelescandura.com/michele/basecompileimage:1.1 + pull: true + volumes: + - name: cache + path: /release + commands: + - chmod +x build.sh + - sh build.sh + +- name: zip + image: alpine:latest + when: + event: + - tag + volumes: + - name: cache + path: /release + commands: + - apk update + - apk add zip + - mkdir /release/zip + - cd /release/net5.0/win-x64 + - zip -r sledgemapper-${DRONE_TAG}-win.zip ./publish + - cp sledgemapper-${DRONE_TAG}-win.zip /release/zip + - cd /release/net5.0/osx-x64 + - zip -r sledgemapper-${DRONE_TAG}-osx.zip ./publish + - cp sledgemapper-${DRONE_TAG}-osx.zip /release/zip + - cd /release/net5.0/linux-x64 + - zip -r sledgemapper-${DRONE_TAG}-linux.zip ./publish + - cp sledgemapper-${DRONE_TAG}-linux.zip /release/zip + +- name: gitea_release + image: plugins/gitea-release + when: + event: + - tag + volumes: + - name: cache + path: /release + settings: + api_key: 5eb87a0a7d55fbf8fb64e678781a5ddcc1a27e09 + base_url: https://git.michelescandura.com + files: /release/zip/* + title: ${DRONE_TAG} + +volumes: +- name: cache + temp: {} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..73c5516 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bfb3dac --- /dev/null +++ b/.gitignore @@ -0,0 +1,367 @@ +# ---> VisualStudio +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +/db +*.db +*.db* \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d5bcf53 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,59 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Docker .NET Core Attach (Preview)", + "type": "docker", + "request": "attach", + "platform": "netCore", + "sourceFileMap": { + "/": "${workspaceFolder}" + } + }, + { + "name": "Sledgemapper", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build sledgemapper", + "program": "${workspaceFolder}/Sledgemapper/bin/Debug/net5.0/sledgemapper.dll", + "args": [], + "cwd": "${workspaceFolder}/Sledgemapper", + "console": "internalConsole", + "stopAtEntry": false + }, + { + "name": "Sledgemapper.API", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build sledgemapper.api", + "program": "${workspaceFolder}/Sledgemapper.Api/bin/Debug/net5.0/sledgemapper.api.dll", + "args": [], + "cwd": "${workspaceFolder}/Sledgemapper.Api", + "console": "internalConsole", + "stopAtEntry": false, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + { + "name": "Identity.API", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build identity", + "program": "${workspaceFolder}/Identity/bin/Debug/netcoreapp3.1/WebApi.dll", + "args": [], + "cwd": "${workspaceFolder}/Identity", + "console": "internalConsole", + "stopAtEntry": false + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickProcess}" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..37441be --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "files.eol": "\n" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..5a18fcc --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,81 @@ +{ + "version": "2.0.0", + "tasks": [ + { + + "label": "build identity", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/Identity/WebApi.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile", + "group": { + "kind": "build", + "isDefault": true + } + }, + { + + "label": "build sledgemapper", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/Sledgemapper/Sledgemapper.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile", + "group": { + "kind": "build", + "isDefault": true + } + }, + { + + "label": "build sledgemapper.api", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/Sledgemapper.Api/Sledgemapper.Api.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile", + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/MyGame/MyGame.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "${workspaceFolder}/MyGame/MyGame.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/Assets/overlays/allied-star.png b/Assets/overlays/allied-star.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce75fc3bd92a9af686f3612accade9721cf7968 GIT binary patch literal 2291 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/ancient-columns.png b/Assets/overlays/ancient-columns.png new file mode 100644 index 0000000000000000000000000000000000000000..3465644c3c8e7b8fce79cd62917c358130a847ea GIT binary patch literal 571 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/anvil-impact.png b/Assets/overlays/anvil-impact.png new file mode 100644 index 0000000000000000000000000000000000000000..0b34ffcb9b753402bd15bef59724d30d845e9988 GIT binary patch literal 1606 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 LNkvXXu0mjfUFjOH literal 0 HcmV?d00001 diff --git a/Assets/overlays/barbed-wire.png b/Assets/overlays/barbed-wire.png new file mode 100644 index 0000000000000000000000000000000000000000..320bb0f2bf5eff0eb1e756289c6144fce06f8e25 GIT binary patch literal 3161 zcmV-f45ssmP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z01M$sL_t(|UhSI;uvKLh$GL~gB_2Ky#EXC^s0?C6ndqcAiIv$y=mj&?q*G3YWcVmY zvp&ekzl2p zBA_26pT@?<&4hO-+**)+C;SWi7JLFWq3+^EwHjp8!-Fj%Ukf-Iv6UwfX0VG2{havS zu)eOYZZuDO8sX7yH|Syz?;zG;dzbJ|SSuUo1_xss$5ZbfsFH!-2E@zMWjX$f;2VLZ zFi6uMF&$1K-DXo33o7scjDd{bM9f3#31wpy>f=0l1av*HU5;E#YpD-hiwEh~K=n<> zde%9>Rz~an4t`aXwanG615fz^D>(ravK6L1Y9RhIPp%8^2Y-#aI=6Moe^5>p&i5RPwDLyZ?hi8sY5(dm`Trv;l|< zli@VD*VQqQr<%3;m8r-HQ15-LWe|TFejBcFRSvMd2QMR-LQaIc1B=<};qiVctp|DC z7-Sitnv5@Tv+nw9t}iLbcaHKWSO&)tf5QxUfNiq}BcNMs6+A$sT;?F1PCx2FRi+A# zQHSIzVYka1;9Kv(2rA49LQ)E z6$zWvg|6>3Dv0HYgC8H&zCe&DJYupM0QAA*eLc!uieJ|q%;P&$F|UfAeS#cxIA9qwWq z0-txkt6ZH3+@uJ6pC);G;oX zPj@R0Bvx})CTq$3A%z9v>X?SZbspC^p>>5E0LZ&LW&9G^8F@NI9i5zCiiEM}#+_3%12($N)a~ z!x?Z6T!_z8$lqd0p6=uHk05z6@F~r=wn$LW04 zw9ZesjF5c;8eQ&(;aGZtOJTm=C0d2Gl#T%E@>6cW{R--#1zNi)Z$ph0GF$COT;>NC zH;)8*_ZKh|)SSCc@ob>qi%-t#Yp{BvHiAf+j>y9aIxf9(h;BNaa~u->xDSq zCP(Beij&|EmNEhOX#nyAf)$oQ2LSc4Wp?VW#hkKqIz3Wx0oz)4i;(>atkDm?!(ey% zfT>995VL`P2VynUBId_U*)i~te&`qnQm>CzR8*`*hKsblT;>ONXb8>*!WT=&*kFpQ zq|4=AG7}~CD85z#^DNazUx3(C8)MjYT7Fb6Eb+ic` za=yoH9Ra!B95Rso3JBp`e>@3#@EX)X+ao|~9bUuYyx-c60P3cWQCsoCnfjsL;ge6? z%ZR{5tM?CQem2);c&TO|0sUli?m(bgy6~@2H@)))!ut_rNL$fHKI`r+1INF50&P8Y zhgxlk_VDOoxhM6}X33!h)k*QLPoPeDH&Cee(YkOCKkms|29BC$hSSNZu8Y>=1maqz zKHU-=0#Jo=F8rI+AzCcW2kZl2jfWR_@(B6*0DVGUMc7D?bT^Xl3}~O15WH9F3>RU~ zIYE*Q(rSQWUzHN#eCjy{*;yACsPbYIb+yAD$ijU<2r7Ic4Eur?q2}1(oz#Ja1`lha zGx5uSi>9YvImlZFtG)z(17Co4b^+M{?^9SH94(?21kM^`MW*0<40zGmHLWxG_+h?`+Gsoj`dHd(knVkIpwF0zZwURs>1nK(8kCo`*KW@XnP_qGRRUE)Q@Ks^edJ0$Ti814*fQ{+jW@Ri8Es7^+1k}VV1ZOa?^ zb?o_Gn+GlPb^_(u`d~KD+psth_~>)8lsokp&RPb~nK_|94aRN){@Rm2M|KU4h{u{A zwsvd&locK95D4lE74}(^+$}%w(SG|;9!&&(gYmNsi4erMAqLA%ST`veoNz;y5O4Dp zB#Me{h!EDqZIVX?t6xb#W|dr6ba+9aFl|1B`v^KzVXI35aV?yD)e^UW+S*#ZW?FGX$@3p^e>pHvc%sYZ9%2cb5>5$>XXVG{Ao&B}Q-H8uU*oCEASt^OaF z=#vf7sO8%DL?EmuuT9cZVK`VjuTM0k%nM0e4R(wHLis7n?0YY67- z(WBG)o}i<*1rIypH;%kF1W7FKb#Q=e$Z$fp0~UO>4+<1;9@Hxkf%sgWw#^fWcHyFL zLT6tXf$*E~D+Hsp1;Tod!{N6UHFB2W<&W*NaJl?K5Z?la$OriiS4*$+iFxNdB?X13 zDc%XK*$ISovP(m1`=SumnWJd?T_CQWdOX4KzXh4c>yycS(F-w#16SdacR z`60)^*ck!R6+E3*GEm-GR3JK7B@o{OXY!f+6wwN#4oR;LtO1B`fK#}b_g!T`HybX4 z(T&Xn`o-{gf@&E$fUQN47|>P06TFJ;0}A{+jP1}0=xX3I@Gcl@#zjISOpQRh!m-fK zA|?TQ-T_&guI*9oD#TeqtaKn>E!95^do#yB4;gLHU|WLFA1=P^YZeCG1ma_0;@RVp zgS(zRVA4@|{XJ%U(29zRk?6Fnrcc*#=)3WRv_GjQtjWuIs0~{Uj!uF4H<^y@G{BwszC)j}iah`B zt5|tKzP+IKI4>j3LTKA&Z3+t1v@~2W`8RC0zrwWy>QQ(~TncdAm45O1cgLx&K78O~ zarOA4Ty=PX3m*-?;L*bmwEhlxn&b##=+xPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00zZLL_t(|UhSG|Y!p=#fZ5#^7pN#wRO*u$DJWG@D;Qr9p;$E#6A~ZM#Ha}|YQi6X zi1J7bF-l@0Mt)#KO|aq*Nc>UbA3~x*8s#Bs6$uDLL)A(wrL}H%xAi-FPZwr)XZPOO z-F8d*B`4?HGxu@snLBr9W@p?OV+=oogM;CCJiZwHVKSNA5R1j;>Y;O+fq{XGke898 zOx^>&-HAlvG0ZBhe(u2JE=Jx&ddzhFk>nuDF~@83(F+rqfV_&FGSjn%Hb)Ry5h3kv zbV2aVG6^%C;Lyh|)J@uL=t~6s#gR8KqdH7wLXh*3tPQSI(04n(7?rsi z2<~|#rm>a{#^^(y(_u#*VyYsbjV8R|gZqcgsFD4pVB)gNe`Z1&ei(Zv>Ou`?cR=#|b|4c7|m`|SSy{>G}Rs;|iOdFrZ2 zNWcJUA(!Y*2@Z6jqy}AB;h!*&O-iEmoHY=3mx^-sg_0sa>DwJnIGE( z$n3Y6(x~8bVwOvxAl5r39c~##tDseNL7ZMTuorwoA{w<=k#Ld{#8``*QdeG_eltnH zRy8Y`HrvSyP6^Je<1Q`q+r^|eVm2^dGm~vIN6tVUtKa{?5Wp%1@qllI9!`O4BECnFZOCa; zD;TstiL}Jy@nsY}uf*^#F|`bo<%LXnUz;&VqZ#fD_&fF7i(5yu=e^3wkfo zi6l*H1LZi!PoTd>-bY@C2m}3NhBQ!4CxBv@@?4||TPBe6 zjNq4kCZneyHAv21B>eKmsR3Dp%tO+*;@Fu9*r12X3j?+4m?$37*9s)gIWC9bvFzX?NW5QY{ zceA>3Lfa{*_o$oo)F~$!SxsWTRaYjzsRPGH<8m~dxF|iX` z^rIKqXG{a_dXY~t=h6Rb#_NUSatHXQ7Rw8ht7E`4l#j`>#q{jhlx0JliQI+Un0ed} z>V=S5w7EMLi_O8V)82 zf6{JpLf@}wRVQdCo2N5D?*pzuAZr;H9>ELobKy0$U8xn@?UB?LtG7NTH~Am zmVX^VI%j%_L?Th>hNYW{#MO3!xbog+=fXJw4AP`#AV^@BnmM6=dF5vPPA`M`B+u!m z-8lga@Q|8;AOSsU=EJ5=79?*P@m;G$E1VKQ@DosrO(_`BXtYnweEh3A2=}VC!gU2S zk>wh-13~+Qn)!&S4nkQI@QCViW0NF57IGO_&&#?Z%U_=GmY7m-EQ1UD9~>)eDr3lV zgcU9cSW4%mc+9o=v@Os>+7QI~fSLudUn=476KWQV&3pTzKAC3)Jg8 zJs$V#Hk)X%U!lmKF;=U{Dgi91LF67fU56C2K}lbpx4b?C`gccSL)I|HB8geurG>qq z5%IkHcY(Ie+LbTV`9rH)Lz^EE>&>qy7*GDKS%G-|A+mvIfycEQU+A|_s~3d2J;+MT z;s0)!L2DWOEysXg(B?UzO4QWM5B(&N&Aq+7muu6JgFvPu>xrw&gy#?SR%^4IP~}on zGdHx4A@Y}5y*8;Fh_8mg6?(c>t!xN%1|s`} ze94jiMj)9?=Kaiux(lQpIzin%=yiyE23yq4ksoF0G!ufC53H}pls7g5+*Ey%I*Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00;L;L_t(|UhSJ}h*eb-fW6moe2*zOlx7*EqL`LFeq{d02M8%il0j0EWMzsKRzG@C zDTNV*WIt@w%Ce}WC@V~8tc*(0GzE)H4Xvipa@27~@7$TOZ|$?r_1-z>o;gpuQ+}{! z?X&jUYwvX)`#koYPUrZalTw{1t*xyUsL{v}WB}3|NvBe&hL)C=+H^Yo3)?%;htdBH zNO}~q`1I-1ThT3OPw)|TBl9#w$Adh&kihNettP8*+^pd`4h%X);xm!GRu19da`*|A z*03D|k{*tHZKV(m;@qQQOCQE7M|}Zu(i(m=h;ssw$+7fdpglQV-_@~)h8PXR+KX&Q zp4aeamB6<_23m>wgj?8Emc<|Bn?-G+{YJ{0%gV}j5#vv*wu8Xn2O=_2`3CVbDEE z$k)9c-~HKacB(ctU>kuvhwM|g03yK z;c9JCdNB3}beu&YfhJD(JGF_l8GzaMT>}5*+O)J_VDdbFO2_F6^>Y87q)nvFbmWLu z`{gxlUOF(S&Kz0K>z+g#x!%p>#im>;ixJP$-3^+oH=ULe4C-DTpDWb2Ak)Q{%``i! z%Bl$taSoVHO9cj0K|+Uhe6HZLNZrMMshUGWj7v0}1M2!~@$5i{kLkEvq5d0GXZ4+H zS))Omg{Jd1V4uRlka^}NH6;rjbw>{AxExTIK}M+WXvA}p^b2ubGy}*3^F%v7x(P{s zC(y|q(qS>|fl};Dd7EX821j@e%08nmL3(Pr64_;WSv!GAH`$#)C!4fC2Mko+-puug zzFW^(Pk&q*Vk9Foxc-KHZ(L0l)BhyY-}7v2SsmV3}l)3;nEd3sOHeP zC2!T3M5__|Oz4m7M4FMAVoL;qdroN7j}$+i`sBM`B)pQh!B$;UQ|NC_bc(8;6Z z<4I_UF%qdlP9b%~Gvg?LiW#Oy7pU8ckAt8+_#Gy80Txf117F2@uAqqviO6TaUJ-6uHO{f*y5WC!IG@)G4B3#Lc#w{wvX zxo*gZSVR5}IHuZ-Ce`Kghd~LyBl1@G5hnR&_@QpgYxKXBys%HTFj#c~#C5JfF)@sz z!WH|JL02FXFnOK{)SJ)kk~|Xmnhyf)R%(nMlwFtQv40>w1z>bM2VnaVc@W8+GJc`W zS-IxhLR&Mzp}h|18{*@D$?gD^!g@rGbf{mDNITkZF}<||ez7I5nA4s(kL$Jr>fF~M zxyR1uQn*GpBS9y_ydJHExRa;-Hq$v!{!YyfsGF;9$wEiN5Sc6;V2}IAOU(N;-eAf_ z-&d%*R{Roy;8Tzl^kd)u9Xo;TB$7XlGLtjqr!A`!>g4wf-NY|;2rkLn-|$wW?42+a zF*^Yrd-4Ktp3%PKn`W(=9Z;9d8U%rJ$=k49uoIXQcCsCN^29w|WujGq($qSseuc~Wkh`$RlkG1H@h}X<7-!$aM8Sy}{(8&wbKdbJc zp#87NAc@81MU;y!<_OfUFdfGM!6GFu;PZqw2@GxbAZ9I*%|4WWuxg5O6gl5?92Gi? zoV%6kGBF{_C`PyWsmVlKU!5c?_~&tBay9chQ&D2@-4a0&Vta2v?{-Ndjxo zS8Efw-pkm27;zm-KKRsUGMO>jG&}@~J$ahS153dzOSa)>&4jSO+tA{T4u==Y^QeXm z4KX$#@qg2E+W~PVUt3$-i&#ZJRe3?XXe%dJ)xGi7bE2HDGP la3|8S{-5X^9g6`!n002ovPDHLkV1jYZ8*l&s literal 0 HcmV?d00001 diff --git a/Assets/overlays/black-book.png b/Assets/overlays/black-book.png new file mode 100644 index 0000000000000000000000000000000000000000..3792c7d0d05617f9ca14677f0201c366c2de5b26 GIT binary patch literal 2411 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 M07*qoM6N<$f-d|tD*ylh literal 0 HcmV?d00001 diff --git a/Assets/overlays/bolt-saw.png b/Assets/overlays/bolt-saw.png new file mode 100644 index 0000000000000000000000000000000000000000..3319ed9c5ecc4a04504a05bbe1f18c42204cc03b GIT binary patch literal 2165 zcmV-*2#WWKP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00;d^L_t(|UhSKEh*VV=z;|ZX)!clB+CxiiC8bi6vV3G=FUXWK3q#wKilm|_r9ktK z!YsqkNFmY8G$>LdqNFktEwi)-ks6kjOKPE_rt5CIvyXn?xu4VCo%^0UGcEapk8{p< zzsEUe?&I9Y6rJWY(P(UJEJNltH8u5DRbcQb(Q3g-Y8jejGI^4L^h9gC2HabHhYkrRaI4ItE%Ia&+aCosCfhh_@a8706;$8Hm5Trlw|eSy|ZuRTU08c{L&@ zxV*w%v75Z-YBvfC9k~WMp?%96j=Pwhq;HYLzc(`J4k z;ZSzXqgL1Q2RY?3*-N`&K=(8{;bK+g2NDiJ4r|}?208asS682}eUK|oqv~xZ(7Zs> zfk?IKSso$hFUZ|Ut*S(K9O}FPc){ZwVSzt1hN*W(R^9KpkL6i22^rM8;Z_l&Lwyk@LiGsZ-uyk~qL^ z`6T0z4a8|jl8si#>>$n#q>qM<1;UmR^SG744nNu#Y8D;h$ZU^7UPrRJ6~_NL4I3*A zbgibyfSi}9S@saG69K1@aGMoAIQY!dFtJ0QrfQlD*tSf~4758SL)kQia;&PugY%bG z3V*P*UF+k9_&pHE)gt&5BY|unN^x=VN(OLLn`sh>L_74)Yts|#Mrt((hqZLXYXZ7!83;Pn z$RK=IW!M~}m}Rvx7|R~w`B6;P6m(2}#(S9Lw^h}gHd?x2CWwiU zCA-`${${k!M4tcxhus6r@z0G^EY0kG z90JXk>FSGyAH3TxYcTzwoF3$1Vr6)S7dve zy1Ke6@OzYBZ#AXk3syhy-HxxkRgM>eR%i}K*j`O?+joTM23o#M zv%z-XldT`bmCx`pV#fl3+cLm|nkz8)Eu)Y}@poAoqpK&@M#_f~b4Q3;F1cGQi|`On zF4yKOlbk^Z<;7=c@LP<_U@9V`@j(CZD=x`>jzV z$h!^6xU0=OT+=5PY7*E1zbCij?QrC!a9B!8O5{vD^M8iT!B(CREM?C)fviyV r{|_di13QBJFR}HW2v1XRii-XL>=jkoq4^oA00000NkvXXu0mjfw8|Hp literal 0 HcmV?d00001 diff --git a/Assets/overlays/boot-prints.png b/Assets/overlays/boot-prints.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd13a3bb04cc958421a2b3bb0bf7d2dd3261c68 GIT binary patch literal 1780 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 eP#|53iv9!ts<(Cw>N_?70000 literal 0 HcmV?d00001 diff --git a/Assets/overlays/broad-dagger.png b/Assets/overlays/broad-dagger.png new file mode 100644 index 0000000000000000000000000000000000000000..934417f06bcdb3ff9252551abccc05a203fdd175 GIT binary patch literal 1967 zcmV;g2T=HlP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00%coL_t(|UhSG|h*eb-$7jYzqoZVM(S)XzXoZy7gDle^$*@$S4?eJ<6d|*)gfbF( zm?dIlVNoA4q%?~N`Vgd1_EIn{#Xgi0NhMbJ$ZBTr&Yc~pG4bDI2|IB{Y{TU*->-QAowGRL}IMFRvz6w_<0^{4hkN*!d)wh8c(a3;Es7V1L8kQGO4Df zW*7NtB&t(U5LiF1@?WG8=~td&HTf5j?Z{Sp zXK^e1mL9wy*o78(7Wh2xE}e#BjO3ilNyl->(sw8gxj8*}(bUv56kYc1kwmU`m;VIE znTRwX`#JOqWQ?1-4m57AMeb03%1yGZMn-$FQ&9hLKeR#lJCY|zN4ZPsp)niPIEL&u zB)wcWQ##VaNT=2b)SHeZbeuS_?cz3ELUy=UDGfBBAHnaWL3XuC>nR_xR)X>@mj2Zf zB0G5UntvL+m;w4W&av66mIm6<+tX?q^MSR@p?#Z>bIh>-@XZNct4&gy6I`7E`j5PN zX`vy}%8`7MA^I3uTO^UzA_L4Z57ddf^3g3sKDHCkJ?So`g|^&CV;YeI$OKob;UkgV zjE+z6iG6Ft9((289DzQk6DUu1bLpWmf^aUQqBUut%Lh+DdY! zo4O7(tPk?48kr8d7LsV@rrhqZ&j&uKb;2H3buDPvMaT~xmqA%9aF^KNQ&*m%Ce&r5 zc^`B5s}r8{V%LMl4MH}1aH8PgDZk))tuOjor5Lbv?VTtZSVIs?k#>Vea)M7mdA(Jv z1PG?xdmdE{Lw{Yco`lJCvAdKnalvN|`+Cp!Aiu$!9Ljppx=Hr3gvNI`?2&`WNZ0iw z|E@VZjEqC*hRI%5(CC8idGf!IT>rZYo&)*O$kAZ2CxhNFd)R?W1r5^Y@)=0M_dNMOkZbJ# zfJ)n2dBJx*iR}=RpMV?>7PBq4gOmyy@Cc%XO6-*vlt-aH7OVkueQ((Fn+rHoxpsWp)Tiiu~&7l*LZq5Pw{q8DX z?Km0a50jklrs6{bwuPqHx_zmubHHyP0e}w;tt2^m#fB5tBiijT$ZJlBo(^%)N%!K@>{V1pJnUv2^AhAIH)nwUXA)Z|H8wU5 zq5P}sMRZFQ6;7;2QUv98M}ojj8>xpvjR044HHqyeW2+~x^?wf7z9dOK9<@7Ua|iW* zC$Y{cDx7q_8jy|}RX`_b65SnY1PJ175_{>vR)@SFESaEx*$x8aA9c0rYbUC>A699A zw!oqxodR8loq$gruJ42z0d!yJn6gvU&Qk2}I_PJo`9u>e`3I#hDx5U?_0>SHIbpiH z#e!Qk9km3%^togo5`7FMKL^QpLU6VJMrZ#lk`6&->kahBDHr$04NiEcPEIPmN7f?q zkV{b)^eYX%lac5NKweAVNp6;XEW!O4tO0a-64(YQ`SdSTdZ9YQDi#AyrdQXgoO`gV zIt9nL0QowEVS#7_J>+JMmH~9ad%+s9#BEw1MC%gB`503c5QILito0xa%5Ne4-9?Ym z`IPO;6RBfDU?4YJG2qpw;~z8;-F5w zHqQ!P0m@n^U1?6`41wH@M4!kN81f3)jPHo(GCE73)5Kc-KXwy{{yE6rDAfzq7Gw=i zh|gS|0~6;WKTLT;Ec$NntO5_A6$bv=h_SCw6#+4gC!mZ^@g0HxIMa$vzTk&cKSm+e6ZeD2jM3u3D!xMfJRbDR%+rh2u?gWyIXn>^N77%kd| zDE$xFrxH408j|<6NG6lFyKCh_oZ5(8fE)~Ap9I}@cdLAew=V%NLJoxR1C(!Ym+k>E zYY}x9@|AbMMmKdo5{bkZIzay<+79z+x;Ir-{{Y7ij0wgWQ%nE=002ovPDHLkV1lhF Bs5<}v literal 0 HcmV?d00001 diff --git a/Assets/overlays/broadhead-arrow.png b/Assets/overlays/broadhead-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..25f77f4d4251cd34aef96c3a6982df45c06f84ca GIT binary patch literal 2005 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 M07*qoM6N<$f-a;CHvj+t literal 0 HcmV?d00001 diff --git a/Assets/overlays/brutal-helm.png b/Assets/overlays/brutal-helm.png new file mode 100644 index 0000000000000000000000000000000000000000..f34639745cb77d7a27fe32446d07f9859a41f7fa GIT binary patch literal 2568 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/bubbling-bowl.png b/Assets/overlays/bubbling-bowl.png new file mode 100644 index 0000000000000000000000000000000000000000..8295e4d52dcb8813dde6638a064e6903f8f0eabb GIT binary patch literal 2826 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/bugle-call.png b/Assets/overlays/bugle-call.png new file mode 100644 index 0000000000000000000000000000000000000000..058ed7d1f8f8204892f230ac13edfda88a049d87 GIT binary patch literal 1919 zcmV-_2Y~pAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00#$2L_t(|UhSHFh*VV+z<0*MYBP;mx3aJ@iwq&@%P29k4E>|X{;1HhAcP79gXjxe z5RLl7APkAJ(8vfZ5QW$xvJZ>cBwZ_WE40ED)3(iz%xz|Ow%@t$>@;uQ$KE^pW}RK; z2ZwXtz2}^J?tSmwcjvvSt5IWU(9_eithcxKaH-_;`PFJNykVeQ7_blOT2b|CGJIi> zBN*&aGirt7KT#9Z#2S23_)gNpy0q%5hNQ1ZrBY|;p&aK?^QqhG)!2jY3MOE#9uAEO zfT^ncXiBHkA86Sc2EK?%dqxk34kW&YGiRW@5tY&=Yr4C;@5Z-BVo)AhlR)A-C2^hv zZInlAwKe$6M7kt~Fr+4cd`FRdH*ypyEMB(YKLx)dX5>oo1SGl!(9tQ#V$Rf7bO-u4 z`d4HVvIsdxO_+IJ71+ydvrYO6qf!&_wFF1^ zAj^?v(_0MK?91hHvou5~m}RtR1@r@(JoC3Vl53>?AlTU3LF zu>zm_k-QhdgF|z+k<-+yGSF8&BEQY0(@w3H`e|CX3t7VCyn^=qqKg7MSwGIyP_bY; z8!_t-y7Fhc6grc~R52!TbcVJ=$o0k$C^s?@8$7dku>A~ms=9`P&2`8zWN^-QDI}Pt zQ{QHTgu{w4}H)!7x`D+;&@73st*Pb*!ohpRhtbQU#!IdwB3&M?H@v+U3QH(t4sAjZnt_V z`jLcD=c<|5#r}53{yxOFf|tUr)Q+-R6bB7*{=`c!2yIK$%nIzA)HM=p)~fl*hh(N} zUZK$botj#Ki)>-v^Sq>13v#j<}6<9nwBu!Rmcs;f1)WfA(uQ27<_4-|A-w@viO5(1+FE3H-LAoZsWi zHrk624sqX5(*jhFq5fJ#_7?JzWdnLA@{e&+oF@REF(h=zb9YA)(oojmGZt6#D>Dq* z+oolHVv_vp&_D}rl!e5!t=C~L|`!O#5_yG zTY>#JB&Q()(Dss=CW|CW!UwgV#2~Ko*Ij%zd)`54`&rGBg}`gIkHjJNW7>@s*w0tj zD4ceN{X&QGqETZf4_B64(lfNXe!;eZd?FK~=^iz8Ca{7MPaaomQYq)Xi#6$VIzvD2 zlK4ceiiKR{dqdpcVaoe)17Q>JG98+)JC%e!8tAK;Nf@hDv0&e>#Q?NfO=K9p2_Tt! z3Ff?OD;KT=N&J2K^?ko*V&ns-?-jRRnW4~jo)*i8AQy3OMs7VT34{FtDf|mepn3*% z3z3P4yz`G+19qsJGleUFIMX>J{eG{n1YC7DqCR3Eg>MMdeTq7Wv{GJ&L@r7+^=Q$V z%5EbaU=Z@NS+0ajyc%jGUx!r7>AP2;3DT^`!~Luu-`8210j(K&@=ZV`g>x?irj{lN7o+o zVX>)JoF{-m=1}tOuLaqLkL<#Bp{0K4A``&i0#Gl1Z~Yuu#_D?udO&|=t6GXDfU>;0 zdKI|?2`oUv5(X;IR{5$jl{qNf8Z~Ovs8ORvjbTb%-G6K_1-eX#rDFg9002ovPDHLk FV1m5Vo^k*H literal 0 HcmV?d00001 diff --git a/Assets/overlays/bull.png b/Assets/overlays/bull.png new file mode 100644 index 0000000000000000000000000000000000000000..063c0c3a86e155882b3d91e1e77678da0a97c75d GIT binary patch literal 1332 zcmV-41Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00g{AL_t(|UhSJ*h*V`5$M?)?yOEY*A^7bUUFd2TRzx6XDhd)s7ZrjbdtuRqAS!rK zVPKyS2%=CoVqMfldLw9rh%QtYQBXu5x+3|JN-OHRyE!{&cKtnP{yVeNoORDRGrP_i z-XHw;dEe)KpEK|Co{x9VnX^p}hhtQRhK8C42M6b^YY}e6TKlQv%;Ebt#)H1<4+U8H;!^&%fl zMh`H?Ieb<-?1wj0?QJLM`;F#!gXU>Cy`1a)u@o|8KfEiEn8CXjdn8Nbi? zKc~2moDLMcF<~Q`;yj{dWYxBhYqg ze%jU)204R4UJph*0{nLG5E=S+Dzpf`x71wUFwkYFOXIeI`?*~1c{N9ZySd*LZt?bX zdN;*bN6}q{!Fs68E?U^wPlk!fkn}v%o+RGka5x+ehr{7;I2>uh?jlv35JG<*A1`vb z+zZ^^zOQNpv~55KnFM<|tFa)l$I*Yt-r0Lm?jpEn=JWX*wAllYeR4MrBz4@9BgxAc zdyA|Ld>(D~LbFYPu|!Sjhn(yu^Z*ijP3{V4wig>OsNW}Yk1G>$4IrNZqeH}PM zpzRjsu$Ac>>mh1VCS(HGn^RTnC&{ti7Wvoy&~G?qT$zvw82)+8lIrX08|#OSh4zOd z;8IX)1ndYv{Ul`Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z0125%L_t(|UhSKCj8)Yg$C-IE3@(Tuqqc5A;*Ll$wUopqZltvujkT3FR>dVQAyH#B zv}t0DMl>$*FB6xbu_-BP)0WmYQl-_B)TNE0R5ThlaG{PUC~t=M2KxD(^L^KM-(BB* zcjAD2l3&jG{mwbRv%GWeJ@?%E#_Zs0PM5+_!Imvs4j`CCIJUdH`$gnspR%1phxb4h zBg0#p7#<$}C&8i0wtYgU_e5UxU5-N9dSs@uZ(q>AE;{$5?`ksSd6!^!72CF;;T1YC z6*&nx54j54I7_S7>vOGxd7#|w&f&H|wOXA*n{S}eE08aI7d))%|0tUc&I{h^I#^XS z7ScB&<5hI@LL=uRgKBpi3zcuGbO-vC$oa^7GDRTmY*)!>g!YZ2fxq@mO@=%_QvM6P z#e@BBvlH&dEQ$ER_FvL+&j5-{KzgK(EHrEqvck1A1M(fCGB?ZQK>wR_CNM4ZDIU^K zR8lU;e+n{7Y9ieV3qvLS1k1a+x@LPzI^^4+=p=;=X5j0aiW>{ims*7WuVqv8l(Xi9 zvPTn~;%Lz#-Ab%hRm>_M=K^o2D3#9FO38(U)v?~UyNY~Poj zNu^S;y~D{~8v$tOSk~oo!ge{q%G03*(sM(ZM_uJPAn%*V5XE+tDVD-B0LOPTEnR2Y z6}CgJGPG?X!4ziDSmMWfYdnPpfRUYx^UI{ROXFJcG>scnJTFfuOoa{BOxo9Y z(966Iv<02t7g z|4d26!H+%E*lns5m<0>uw~JYItG7m>&ZWpst`Rw)$OQ6l@ufYe4=cGiIQgmkl>+{1 z$Z2wK{!c}gA)6SG8u9}1d1P(tLQVb?Tm?TN)76wr$QwCc!}bY5u_r?cPQ*dl^ZkfJ z{ohq{QX$`XBy_N9U|Xy#5i*wm<-FpC+qHPR;r;LnOi$a4)iQ(*); zzn0(tZfPeIU+t~sg5O~}wMJ?xbTqR5tvt^xe~}s?bpUW^zkKXLggGXdi}N+Ty}fp_ z+j!0|n>7qTP4QG{OXT>RcKr+cfYb=71Hdmki^_MA+KN35KBKr@xxb-k+2o#CbT%>r zXycz0jU{yeD15A02#;G}e|K9uDA$V|iX`s$2L}i3HCmlK0qFK!k-Y+U5D$H2l84xr1vu(w znyr%>fw~qm^?stb{hAxd-})$8CHM&WnD}Rewm095pt=*NGlO??+xTqJFg+k#)u*7OggMj+ijp?g+p1lna6 z?##1;W|9WLre_E$Hs?1HzUVDu<|s7YRu~Iq>=pQ4a6}PGz^L8GMk?3TclZ_8EKx>{F2EmDPcswG8Y74Yw5I zAg!%e>9Nqs8S)pRUawza=~NPWQY7h8pW{o&V}o>|vLr$tdz&Um1<*S26gx02k%|2T{Tv;6G zcPQC`o_jMwUVG*bKp(8tYNO+;a2jLV+~)W6tB}Y>16%0JG4z|1lnVKdL4xmjh<=Wg z`(0lKsShOFlUETOMB8Q~)42yv!xpy@X`QaQ9!T(c2|k+4 z3&F3rNXe;?FYV6}TyKZ}Zp#6+yo+1e(9qBwz`&Mz8#BmbGbW1B5|va^mQ3M-_d&fkd7mk386G;kun(n_1Q_Uj|=Um;&B n7zF!M!$DGau!C)aF=PG@M%t^Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00&n|L_t(|UhSG|h!tfR$KA7=w>2!UMHkW1?j~gBrAX2u%nxQaDp4b>M9eSJhZ60B zK}i@&P(;wp3MBiImZX)2SYFaXY0b*C%q>ma-B#1xv%CGCnZKiFcg~!dIdjh0#r?s< zdwXv4o;fq~zB64q>7wgx7$78oQo2sx%4Ly=CW7s%Wf{I&TDoQAO{rPh8RDc@f#2y7O~ybX-KB(*j$ z_MOxU5An)X4Fo;AGh{qAhXI>8a*+Z3tEJ)#Gun=f0GD^)rOjr4ZhC4|by9sjP zK(}37|8X_4^1Rdw3xRr*j9tBlsw)umHo5tQ2b;eT?-ogYjE1s;&JL-^CZ#eEmcF$V zwj}<7pkXHAEtR1mhCS;qb6XD6R0c7EoGwz`7xEn*GUs4$vP`pnm}0!TeL-gc(ro%s z!E7AT7x`CRfuQ$@!urDa=g53DAvPgdpYa+0+0~8)c59KPYUYIN$7>4N z2K+oFwGHZu56*fZ^>XN-_S=+GkxQiNK>JfyD;n4tjcVouUEk{fLlYTu_Ae+KDDvM^ zz{yH;m<RL5DB29q7EH5HRaUMWI!oeLTr@&=4IxQ3fnS>*5k4vP#fUxy{z3T0PTnBHU zV?Xv-w{?cd6Tl1}rFg|{bvSNO=@I7)u-UY&s)K5FBu1+Ah&uuH7ntp~Ius*Rdc>Ll zgTI0;RhO&TA>fDWUteFJv37_(0R|4|GYM=0B|R%X1kiF_Mu4HM84u?LU4)m12J ziL-+^zf+!~ZLi^mQNMw+G1P{Qf&MJ?-&8Xha9Y9h!4jm2dSc+uScTYYvI>REfc^`S zCs-6!nN2S6wOFRfgL8X#xDHXc_~7HmhK7dGa-9=Q%CVV;oNzt(!+7MqipUUT402L2 zBZIB2BxAh?#P(*y_AGp1Y>iY40|Bn!bljzQk-_#$d~}n$Sm0&^KI&YLnb5ykYRQ6Q z+r?SP0c7kML;?Hiy1Kgla+w$SdQ@&Rp#KM{IE20nG&VL)DlacjaTT_8ewwm7rS0Qg zg^Z&!_=n1PRX)yx|Xc0GBv-fiAPjOefJF}xgyu}|$>;CmlM=-XKs@HgIZ zeip>3(y&A52O+!v*3{J8ijPm!l{71e(WH7(*oPeZRX@#1l@5`f1pD;qQ%jOl_@6Jp zanfIjty7s8)nS!imo7)>5lCld{ z-s_SqwD!A4r9)m5a2h6I8wX*NFr8oXfVxA2t$h&|>qDv#w0?C~*w^YzKsRJI@*4*g z1>bG!d?Al_U2mDXcP-!5Cemp~b>!#Bd60{3yBH%7XEbqfDeA~;~ z;++1iA+UWqb3gK@lT8*FuSEvSEHCi$wA?z-o}r=QLEK(k2c}bQcd`fpiGEL!*Ly{L z+<|yswo~6sQJi0&V74Lg9AfYJ19xY#ft{VYfnR=P1KY{S*-P>o+E;40@DR{Gq<$Fr z3W>cphN)c??~~h{pnE>D6!G>Ysh>pdluGd-xLy4hBm0$8WU$>rF_W^d+@9*KajpSbAGq#F8ySClg#2$JoEjG=04iIMzr!>JFV z%$Xbdc2@j?*qZ+%Og12qR;DGN06#b`d)qXG>Sg?@_U^wor?WjJ+5w+H>=peV9BdU* hsAY5~=Kx*0{0})OsJ<`uh!_9>002ovPDHLkV1hZ;xQhS) literal 0 HcmV?d00001 diff --git a/Assets/overlays/burning-embers.png b/Assets/overlays/burning-embers.png new file mode 100644 index 0000000000000000000000000000000000000000..fa521d77e4916c64aa0e923e1c01c259a4717dff GIT binary patch literal 2572 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/campfire.png b/Assets/overlays/campfire.png new file mode 100644 index 0000000000000000000000000000000000000000..fd95a5eb46b070723317518a469b8ff76ebe5d2c GIT binary patch literal 2584 zcmV+z3g`8SP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z012Q;L_t(|UhSI;j2%@S#&?(P@@x?b7*ToEQfW1!MJ2ui_HF%43*BEdjSDI$$jY72^wJ^|P5K6>}z?>qC|>CWDn`ga*Q<*B&_dtKcpM zW3ElFF3|b+!%tal7##RfaEKhjBAZ7)=yN+AzSW(dX>(Jc{`1NsylMtvU|`^f?z1|5 zs?AM-`m3C(d?kF;uF(lPI90uLpNIPU`*Zz%8O#TqDuC2Ih!gED6m6DyF{2f@+(Pkv zE+){`)%6A!tD>!~?Qj&>U=CUY5CGh{TUgrD(-Tj7@x257*}hB=bDyh> zKG3;usFU2qA4SAB#WL_umA?$)FbzHnH`-Ja)Y;^8qYoU&bf|m5F*YTDZ*p`Px$v^n z6@sE3g8@9Qo`Gk==WQB^4$G#&0PJ$H5EMNCyWo1O6<~sNh>Lmff@L8nWB@oThq+i4 z?d|Pvb}X+c5 zPFDz;z5?jaeu!W4n?G7Q9jm$o#;q5MXhivbBw54|Z4A0+2Q-AxjRndU00v#y>xb%SIJox3Qct{Mf}+Ul4X*eW(zMuM<*1}}a>QRhc? z? zj%gVOl({?H*Vi|NxOhTFS;v^Ujn?P@olPq&rcHFpe(_G9AZjygT+#hMV@f2r&$mIkY z8UT_Ezz40SL3il7z(Bqp9%(fTU*^p9xts^TvCI!TePOt+Qh;w8+}EM0kiWmbe=(Ca zz31BsPqr%+#9r?7O@lTvCqfN_eEN`SOO(12_%c6_!FK_SAC;8<2QRfd6U2NHCN@;i zOAO-6Rx?3d%~fQ>An6k4uK>Pvh{O#C+uPwoQA7lEZIB-4keVP~8?cMvZEy)Z0j`X) zWrLX0ouW99RBv$;%VP9?c&mI4Yw7IlJPiF7IDBs23$LOW<^#xs(64}3he{2AI?slr z8Nh$HLyHH=uXj6YXcdpZ>2~R$^u566;fqm31axh4g?9tJy}ieC34a%JxQwy)A&v?O z>OfCV&s$V43*^&GF?I4&2uMDj19%j9p-lnkGvQy{j{tPd*1k?r8!8`w4^TI4%6fy- z)C95LakUEI(|3k-KamOnXH+}CE21v!1_!zx`?>Ioun@LAfJO_cNnPw4{chmK|Td* zzHA|8g>n=ElHKUMbwizmx)H`xQObAPEi6UX86RW-K8~(O zx(_UbCqq4QzW{##e-Af1RIwXFqeXxYUgEqpLBrdjW`vp&OaHWTAg93a>?fbz`kaUw zc5yghtqHU`)Rp#c*^pr$uT&~&W2FN4byIv0UJB!nCvoYiq`^tNqs#@89Rd5JrqhA{ zUmTcjNV7PgcuyZa%n*^`odR;T^^t3X@Mf9f*Q|fvaTBCh12MYV?t!ylLr;gg_5<45 z+O{HAMp_cI{~Vmx+S)o9>Me|Re23rBRaXcfQhJ+HOqJAME9qpkY2hF1;e} z4VDbh?*8yYa2cwmz*;bk%%6%zHbic+44_k*?#`jn<57P>c{!c^DtgF?u2Xl$uzurOC7uSuDiNt?diazc85UW{1=5*f zYo|FA#61bGq*%l!c-288@%)@}E5CXDgH!n+1WkM24IaU6DScDy7TGVM!q{U3oIdpAMN1u9mPW#B4)6J$7OLvwLm>bmpKL9ctnsdF9& z9q$vM$4?i^I*XriXjKrW$L1yEx*a+EQ<_)iLn<1YLVE{UZ3xtz2(O0vltyP$tHveW u-Q9I>h>QgFHP4t2>-x8xF^oZIY57063ouV#KXOL^0000 literal 0 HcmV?d00001 diff --git a/Assets/overlays/candle-flame.png b/Assets/overlays/candle-flame.png new file mode 100644 index 0000000000000000000000000000000000000000..2c184637805d7b105447743ede438e20fc9612c5 GIT binary patch literal 1659 zcmV->288*EP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00sj|L_t(|UhSG|XdG1($2VC?*7PM>Evb(Ni*2a2g7wk#L#v|rrQi!H8dNO$r6_`} zw1So*D2jps>o@&qst7)?ASwjX54P4Su{COo7;1}3Rcf20*=(|jzccgCHrs4=XJ+?q zcGvviaLzq5bMHN8?%cWah|Tgpr%t*eNhXua8yg$%9UmW0*4Ni}$X&eL&noD2^SU#H!xo1vkhs}n-9qx>J>2mOhbgZtfZk^1$uwRc%XOtxYobfh-S)pPWewKDd zxkkVf(qZY7u3k9%wy?>0iwi)Ds&R(%5kT-88UAxr38RCV(Ioq5{qM=fkmQWje)m0`6q^$5jkVO4=!|FM&4c(2%$>nND$?fL7_yFnXen zoKUzG!?a za2cGIS-lY4YR=@8H$V7(LwRp|u;2H+=dkTw1&(n&2iRHs7PZ4Kodf@ss2luJY|1EM zdzZ}GfHV5KPHqN#&)PQ3R^Q`;-&o@vSW6Jp<4C{av_L;FKW07lpzrnkySxKx5rVrM zc?&s%^vZ4i@6+k@F!B;PD9bW&n2?+>>1q3tWtA#_*b5WcIvoAwmWDf^H+ynXRSlOAXj9lXOzjXs7aMNypa@zFmu2vX?xXW zvNs-&@1p&`<&FerKTcgm&FIw8HZn4DyNaO*lmIe3hej?^(b$Bq5#K57`$@tX-#v4X z#Hc@E6ovp7+EAMe33x-BEkVl|#(TA?EYRLz+WlQc>rcO(6m_YzQ1LvqlLh{lQQjy* z+hS$|9qU4uWTBJ`s{Wd}ryVnnZT}HZret@iDbUz-e{z0_EY)rvxLfGtGbH14B+v?P zI;eXP>B6+xK5H3F*?zCJSML*S*QUS(o_uKN0N4CYDrP~$_UQUfDwXO;Boaq`uMgYo z{Xi?nu0SutbroW7er!%@!f)Hh&}Y&1aCDNkj&n`_g8c*jpO6vk3~X;^->2|DiP*aa z4}6^**REn|q0v`qATR7=bR(OQB|5YuP~WA9J%@aP%1+h7kF4}1)L z`W3a0V|zF=KQco48X6i-VCVc2WN=JVGMQY=NNT~h{|l~1Y@u^4P3OI9(av#h%{IaU z6YBm;1Mks^2ULsN*&hEKwv{5`{-FwFzkDg%KxS~OT`e2{Re^ndD7{26hi<2002ovPDHLk FV1m$%6`KG6 literal 0 HcmV?d00001 diff --git a/Assets/overlays/candle-holder.png b/Assets/overlays/candle-holder.png new file mode 100644 index 0000000000000000000000000000000000000000..b3723af510c52a6ec180a968f7f6da3e30e8385e GIT binary patch literal 1379 zcmV-p1)TbcP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0V80K!uM z00iqvL_t(|UhSJ*h*eb-$7il{Ge$EN@j<4LK2$`-F+@hHhsfwtknlMXeGo%^Fhzvv z#fQ=dm4YA`NGRy3pdKpv5CRjV1RqqeBu57al?HrJ#{1cC?em}8z0SSo-f@n1pL;q# zShM!pd+mGoTIZg<_xYHvlo(MimwS*WW&Xb?l}byI^CX~*K7q_sQ}Q9^#RNQR!B2qw zH7X;QiZ}Z3WIV>E(AZQcqdUT7W1^Pl56rHxJAev#akEJf0TRjAh^Sd zGZg&RsY`Mot{wur6@(ZLr^1lBB?p3kQSmvj$5Edln<=~Ha02X`sBU#l1_bq95MBUw z4mDeC9|yJnLESU1W5oDeXBSC3y1Tox#Mv+NoOCrc{!!sG0Y&L*me?PX@wc;Tspmg! zd?sL6x|)UdCzs3pxLH0P;1N)qFQX$R^fxeC$N8G+2y%u>F zc_=e~N*v(GujUBvM*1mdRXqvX7U1&+r@~%UMT)oWB|&XsX8+2{1er(KvUmfzi_Adg zB7OL{r4gTtOq|QDoCrw3PJ(I~{4c0$r1;ziyeaJ!FA3mizJhu+u>8{Y1Q7fz)DY)( zP~jOLzW|&3`c(Fgj|8|`Judi2fNgzCDo+Jl8j}I@zyPv0Sm0WtSS;q~Ge;j08D3Ta zHZ-SEmjbIb=wrLZZGjaXUJ@`3-si`#Smj9Qs06Tj%pn1v%8Z0g`vq7MHZT`N_PDI$ z5+IgIPn%9nz^L@JnQ{X7`Sl^MA)AmjoRd9jdZ_R{_T;FD{LE=^O4aRyU|&K`F@PGV zyNMj4__$nKf<7CAPiPJNFQDcj?Z1ey0Fja#30RqpNyRp>N2p$}E=|FA$_Y@{_QDq* z&=_nG=a9E3_9FH|({tFL*ozEmw`cv&t7|Cu#y58i0zDGT(rW$CoySVNhAN)rt z&sS4J@QHr{2<8iYxdk^*)pfzAAF+wbl5kkn4T*gM_`;cpdwm7HU)7=DcTE2F;zQ`_ zfKMzE5Vj1iWVz{8`5Wm_3WdVwrs=l;wZh7ACoBP#r!oZemx`fev)Rf~;-EdDVyp>E zKv~*?X?4R?{ZO+Y9c#h@8<94il@5hdU_eEq{j>H1&~R79QMWfZ$1<7BEXw=PN7Pgo zd}bggIbB{r|BnA!HPr>5*+|O|Kl$7oaz$o)AOT-8NSlE#qZ&THqy4d}CDSAp_xxKS zbYD#%17!U-D-+u`j;ecKkNQ2-+p{~Xx4XQXv2Erz`wHa~R*ox-@g8IR5NUpMmLvNE z9qg!{RFx&5vOVrZ82?d)(j1(3sMDCLtj;z`7u~0I7>s)aRk?C)y1dcB9$g!i`|_L$ z_fYTfK{YQk#T|>EpZyl(wyGv40H>M@9)f*a#q-h*>d&Bd2Ucf5;0KYPWKM?QU*?Ek zM|L9Xks<0Fl();R2AVzyJmL-G|42iw4?ev(T@T!Aq5eBm!$(tg^%r=?6UKiO)%;Ep zPEX-%|FATsj>E_x()1sg@Y#j9dk1mB#)It95bF}Q6YSx9nbLlqFIz*Or)7GF7%nqc lot2rAl9G~=l2T1q*S~{}<2{T8snq}g002ovPDHLkV1jzkh%x{G literal 0 HcmV?d00001 diff --git a/Assets/overlays/candlebright.png b/Assets/overlays/candlebright.png new file mode 100644 index 0000000000000000000000000000000000000000..77eb686961235fec5b83a132e7bedc043391a0c3 GIT binary patch literal 1652 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 LNkvXXu0mjfXs`nU literal 0 HcmV?d00001 diff --git a/Assets/overlays/cash.png b/Assets/overlays/cash.png new file mode 100644 index 0000000000000000000000000000000000000000..db12bfa6877499f1efb2a121ac88b610065912f6 GIT binary patch literal 3011 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 D=BfCV literal 0 HcmV?d00001 diff --git a/Assets/overlays/centipede.png b/Assets/overlays/centipede.png new file mode 100644 index 0000000000000000000000000000000000000000..81919b44dd3eced38fc3603361e0df006c50a910 GIT binary patch literal 2087 zcmV+?2-x?DP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00*y0L_t(|UhSJ{j1)x}hM5u91q4h`0V79(fPjF}=tjIiF^HVTkccjb7erJd2!tR% z^p6pZ3Zi%=8pQ)e(U^$Q803foa(EL-#E2p)Ah7Go?(FIF)_l|K>~zoU4D7Jm@+9w8 z)%Sf>)z#D8Refx$6J$wUU0uYop&)9h1~#v@w)Q1-Kk95|2fiq_E7212yGYM4S9oAh zUobdFO-)TH<#Fbc?=5pBm};)@P=5yq%H^o9`9_=VSM)eK&s7Q&3@T{{2yBbY*9H|~ z3f1{9ylX%J=ju;18ZAegB9Ta)vxbOFJ7Axs;U{qlkgi2z(J<7@+~KF*4%lv{KnN>D zQ;B`lOf8?p4iMyLq3LK8YGWZ9cx%e@(H|C9jlyx1Fp!j4Kw$q9jkYkwtuVV-h5DJR zWy3&xcYwfGi7r-LEEXF?{uMOPRSXO1c7VYDzJ-R0Ow(X}F0wRKGW+%GLOf8R~YXJ6z7Lo$KuIOD0)m`LwBrWrPfq}fI zL6BB4kiE(a$}uzzY5u<(^|mUi)1Qz-7PlDrNlax1iaSPjU@~0R|IcP#ZMhG|aQ`@KI7y(uo~VY6JC!qhLRY@2^hXVveM{tl08k zU{l;EGr&N*Srre=L$Sx?XD7@sbF;;F8f4phSk@Q(2hlRJhvJqv6%`e_D6VA6EFj$- zjYe0RtJxB?4%lsJ5K9@{Wb}`f9R&pi?MQTLlvY($jmGb_gDo%9BmER|1nODFy=Z`$ z8wVBK<8IPUG~}i?Kk$p&$zDi0tgNi8i)#QVt8U7Ih|^&vz7H!aE8R_1Q^PiNp}%EZ zt2U5cXXaoCd<^ZNVr!MDG=_3H<-~wrQ{E4Jgw`x0d#Y=!0odCT?2RZI}Xt#TC`fPI$vYf#=Fsne$(@u~06k@tWn z3AS$y&WF$`W=a9y6&gr76l38Y?6^hP50k!arX;8~9{<8vESB9ln+3GL*tYLUGbMxL zOv?sB%$sT?2>dHiR|`)FLNZSAstip`WARQz5Iq=T6CXqy!s zl)nx-yz$Mon14|RGkajWRep|+3X%dd=LBv2Y<(>-Q+7}>@I&CD5wAp6P4l4FQ2h>Oc$~y1wL~i*T1pYFV^%{UW?r0)? z+Dth?eRre@^4FTVaZo3M+>HzY*ypiv_6G z%pRDQxQ350wA%q~wQkhU!{%xnRG4OURXOnP4&Ouz%L(d>qzffwopOC~yVYs7P`5Ms zGTwvhL*F-~TxbI!cqFQ_${R`Ank$9!^75XjR+R}NQ_Dxm-;!4mc)$^lC?$PP6A1aDQqZJfalkTP5H4=&J ziAQ7)V<{zh0Ubm`Y0H~cf}qY84*TN5!onS9YC0I8o(`v-=kc#|KT95_;i0z65qrlU>m`?t9K6Gbak}Q)?e0b(?e(Tty6t4(Z|fb;O~z< zK!=fDyRWCJyGtbRKF9L|pY9b>)(=4t`jhLhsiC9x{PKURQ_@$>oDsscx=eZ|Nm(yv zyy>q2Q<40a#*67;Tb{FKn-==g&CD3I33;#0{J^gVm4mG43;up={BQAL909wxf+N4$ z%z+S-a%+8DVVgR#QHSH3m;O^*{ED5)j(DB)c{CQAH)Byg3vG8T1%O{u>eW`|_`}BB zVH>9F#Mx%f8Jg0A);UPe`F^3ih4d-p-K~<>jZfO6GHgqBvPa_ z8jUvDYqw?#=e?T>N%dcFN&gBMdKmCPq=%_ul9|H~Ke%qQr!Z(e3)I`F$>s_-3|cow z#b_I=NZkbKO?7v32a=Z$mzoj=+Kvm|B@9-d^B+LpP~M8FT)+uVkcL*R{sSn(y(rmS Rh^znr002ovPDHLkV1mVh;;;Y! literal 0 HcmV?d00001 diff --git a/Assets/overlays/chemical-bolt.png b/Assets/overlays/chemical-bolt.png new file mode 100644 index 0000000000000000000000000000000000000000..69f625c7507d1b664813039b590d33eb5a20225b GIT binary patch literal 2033 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00((VL_t(|UhSJ}Y!p=#fcpR`6vc`n5{XEn7N0;&lsEWGEP_TvMB_6-P1J;-F^U-U zhbCf_$Xg;<-~18;l}CtCB2a`v#8(>?C1NZph7$T%wyoc}b2`rKYmztH%e9)++oa~ar$n{TpxTMCF`#M4 zN5~__nw^X)L1PlJQ&9W2Ji;@ zb~U90zezH1C)nz>xbR^x^2nUT6*C@vx|(gU&CzkYz+SE{g@F#VS}tMqA>>(PHF8qN zB!gC8u zkV%MHmOw}y4_p}|kVVK&qz&< zqgu^?Nmh~7h`AXigQ5?R{#wNa_W9~&gY8pPnYu&=9S=Z$v%>JgCv*U12ZnDsvdbz> z4SwGuu1UZ=99z} z@0M9lBp#37qvfBdDHPP(YdTQKzpO=0_8|858lPo|unp;@=IlZMJ?P9eNG`!mDD#M- zEYQs_5$YW@9XP-yhcWLU^0b(P^wuI9sz!fyNvHDtli;2reG_61K?H0clMfB`TvtF> z;CBY@1JTiZ;$b1U1!hDc;VN3LO?Y6ivY3*^kQ}-iNXL;{!&V%4Yfn z+7;AYtIgP8lfiFQ7hmvgL+;n=nL$JLrRGFCsZuu^iYl=GZFz-fM@HcFdF9~!y_snd2{VE;_rY%tHZN;8M{HzHG!bg!nps6b!aRJ*|%)NU*1 zVX$f&I_&beJS;43s*v?a;Cqh~s*NO`K&Q}ttF=9<6ZulLleB`(7EHioO{T$Vy~6@&FQ(dQn23@-kru(`SU!}9X-UrDXn^T%9FUY-ztSzggXzxyq7;D2r8x;TUU#HJa`u+V}myr1#Wh`V+uau!M#-YSsf~vT2gT69Z{^WKL#*bXZND zw5pB_Vn43Q%wRx0S=cH^shL&6DGf!U2LOfb20(xt{*antG}tGrR4?9<_3b0U1X%2pHAp^u7;6Y2&4+J z{|luP9;uB;R&J2=w-J?#D?T~$pC<(MCQ^@lhpZ&Pp~$VI?Vsa!2eh{XRT%%aBM|Tu zPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00zZLL_t(|UhSHDh!#~Chj;f|FQu86yhT}tCPZdfsU@O?C6*H2%EUs5E`LPUKV=k_ z7O36uf?7f;lo_=t28$6DSqo(%sVS9aT3V)U+Lo)k?S8vGzccSlJARj4-EVKxJn-Yp z`=0mQ=9@Wl&e_e2iHV7ciHZ5&l5c5bsI9H-T3uZ|wy?0UJJ;Xm=jWH8q-95&nwpxs zQ5gddz}|;$wUB7S0Q;gRP>l^biGmv;KRjaL(SQM6f*wUBC~0HWV0WVa7Be!LOzt+n zZq77UxUEuAQE@qgn8R4M+JHjH2Ul6R19w+^J1qY=NgvB<8_?;&{EE+z?$jWBuur0m z=pIyLzO7a)1pa~Oq{XZ-ck6^c=F`bxqzg&+sM9{&h`;f@jqbqgY(?_$mstKvbEQC; z1r~FP>+a@m9nh}?of?gnpr6%IAM8I!){ssl?Px_pkhjZX=bI}9@-$IaS=@c*ZaL^j zdpa^6twKlCF(2&1Xk}GZ)h(FqtVl+P{o2YcGFMv2|JdS+%+dzyu3qW4g_I^e_mxCh??q<8+TSEZC)sQRd9 zpSjXP{+$-5&t{>ya}N#lrh)rOH=#;3>Vv(5rRvk9gDt$#P}g{?UiDvL?i9!yXJMkN zxpM;*_M?H>{HmKttGzZ{hs2lYaWuffa|-o#K*y}TCFV|nyh*N89&SQy)MkhZ2eHvm zrIRtQ<=WMUo#axVruCQ`3JMAi%I|}}8#ihq{&AS+c-}^HJ#F@(PZgxa<~yDKv$9mvn=H$&=`E`&_TsC1q^sE^)EuhF+*P|>_Rk_yyfUu#rt6E)m(?% zMv1fss(Vgw+^We8LGvtFzx;LPR>PVLLYtIaLR;GEYReni%M1MaQ6|v-YSL0yz`*_; zy@pa=O|s9&7c9akf7r6pL$KEA?ih*mS#!(3+|`gnsI!I+eMO?h(Lie|fRN5;8hQFf z|8j*4>_cc7bHPoRS(mfK-HVQ)Ur_dQK>{XQ1J%fV$4O_%mkX#%=XClU>QmLvHChLJ z-T0L0aAN~zrSbD z;^_1}gL^G1D=UXsc+*0Ii>=`jbIBK)T^j;rGy}iSzoqvhlB0D8b}(dm@n-Ls&PY&&g)=5j(0%(f|fDlw^uT*+I?;)Nztz z6IzeI7?rtzU?0b11K!S5MMDD6|!At!Q45a;97?{Y5%YiNq9on zdPDyYZouvEN{qRxB+6Sg+&tvI0%LQ08Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M?~(=x6(HN z00V4EL_t(|UhSGaXcR#dfbYixn|NSA6f{N=wXsx*5DP)XI*NsjAP9?xPaH8l&1#2~S#8N!$V*sr?q zIF4hCB`yK`R2QCVwQ7uIELH$)Y6aK?s2&BzI|2L(^p^lS)cN_CRI~7K5}f2fv`x(b zrWG(UzW^PW(8yI_S^=Z9|6NQmnO4BS6To5Q27@@0M5L{D8zjkNV!zBYkS0)mL=*Iw45Idtf7;#!BTIFs4275&}NxoS^+0fTagvAw#3-# zh-uam!Bcnd0wkCl1q)y8Ny`S3M=YyZPlVEBvo~jo8MEO!DmjtjBXP6P$0xnW!xz4DW zDY+y-xvX07mop{L1Plc>0jkHAJQE;)qCOIlvggX4+!DZ3e*(FpGNJCwv0FfOmNYpC zEkudbc};Rgj*Sc`m7{PH26;b;LG65x!tC=pgOCSbPm#9TEp@Wo0O5gC&y0dqVzR<&Gsh-HnfbxzFykqO|>)i0=7I>mlnQ3NCgL}K}@t^kp* z#K>5U4u92jf0nR6s96Yz;TRM7QO!_H9U>FpIL>n#U*!V7#3li8Z)t}W_bs#(82@(E zL+lG;_k<2Dq^W@y8fJbcaeR`P)D^(=R=C9qn5MJrpVP>S`XwPpq&&nleKWro^_uY? zAQpMUo$P;}k^nlmP+mnH7C*X%{nV`(LKxdKl>1>9>Iv literal 0 HcmV?d00001 diff --git a/Assets/overlays/circle.png b/Assets/overlays/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..eed969172385be89204573bc7e6f956dd1a53987 GIT binary patch literal 1542 zcmV+h2Ko7kP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0V80K!uM z00oXoL_t(|UhSL9j}%oDho`#7jI1OX6U0YCFb*u_5lk?X=nTSaz=aE4fr;^NP+$cl zqOM>IxC1ooOoWB5bePqEY$O^-Fro>;!GuX*Hq4{D$M1Lh+)8&b%}jS!Rd-d-mz+LT z=f2Llb?edhR`spX;{>KtWoc=tAGIF6PWwR+JVrf4m$aWIiFW`&Zbpru-$cKTyozif z*aA9)^a|=f^icOm~OIto9(;E%>4ZPoYDsd2A)L?BCjB?Av=*_@^3&pD7S>Vik!y& zJ)-^YfFtxaa$Qb(bo5K5(h2kqcAM^Km7(l**rM5M4(r0mTag6ixUpXUiWE}N|B_{^$>_UF3w(71C@?p%9(}AIV z6emh@06l|zXi2F-n}?7G=0gcNVoAwCTSXfBN{tG(Cys<%i$IaX|;L|a4PyU@Vb39PtQLDQv zgZD%_A)adjb&XM(zu=uUbJv28?sSmP$UZZ-#_a6u^Zr&xWfQ25pYtn$kNt?dFyiw) zr1j?n3SYE}9v~gN+Bb`QmCxq;1v57X1xFCop-NJ}&$kOcA2Qz+#9L-w9Td=`r+cY%{8R#3f{_~UI-;JzN4{eOr3W?mUGyPo3$c*RVag;*|I2mENJ zr$gSYWcIx_YUa#B44RE{qj_#_Zi|^4L%uImfTOS3oW!Th(tw!Ud;RuS5BRV&~%{G5AohN)uTAK)|>i~L6ix}ch)4746 z?_<)!Oi0)P9DOZU`FVKF+vkd6vFKykNUY(EQSAs=&j|4QGp2I`LA#g~Biqk8Bh-!n zw@_(lu`*W>cx_B!taaCbUL@>*Mm>}l8jbMU5%7>qTA~)6S#C-Y4zP=fyFrERN6rYf zBS0@FXcbpzl{Qy!a9vEqIgON^5u(=s|1yG>sPl%8sqTe~Xb1deTI=(9!^h-fbVNJg zXVb$BnOyxDLJe2mcJ1J(h(xiCWhye*CS>9Ey9 zA-((OdoRkgUEUv)9b+Q7V;= zs8T_tS$Rq7u$kk53eQ>HUD*kd;Nu^u)LWq9ud7YC2a9ffQBpoG_lVyh5dfeS21^eSXaHRga zJlnd}#dEc978)MJhx2Iv#3=Mp!zjD4{gqZ-)T!6@zEcCfEe^m1ROe@~^{9y>lXA?% z{uFWy(QHi9ouM+6-DY+C?kY71{2HpY$J+?8PI%zxejNKW2!eNzux@PkQIn+KEEEd2 zNxF+|2JIFo*j~puJxJQi$PoKGNz+GDFDPAL(;C12n4Kce56;-F5avfL__z@DW*sQTe8ua!34|>sWcUerD82|tP07*qoM6N<$f@dG?IsgCw literal 0 HcmV?d00001 diff --git a/Assets/overlays/circular-sawblade.png b/Assets/overlays/circular-sawblade.png new file mode 100644 index 0000000000000000000000000000000000000000..36a5a0a06c2833b7fb30ff81622b05841ced2afa GIT binary patch literal 3199 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/cleaver.png b/Assets/overlays/cleaver.png new file mode 100644 index 0000000000000000000000000000000000000000..215b854d452361576eaf4d50267d6982f96bf1d0 GIT binary patch literal 2031 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00(zTL_t(|UhSHFh*VV+z-M=6ciYlxqcr%BTG=oOifctB+^JFr9YxSRzK^v zX68j;e-V|^t_EzEA_i8>O4@sE+XjNbnuu{SG9S4ooleijHWI1TE;(o)CG(-J1Sa_& zsyGR|tyYtyHEQmAh^K~$&L!wJw+UfChHONpQ_X#P)E!rWfWPOpn}NQYw8=nyfj0FW z1ThHNrZM?~{=1N=I{sxfJ3{-N=0ZS1Hmcb`TRZApZH`3A^7KnhP0eru*^0bMFo)Ib z31hB9eZrXa=t0Kl&f50&_JLAh+$dvFsGrX@muj`|A(&()lUb;rOq?t~dGh3VEf>JG z4xvJSfE9tDMj#zlh|$5lzuBrV!ZCIK6??2AwdAk*?dGZR^Xe2B;s-EPq|-(mHtJS1nd7H!60n?oG8YCT?X zJOp_bIcC;iA441;YiJT%Bc?ypzD3Pt@wEc*S%cFSiu=g$gGiu#Rzc2CE!>BkV-*wA zBq3V%q-+A1ygZd{VAAW50hYCD_(%RQ*&9$Rq%06;18R&_^TtmCo0Pb5QZ51Cphh4&kROpAM3&Y>5)*NJu-0ElYg5T$W6qA1er<;)>YK{y(kBVqDHi+?cEgHDSSeb)X zgTX*~h4leC7VwopR#R-&OUO0kyjd-6rc(s)u~Xd|s1HQGLkhl9`-Xw9sPD+&OC~=@ zU6+tfr{y_5bP^aV+@$U#_OlT4(k9>T8wSlco?`-ktJSqD(nq@ohOukaO+vmZQ_sCi zq<+0N72tXoV9WqyKl^F0n&Mz6{(jZ6BV1Fq#xGVa7))3WzYdDmps%&8#%C7Q#B)KX zW$^*d9$;W>WV6}d)pc2+sraNBxQUKL)nk2)3NWDLRVK;b7Ny;s4d_G*ZdhZ694~N zmO>m?0E33vlZQ5nSL5IoWGUrCVJ5FEQ!R|g&t)P~woHjcLqkJ;pGYtdS#>RLlXrzr zXOawNFTR7SQ?uB|BT;TsavLL_owtj4}wY!qv?Ph{}30Tt*`KL-PoIJioy2JWL1jpt~{IZ`rFEt_D` zt;QGTTi^sR@dJn)(4*?=>T++2{opGBIG58p^0z>?QP~9K z^$EgX#P=B@KfTGpZjiHV4e>{Ni;a^RIEe&491lPnu}K@nPzNDngs+iJ$ot4%wQm)_ zk-*8_<|+}uhvx*<=9-`|;3ti8{1Rm2YYVWnIF{%2MaV`qmBTD;`WGC4He!=D zt%lhKPCSBNPhWly!QWIHWb&wq+$r8b``uq&``;$?L6{Hm36B$B*{|Pz6R-z|`Kw?V z&JSui|KC$y^hyGV^9X7V@jYQ#yz%`|&wi4BGDv{!EUO7fx7y|3(Kk!kgD(2ZcXYaU zZ$~@!C-_zZpMsVjRqny$`ujl# zTJ;A3tRk3Lz}Il~S@wme^wGY<)f5@NAFL9ePIzsBS*jz!M2_>Ro3}mSbqBC9ePj%= z$MtJ+*SR<*fD1PhK=JQyLV=%MNH;#^TH`FMC*!2AjG?^CGDU+eHCpDR)dJjBz)aO~ zVD9Mz;CTSrNFV8|)kqIS`N-E~Ef(Om0%BSIik}CdVj@2f6+>eEC4kA-qo!H4Sg4i+ zOx3v+;FN$H>1=+Z8FiV)p_&NY>q_2$8YHZs8O6FFO04^Ha?N14_|7|L94vc174%Mom;8B>yyHMf& znc$51mlug$j@+*{Ul8m|$kW6mDDAIwpRP;=kz9#_z%%7-fCDKP;USL N002ovPDHLkV1oBU%1ZzM literal 0 HcmV?d00001 diff --git a/Assets/overlays/cliff-crossing.png b/Assets/overlays/cliff-crossing.png new file mode 100644 index 0000000000000000000000000000000000000000..b6771be8d8ba2076555ee913e0debc23d058aa96 GIT binary patch literal 1673 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/coffin.png b/Assets/overlays/coffin.png new file mode 100644 index 0000000000000000000000000000000000000000..049eef27ce3b7ab14b417b70779135f1453d1556 GIT binary patch literal 1577 zcmV+^2G;qBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00ps0L_t(|UhSJ(iyTE1fM<4hX2r!zq7MoZ2!d?f=q|_-h>9qzAR_qYo4>+GAAJ=6 zfGA=f0)h}BpeQCmA!6cgOo+xryu=HEL|u)tW-h(scWO=z-80=Y-Cfl^E!ht$Rdu@N z)ag^FPWRMoYCGKI)V21?_V)H}s(bsrTCd%1_q08c`T6;4^?Lm`X`|;++6{9dM6cJo zI5RVIMZ47l!;fNQF8J(8RU>-dP;ms&uS2Q_#;sD+)O_&yHPv-LrK92qMAZQ^Vb#Fk z+^cUv$ET`J!u_qjGzw$h*CEvbqnuaYf}W>T=L3|kiX$LDXeO=-805VAAx@}T(R)Z` z5s-hRL#7YLcw2o7`koNoG#6&W}~S=s&FD2*{7?km-RD-d8`w zV>-tYB~V!eQyJII^gXUz2w-Ls4vnT#<{Gp78cIBxa1_O=e22xHguVa~7vA}i>5McX5w>i{c!ih6~zkq`yXFy;g877q?6 zZ0`?46b#<~nfHi_BOw2rD$}Coj(|z4FJR2Sls~mQ7W6bJcWHM7xk0Y4Qr2lcLOD%4 zE()F_3Q~Vra&f>>=6_bZv0%(0jCoPJV?o~<`UV+44)nc;zUQUQ_*bd+NqdMhjConx z#lYmt6zmxfW4t6m3uA;O{fHNGML?_7dbrtap4Dz5*nE}h+kS5%cM<^;Zw{UNS>dm= z>r5^OU_^s*9fNOCQ7N$cH@NxRn72z(d=t?N{VNf+7;_I}0_~4wM(a$VyhHJ}3Ta`^ z^K$drUgbt_9WKZ(QBvK!kjnuA5pYJEW%8x`!`u>ii_(ta3$0U;+W}Cz1K0vK@5pQO zoVJH4%>iaL%4BwS)<(dJ5yVrD16YA`7_zP1!eK7qoOYMBj==T5vFoCCQ{m!(f2h(v z;(YKuN$$F~Vv}+fVsRUK*4njl=&pEb0vlUCj0+8?WV>x0kdq$j}i z9Uv5x2yFtCQD#kq2x7Z16bTZzLg* z%O5ChXx9nv4&bfLIRdz8v;X;?zeps^8)1}7$n6iMPIz|!Ny|9`xH;p*Mx#+^0u;PE z0Gtm=*+wP;pwI*;6p;g*4oPv|FMQtozd_pnKL-dH?y?OAIRr)S0N4n zmqciyha0_*8@<~|LLif4@-6K;QLUc%dBdN$|`zmVt7`r)KkPrS(;SM{v bQmg$37b7*K808pX00000NkvXXu0mjf0tnSC literal 0 HcmV?d00001 diff --git a/Assets/overlays/coins.png b/Assets/overlays/coins.png new file mode 100644 index 0000000000000000000000000000000000000000..c480a4e9c4a65c710ea8c4a4e6904ccba69d5acc GIT binary patch literal 1741 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 VrREYYNk#ww002ovPDHLkV1l2{4FUiF literal 0 HcmV?d00001 diff --git a/Assets/overlays/cracked-glass.png b/Assets/overlays/cracked-glass.png new file mode 100644 index 0000000000000000000000000000000000000000..0e16455c828d62f6f3d209a8e9d2a794f42321eb GIT binary patch literal 2938 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/croc-jaws.png b/Assets/overlays/croc-jaws.png new file mode 100644 index 0000000000000000000000000000000000000000..15e8bd5f887d659acc9bc179fb6eeadc7f9eb581 GIT binary patch literal 2798 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 IM6N<$f&gy5xBvhE literal 0 HcmV?d00001 diff --git a/Assets/overlays/crossed-bones.png b/Assets/overlays/crossed-bones.png new file mode 100644 index 0000000000000000000000000000000000000000..25769e590a60f141cdf0e71c1cd84b48656b6010 GIT binary patch literal 2002 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 JPDHLkV1fjuF0=pu literal 0 HcmV?d00001 diff --git a/Assets/overlays/crown-coin.png b/Assets/overlays/crown-coin.png new file mode 100644 index 0000000000000000000000000000000000000000..4019d8ec2228d0bf8d3a6d6d4a0a85a4f3267bf5 GIT binary patch literal 3084 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 KMNUMnLSTZmvf%{) literal 0 HcmV?d00001 diff --git a/Assets/overlays/crystal-bars.png b/Assets/overlays/crystal-bars.png new file mode 100644 index 0000000000000000000000000000000000000000..2efddd1124ba258a6545fe39ffd626e9185970aa GIT binary patch literal 3163 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 JPDHLkV1m?1TBiU2 literal 0 HcmV?d00001 diff --git a/Assets/overlays/cultist.png b/Assets/overlays/cultist.png new file mode 100644 index 0000000000000000000000000000000000000000..bffde0c0acc3479e902be01cf0ef364b9bc50747 GIT binary patch literal 1967 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 N002ovPDHLkV1jyPb*=ya literal 0 HcmV?d00001 diff --git a/Assets/overlays/curvy-knife.png b/Assets/overlays/curvy-knife.png new file mode 100644 index 0000000000000000000000000000000000000000..91370c84df92d14676dadde765d8249b3a327553 GIT binary patch literal 1679 zcmV;A25|X_P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00tLHL_t(|UhSJ}h*eb-$7k-8;C3kAPzp*jH{qam({ z$8a^7Ic%t>BP!Jo{-uh`=kphv$$|YXn(^)+A;YivT2xXJe0yn5P@L~XVf&0`qB~Hi zP{cyiAC;8gQHvRedd(IC`{y(#xr2pDUtixD6tWJzf_9>!6?dWhv^Q$M3VKXVcL&M} z6f~Bi=i07LK&LCU0_@Myj8P12b_YxpIvL%Cepcb!8}w*gXKoeWis`*lskGKiso)s; z(`vTe;~yo9?nNujB%8(t2X$g-2WT!aS5=6aNbG~?0NZQK93B*~ieKK{FGj%jT~ANX zI17n^ubHdl9@;||uJ~?qhXuK71gXbh0_=}lSQ%{d(GM1)m;%~_+AJhIs6&_Xw^2z) z;Hua|0VmaGGR&xy5 z;ZoNri%_F(jQgT;{owDk@a#cxPgtE*(Io)0txI;GwiXII9F(2MYxXT!z|F7y3&T&}v%UO^C4lqHJj)Uh|G_QY8pTctezW90os&<F96Ey$rT(7NVFB%$y41chQ71rN)@wH$|>#vh(C;cR^%L4}F)p zgNFdgPCQbGKu)-?=BIPo2%HfriS==?%*LnvL~a&t1mX))!nn5_k$IY zH68Q~?kZSmxyQi1!9o=Cs+m(k{Cw+r{6oH4Tl8U+`Vp`d7!JWOF3#9Rg#&)53HT+Ra=SVjr?@VL-wf8XSGhf#JF_f+Jm4l#Pi2mEx4$<<^Z2!!}~u5lD-|) zd_~6Jjr6}ulV~@hs!s`gT6Q_PXbNR(KkI0C+1rBX?&+`~B$Bs~qij_OXD5Tf@3Jvux2)pwgY0sh@c zL+x<>Gzx{nWhAVx&uM3mN+`Bwxf1+`QF(=X5Rh;izwUFie^?#=3i@wH;r_Q9HH@Kv zC8z^wqP6ao!HN5kuxF6>Lrc*A-9de)7K_EUTrM}2-4OniP{YE>=C|(*G Z{sEGy-?+hs4{rbf002ovPDHLkV1iFQCz}8O literal 0 HcmV?d00001 diff --git a/Assets/overlays/cut-diamond.png b/Assets/overlays/cut-diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..785f51637e71bf940377b732425fffaa2eb60a13 GIT binary patch literal 1918 zcmV-^2Z8vBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00#z1L_t(|UhSHDh*VV^$9HE}H!Y#k%B-}fh?$5+pdy%=iPA$vMXj*%kL;nCQAtmX zGArpt4=e2<21WEjtPqi;qS7QKC?eE~?6H})<+i)Ck3Qeu{mr@cgExrk8Ogygvk~4x*z&?nYFFYM~>2 zxj9im3a>;Tt3K`Xkp1){K~55xZbgCiJfzuuFQ9C|_4W0`=C5vDX|SAh!vb;JMvt zZ+82GvK0&kE<_qtOmO0h+$G;CH@69K8r;>MrUA~8E%0W7{YjL42(&Mtz0VwZAoc+( z4zwS4vmHB`Oip%JG)O)X+3mFq`nrcl$xpW@?d^dlJA8|TG+$>0f%a@9{efl!|8fs6 zYiMW~MZd;fS;4;vWtTeo3i=0MS$`k{tYBEkOOW(IP$CoTKcf10+#vc{2Z+6yE9QDD z2y|!29qe0Jegqs4AtEVhJk@E4pOs2!S_+AU+$TK z^#It!O;!xJ45!jhx;qra-|y+l*R7cG!>a?pB>Cxfqpg$73H~RnSUw0GjpQ9HF?V{3 za-MOsL4TpUH2BNuH@GVj`=5f#dL}1h1f=Y zGoDvP-j{B_&58m3$=K^Hp+Km&*vsiS6OlUP6I|Wgb}5o^-{*p`zv}Ah23oO$!Cy|m zdqHS8i2nuESNXKhLRvp1E6=nq9T3CMPMUS&%3>CaDV|E>qVxx=>rvsrpkA5oR5NT0LRg7FgoZ(Vl}l^csr&` z)A|;e%q_5jOV=K6QQ%Te1RO%h!mB3m&)cV>6 z1+?FCb0~=a31t(f$dGs(1=@V&&B9pE9UpXyhg<3n)nqKkN10j^zXv&2xdlT3{i^Tu znt5S>E0sr6uhjbVi-H%`L!p7l?_N6}`-rtEFnXEW3WgdR zY!E>EQ#ZE>aay>sM`p>O;Q2_Kt1~Hxo8dV_+*Ay6yw=%B-nTx*z*WjAIn*B?<{o4K zYdu8+-|FVbkgLns_6g|P;%q*Mzr_xGxZnWOk*tfFDe!9v{3MTG=;p|fyGAu=YHsp< zU~QB1QrcmK!Q9{n%n30I6ic%&?MTaEDaf1X#~baYoN#4ol{)=ybJ*cv`7X&V9;y>q z=eE$0qs5lg)c3i-njQS_qKe-Hi3*>(HZyXRh=lCo)g@#;P9!FOpSyy`nzD-D} z7G9#k@hgxwY$RD=VD`#MQ+o)Zo*=Clrd;x-djAmcZA00XUAw^`v>>`67*Zzqw7_ap zV`4(TV3D`oiUV!!@f`y89Y{Y9YhM^hFUGVb7+NODWOAIxjB`_7xMgf*xu&M34|#_? zcCl$A^c=->7#NVY(!TRCropyKewvyZ=Us9qMjNT8c+DH#oCce2r4jOXI2ha+T$>@P@GWakw z`D%M-r=!5&wV_!X4Bbv@ox5}^Wc{rW#Ay@MR&8i639JG1=UIWy0t3Dbu^FK2)DF@D z*|LFewPI*$>boPbn*CncJ01L*U(4WAe}l0NQ?!08vrdh%+rK=}W85U$)3SA1IDy;! zM7Fv~wzYP4t-$s(%KqR)`+2v$j*7fb(c$1kZ2KBL#QQVUZwZ-1F-)U(A0ktZ5DXM!^vuDybICPx7}W9+U*y%yu7>_wT2I3 zLn4vb9ay^>_CMG5(2Fl9*13J#RDzxtuZ~y=R07*qoM6N<$ Eg7!VOX8-^I literal 0 HcmV?d00001 diff --git a/Assets/overlays/dark-squad.png b/Assets/overlays/dark-squad.png new file mode 100644 index 0000000000000000000000000000000000000000..fc1d420f0a00b185c637faae2fe2afbb340f1cf4 GIT binary patch literal 3095 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/death-juice.png b/Assets/overlays/death-juice.png new file mode 100644 index 0000000000000000000000000000000000000000..f85f5c3010eb4b1a99c744f83cdc9332e8b6dd9b GIT binary patch literal 1790 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00xFhL_t(|UhSJ}Y*a-QfV0;VJ|fX*G%;$bMpFne7{v!Mpdvmh#Au2S9#H{XVcXs9ZvD>8*~@PC*}c2> z?r!@fr!!~HnLBf4=Dy}`8^#&q1T^)GL?SUI5D3g49v+^KdKUQr`BUVNB0mR%!9T>W zZXmc2L9a$$L4HHe3qFUD*Q5?=qaLRApz}=xu^}Fh|862H0qXZ6>&b@nu(bi5ZbuH- zFxbrG=;5myI{FYYq!zZ1q6Lp0-`A zJhb(!Hd`Igr**b#-oYSrYV)peeLjW5;TbJ0Ej`@MCuxya^dT3~t~@`KjO%l$wY7DV z55WtQSqP76zGPgj0G6RV%^hR_e7R3E00Xo=9XX*zqsHwDxXrKN1=?<95IR&X30DI^ z<2Pv5PgZGK5^hg{f0%`HR5dUt@-owloQ+(JeS(yi3da+Ab)58MbCy%mxi$i~Ze;dyUFJm)1N~E*ZRDIC7Imliv zRC!-(iQ^K2O4}l1=|86CtZ-a;@%oyysC@@tpo1Z#s2?>DhQ=un({j}} z5U^lgegyKaH#w^s0$ihk9z#xZwcC}Wk4~R)#ZF@Ah^-@Oqmgw2Q_L-?zFA&gL4eS>Zvo}D#Tgq~Q z{Tfrb)*%)-_kWV0IQQ??Vi|yMq%0TMx2bDwLm(?OAbI6Y-5EM8<+;EvA5JU&+aE6; zg_BFUD-a08G%w`+Z6ChUx7Ajw99|5-Ecrt~@}V=8j1QtonEB-3EY`GQcrgHG)>+lf zMpGD&Cn(GKaRX(0u)U~i!CfM^crgG6G)>zlB*;Nz6&J{Ls9gm9KC*$lybml8AM|2> zGgQ5>oaI+xazP6t^4sFP5cDkkBBa7~T3p)@&>IpBsXYGX{H%>lo)AA(UwLryVue;7 zf|-IO|9fmF`MGLxplmVnr8tmAkSo0&o> glKeR1ct%6R|1vjB5p5icwEzGB07*qoM6N<$g7h&{Z~y=R literal 0 HcmV?d00001 diff --git a/Assets/overlays/decapitation.png b/Assets/overlays/decapitation.png new file mode 100644 index 0000000000000000000000000000000000000000..3b362d81a71f4393bd19e01b6bd9967a47087767 GIT binary patch literal 1512 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 ClR!xT literal 0 HcmV?d00001 diff --git a/Assets/overlays/dice-six-faces-six.png b/Assets/overlays/dice-six-faces-six.png new file mode 100644 index 0000000000000000000000000000000000000000..58123bac046eb19b207d6abdece370d12327fe79 GIT binary patch literal 1651 zcmV-(28{WMP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M?~FlXR{#y z00sL=L_t(|UhSJfXdGn}$J1o9Ni>*(0l``eHlXdnV$q9H3Yw;Zc#>j|f?zDQYU!m1 z#Yz!+X{%DH9t00!qcvVcX__2b)Ls;Osv;DzwF;IhNL&<%gAVJYwNkW zMlbxfFgrW@22zou<&65EzECY#_tLQ+G!*KSb#DQ&!y3aritjn%Tcei7Kx060=i<{L zsgqk8t@A>CV&`f;TR>7rd##Lt1071kjOGC9N~B1=4|yKBFlV#`C|0FXc|oyJi^$4y zxjcY=6w&0D2z$S3->$;%_sYp)==dKqGc&Of{1;5RvH2*nt{)bo+rq|R`=D}-tYhpo zv#Yocb^VfJYkPb9Xw(viL+npv8`V=$OIZ?j4EFK~imjG&D&BK_*c=BTu`+SD zBbsn>MLy+QF|4U7mg{h&h4Bu+J65Jb@b5_Uw5hovpYm<02UpIn0bta>wyF#4zp`p> zWcBII*?R<(tn~7im3flYrz>agB)G<^Ub5PI$mG+Tv-b#i)XG!{tn2dTNXwPY=G%)a zXYT;)CV16r?|iTu;{3bC)ZCCy`8G9(<+?l4!gwda+j06X(r!(OOixeuQ|ynly0D*{ z9L1;#ITn}e1ux?OxZ(&DgPHzcPCqRWzIW{vb9dhUmP2y*z9VhlNtXwdIP`pF}-Q(s|w z>~?qo8UUnGsqI;yk!cQqm6_mBx`LcRzCeDm<|T*N7cB?na>bf6k!b)3atV2cYA+8a z8<7VQT_QIiBav18A=bx=N$k~@!$z95*fB)=r8%Qo!9leJk+aAuGfRZ+TBWHg#Mouw z5@GwT%GJylQ`;nn!xEQ|#~A6Kttk<yXpQ|amH`Hf;c(sE^-9r3%>Q{lG!L#qaH z4FIE=WhExFy@#wmi^bx%Rt=KrD$s~{Pl4D2P>8Jd9-Xq{ym%2hdAQxNwgh{N?bK0^XS$O7l+cULNvk+!zBgVt0x$m1aK zMy95wHdxaf%8C4*?&|9LM!8yZDw!8V1i_{VqRWi#w$@NzJ-1&T;1 z?Ezv7BJLw#KHQLW;OHLYfos)yLG0Ts2j!C1`9x|OfJUM@09Lx;ywjqn79kEHuOjau zTA*A~6w_iW2j%iP^8epT<0P~wdXfpS>asXeip=VVVkj2X#AR{hr0l8?UJ({Difk7` zP<@#Zd@+K}{q-CK>wM~q5z94++7?9k;RR;dCy^OzN`$L}z6;nBX?0-_F}}2VBIHJBj#?;Mcz=`Q!DLCESezlR|nbndgN7rm&=n@m30 zX)b%$0PvLelvPvV5~TZt;H9cY`stKje|vG|?41O+(Xm0RSA_%%%oj%xuU|Lj^DV`Q zTB>8Y>Z8q6T!|7~kIlzIgFs^4h(1o-6t&caO^TsdrpK@xk6F&C#0CK8iJzF_?x4ZW1ZWtBMtwjso+e> x57$yWf-K9w&5{3Q9ro@$-=s;C>x`C`e*jP`W!~B!QP2PY002ovPDHLkV1hY-CN=;7 literal 0 HcmV?d00001 diff --git a/Assets/overlays/dice-six-faces-three.png b/Assets/overlays/dice-six-faces-three.png new file mode 100644 index 0000000000000000000000000000000000000000..910cd452dbc6474a40af4b0b864eaab095f92504 GIT binary patch literal 1222 zcmV;%1UdVOP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M?~FlXR{#y z00d4+L_t(|UhSJpNK{c6$9-IrM0$YHs#+vj6x5=~2x(E;YZ-=wMbIKz6g@V*mW6F9 zEFxM2Q9+TotbDaF!i-wfLZYxm?xMhoO3Jy`@AH0&cJJId1I?K^)BND$JLmX~`2U}W zcjn$HDo~)ne@(IGNJd6Rs>{pEH`A;thG5hUego+f(OFVbGB`eH3a|CX#>OrYzWgGW z5e=e+rl;~!qc6xSM3c&!Mrc`6SWSAviZ2O9@&oaJRP*R)Ix7MIR|ADT`1t~nN$3|OSu2)2w-y-NnvBTD|~ zo3dSVEH0e^^D$t*c4MKgl5{NS#pBWn5YBNqyI$LoAl@TxVAw((ip41d5LJP=ZcI2x z4s8dZXDV^V;wYWG2vb?Y6oiu$m}ArnfR$gA@pZ^Y_0^GE8qk({Y%?P5fgmh zKdIe}W5obwbQtmSDUA`H=XJ?zw3|_EtpK^tFuCVbA!h>VZP3dsRu92k#FhayEa_5h zr$lR)1ij2+#Q>J{+(aVLpxu;UK!dzSyBWpW7T|Pm;X0sPyGfB63~14A#<6L@N@i8w zz9uz6e|A%9gOSW*`w(m-o*`5&dneBXX*0HkW+WC2A#D@>UMKD6(ciu23*QvoY*lxl8+mxJaBOZWAB$$Ig+i0lmZu z_G}$-lsHZ7W*;xWghNES_wTZfu>pu{C)Fc3bc-4TMj5|MQ*K{5WrC3bh#ErVUJ3Gm{1Jf079`Q*ZOPLCF*D%bPGr`n=`lDN=r-kX)`6fu~|lny@#Jmm>z;n2ut~i4qL_J zytqo3{@$!(^oJry9x-i;GXe3Hggl&>*8TZx6EXl1k&l?-!7Ne-=fNF}*htxILcUnB zn2^ih0cwn&%*X~&+M-r~e9a^hSqWV2$+NmWbUzdFpznZOrT_o{07*qoM6N<$g8Z5+e*gdg literal 0 HcmV?d00001 diff --git a/Assets/overlays/dice-six-faces-two.png b/Assets/overlays/dice-six-faces-two.png new file mode 100644 index 0000000000000000000000000000000000000000..8381ab4fc28c98971e6c94aff77c807177dccf88 GIT binary patch literal 971 zcmV;+12p`JP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M?}yL*3X;( z00UD=L_t(|UhSJbXcR#hhI4xx4?|FkfR$P#prWN#5-c<(U@1Zn1;Iir6n`2)O9dO1 zL_{nEK_P;q6g(4)h@{arh!6{}6H=(C0du?Y`P@%Q+|Ar92zzro54?Ocleuv3yR(xG zyW8dQcuGx0YbJ|}ivzVSN5}2WEt(#+O}{s z8&MRUr^;$whc-2v&4ctOkZgXLaP(8&QUSF4ZjZl7zT&Ph4976^f%X#m(%s$tlKwHK zj4y-dtPiGk6$9-?X2C5MEG@npVO}oCyFwF*<|!rVg!%hVUfmnQW~qq0>D%c=B5bYEH!mHFt&p- z&AcPYNNZeM0dkSE9)t4ldV?Syp=;7(^G*Rdk|Ksca#Hb13iqyTY*!0CSU+Aq=N(Q4_!t<9BGv z?JK83unGWE4NRUCqdJrcA&>Szvg2pD`DP!0&`|hunpju)|L>!Ps&u% zYk#Z)z|===+LCvEVc6~gJ=(M-@BG5B3LuK2z1p;8kJh%wDu8OWdPr%AfCjVcFizZ&h0VO@h?poUyk5| t{ge^pn0)<@ps@sy0Nu3wUdvQ)&--O>O6002ovPDHLkV1oJwu@e9Q literal 0 HcmV?d00001 diff --git a/Assets/overlays/dice-twenty-faces-one.png b/Assets/overlays/dice-twenty-faces-one.png new file mode 100644 index 0000000000000000000000000000000000000000..3839115cfa3c36a304aa57b0c3b09db19a3170f4 GIT binary patch literal 3153 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/dolmen.png b/Assets/overlays/dolmen.png new file mode 100644 index 0000000000000000000000000000000000000000..08b5b9b66889f20d2d34e89bd3a48b4682903378 GIT binary patch literal 2148 zcmV-q2%GnbP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00-6v_3Hh>y6c|zBVGno6AcGv=G?_kT=`-_p{upYXw^ zrlx<<1*C-Z5bvQe)jJevL)wYU1y4jyMl>hKAmfmU$Z6zH;&*2%jMncmgStCWAJYG~ z>GLaY>R}QMKm{7aL+IsnuGvjJdZC|vs4d7QWFvk49MQ$89jrDL`C648&CthP$g9Zh z$aw318PeME+FQ_@kd>C~5a|IFTu9w(nKvg`QW?^FP;&bM;Uc<-m7TbkRuwN0*M6+B zP8#u|(v_w>E2FZHpwA^e5&F25vMZ1cNUtTAp|10gMFba+Ki1Mz?ncJ7QSks27{!Xa z9vupeK7nen;+fLf**TW_yWE!2L3znGWDPQpqzULdkWUb|P!*&vv?l$KaW%5t%K0Gu z5OSLp%?0XTWX#sD8X1t72p@|(#NeuF|fkQ_Cb z7w$teh{^$Z(oqrKL!RP$(SgOWlF(g%%G;2K2`;08$ep5Is9Srr4pL5MH5d#ot&TgI z^y&d=Fxq`GC3bLl!}X|_X;`PWP&5|u_lI=a3EO~nD_km-I@;RWbmcUdF47u?xS z5qumYeovnlQuhMVbgcGd9eHce0TQn+73#RU6gh}E1G7PSVM%=_tqh=lkD+d&4^xmH z;_ss8ySXm(^#Kg9%A&^(4EAz_Ltgj&mZY@6Hcr|-mfaZC)kI~d77B%_xbrN+^O3;O zvp=9OZ5-IP(*6O$&c4n;YK#V44P~-9zfjQ(tFsJg_gQwoLc1%~K1O)jl4O+YlvWL8 z=UI^ewcg!LH(kjMru&Uzu{aI&AOq`TzCY=vItIANf<7p7z=8p?Fu+xGB$J00X<(2; zTU%S7XHad(1{Sv;ElXT%+6TYUGl5VVHh^{HT8rimgIP*@GcCH-v`451K%@a`f-Aj~ z4g?@w_X+(1ZGB*E{(vfPckA< z)9GK-|1Qc#z8pzy09n|AQOq@+ zEA*rCMaP|{We`0{4nX!qZ zZwxAmeK<;f38ly0xuN=<#wy?#yo9#@vSesyY zL0ag_??L{j_VZ9utpS|8rZC5bTQrWm*MY!odCbc15qkzmWdQEslNLY+44(IPSkH}D z;|73K2Ea=uVt}aASQh9ZY_0U40gT+H0miMz0I}O(9tOzm?l9&g8b@Ouz$&U&W9PWB zR9tF05Bh%!u+L7z@@YLqS7{ion!0?A)Z+n-O@Wq{mRj83W0>iziF`Wkf$%8GjV7Y0JD@=!y+5j}JqwX(GN-~)nfVHTdZ8rAF6J_2(z2wHq zTxmL#T0G!0L@zrM(K=wkEE#P&6fVwg+FguvTap9uvoOr*77Y+<0Dd@;3iLgX&<6$j zz#)-5ra-AwO8VY!2_Etf+GhYm-#3Ml? zGr)8%X6QE$X{UfwIYvn30g%TcsJFavlnp>Xs~1AuGKX%5Nd}l?+B<=zH9+QT03_Y_ zm#;A161EVAPJ<)^=$jznoxqNy2P6?U1w`mh5NiM|x!r=J3G36iBen)W*q|y&GQdp6 z;Cq)KVhzCD`Q3CgKh`mHr{XEd!vIOfuQY%@=J3H7^d-q97A+HN09H=V15|<5fz56# zkvt5bkFq17f0e6z;G<~4cmnG{tO3{t9S;y#PwT*!=p>!-=D}Ua3fg}k@hytP0|ub4TU1tI^ln7E*l&t^q<)LTk6ZBw=j%?^1HG2k z*;?mw-FoV?*T2dC8T}nP?USRrp+D-ozFgNoNa~C-l6K!je8wkVhSC2r1$Ko&2088- aGUR{Uj|?Q}g9`5e0000Y#`vO z%j?dd#bv=@awR0Dz3ui=4=t`DZjBWU$_br+&+*H;`1#~y|DS#F&s8nsY5T67>aoph z5jbSrc&mHLrO79cE;E)De)i!tu|3;5ZIs>klK(`;=4c=I zGIu3gw>#efmSq!<@BHw-CyX&VXS?y?$ifMX+g=zK|C{x(IhSQsLa&5n&&`DuT|2Y_ z@?!5wiv6$RD0-uj;J2qlzs-W>{o7yMZ_I-4o{Nr7=vjHv=*8*4)AdfrHL7p7e2ni) zdRV;sIlE~>9}e%peEa6N$C_FEYAxkmd5xXZ{^)h(bp|o3eeb=X=OsV+b$r7wb<_Jy ePCJ%m?qiI$W(|?+j|Ijd1B0ilpUXO@geCy{CDRfB literal 0 HcmV?d00001 diff --git a/Assets/overlays/doorway.png b/Assets/overlays/doorway.png new file mode 100644 index 0000000000000000000000000000000000000000..7289e3fa684e3894b0aa89ca07368d39c13010e4 GIT binary patch literal 1704 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 Y1Evs=J}6&#hyVZp07*qoM6N<$f*{6oy8r+H literal 0 HcmV?d00001 diff --git a/Assets/overlays/droplets.png b/Assets/overlays/droplets.png new file mode 100644 index 0000000000000000000000000000000000000000..0d14a58efefaa89a910256ee111c71cc3d445e1e GIT binary patch literal 2584 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/earth-spit.png b/Assets/overlays/earth-spit.png new file mode 100644 index 0000000000000000000000000000000000000000..0770ae01aaf7e86f6392edb6081ade0f67cd6cd4 GIT binary patch literal 1891 zcmV-p2b}ncP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Qg36tpn z00!$xL_t(|UhSHDh*d=#$9MPMRoB`cMiQ2!q?uy$Fs-CO%?b+39!6kF77>^|lp@Oh zF*AZd)U^IkdMTMj30hc~W+h@N*yba$B9$y%)6I2t-Iv?vJLh+gdp-BwJ?B26$N9jQ znfc9c9%s&+b7tn=vY42dn3$NDn3$NDn3$NDn3$NDn3$NDn3y7P;>3xb=s`5pOnE{1 zDedj;BPMzYE(UhAECjP zl}5IU#9mIBRj99-!a>2)DKrV`Ld0HFZP`9*01YAUdGsCeG}_wQcA9HmQ0GFc%0apn zEkfs;i-UHyVS5=3Fq0294O|_%!%Uf>evQ`k=yi0&Ytn=C1ap&LlJqDv5AF6mGDH3X zD;62bYUZ_ARcT;9iZmTgVv1DE=tNQz35ys%~j% zxeK4g#1C3l7{*!?k)f@nR!3IoOKodw>!XB=%;bYjcYQvZY9^cK3JY^mUS57N>SoC(Y@*y@i$`T9WkdB( z;G48)BtkckC#x-t1b66KE@+G;OG-%xfM@eFi$-OZg(atC1Hhwpq_VPdqa{N_xzXJH zk(MkurJMolxR4f$hlT;r=j#u>tISj|JW}lz4Nz{O`wGzEe5Y&xF5vNsii&xbj11)y z=p3Rw(YYDIR9uqZL9`3~k_veQ_a~FdyNN%*wYfEcpxzq#cDW@zGyr524eA?cRsZeK zycTr#pj}>X(!n0>GZ+=x_>~d<-jYS5si|o&o$pWmXCZ&~o(g&Mx#P>wg=Wf1DF#5_ z{pnt`cyQqpd8yWLQQBM7agoQdX@9Z>eadwAm+CN${F&Hm2%F888=MPz1Sl`wYG`OU z&#EjMEWz)j?oL;F_$)_yC-`9Qf=#Q+iD))jgVtJhabAKnqB}DMt+#X~dW`5ebO7y7 z37_A|t0h!=AK{;bS)pGy60F3pt7pj#b*nw~WjPA}7197uI1-fEjdWPyFGGosz_!gf zgaF@1tY`qTb@%pqp3$J39+532rQNoI=d@uA4a(-dJ zcOR;&IyJn9u~^fb3tj#WNcX%HUj@P zf_s^DI{DETq$uP)0Cd6)0N?0gbS~#73g1KMb2>kVVelB1!;W$EfB24+8&}_<%Kt0L370p7L zb*cAMZgA{$25_ei;HQ_7J0B#hAgy(IPUM5snHNdA!5~!GCC;G(*nUH43l`E^V>FqI zk8J1@G#O=_X}IYK|4O7EYuph&p+5tBFlHS9^6JqHq|G#JJmi0kL4H;x@U=I^I5 zC$LST;+($(WkdC;9tQ6jGiAiuUV;X>hC4vEX3pE5=Si?FG8Z3gUC~WwF8bMA9i%f4 z01_V}|1<}GHLC6C4zGB0D65MafI=^6@zq_`s`Co#ii0d|kk)!$9;8+OdJQh&rRJIj z_JQb0-1QUMW;36JOnpj*S<=Bbel&Od8`nw!Q14Q79}4|TPYTM2mFODlmImQ$(%U_c zAmr^r3(zenu-VFFO9O|YNISlQp&p?%LBTsZ>R8Q9asLw_*@v{w7IK1*eneft?0A^) z0(XJgz(LdG0~CHw+X+;45FNK2OV(2)3g8>38Tw9p(IE@s5S6|4kP!=@U}g3%6Fd9b*6h002ovPDHLkV1nr!hS~rC literal 0 HcmV?d00001 diff --git a/Assets/overlays/earwig.png b/Assets/overlays/earwig.png new file mode 100644 index 0000000000000000000000000000000000000000..01099873f982b77bebbde5c536540c9a060bfb54 GIT binary patch literal 2548 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 IM6N<$f-0r|s{jB1 literal 0 HcmV?d00001 diff --git a/Assets/overlays/evil-minion.png b/Assets/overlays/evil-minion.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcbb83e97677084aea44035727a573348057e13 GIT binary patch literal 2149 zcmV-r2%7haP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00-?!L_t(|UhSKEh!s^F$M@dd&D6}dmD>79i^xhrFf+>@7X48{R4AcTh)DlLnHi*^ zME;XRg;ts%n$bUEP?lmLQQ1R$M3V0p;S0^z=B|6&yKbM~%y-9~ow?Whn7MZ)Kk(zs z`Tc(9cYf#W+?g|HW-G36g~GUS;X*%TWOH+KLaP5441O|$Z>BtgEJhxu+DYb6uwRYe ztU@P^wof3VRE-}JtxBa*!zc$Ly=(w7Su$@?_kpe+`5GA}HxJA<`0tSUQsoV8?W{Y8 zJRnv4(AjuozdJ-{kc~}EO=l?UqzZs-klXqq=suLKsN`wC6*-0UmnweftTXa1l6FRz z1$?%vnFqQ%kS4kGlDZ(6{N)yecuS=!iloY{B$LTH$E-{5*UKL1ioMFMvMbd}h9gxS#Fglxg)L4CB$rG<_sDF+|uSINZ( z`o(hb;J3UP{R>DBq$BlrP@gdy^`ppi4y!1~AaJb`%E0{+q|>U->%a)FvfPEHGesycP z!Gh*2MNd1X{a+M=4;?x*h~pim!~QUfuc6f6qZ-??w~z@KqOvvXNI0$IoMCX?baFxgZSVSoh)-+(C&ajSd8_Y_G?wO`aWd2-3lq!s!91F z8Q(3CdK1z|=DeV}w?xhc@wZZ3uV#@F#ZO=pzt!V9&KU;PnL%|>H7ooChU2@PyTBC6 z^6fxb(n#A|;2fEAh8X>k&1#<)v|En^F2u1zrvs3^%EJTQ{c_0({6`{()x02RZ%gFY zkt&6aA1+4UIK8(4{R+8U65O9A`HVYB`9dt)9g6>vn7(X3FLXBueXZOwf?EQ=Sx9l~ z;1Db?WIoba-9-=mWSao{i)OqqVY9X?9OoFJkNwDabsIedU!%SPVB5nLdM0IWxjRt5 z4*6MbMMEt6YoAv&05+3lh_k|s6ygu$_wH>+g@N7H@1Juxj?y+l54x6UAl|pgwM_OT z%CC@=Og_ltIJSvOJvs<_Qhiu5A0u;H>so`pWf$0k#MYp{7ip9#FK9PSsW_nOj_!G6 zEwKYJ(c3$UE^;pp0=0b#94>tqWIB@Z)<$y2uupIT0mmz4${E_&gl1d~*4Ebc!pC=~ zqThuw7Z1TlDXt}Rh{AW_L)U>*b1J3t2y1X`*nXgI?~eL7#~}|G%nxcF3jMrnoypz$ z{(_=X=HemXvu+O72&WCpU-^>U%U1Bw1FK+s2#_mNe|wNe)hxppE> zU~4T5{JhN;j%`W4OC}%ak5CMhYx{?U=ewzA2frC=Vr|w*?F0Qk$OySz9+2>8<$oy# zn?I%PBZe-gQ6F`J=1C#@0g*t?c4t`R)-r?N)J6xV!p=dpuIz~AGpIQ4BFeLI^}yOSPUfp zraO${AkJRITNGUukg%PmkwH9rL0Y4e$1%XH7Vj<@4y1KfIujAVVB>4yux@m#l zzV~y!_{s)887B|hE+(O`x@%vMTwfcca`ixWmZ!IQl)aG-NVWmmYq2|#jN5U<+KIjW z-2%z2o13BwNuEUPLg?EYU;wta5DNa@@|LP?v;F2;{Gi`X5zDKyq98H*l*NJLH>CD~ z{zth4z_wFv4yY21jg3#C4?GQ`TPC->h<%1+1LwpZ8)Fc1Aov@vlXy035 z`mt}2ofo%dp`oF{7Cg>BKD1$+Tq1+P-ly0;m=yc2uv%`VgM{o=`JZkY7eTj;BJ%J1 z(&@B)DHaNS&X!wNB29`;M<9W(#<>vM$CSUQ8X1i9A^zI8s_KJ9SBhc@x8l}!p(|X$ bM@7Yd?sJiZG!g&g00000NkvXXu0mjfGxZLl literal 0 HcmV?d00001 diff --git a/Assets/overlays/fangs.png b/Assets/overlays/fangs.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c624ce7b0d081631af95dc47aaa0a35b6e87ab GIT binary patch literal 2105 zcmV-92*&q`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00+TIL_t(|UhSG|j9pU{$LFP{GiasNqNsYbMMG(Y#+!r?z7i$ji&np(X)B?=G~pXc zL?qtviil8Al_p*h+7eNZ@2ZMwORHmMIx~0bxAys;J!jvu&%JldOy@T4FIltBT5F%Z z*IskZJ^MVG8Z>Coph1KGFU`^cgM)+Tpl(B^BA+xjH@}GtSnP1&;K74!$j!)An7hdT z)s~i)ACqVW*kK6;=tq07zv=1eIZaLK9#THda!#^O(43a2NgNu?FQ0r0{_V(#YU;qg z1$h8DU#>$2V_u-KZA2@JezMAHt!E0(8rBo`dS5tSIASH#Y^Y@XN z3J2gnnkKC>t3ulr_UV)vU}GTb-JrmB2{~KgCUX2hp(wO{RZT;PwGsR~X;zU1)}FR2 zWqa`LLN0I}ivIroEAjOsf0Eo<^l=L1po^)*A4T>ceaK}BIfyU7x7!Vt0pALXqZi6m z2yOPE^8XA1XD3Z6L%Rpn{t>wX@c)Dy={g0r-&V+h{ReV|!k)gqzRU6NR5J(mTMAo0 zMl9j~jZ>woakBJI=>UFhXATSu%#&%HF6|(0N5K2!F*otJ z#OJiOwyq~OO|FzPq;0=>$SE=d*gwtXBJ+taLT@N`ECCU=?m_Yx_;6v0vK5 zL^^49mrP>`m#Ek|-zDAD-QE4W^(`}iebZdh+^XT{nk_(^bTz)SKTKjX`RsO{kdH{{ zS8W@veT3|~BD%()f4^^MXXg&=k7ar+2XfgWvuLbx{9LmII3Qh(t@ejOE$P>7JB35h zd@B>n^PzMAr^!3oG~SgCV2og2>=jJ7UuMc{%EfTG)j*&05F~#Coma#rh-81@W+T~4 z;c|sM)*cCdxv{g8ci>y6utWQ_E9}9)JZa%B%XSHzt&khbdf5cn4);bPeF zCpGurb883m<8tL7=C2rR|BRIX*jbzDh+n|iJ__X^_PE;QuIc!qSBf&+r96Ngrz=

`-`
` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer / 2 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\n$input-height-inner-half: calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n\n$input-height: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\n$input-height-sm: calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\n$input-height-lg: calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default;\n$custom-switch-indicator-size: calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer / 2 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n"]} \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css new file mode 100644 index 0000000..c804b3b --- /dev/null +++ b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css @@ -0,0 +1,8 @@ +/*! + * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) + */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} +/*# sourceMappingURL=bootstrap-reboot.min.css.map */ \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map new file mode 100644 index 0000000..73f4a19 --- /dev/null +++ b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap-reboot.scss","../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","../../scss/vendor/_rfs.scss","bootstrap-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n"]} \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap.css b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap.css new file mode 100644 index 0000000..8f47589 --- /dev/null +++ b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap.css @@ -0,0 +1,10038 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #007bff; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #dc3545; + --orange: #fd7e14; + --yellow: #ffc107; + --green: #28a745; + --teal: #20c997; + --cyan: #17a2b8; + --white: #fff; + --gray: #6c757d; + --gray-dark: #343a40; + --primary: #007bff; + --secondary: #6c757d; + --success: #28a745; + --info: #17a2b8; + --warning: #ffc107; + --danger: #dc3545; + --light: #f8f9fa; + --dark: #343a40; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; +} + +[tabindex="-1"]:focus { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +a { + color: #007bff; + text-decoration: none; + background-color: transparent; +} + +a:hover { + color: #0056b3; + text-decoration: underline; +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; +} + +a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; +} + +a:not([href]):not([tabindex]):focus { + outline: 0; +} + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +select { + word-wrap: normal; +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h1, .h1 { + font-size: 2.5rem; +} + +h2, .h2 { + font-size: 2rem; +} + +h3, .h3 { + font-size: 1.75rem; +} + +h4, .h4 { + font-size: 1.5rem; +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} + +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #6c757d; +} + +.blockquote-footer::before { + content: "\2014\00A0"; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #6c757d; +} + +code { + font-size: 87.5%; + color: #e83e8c; + word-break: break-word; +} + +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #fff; + background-color: #212529; + border-radius: 0.2rem; +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; +} + +pre { + display: block; + font-size: 87.5%; + color: #212529; +} + +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +.container-fluid { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} + +.no-gutters > .col, +.no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; +} + +.col-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; +} + +.col-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.col-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; +} + +.col-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; +} + +.col-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; +} + +.col-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; +} + +.col-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; +} + +.col-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + -ms-flex-order: -1; + order: -1; +} + +.order-last { + -ms-flex-order: 13; + order: 13; +} + +.order-0 { + -ms-flex-order: 0; + order: 0; +} + +.order-1 { + -ms-flex-order: 1; + order: 1; +} + +.order-2 { + -ms-flex-order: 2; + order: 2; +} + +.order-3 { + -ms-flex-order: 3; + order: 3; +} + +.order-4 { + -ms-flex-order: 4; + order: 4; +} + +.order-5 { + -ms-flex-order: 5; + order: 5; +} + +.order-6 { + -ms-flex-order: 6; + order: 6; +} + +.order-7 { + -ms-flex-order: 7; + order: 7; +} + +.order-8 { + -ms-flex-order: 8; + order: 8; +} + +.order-9 { + -ms-flex-order: 9; + order: 9; +} + +.order-10 { + -ms-flex-order: 10; + order: 10; +} + +.order-11 { + -ms-flex-order: 11; + order: 11; +} + +.order-12 { + -ms-flex-order: 12; + order: 12; +} + +.offset-1 { + margin-left: 8.333333%; +} + +.offset-2 { + margin-left: 16.666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.333333%; +} + +.offset-5 { + margin-left: 41.666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.333333%; +} + +.offset-8 { + margin-left: 66.666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.333333%; +} + +.offset-11 { + margin-left: 91.666667%; +} + +@media (min-width: 576px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-sm-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-sm-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-sm-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-sm-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-sm-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-sm-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-sm-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-sm-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-sm-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-sm-first { + -ms-flex-order: -1; + order: -1; + } + .order-sm-last { + -ms-flex-order: 13; + order: 13; + } + .order-sm-0 { + -ms-flex-order: 0; + order: 0; + } + .order-sm-1 { + -ms-flex-order: 1; + order: 1; + } + .order-sm-2 { + -ms-flex-order: 2; + order: 2; + } + .order-sm-3 { + -ms-flex-order: 3; + order: 3; + } + .order-sm-4 { + -ms-flex-order: 4; + order: 4; + } + .order-sm-5 { + -ms-flex-order: 5; + order: 5; + } + .order-sm-6 { + -ms-flex-order: 6; + order: 6; + } + .order-sm-7 { + -ms-flex-order: 7; + order: 7; + } + .order-sm-8 { + -ms-flex-order: 8; + order: 8; + } + .order-sm-9 { + -ms-flex-order: 9; + order: 9; + } + .order-sm-10 { + -ms-flex-order: 10; + order: 10; + } + .order-sm-11 { + -ms-flex-order: 11; + order: 11; + } + .order-sm-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.333333%; + } + .offset-sm-2 { + margin-left: 16.666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.333333%; + } + .offset-sm-5 { + margin-left: 41.666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.333333%; + } + .offset-sm-8 { + margin-left: 66.666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.333333%; + } + .offset-sm-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 768px) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-md-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-md-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-md-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-md-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-md-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-md-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-md-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-md-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-md-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-md-first { + -ms-flex-order: -1; + order: -1; + } + .order-md-last { + -ms-flex-order: 13; + order: 13; + } + .order-md-0 { + -ms-flex-order: 0; + order: 0; + } + .order-md-1 { + -ms-flex-order: 1; + order: 1; + } + .order-md-2 { + -ms-flex-order: 2; + order: 2; + } + .order-md-3 { + -ms-flex-order: 3; + order: 3; + } + .order-md-4 { + -ms-flex-order: 4; + order: 4; + } + .order-md-5 { + -ms-flex-order: 5; + order: 5; + } + .order-md-6 { + -ms-flex-order: 6; + order: 6; + } + .order-md-7 { + -ms-flex-order: 7; + order: 7; + } + .order-md-8 { + -ms-flex-order: 8; + order: 8; + } + .order-md-9 { + -ms-flex-order: 9; + order: 9; + } + .order-md-10 { + -ms-flex-order: 10; + order: 10; + } + .order-md-11 { + -ms-flex-order: 11; + order: 11; + } + .order-md-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.333333%; + } + .offset-md-2 { + margin-left: 16.666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.333333%; + } + .offset-md-5 { + margin-left: 41.666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.333333%; + } + .offset-md-8 { + margin-left: 66.666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.333333%; + } + .offset-md-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 992px) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-lg-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-lg-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-lg-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-lg-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-lg-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-lg-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-lg-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-lg-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-lg-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-lg-first { + -ms-flex-order: -1; + order: -1; + } + .order-lg-last { + -ms-flex-order: 13; + order: 13; + } + .order-lg-0 { + -ms-flex-order: 0; + order: 0; + } + .order-lg-1 { + -ms-flex-order: 1; + order: 1; + } + .order-lg-2 { + -ms-flex-order: 2; + order: 2; + } + .order-lg-3 { + -ms-flex-order: 3; + order: 3; + } + .order-lg-4 { + -ms-flex-order: 4; + order: 4; + } + .order-lg-5 { + -ms-flex-order: 5; + order: 5; + } + .order-lg-6 { + -ms-flex-order: 6; + order: 6; + } + .order-lg-7 { + -ms-flex-order: 7; + order: 7; + } + .order-lg-8 { + -ms-flex-order: 8; + order: 8; + } + .order-lg-9 { + -ms-flex-order: 9; + order: 9; + } + .order-lg-10 { + -ms-flex-order: 10; + order: 10; + } + .order-lg-11 { + -ms-flex-order: 11; + order: 11; + } + .order-lg-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.333333%; + } + .offset-lg-2 { + margin-left: 16.666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.333333%; + } + .offset-lg-5 { + margin-left: 41.666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.333333%; + } + .offset-lg-8 { + margin-left: 66.666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.333333%; + } + .offset-lg-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 1200px) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-xl-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-xl-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-xl-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-xl-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-xl-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-xl-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-xl-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-xl-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-xl-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-xl-first { + -ms-flex-order: -1; + order: -1; + } + .order-xl-last { + -ms-flex-order: 13; + order: 13; + } + .order-xl-0 { + -ms-flex-order: 0; + order: 0; + } + .order-xl-1 { + -ms-flex-order: 1; + order: 1; + } + .order-xl-2 { + -ms-flex-order: 2; + order: 2; + } + .order-xl-3 { + -ms-flex-order: 3; + order: 3; + } + .order-xl-4 { + -ms-flex-order: 4; + order: 4; + } + .order-xl-5 { + -ms-flex-order: 5; + order: 5; + } + .order-xl-6 { + -ms-flex-order: 6; + order: 6; + } + .order-xl-7 { + -ms-flex-order: 7; + order: 7; + } + .order-xl-8 { + -ms-flex-order: 8; + order: 8; + } + .order-xl-9 { + -ms-flex-order: 9; + order: 9; + } + .order-xl-10 { + -ms-flex-order: 10; + order: 10; + } + .order-xl-11 { + -ms-flex-order: 11; + order: 11; + } + .order-xl-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.333333%; + } + .offset-xl-2 { + margin-left: 16.666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.333333%; + } + .offset-xl-5 { + margin-left: 41.666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.333333%; + } + .offset-xl-8 { + margin-left: 66.666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.333333%; + } + .offset-xl-11 { + margin-left: 91.666667%; + } +} + +.table { + width: 100%; + margin-bottom: 1rem; + color: #212529; +} + +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #dee2e6; +} + +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #dee2e6; +} + +.table tbody + tbody { + border-top: 2px solid #dee2e6; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #dee2e6; +} + +.table-bordered th, +.table-bordered td { + border: 1px solid #dee2e6; +} + +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + color: #212529; + background-color: rgba(0, 0, 0, 0.075); +} + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #b8daff; +} + +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #7abaff; +} + +.table-hover .table-primary:hover { + background-color: #9fcdff; +} + +.table-hover .table-primary:hover > td, +.table-hover .table-primary:hover > th { + background-color: #9fcdff; +} + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #d6d8db; +} + +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #b3b7bb; +} + +.table-hover .table-secondary:hover { + background-color: #c8cbcf; +} + +.table-hover .table-secondary:hover > td, +.table-hover .table-secondary:hover > th { + background-color: #c8cbcf; +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #c3e6cb; +} + +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #8fd19e; +} + +.table-hover .table-success:hover { + background-color: #b1dfbb; +} + +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #b1dfbb; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #bee5eb; +} + +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #86cfda; +} + +.table-hover .table-info:hover { + background-color: #abdde5; +} + +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #abdde5; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #ffeeba; +} + +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #ffdf7e; +} + +.table-hover .table-warning:hover { + background-color: #ffe8a1; +} + +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #ffe8a1; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #f5c6cb; +} + +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #ed969e; +} + +.table-hover .table-danger:hover { + background-color: #f1b0b7; +} + +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #f1b0b7; +} + +.table-light, +.table-light > th, +.table-light > td { + background-color: #fdfdfe; +} + +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #fbfcfc; +} + +.table-hover .table-light:hover { + background-color: #ececf6; +} + +.table-hover .table-light:hover > td, +.table-hover .table-light:hover > th { + background-color: #ececf6; +} + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #c6c8ca; +} + +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #95999c; +} + +.table-hover .table-dark:hover { + background-color: #b9bbbe; +} + +.table-hover .table-dark:hover > td, +.table-hover .table-dark:hover > th { + background-color: #b9bbbe; +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table .thead-dark th { + color: #fff; + background-color: #343a40; + border-color: #454d55; +} + +.table .thead-light th { + color: #495057; + background-color: #e9ecef; + border-color: #dee2e6; +} + +.table-dark { + color: #fff; + background-color: #343a40; +} + +.table-dark th, +.table-dark td, +.table-dark thead th { + border-color: #454d55; +} + +.table-dark.table-bordered { + border: 0; +} + +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); +} + +.table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255, 255, 255, 0.075); +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-sm > .table-bordered { + border: 0; + } +} + +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-md > .table-bordered { + border: 0; + } +} + +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-lg > .table-bordered { + border: 0; + } +} + +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-xl > .table-bordered { + border: 0; + } +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +.table-responsive > .table-bordered { + border: 0; +} + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} + +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.form-control::-webkit-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control:-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} + +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} + +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.form-control-lg { + height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} + +.form-row > .col, +.form-row > [class*="col-"] { + padding-right: 5px; + padding-left: 5px; +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; +} + +.form-check-input:disabled ~ .form-check-label { + color: #6c757d; +} + +.form-check-label { + margin-bottom: 0; +} + +.form-check-inline { + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-align: center; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; +} + +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #28a745; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(40, 167, 69, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #28a745; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated .form-control:valid ~ .valid-feedback, +.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, +.form-control.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #28a745; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated .custom-select:valid ~ .valid-feedback, +.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, +.custom-select.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control-file:valid ~ .valid-feedback, +.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback, +.form-control-file.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #28a745; +} + +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #28a745; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #28a745; +} + +.was-validated .custom-control-input:valid ~ .valid-feedback, +.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, +.custom-control-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #34ce57; + background-color: #34ce57; +} + +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #28a745; +} + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #28a745; +} + +.was-validated .custom-file-input:valid ~ .valid-feedback, +.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, +.custom-file-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated .form-control:invalid ~ .invalid-feedback, +.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, +.form-control.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #dc3545; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated .custom-select:invalid ~ .invalid-feedback, +.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, +.custom-select.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control-file:invalid ~ .invalid-feedback, +.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback, +.form-control-file.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #dc3545; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #dc3545; +} + +.was-validated .custom-control-input:invalid ~ .invalid-feedback, +.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, +.custom-control-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #e4606d; + background-color: #e4606d; +} + +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #dc3545; +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #dc3545; +} + +.was-validated .custom-file-input:invalid ~ .invalid-feedback, +.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, +.custom-file-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.form-inline { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -ms-flex-align: center; + align-items: center; +} + +.form-inline .form-check { + width: 100%; +} + +@media (min-width: 576px) { + .form-inline label { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: -ms-flexbox; + display: flex; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -ms-flex-align: center; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-plaintext { + display: inline-block; + } + .form-inline .input-group, + .form-inline .custom-select { + width: auto; + } + .form-inline .form-check { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + width: auto; + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + -ms-flex-negative: 0; + flex-shrink: 0; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + } + .form-inline .custom-control-label { + margin-bottom: 0; + } +} + +.btn { + display: inline-block; + font-weight: 400; + color: #212529; + text-align: center; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} + +.btn:hover { + color: #212529; + text-decoration: none; +} + +.btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.btn.disabled, .btn:disabled { + opacity: 0.65; +} + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + +.btn-primary { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-primary:hover { + color: #fff; + background-color: #0069d9; + border-color: #0062cc; +} + +.btn-primary:focus, .btn-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); +} + +.btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, +.show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0062cc; + border-color: #005cbf; +} + +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); +} + +.btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-secondary:hover { + color: #fff; + background-color: #5a6268; + border-color: #545b62; +} + +.btn-secondary:focus, .btn-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); +} + +.btn-secondary.disabled, .btn-secondary:disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, +.show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #545b62; + border-color: #4e555b; +} + +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); +} + +.btn-success { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:hover { + color: #fff; + background-color: #218838; + border-color: #1e7e34; +} + +.btn-success:focus, .btn-success.focus { + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); +} + +.btn-success.disabled, .btn-success:disabled { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, +.show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #1e7e34; + border-color: #1c7430; +} + +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); +} + +.btn-info { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:hover { + color: #fff; + background-color: #138496; + border-color: #117a8b; +} + +.btn-info:focus, .btn-info.focus { + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); +} + +.btn-info.disabled, .btn-info:disabled { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, +.show > .btn-info.dropdown-toggle { + color: #fff; + background-color: #117a8b; + border-color: #10707f; +} + +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); +} + +.btn-warning { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:hover { + color: #212529; + background-color: #e0a800; + border-color: #d39e00; +} + +.btn-warning:focus, .btn-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); +} + +.btn-warning.disabled, .btn-warning:disabled { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, +.show > .btn-warning.dropdown-toggle { + color: #212529; + background-color: #d39e00; + border-color: #c69500; +} + +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:hover { + color: #fff; + background-color: #c82333; + border-color: #bd2130; +} + +.btn-danger:focus, .btn-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); +} + +.btn-danger.disabled, .btn-danger:disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, +.show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #bd2130; + border-color: #b21f2d; +} + +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); +} + +.btn-light { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:hover { + color: #212529; + background-color: #e2e6ea; + border-color: #dae0e5; +} + +.btn-light:focus, .btn-light.focus { + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); +} + +.btn-light.disabled, .btn-light:disabled { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, +.show > .btn-light.dropdown-toggle { + color: #212529; + background-color: #dae0e5; + border-color: #d3d9df; +} + +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); +} + +.btn-dark { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:hover { + color: #fff; + background-color: #23272b; + border-color: #1d2124; +} + +.btn-dark:focus, .btn-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); +} + +.btn-dark.disabled, .btn-dark:disabled { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, +.show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1d2124; + border-color: #171a1d; +} + +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); +} + +.btn-outline-primary { + color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #007bff; + background-color: transparent; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, +.show > .btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.btn-outline-secondary { + color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #6c757d; + background-color: transparent; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, +.show > .btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.btn-outline-success { + color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #28a745; + background-color: transparent; +} + +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, +.show > .btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-info { + color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:hover { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #17a2b8; + background-color: transparent; +} + +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, +.show > .btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-warning { + color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:hover { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, +.show > .btn-outline-warning.dropdown-toggle { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-danger { + color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, +.show > .btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:hover { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, +.show > .btn-outline-light.dropdown-toggle { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-dark { + color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #343a40; + background-color: transparent; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, +.show > .btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-link { + font-weight: 400; + color: #007bff; + text-decoration: none; +} + +.btn-link:hover { + color: #0056b3; + text-decoration: underline; +} + +.btn-link:focus, .btn-link.focus { + text-decoration: underline; + box-shadow: none; +} + +.btn-link:disabled, .btn-link.disabled { + color: #6c757d; + pointer-events: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.btn-block { + display: block; + width: 100%; +} + +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + transition: opacity 0.15s linear; +} + +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} + +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} + +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} + +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.dropdown-menu-left { + right: auto; + left: 0; +} + +.dropdown-menu-right { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; + } + .dropdown-menu-sm-right { + right: 0; + left: auto; + } +} + +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; + } + .dropdown-menu-md-right { + right: 0; + left: auto; + } +} + +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; + } + .dropdown-menu-lg-right { + right: 0; + left: auto; + } +} + +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; + } + .dropdown-menu-xl-right { + right: 0; + left: auto; + } +} + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} + +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} + +.dropright .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-toggle::after { + vertical-align: 0; +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} + +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} + +.dropleft .dropdown-toggle::after { + display: none; +} + +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] { + right: auto; + bottom: auto; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; +} + +.dropdown-item:hover, .dropdown-item:focus { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa; +} + +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #007bff; +} + +.dropdown-item.disabled, .dropdown-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #212529; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; +} + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 1; +} + +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} + +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} + +.dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after, +.dropright .dropdown-toggle-split::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-pack: center; + justify-content: center; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} + +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} + +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; +} + +.btn-group-toggle > .btn input[type="radio"], +.btn-group-toggle > .btn input[type="checkbox"], +.btn-group-toggle > .btn-group > .btn input[type="radio"], +.btn-group-toggle > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: stretch; + align-items: stretch; + width: 100%; +} + +.input-group > .form-control, +.input-group > .form-control-plaintext, +.input-group > .custom-select, +.input-group > .custom-file { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0; +} + +.input-group > .form-control + .form-control, +.input-group > .form-control + .custom-select, +.input-group > .form-control + .custom-file, +.input-group > .form-control-plaintext + .form-control, +.input-group > .form-control-plaintext + .custom-select, +.input-group > .form-control-plaintext + .custom-file, +.input-group > .custom-select + .form-control, +.input-group > .custom-select + .custom-select, +.input-group > .custom-select + .custom-file, +.input-group > .custom-file + .form-control, +.input-group > .custom-file + .custom-select, +.input-group > .custom-file + .custom-file { + margin-left: -1px; +} + +.input-group > .form-control:focus, +.input-group > .custom-select:focus, +.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; +} + +.input-group > .custom-file .custom-file-input:focus { + z-index: 4; +} + +.input-group > .form-control:not(:last-child), +.input-group > .custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .form-control:not(:first-child), +.input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group > .custom-file { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; +} + +.input-group > .custom-file:not(:last-child) .custom-file-label, +.input-group > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group-prepend, +.input-group-append { + display: -ms-flexbox; + display: flex; +} + +.input-group-prepend .btn, +.input-group-append .btn { + position: relative; + z-index: 2; +} + +.input-group-prepend .btn:focus, +.input-group-append .btn:focus { + z-index: 3; +} + +.input-group-prepend .btn + .btn, +.input-group-prepend .btn + .input-group-text, +.input-group-prepend .input-group-text + .input-group-text, +.input-group-prepend .input-group-text + .btn, +.input-group-append .btn + .btn, +.input-group-append .btn + .input-group-text, +.input-group-append .input-group-text + .input-group-text, +.input-group-append .input-group-text + .btn { + margin-left: -1px; +} + +.input-group-prepend { + margin-right: -1px; +} + +.input-group-append { + margin-left: -1px; +} + +.input-group-text { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} + +.input-group-text input[type="radio"], +.input-group-text input[type="checkbox"] { + margin-top: 0; +} + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(1.5em + 1rem + 2px); +} + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.5em + 0.5rem + 2px); +} + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; +} + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.custom-control { + position: relative; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem; +} + +.custom-control-inline { + display: -ms-inline-flexbox; + display: inline-flex; + margin-right: 1rem; +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0; +} + +.custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + border-color: #007bff; + background-color: #007bff; +} + +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #80bdff; +} + +.custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #fff; + background-color: #b3d7ff; + border-color: #b3d7ff; +} + +.custom-control-input:disabled ~ .custom-control-label { + color: #6c757d; +} + +.custom-control-input:disabled ~ .custom-control-label::before { + background-color: #e9ecef; +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; +} + +.custom-control-label::before { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #fff; + border: #adb5bd solid 1px; +} + +.custom-control-label::after { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background: no-repeat 50% / 50% 50%; +} + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; +} + +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #007bff; + background-color: #007bff; +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-radio .custom-control-label::before { + border-radius: 50%; +} + +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} + +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-switch { + padding-left: 2.25rem; +} + +.custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; +} + +.custom-switch .custom-control-label::after { + top: calc(0.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #adb5bd; + border-radius: 0.5rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; + } +} + +.custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #fff; + -webkit-transform: translateX(0.75rem); + transform: translateX(0.75rem); +} + +.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-select:focus { + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} + +.custom-select:disabled { + color: #6c757d; + background-color: #e9ecef; +} + +.custom-select::-ms-expand { + display: none; +} + +.custom-select-sm { + height: calc(1.5em + 0.5rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; +} + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin-bottom: 0; +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin: 0; + opacity: 0; +} + +.custom-file-input:focus ~ .custom-file-label { + border-color: #80bdff; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-file-input:disabled ~ .custom-file-label { + background-color: #e9ecef; +} + +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; +} + +.custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} + +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + 0.75rem); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + content: "Browse"; + background-color: #e9ecef; + border-left: inherit; + border-radius: 0 0.25rem 0.25rem 0; +} + +.custom-range { + width: 100%; + height: calc(1rem + 0.4rem); + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-range:focus { + outline: none; +} + +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range::-moz-focus-outer { + border: 0; +} + +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + transition: none; + } +} + +.custom-range::-webkit-slider-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} + +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + transition: none; + } +} + +.custom-range::-moz-range-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} + +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + transition: none; + } +} + +.custom-range::-ms-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; +} + +.custom-range::-ms-fill-lower { + background-color: #dee2e6; + border-radius: 1rem; +} + +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dee2e6; + border-radius: 1rem; +} + +.custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} + +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; +} + +.custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.custom-range:disabled::-moz-range-track { + cursor: default; +} + +.custom-range:disabled::-ms-thumb { + background-color: #adb5bd; +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-control-label::before, + .custom-file-label, + .custom-select { + transition: none; + } +} + +.nav { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; +} + +.nav-link:hover, .nav-link:focus { + text-decoration: none; +} + +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6; +} + +.nav-tabs .nav-item { + margin-bottom: -1px; +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; +} + +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; +} + +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #007bff; +} + +.nav-fill .nav-item { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + text-align: center; +} + +.nav-justified .nav-item { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 0.5rem 1rem; +} + +.navbar > .container, +.navbar > .container-fluid { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; +} + +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} + +.navbar-nav { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} + +.navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + -ms-flex-preferred-size: 100%; + flex-basis: 100%; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-align: center; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; +} + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 576px) { + .navbar-expand-sm { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-sm .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } +} + +@media (max-width: 767.98px) { + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-md .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } +} + +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-lg .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } +} + +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 1200px) { + .navbar-expand-xl { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-xl .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } +} + +.navbar-expand { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid { + padding-right: 0; + padding-left: 0; +} + +.navbar-expand .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; +} + +.navbar-expand .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; +} + +.navbar-expand .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #fff; +} + +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-text a { + color: #fff; +} + +.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #fff; +} + +.card { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} + +.card > hr { + margin-right: 0; + margin-left: 0; +} + +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.card-body { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} + +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} + +.card-header + .list-group .list-group-item:first-child { + border-top: 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img { + width: 100%; + border-radius: calc(0.25rem - 1px); +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-deck { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; +} + +.card-deck .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-deck { + -ms-flex-flow: row wrap; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + display: -ms-flexbox; + display: flex; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + -ms-flex-direction: column; + flex-direction: column; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; + } +} + +.card-group { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; +} + +.card-group > .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-group { + -ms-flex-flow: row wrap; + flex-flow: row wrap; + } + .card-group > .card { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.card-columns .card { + margin-bottom: 0.75rem; +} + +@media (min-width: 576px) { + .card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns .card { + display: inline-block; + width: 100%; + } +} + +.accordion > .card { + overflow: hidden; +} + +.accordion > .card:not(:first-of-type) .card-header:first-child { + border-radius: 0; +} + +.accordion > .card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0; +} + +.accordion > .card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.accordion > .card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.accordion > .card .card-header { + margin-bottom: -1px; +} + +.breadcrumb { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} + +.breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #6c757d; + content: "/"; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} + +.breadcrumb-item.active { + color: #6c757d; +} + +.pagination { + display: -ms-flexbox; + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #007bff; + background-color: #fff; + border: 1px solid #dee2e6; +} + +.page-link:hover { + z-index: 2; + color: #0056b3; + text-decoration: none; + background-color: #e9ecef; + border-color: #dee2e6; +} + +.page-link:focus { + z-index: 2; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} + +.page-item.active .page-link { + z-index: 1; + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .badge { + transition: none; + } +} + +a.badge:hover, a.badge:focus { + text-decoration: none; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; +} + +.badge-primary { + color: #fff; + background-color: #007bff; +} + +a.badge-primary:hover, a.badge-primary:focus { + color: #fff; + background-color: #0062cc; +} + +a.badge-primary:focus, a.badge-primary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.badge-secondary { + color: #fff; + background-color: #6c757d; +} + +a.badge-secondary:hover, a.badge-secondary:focus { + color: #fff; + background-color: #545b62; +} + +a.badge-secondary:focus, a.badge-secondary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.badge-success { + color: #fff; + background-color: #28a745; +} + +a.badge-success:hover, a.badge-success:focus { + color: #fff; + background-color: #1e7e34; +} + +a.badge-success:focus, a.badge-success.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.badge-info { + color: #fff; + background-color: #17a2b8; +} + +a.badge-info:hover, a.badge-info:focus { + color: #fff; + background-color: #117a8b; +} + +a.badge-info:focus, a.badge-info.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.badge-warning { + color: #212529; + background-color: #ffc107; +} + +a.badge-warning:hover, a.badge-warning:focus { + color: #212529; + background-color: #d39e00; +} + +a.badge-warning:focus, a.badge-warning.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.badge-danger { + color: #fff; + background-color: #dc3545; +} + +a.badge-danger:hover, a.badge-danger:focus { + color: #fff; + background-color: #bd2130; +} + +a.badge-danger:focus, a.badge-danger.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.badge-light { + color: #212529; + background-color: #f8f9fa; +} + +a.badge-light:hover, a.badge-light:focus { + color: #212529; + background-color: #dae0e5; +} + +a.badge-light:focus, a.badge-light.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.badge-dark { + color: #fff; + background-color: #343a40; +} + +a.badge-dark:hover, a.badge-dark:focus { + color: #fff; + background-color: #1d2124; +} + +a.badge-dark:focus, a.badge-dark.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: 0.3rem; +} + +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 4rem; +} + +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-primary { + color: #004085; + background-color: #cce5ff; + border-color: #b8daff; +} + +.alert-primary hr { + border-top-color: #9fcdff; +} + +.alert-primary .alert-link { + color: #002752; +} + +.alert-secondary { + color: #383d41; + background-color: #e2e3e5; + border-color: #d6d8db; +} + +.alert-secondary hr { + border-top-color: #c8cbcf; +} + +.alert-secondary .alert-link { + color: #202326; +} + +.alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb; +} + +.alert-success hr { + border-top-color: #b1dfbb; +} + +.alert-success .alert-link { + color: #0b2e13; +} + +.alert-info { + color: #0c5460; + background-color: #d1ecf1; + border-color: #bee5eb; +} + +.alert-info hr { + border-top-color: #abdde5; +} + +.alert-info .alert-link { + color: #062c33; +} + +.alert-warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba; +} + +.alert-warning hr { + border-top-color: #ffe8a1; +} + +.alert-warning .alert-link { + color: #533f03; +} + +.alert-danger { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb; +} + +.alert-danger hr { + border-top-color: #f1b0b7; +} + +.alert-danger .alert-link { + color: #491217; +} + +.alert-light { + color: #818182; + background-color: #fefefe; + border-color: #fdfdfe; +} + +.alert-light hr { + border-top-color: #ececf6; +} + +.alert-light .alert-link { + color: #686868; +} + +.alert-dark { + color: #1b1e21; + background-color: #d6d8d9; + border-color: #c6c8ca; +} + +.alert-dark hr { + border-top-color: #b9bbbe; +} + +.alert-dark .alert-link { + color: #040505; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +.progress { + display: -ms-flexbox; + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.progress-bar { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: center; + justify-content: center; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #007bff; + transition: width 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + -webkit-animation: progress-bar-stripes 1s linear infinite; + animation: progress-bar-stripes 1s linear infinite; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none; + } +} + +.media { + display: -ms-flexbox; + display: flex; + -ms-flex-align: start; + align-items: flex-start; +} + +.media-body { + -ms-flex: 1; + flex: 1; +} + +.list-group { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; +} + +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; +} + +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} + +.list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.list-group-horizontal { + -ms-flex-direction: row; + flex-direction: row; +} + +.list-group-horizontal .list-group-item { + margin-right: -1px; + margin-bottom: 0; +} + +.list-group-horizontal .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; +} + +.list-group-horizontal .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-sm .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-sm .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-sm .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } +} + +@media (min-width: 768px) { + .list-group-horizontal-md { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-md .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-md .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-md .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } +} + +@media (min-width: 992px) { + .list-group-horizontal-lg { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-lg .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-lg .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-lg .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } +} + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-xl .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-xl .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xl .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} + +.list-group-flush .list-group-item:last-child { + margin-bottom: -1px; +} + +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0; +} + +.list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; + border-bottom: 0; +} + +.list-group-item-primary { + color: #004085; + background-color: #b8daff; +} + +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #004085; + background-color: #9fcdff; +} + +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #004085; + border-color: #004085; +} + +.list-group-item-secondary { + color: #383d41; + background-color: #d6d8db; +} + +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #383d41; + background-color: #c8cbcf; +} + +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #383d41; + border-color: #383d41; +} + +.list-group-item-success { + color: #155724; + background-color: #c3e6cb; +} + +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #155724; + background-color: #b1dfbb; +} + +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #155724; + border-color: #155724; +} + +.list-group-item-info { + color: #0c5460; + background-color: #bee5eb; +} + +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #0c5460; + background-color: #abdde5; +} + +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #0c5460; + border-color: #0c5460; +} + +.list-group-item-warning { + color: #856404; + background-color: #ffeeba; +} + +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #856404; + background-color: #ffe8a1; +} + +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #856404; + border-color: #856404; +} + +.list-group-item-danger { + color: #721c24; + background-color: #f5c6cb; +} + +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #721c24; + background-color: #f1b0b7; +} + +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #721c24; + border-color: #721c24; +} + +.list-group-item-light { + color: #818182; + background-color: #fdfdfe; +} + +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #818182; + background-color: #ececf6; +} + +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #818182; + border-color: #818182; +} + +.list-group-item-dark { + color: #1b1e21; + background-color: #c6c8ca; +} + +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #1b1e21; + background-color: #b9bbbe; +} + +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #1b1e21; + border-color: #1b1e21; +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5; +} + +.close:hover { + color: #000; + text-decoration: none; +} + +.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: .75; +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +a.close.disabled { + pointer-events: none; +} + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + opacity: 0; + border-radius: 0.25rem; +} + +.toast:not(:last-child) { + margin-bottom: 0.75rem; +} + +.toast.showing { + opacity: 1; +} + +.toast.show { + display: block; + opacity: 1; +} + +.toast.hide { + display: none; +} + +.toast-header { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding: 0.25rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.toast-body { + padding: 0.75rem; +} + +.modal-open { + overflow: hidden; +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} + +.modal.fade .modal-dialog { + transition: -webkit-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; + -webkit-transform: translate(0, -50px); + transform: translate(0, -50px); +} + +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} + +.modal.show .modal-dialog { + -webkit-transform: none; + transform: none; +} + +.modal-dialog-scrollable { + display: -ms-flexbox; + display: flex; + max-height: calc(100% - 1rem); +} + +.modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden; +} + +.modal-dialog-scrollable .modal-header, +.modal-dialog-scrollable .modal-footer { + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + min-height: calc(100% - 1rem); +} + +.modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + content: ""; +} + +.modal-dialog-centered.modal-dialog-scrollable { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: center; + justify-content: center; + height: 100%; +} + +.modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none; +} + +.modal-dialog-centered.modal-dialog-scrollable::before { + content: none; +} + +.modal-content { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: -ms-flexbox; + display: flex; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: 0.3rem; + border-top-right-radius: 0.3rem; +} + +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} + +.modal-footer > :not(:first-child) { + margin-left: .25rem; +} + +.modal-footer > :not(:last-child) { + margin-right: .25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem); + } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem); + } + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); + } + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem); + } + .modal-sm { + max-width: 300px; + } +} + +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + max-width: 800px; + } +} + +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} + +.tooltip.show { + opacity: 0.9; +} + +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} + +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { + padding: 0.4rem 0; +} + +.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { + bottom: 0; +} + +.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { + padding: 0 0.4rem; +} + +.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { + padding: 0.4rem 0; +} + +.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { + top: 0; +} + +.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { + padding: 0 0.4rem; +} + +.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} + +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; +} + +.popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top, .bs-popover-auto[x-placement^="top"] { + margin-bottom: 0.5rem; +} + +.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { + bottom: calc((0.5rem + 1px) * -1); +} + +.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; +} + +.bs-popover-right, .bs-popover-auto[x-placement^="right"] { + margin-left: 0.5rem; +} + +.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { + left: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; +} + +.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { + margin-top: 0.5rem; +} + +.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { + top: calc((0.5rem + 1px) * -1); +} + +.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; +} + +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; +} + +.bs-popover-left, .bs-popover-auto[x-placement^="left"] { + margin-right: 0.5rem; +} + +.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { + right: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} + +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #212529; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + -ms-touch-action: pan-y; + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: -webkit-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + -webkit-transform: translateX(100%); + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + -webkit-transform: none; + transform: none; +} + +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; +} + +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: 0s 0.6s opacity; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, + .carousel-fade .active.carousel-item-right { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: 0.5; + transition: opacity 0.15s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} + +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: no-repeat 50% / 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} + +.carousel-indicators li { + box-sizing: content-box; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; + } +} + +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; +} + +@-webkit-keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: spinner-border .75s linear infinite; + animation: spinner-border .75s linear infinite; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@-webkit-keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + } +} + +@keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + } +} + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: spinner-grow .75s linear infinite; + animation: spinner-grow .75s linear infinite; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-primary { + background-color: #007bff !important; +} + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #0062cc !important; +} + +.bg-secondary { + background-color: #6c757d !important; +} + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #545b62 !important; +} + +.bg-success { + background-color: #28a745 !important; +} + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #1e7e34 !important; +} + +.bg-info { + background-color: #17a2b8 !important; +} + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #117a8b !important; +} + +.bg-warning { + background-color: #ffc107 !important; +} + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #d39e00 !important; +} + +.bg-danger { + background-color: #dc3545 !important; +} + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #bd2130 !important; +} + +.bg-light { + background-color: #f8f9fa !important; +} + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #dae0e5 !important; +} + +.bg-dark { + background-color: #343a40 !important; +} + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #1d2124 !important; +} + +.bg-white { + background-color: #fff !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.border { + border: 1px solid #dee2e6 !important; +} + +.border-top { + border-top: 1px solid #dee2e6 !important; +} + +.border-right { + border-right: 1px solid #dee2e6 !important; +} + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; +} + +.border-left { + border-left: 1px solid #dee2e6 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #007bff !important; +} + +.border-secondary { + border-color: #6c757d !important; +} + +.border-success { + border-color: #28a745 !important; +} + +.border-info { + border-color: #17a2b8 !important; +} + +.border-warning { + border-color: #ffc107 !important; +} + +.border-danger { + border-color: #dc3545 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #343a40 !important; +} + +.border-white { + border-color: #fff !important; +} + +.rounded-sm { + border-radius: 0.2rem !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-lg { + border-radius: 0.3rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: -ms-flexbox !important; + display: flex !important; +} + +.d-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-sm-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-md-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-lg-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-xl-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media print { + .d-print-none { + display: none !important; + } + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-print-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} + +.embed-responsive::before { + display: block; + content: ""; +} + +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.857143%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-4by3::before { + padding-top: 75%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.flex-row { + -ms-flex-direction: row !important; + flex-direction: row !important; +} + +.flex-column { + -ms-flex-direction: column !important; + flex-direction: column !important; +} + +.flex-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; +} + +.flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; +} + +.flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; +} + +.flex-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; +} + +.flex-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; +} + +.flex-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; +} + +.justify-content-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; +} + +.justify-content-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; +} + +.justify-content-center { + -ms-flex-pack: center !important; + justify-content: center !important; +} + +.justify-content-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; +} + +.justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; +} + +.align-items-start { + -ms-flex-align: start !important; + align-items: flex-start !important; +} + +.align-items-end { + -ms-flex-align: end !important; + align-items: flex-end !important; +} + +.align-items-center { + -ms-flex-align: center !important; + align-items: center !important; +} + +.align-items-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; +} + +.align-items-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; +} + +.align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; +} + +.align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; +} + +.align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important; +} + +.align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; +} + +.align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; +} + +.align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; +} + +.align-self-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; +} + +.align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; +} + +.align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; +} + +.align-self-center { + -ms-flex-item-align: center !important; + align-self: center !important; +} + +.align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; +} + +.align-self-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-sm-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-sm-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-sm-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-sm-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-sm-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-sm-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-sm-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-sm-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-sm-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-sm-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-sm-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-sm-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-sm-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-sm-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-sm-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 768px) { + .flex-md-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-md-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-md-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-md-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-md-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-md-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-md-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-md-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-md-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-md-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-md-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-md-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-md-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-md-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-md-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-md-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-md-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-md-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 992px) { + .flex-lg-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-lg-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-lg-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-lg-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-lg-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-lg-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-lg-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-lg-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-lg-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-lg-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-lg-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-lg-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-lg-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-lg-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-lg-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-lg-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 1200px) { + .flex-xl-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-xl-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-xl-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-xl-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-xl-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-xl-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-xl-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-xl-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-xl-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-xl-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-xl-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-xl-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-xl-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-xl-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-xl-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-xl-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + .float-sm-right { + float: right !important; + } + .float-sm-none { + float: none !important; + } +} + +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + .float-md-right { + float: right !important; + } + .float-md-none { + float: none !important; + } +} + +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + .float-lg-right { + float: right !important; + } + .float-lg-none { + float: none !important; + } +} + +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + .float-xl-right { + float: right !important; + } + .float-xl-none { + float: none !important; + } +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +@supports ((position: -webkit-sticky) or (position: sticky)) { + .sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.vw-100 { + width: 100vw !important; +} + +.vh-100 { + height: 100vh !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0, 0, 0, 0); +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-n1 { + margin: -0.25rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} + +.m-n2 { + margin: -0.5rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} + +.m-n3 { + margin: -1rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} + +.m-n4 { + margin: -1.5rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} + +.m-n5 { + margin: -3rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; + } + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; + } + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; + } + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; + } + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; + } + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; + } + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; + } + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; + } + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; + } + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; + } + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; + } + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; + } + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; + } + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; + } + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; + } + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; + } + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; + } + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; + } + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; + } + .p-sm-0 { + padding: 0 !important; + } + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; + } + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; + } + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; + } + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; + } + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; + } + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; + } + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; + } + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; + } + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; + } + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; + } + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; + } + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; + } + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; + } + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; + } + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; + } + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; + } + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; + } + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; + } + .m-sm-n1 { + margin: -0.25rem !important; + } + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; + } + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; + } + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; + } + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; + } + .m-sm-n2 { + margin: -0.5rem !important; + } + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; + } + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; + } + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; + } + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; + } + .m-sm-n3 { + margin: -1rem !important; + } + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; + } + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; + } + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; + } + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; + } + .m-sm-n4 { + margin: -1.5rem !important; + } + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; + } + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; + } + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; + } + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; + } + .m-sm-n5 { + margin: -3rem !important; + } + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; + } + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; + } + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; + } + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; + } + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; + } + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; + } + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; + } +} + +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; + } + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; + } + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; + } + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; + } + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; + } + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; + } + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; + } + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; + } + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; + } + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; + } + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; + } + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; + } + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; + } + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; + } + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; + } + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; + } + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; + } + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; + } + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; + } + .p-md-0 { + padding: 0 !important; + } + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; + } + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; + } + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; + } + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; + } + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; + } + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; + } + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; + } + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; + } + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; + } + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; + } + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; + } + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; + } + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; + } + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; + } + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; + } + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; + } + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; + } + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; + } + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; + } + .m-md-n1 { + margin: -0.25rem !important; + } + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; + } + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; + } + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; + } + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; + } + .m-md-n2 { + margin: -0.5rem !important; + } + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; + } + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; + } + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; + } + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; + } + .m-md-n3 { + margin: -1rem !important; + } + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; + } + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; + } + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; + } + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; + } + .m-md-n4 { + margin: -1.5rem !important; + } + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; + } + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; + } + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; + } + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; + } + .m-md-n5 { + margin: -3rem !important; + } + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; + } + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; + } + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; + } + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; + } + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; + } + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; + } + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; + } +} + +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; + } + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; + } + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; + } + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; + } + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; + } + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; + } + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; + } + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; + } + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; + } + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; + } + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; + } + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; + } + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; + } + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; + } + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; + } + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; + } + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; + } + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; + } + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; + } + .p-lg-0 { + padding: 0 !important; + } + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; + } + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; + } + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; + } + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; + } + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; + } + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; + } + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; + } + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; + } + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; + } + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; + } + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; + } + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; + } + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; + } + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; + } + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; + } + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; + } + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; + } + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; + } + .m-lg-n1 { + margin: -0.25rem !important; + } + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; + } + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; + } + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; + } + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; + } + .m-lg-n2 { + margin: -0.5rem !important; + } + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; + } + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; + } + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; + } + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; + } + .m-lg-n3 { + margin: -1rem !important; + } + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; + } + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; + } + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; + } + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; + } + .m-lg-n4 { + margin: -1.5rem !important; + } + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; + } + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; + } + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; + } + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; + } + .m-lg-n5 { + margin: -3rem !important; + } + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; + } + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; + } + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; + } + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; + } + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; + } + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; + } + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; + } +} + +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; + } + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; + } + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; + } + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; + } + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; + } + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; + } + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; + } + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; + } + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; + } + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; + } + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; + } + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; + } + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; + } + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; + } + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; + } + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; + } + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; + } + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; + } + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; + } + .p-xl-0 { + padding: 0 !important; + } + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; + } + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; + } + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; + } + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; + } + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; + } + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; + } + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; + } + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; + } + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; + } + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; + } + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; + } + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; + } + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; + } + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; + } + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; + } + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; + } + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; + } + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; + } + .m-xl-n1 { + margin: -0.25rem !important; + } + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; + } + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; + } + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; + } + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; + } + .m-xl-n2 { + margin: -0.5rem !important; + } + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; + } + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; + } + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; + } + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; + } + .m-xl-n3 { + margin: -1rem !important; + } + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; + } + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; + } + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; + } + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; + } + .m-xl-n4 { + margin: -1.5rem !important; + } + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; + } + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; + } + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; + } + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; + } + .m-xl-n5 { + margin: -3rem !important; + } + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; + } + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; + } + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; + } + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; + } + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; + } + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; + } + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; + } +} + +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; +} + +.text-justify { + text-align: justify !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + .text-sm-right { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} + +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + .text-md-right { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} + +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + .text-lg-right { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} + +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + .text-xl-right { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-lighter { + font-weight: lighter !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-bolder { + font-weight: bolder !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-white { + color: #fff !important; +} + +.text-primary { + color: #007bff !important; +} + +a.text-primary:hover, a.text-primary:focus { + color: #0056b3 !important; +} + +.text-secondary { + color: #6c757d !important; +} + +a.text-secondary:hover, a.text-secondary:focus { + color: #494f54 !important; +} + +.text-success { + color: #28a745 !important; +} + +a.text-success:hover, a.text-success:focus { + color: #19692c !important; +} + +.text-info { + color: #17a2b8 !important; +} + +a.text-info:hover, a.text-info:focus { + color: #0f6674 !important; +} + +.text-warning { + color: #ffc107 !important; +} + +a.text-warning:hover, a.text-warning:focus { + color: #ba8b00 !important; +} + +.text-danger { + color: #dc3545 !important; +} + +a.text-danger:hover, a.text-danger:focus { + color: #a71d2a !important; +} + +.text-light { + color: #f8f9fa !important; +} + +a.text-light:hover, a.text-light:focus { + color: #cbd3da !important; +} + +.text-dark { + color: #343a40 !important; +} + +a.text-dark:hover, a.text-dark:focus { + color: #121416 !important; +} + +.text-body { + color: #212529 !important; +} + +.text-muted { + color: #6c757d !important; +} + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-break { + word-break: break-word !important; + overflow-wrap: break-word !important; +} + +.text-reset { + color: inherit !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media print { + *, + *::before, + *::after { + text-shadow: none !important; + box-shadow: none !important; + } + a:not(.btn) { + text-decoration: underline; + } + abbr[title]::after { + content: " (" attr(title) ")"; + } + pre { + white-space: pre-wrap !important; + } + pre, + blockquote { + border: 1px solid #adb5bd; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + @page { + size: a3; + } + body { + min-width: 992px !important; + } + .container { + min-width: 992px !important; + } + .navbar { + display: none; + } + .badge { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #dee2e6 !important; + } + .table-dark { + color: inherit; + } + .table-dark th, + .table-dark td, + .table-dark thead th, + .table-dark tbody + tbody { + border-color: #dee2e6; + } + .table .thead-dark th { + color: inherit; + border-color: #dee2e6; + } +} +/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map new file mode 100644 index 0000000..7eb1581 --- /dev/null +++ b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","bootstrap.css","../../scss/_root.scss","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/vendor/_rfs.scss","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_functions.scss","../../scss/_forms.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_forms.scss","../../scss/mixins/_gradients.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/utilities/_overflow.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_shadows.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_stretched-link.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/_print.scss"],"names":[],"mappings":"AAAA;;;;;ECKE;ACLF;EAGI,eAAc;EAAd,iBAAc;EAAd,iBAAc;EAAd,eAAc;EAAd,cAAc;EAAd,iBAAc;EAAd,iBAAc;EAAd,gBAAc;EAAd,eAAc;EAAd,eAAc;EAAd,aAAc;EAAd,eAAc;EAAd,oBAAc;EAId,kBAAc;EAAd,oBAAc;EAAd,kBAAc;EAAd,eAAc;EAAd,kBAAc;EAAd,iBAAc;EAAd,gBAAc;EAAd,eAAc;EAId,kBAAiC;EAAjC,sBAAiC;EAAjC,sBAAiC;EAAjC,sBAAiC;EAAjC,uBAAiC;EAKnC,+MAAyB;EACzB,6GAAwB;ADkB1B;;AEjBA;;;EAGE,sBAAsB;AFoBxB;;AEjBA;EACE,uBAAuB;EACvB,iBAAiB;EACjB,8BAA8B;EAC9B,6CCXa;AH+Bf;;AEdA;EACE,cAAc;AFiBhB;;AEPA;EACE,SAAS;EACT,kMCiOiN;ECjJ7M,eAtCY;EFxChB,gBC0O+B;EDzO/B,gBC8O+B;ED7O/B,cCnCgB;EDoChB,gBAAgB;EAChB,sBC9Ca;AHwDf;;AAEA;EEHE,qBAAqB;AFKvB;;AEIA;EACE,uBAAuB;EACvB,SAAS;EACT,iBAAiB;AFDnB;;AEcA;EACE,aAAa;EACb,qBCgNuC;AH3NzC;;AEkBA;EACE,aAAa;EACb,mBCoF8B;AHnGhC;;AE0BA;;EAEE,0BAA0B;EAC1B,yCAAiC;EAAjC,iCAAiC;EACjC,YAAY;EACZ,gBAAgB;EAChB,sCAA8B;EAA9B,8BAA8B;AFvBhC;;AE0BA;EACE,mBAAmB;EACnB,kBAAkB;EAClB,oBAAoB;AFvBtB;;AE0BA;;;EAGE,aAAa;EACb,mBAAmB;AFvBrB;;AE0BA;;;;EAIE,gBAAgB;AFvBlB;;AE0BA;EACE,gBCiJ+B;AHxKjC;;AE0BA;EACE,oBAAoB;EACpB,cAAc;AFvBhB;;AE0BA;EACE,gBAAgB;AFvBlB;;AE0BA;;EAEE,mBCoIkC;AH3JpC;;AE0BA;EEpFI,cAAW;AJ8Df;;AE+BA;;EAEE,kBAAkB;EE/FhB,cAAW;EFiGb,cAAc;EACd,wBAAwB;AF5B1B;;AE+BA;EAAM,cAAc;AF3BpB;;AE4BA;EAAM,UAAU;AFxBhB;;AE+BA;EACE,cClJe;EDmJf,qBCX4C;EDY5C,6BAA6B;AF5B/B;;AKhJE;EH+KE,cCd8D;EDe9D,0BCd+C;AHbnD;;AEqCA;EACE,cAAc;EACd,qBAAqB;AFlCvB;;AKtJE;EH2LE,cAAc;EACd,qBAAqB;AFjCzB;;AE2BA;EAUI,UAAU;AFjCd;;AE0CA;;;;EAIE,iGCoDgH;ECzM9G,cAAW;AJ+Gf;;AE0CA;EAEE,aAAa;EAEb,mBAAmB;EAEnB,cAAc;AF1ChB;;AEkDA;EAEE,gBAAgB;AFhDlB;;AEwDA;EACE,sBAAsB;EACtB,kBAAkB;AFrDpB;;AEwDA;EAGE,gBAAgB;EAChB,sBAAsB;AFvDxB;;AE+DA;EACE,yBAAyB;AF5D3B;;AE+DA;EACE,oBC2EkC;ED1ElC,uBC0EkC;EDzElC,cCpQgB;EDqQhB,gBAAgB;EAChB,oBAAoB;AF5DtB;;AE+DA;EAGE,mBAAmB;AF9DrB;;AEsEA;EAEE,qBAAqB;EACrB,qBC4J2C;AHhO7C;;AE0EA;EAEE,gBAAgB;AFxElB;;AE+EA;EACE,mBAAmB;EACnB,0CAA0C;AF5E5C;;AE+EA;;;;;EAKE,SAAS;EACT,oBAAoB;EEtPlB,kBAAW;EFwPb,oBAAoB;AF5EtB;;AE+EA;;EAEE,iBAAiB;AF5EnB;;AE+EA;;EAEE,oBAAoB;AF5EtB;;AEkFA;EACE,iBAAiB;AF/EnB;;AEsFA;;;;EAIE,0BAA0B;AFnF5B;;AEwFE;;;;EAKI,eAAe;AFtFrB;;AE4FA;;;;EAIE,UAAU;EACV,kBAAkB;AFzFpB;;AE4FA;;EAEE,sBAAsB;EACtB,UAAU;AFzFZ;;AE6FA;;;;EASE,2BAA2B;AF/F7B;;AEkGA;EACE,cAAc;EAEd,gBAAgB;AFhGlB;;AEmGA;EAME,YAAY;EAEZ,UAAU;EACV,SAAS;EACT,SAAS;AFtGX;;AE2GA;EACE,cAAc;EACd,WAAW;EACX,eAAe;EACf,UAAU;EACV,oBAAoB;EElShB,iBAtCY;EF0UhB,oBAAoB;EACpB,cAAc;EACd,mBAAmB;AFxGrB;;AE2GA;EACE,wBAAwB;AFxG1B;;AAEA;;EE4GE,YAAY;AFzGd;;AAEA;EE+GE,oBAAoB;EACpB,wBAAwB;AF7G1B;;AAEA;EEmHE,wBAAwB;AFjH1B;;AEyHA;EACE,aAAa;EACb,0BAA0B;AFtH5B;;AE6HA;EACE,qBAAqB;AF1HvB;;AE6HA;EACE,kBAAkB;EAClB,eAAe;AF1HjB;;AE6HA;EACE,aAAa;AF1Hf;;AAEA;EE8HE,wBAAwB;AF5H1B;;AM/VA;;EAEE,qBHiSuC;EG/RvC,gBHiS+B;EGhS/B,gBHiS+B;AHgEjC;;AM7VA;EFgHM,iBAtCY;AJuRlB;;AMhWA;EF+GM,eAtCY;AJ2RlB;;AMnWA;EF8GM,kBAtCY;AJ+RlB;;AMtWA;EF6GM,iBAtCY;AJmSlB;;AMzWA;EF4GM,kBAtCY;AJuSlB;;AM5WA;EF2GM,eAtCY;AJ2SlB;;AM9WA;EFyGM,kBAtCY;EEjEhB,gBHmS+B;AH8EjC;;AM7WA;EFmGM,eAtCY;EE3DhB,gBHsR+B;EGrR/B,gBH6Q+B;AHmGjC;;AM9WA;EF8FM,iBAtCY;EEtDhB,gBHkR+B;EGjR/B,gBHwQ+B;AHyGjC;;AM/WA;EFyFM,iBAtCY;EEjDhB,gBH8Q+B;EG7Q/B,gBHmQ+B;AH+GjC;;AMhXA;EFoFM,iBAtCY;EE5ChB,gBH0Q+B;EGzQ/B,gBH8P+B;AHqHjC;;AE1VA;EIhBE,gBH0EW;EGzEX,mBHyEW;EGxEX,SAAS;EACT,wCHzCa;AHuZf;;AMtWA;;EFMI,cAAW;EEHb,gBHsN+B;AHmJjC;;AMtWA;;EAEE,cH8PgC;EG7PhC,yBHsQmC;AHmGrC;;AMjWA;EC/EE,eAAe;EACf,gBAAgB;APoblB;;AMjWA;ECpFE,eAAe;EACf,gBAAgB;APyblB;;AMnWA;EACE,qBAAqB;ANsWvB;;AMvWA;EAII,oBHgP+B;AHuHnC;;AM7VA;EFjCI,cAAW;EEmCb,yBAAyB;ANgW3B;;AM5VA;EACE,mBHiBW;ECFP,kBAtCY;AJuXlB;;AM5VA;EACE,cAAc;EF7CZ,cAAW;EE+Cb,cH1GgB;AHyclB;;AMlWA;EAMI,qBAAqB;ANgWzB;;AQndA;ECIE,eAAe;EAGf,YAAY;ATidd;;AQldA;EACE,gBL++BwC;EK9+BxC,sBLRa;EKSb,yBLNgB;EOLd,sBPqOgC;EM/NlC,eAAe;EAGf,YAA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AAwB,iBADZ;IACY,QADZ;EfitClB;EehtCM;IAAwB,iBADZ;IACY,QADZ;EfotClB;EentCM;IAAwB,iBADZ;IACY,QADZ;EfutClB;EettCM;IAAwB,iBADZ;IACY,QADZ;Ef0tClB;EeztCM;IAAwB,iBADZ;IACY,QADZ;Ef6tClB;Ee5tCM;IAAwB,iBADZ;IACY,QADZ;EfguClB;Ee/tCM;IAAwB,iBADZ;IACY,QADZ;EfmuClB;EeluCM;IAAwB,iBADZ;IACY,QADZ;EfsuClB;EeruCM;IAAwB,iBADZ;IACY,QADZ;EfyuClB;EexuCM;IAAwB,iBADZ;IACY,QADZ;Ef4uClB;Ee3uCM;IAAwB,kBADZ;IACY,SADZ;Ef+uClB;Ee9uCM;IAAwB,kBADZ;IACY,SADZ;EfkvClB;EejvCM;IAAwB,kBADZ;IACY,SADZ;EfqvClB;Ee9uCQ;IFTR,cAA4B;Eb0vC5B;EejvCQ;IFTR,sBAA8C;Eb6vC9C;EepvCQ;IFTR,uBAA8C;EbgwC9C;EevvCQ;IFTR,gBAA8C;EbmwC9C;Ee1vCQ;IFTR,uBAA8C;EbswC9C;Ee7vCQ;IFTR,uBAA8C;EbywC9C;EehwCQ;IFTR,gBAA8C;Eb4wC9C;EenwCQ;IFTR,uBAA8C;Eb+wC9C;EetwCQ;IFTR,uBAA8C;EbkxC9C;EezwCQ;IFTR,gBAA8C;EbqxC9C;Ee5wCQ;IFTR,uBAA8C;EbwxC9C;Ee/wCQ;IFTR,uBAA8C;Eb2xC9C;AACF;;AgBz0CA;EACE,WAAW;EACX,mBb2HW;Ea1HX,cbSgB;AHm0ClB;;AgB/0CA;;EAQI,gBb8UgC;Ea7UhC,mBAAmB;EACnB,6BbJc;AHg1ClB;;AgBt1CA;EAcI,sBAAsB;EACtB,gCbTc;AHq1ClB;;AgB31CA;EAmBI,6Bbbc;AHy1ClB;;AgBn0CA;;EAGI,ebwT+B;AH6gCnC;;AgB5zCA;EACE,yBbnCgB;AHk2ClB;;AgBh0CA;;EAKI,yBbvCc;AHu2ClB;;AgBr0CA;;EAWM,wBAA4C;AhB+zClD;;AgB1zCA;;;;EAKI,SAAS;AhB4zCb;;AgBpzCA;EAEI,qCb1DW;AHg3Cf;;AKr3CE;EW2EI,cbvEY;EawEZ,sCbvES;AHq3Cf;;AiBj4CE;;;EAII,yBC2E4D;AlBwzClE;;AiBv4CE;;;;EAYM,qBCmE0D;AlB+zClE;;AKv4CE;EYiBM,yBAJsC;AjB83C9C;;AiB/3CE;;EASQ,yBARoC;AjBm4C9C;;AiBv5CE;;;EAII,yBC2E4D;AlB80ClE;;AiB75CE;;;;EAYM,qBCmE0D;AlBq1ClE;;AK75CE;EYiBM,yBAJsC;AjBo5C9C;;AiBr5CE;;EASQ,yBARoC;AjBy5C9C;;AiB76CE;;;EAII,yBC2E4D;AlBo2ClE;;AiBn7CE;;;;EAYM,qBCmE0D;AlB22ClE;;AKn7CE;EYiBM,yBAJsC;AjB06C9C;;AiB36CE;;EASQ,yBARoC;AjB+6C9C;;AiBn8CE;;;EAII,yBC2E4D;AlB03ClE;;AiBz8CE;;;;EAYM,qBCmE0D;AlBi4ClE;;AKz8CE;EYiBM,yBAJsC;AjBg8C9C;;AiBj8CE;;EASQ,yBARoC;AjBq8C9C;;AiBz9CE;;;EAII,yBC2E4D;AlBg5ClE;;AiB/9CE;;;;EAYM,qBCmE0D;AlBu5ClE;;AK/9CE;EYiBM,yBAJsC;AjBs9C9C;;AiBv9CE;;EASQ,yBARoC;AjB29C9C;;AiB/+CE;;;EAII,yBC2E4D;AlBs6ClE;;AiBr/CE;;;;EAYM,qBCmE0D;AlB66ClE;;AKr/CE;EYiBM,yBAJsC;AjB4+C9C;;AiB7+CE;;EASQ,yBARoC;AjBi/C9C;;AiBrgDE;;;EAII,yBC2E4D;AlB47ClE;;AiB3gDE;;;;EAYM,qBCmE0D;AlBm8ClE;;AK3gDE;EYiBM,yBAJsC;AjBkgD9C;;AiBngDE;;EASQ,yBARoC;AjBugD9C;;AiB3hDE;;;EAII,yBC2E4D;AlBk9ClE;;AiBjiDE;;;;EAYM,qBCmE0D;AlBy9ClE;;AKjiDE;EYiBM,yBAJsC;AjBwhD9C;;AiBzhDE;;EASQ,yBARoC;AjB6hD9C;;AiBjjDE;;;EAII,sCdQS;AH2iDf;;AKhjDE;EYiBM,sCAJsC;AjBuiD9C;;AiBxiDE;;EASQ,sCARoC;AjB4iD9C;;AgBt9CA;EAGM,Wb3GS;Ea4GT,yBbpGY;EaqGZ,qBb2PqD;AH4tC3D;;AgB59CA;EAWM,cb5GY;Ea6GZ,yBblHY;EamHZ,qBblHY;AHukDlB;;AgBh9CA;EACE,Wb3Ha;Ea4Hb,yBbpHgB;AHukDlB;;AgBr9CA;;;EAOI,qBbuOuD;AH6uC3D;;AgB39CA;EAWI,SAAS;AhBo9Cb;;AgB/9CA;EAgBM,2Cb1IS;AH6lDf;;AKxlDE;EW4IM,WbjJO;EakJP,4CblJO;AHkmDf;;AchiDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhBk8CvC;EgBv8CG;IASK,SAAS;EhBi8CjB;AACF;;Ac5iDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhB88CvC;EgBn9CG;IASK,SAAS;EhB68CjB;AACF;;AcxjDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhB09CvC;EgB/9CG;IASK,SAAS;EhBy9CjB;AACF;;AcpkDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhBs+CvC;EgB3+CG;IASK,SAAS;EhBq+CjB;AACF;;AgBp/CA;EAOQ,cAAc;EACd,WAAW;EACX,gBAAgB;EAChB,iCAAiC;AhBi/CzC;;AgB3/CA;EAcU,SAAS;AhBi/CnB;;AmB9pDA;EACE,cAAc;EACd,WAAW;EACX,mChBqe2H;EgBpe3H,yBhBqXkC;EChQ9B,eAtCY;Ee5EhB,gBhB8Q+B;EgB7Q/B,gBhBkR+B;EgBjR/B,chBDgB;EgBEhB,sBhBTa;EgBUb,4BAA4B;EAC5B,yBhBPgB;EONd,sBPqOgC;EiBpO9B,wEjB4e4F;AHksClG;;AoBzqDI;EDLJ;ICMM,gBAAgB;EpB6qDpB;AACF;;AmBprDA;EAsBI,6BAA6B;EAC7B,SAAS;AnBkqDb;;AqBlrDE;EACE,clBAc;EkBCd,sBlBRW;EkBSX,qBlBgdsE;EkB/ctE,UAAU;EAKR,gDlBcW;AHmqDjB;;AmBjsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA2CI,yBhBxCc;EgB0Cd,UAAU;AnB8pDd;;AmB1pDA;EAOI,chBhDc;EgBiDd,sBhBxDW;AH+sDf;;AmBlpDA;;EAEE,cAAc;EACd,WAAW;AnBqpDb;;AmB3oDA;EACE,iCAA+D;EAC/D,oCAAkE;EAClE,gBAAgB;EfZd,kBAAW;Eecb,gBhB0M+B;AHo8CjC;;AmB3oDA;EACE,+BAAkE;EAClE,kCAAqE;EfoCjE,kBAtCY;EeIhB,gBhBuI+B;AHugDjC;;AmB3oDA;EACE,gCAAkE;EAClE,mCAAqE;Ef6BjE,mBAtCY;EeWhB,gBhBiI+B;AH6gDjC;;AmBroDA;EACE,cAAc;EACd,WAAW;EACX,qBhB8QmC;EgB7QnC,wBhB6QmC;EgB5QnC,gBAAgB;EAChB,gBhB6K+B;EgB5K/B,chBpGgB;EgBqGhB,6BAA6B;EAC7B,yBAAyB;EACzB,mBAAmC;AnBwoDrC;;AmBlpDA;EAcI,gBAAgB;EAChB,eAAe;AnBwoDnB;;AmB5nDA;EACE,kChBsWqI;EgBrWrI,uBhB+PiC;EC1Q7B,mBAtCY;EemDhB,gBhByF+B;EOhO7B,qBPuO+B;AHgiDnC;;AmB5nDA;EACE,gChB+VqI;EgB9VrI,oBhB4PgC;EC/Q5B,kBAtCY;Ee2DhB,gBhBgF+B;EO/N7B,qBPsO+B;AHyiDnC;;AmB3nDA;EAGI,YAAY;AnB4nDhB;;AmBxnDA;EACE,YAAY;AnB2nDd;;AmBnnDA;EACE,mBhBoV0C;AHkyC5C;;AmBnnDA;EACE,cAAc;EACd,mBhBqU4C;AHizC9C;;AmB9mDA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,kBAA0C;EAC1C,iBAAyC;AnBinD3C;;AmBrnDA;;EAQI,kBAA0C;EAC1C,iBAAyC;AnBknD7C;;AmBzmDA;EACE,kBAAkB;EAClB,cAAc;EACd,qBhB0S6C;AHk0C/C;;AmBzmDA;EACE,kBAAkB;EAClB,kBhBsS2C;EgBrS3C,qBhBoS6C;AHw0C/C;;AmB/mDA;EAMI,chBxMc;AHqzDlB;;AmBzmDA;EACE,gBAAgB;AnB4mDlB;;AmBzmDA;EACE,2BAAoB;EAApB,oBAAoB;EACpB,sBAAmB;EAAnB,mBAAmB;EACnB,eAAe;EACf,qBhByR4C;AHm1C9C;;AmBhnDA;EAQI,gBAAgB;EAChB,aAAa;EACb,uBhBoR4C;EgBnR5C,cAAc;AnB4mDlB;;AqBvzDE;EACE,aAAa;EACb,WAAW;EACX,mBlBod0C;EC5a1C,cAAW;EiBtCX,clBSa;AHizDjB;;AqBvzDE;EACE,kBAAkB;EAClB,SAAS;EACT,UAAU;EACV,aAAa;EACb,eAAe;EACf,uBlBsyBqC;EkBryBrC,iBAAiB;EjBmFf,mBAtCY;EiB3Cd,gBlBkP6B;EkBjP7B,WlBxCW;EkByCX,wClBLa;EOtCb,sBPqOgC;AHioDpC;;AqBtzDI;EAEE,qBlBZW;EkBeT,oClBgb2F;EkB/a3F,4PHfmI;EGgBnI,4BAA4B;EAC5B,2DlB+a6F;EkB9a7F,gElB6awF;AHy4ChG;;AqB/zDI;EAaI,qBlBvBS;EkBwBT,gDlBxBS;AH80DjB;;AqBp0DI;;;EAmBI,cAAc;ArBuzDtB;;AqBhzDI;EAGI,oClBwZ2F;EkBvZ3F,kFlByZ6F;AHw5CrG;;AqB3yDI;EAEE,qBlBhDW;EkBmDT,sDlBqe0J;EkBpe1J,6gBAAkJ;ArB2yD1J;;AqBjzDI;EAUI,qBlBxDS;EkByDT,gDlBzDS;AHo2DjB;;AqBtzDI;;;EAgBI,cAAc;ArB4yDtB;;AqBryDI;;;EAII,cAAc;ArBuyDtB;;AqBjyDI;EAGI,clBlFS;AHo3DjB;;AqBryDI;;;EAQI,cAAc;ArBmyDtB;;AqB7xDI;EAGI,clBhGS;AH83DjB;;AqBjyDI;EAMM,qBlBnGO;AHk4DjB;;AqBryDI;;;EAYI,cAAc;ArB+xDtB;;AqB3yDI;EAiBM,qBAAkC;ECnJxC,yBDoJ+C;ArB8xDnD;;AqBhzDI;EAwBM,gDlBrHO;AHi5DjB;;AqBpzDI;EA4BM,qBlBzHO;AHq5DjB;;AqBpxDI;EAGI,qBlBpIS;AHy5DjB;;AqBxxDI;;;EAQI,cAAc;ArBsxDtB;;AqB9xDI;EAaM,qBlB9IO;EkB+IP,gDlB/IO;AHo6DjB;;AqBl7DE;EACE,aAAa;EACb,WAAW;EACX,mBlBod0C;EC5a1C,cAAW;EiBtCX,clBMa;AH+6DjB;;AqBl7DE;EACE,kBAAkB;EAClB,SAAS;EACT,UAAU;EACV,aAAa;EACb,eAAe;EACf,uBlBsyBqC;EkBryBrC,iBAAiB;EjBmFf,mBAtCY;EiB3Cd,gBlBkP6B;EkBjP7B,WlBxCW;EkByCX,wClBRa;EOnCb,sBPqOgC;AH4vDpC;;AqBj7DI;EAEE,qBlBfW;EkBkBT,oClBgb2F;EkB/a3F,sSHfmI;EGgBnI,4BAA4B;EAC5B,2DlB+a6F;EkB9a7F,gElB6awF;AHogDhG;;AqB17DI;EAaI,qBlB1BS;EkB2BT,gDlB3BS;AH48DjB;;AqB/7DI;;;EAmBI,cAAc;ArBk7DtB;;AqB36DI;EAGI,oClBwZ2F;EkBvZ3F,kFlByZ6F;AHmhDrG;;AqBt6DI;EAEE,qBlBnDW;EkBsDT,sDlBqe0J;EkBpe1J,ujBAAkJ;ArBs6D1J;;AqB56DI;EAUI,qBlB3DS;EkB4DT,gDlB5DS;AHk+DjB;;AqBj7DI;;;EAgBI,cAAc;ArBu6DtB;;AqBh6DI;;;EAII,cAAc;ArBk6DtB;;AqB55DI;EAGI,clBrFS;AHk/DjB;;AqBh6DI;;;EAQI,cAAc;ArB85DtB;;AqBx5DI;EAGI,clBnGS;AH4/DjB;;AqB55DI;EAMM,qBlBtGO;AHggEjB;;AqBh6DI;;;EAYI,cAAc;ArB05DtB;;AqBt6DI;EAiBM,qBAAkC;ECnJxC,yBDoJ+C;ArBy5DnD;;AqB36DI;EAwBM,gDlBxHO;AH+gEjB;;AqB/6DI;EA4BM,qBlB5HO;AHmhEjB;;AqB/4DI;EAGI,qBlBvIS;AHuhEjB;;AqBn5DI;;;EAQI,cAAc;ArBi5DtB;;AqBz5DI;EAaM,qBlBjJO;EkBkJP,gDlBlJO;AHkiEjB;;AmBz0DA;EACE,oBAAa;EAAb,aAAa;EACb,uBAAmB;EAAnB,mBAAmB;EACnB,sBAAmB;EAAnB,mBAAmB;AnB40DrB;;AmB/0DA;EASI,WAAW;AnB00Df;;AcxhEI;EKqMJ;IAeM,oBAAa;IAAb,aAAa;IACb,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;IACvB,gBAAgB;EnBy0DpB;EmB31DF;IAuBM,oBAAa;IAAb,aAAa;IACb,kBAAc;IAAd,cAAc;IACd,uBAAmB;IAAnB,mBAAmB;IACnB,sBAAmB;IAAnB,mBAAmB;IACnB,gBAAgB;EnBu0DpB;EmBl2DF;IAgCM,qBAAqB;IACrB,WAAW;IACX,sBAAsB;EnBq0D1B;EmBv2DF;IAuCM,qBAAqB;EnBm0DzB;EmB12DF;;IA4CM,WAAW;EnBk0Df;EmB92DF;IAkDM,oBAAa;IAAb,aAAa;IACb,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;IACvB,WAAW;IACX,eAAe;EnB+zDnB;EmBr3DF;IAyDM,kBAAkB;IAClB,oBAAc;IAAd,cAAc;IACd,aAAa;IACb,qBhB2LwC;IgB1LxC,cAAc;EnB+zDlB;EmB53DF;IAiEM,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;EnB8zD3B;EmBh4DF;IAqEM,gBAAgB;EnB8zDpB;AACF;;AuB/nEA;EACE,qBAAqB;EAErB,gBpBkR+B;EoBjR/B,cpBMgB;EoBLhB,kBAAkB;EAClB,sBAAsB;EACtB,yBAAiB;EAAjB,sBAAiB;EAAjB,qBAAiB;EAAjB,iBAAiB;EACjB,6BAA6B;EAC7B,6BAA2C;ECsF3C,yBrB0RkC;EChQ9B,eAtCY;EoBchB,gBrByL+B;EO3R7B,sBPqOgC;EiBpO9B,qIjBqb6I;AH0tDnJ;;AoB1oEI;EGLJ;IHMM,gBAAgB;EpB8oEpB;AACF;;AK/oEE;EkBQE,cpBJc;EoBKd,qBAAqB;AvB2oEzB;;AuB1pEA;EAoBI,UAAU;EACV,gDpBSa;AHioEjB;;AuB/pEA;EA2BI,apB8Y6B;AH0vDjC;;AuBznEA;;EAEE,oBAAoB;AvB4nEtB;;AuBnnEE;ECrDA,WrBCa;EmBDX,yBnB8Ba;EqB5Bf,qBrB4Be;AHgpEjB;;AKxqEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxBqrE7H;;AwBzqEE;EAMI,gDAAiF;AxBuqEvF;;AwBlqEE;EAEE,WrBvBW;EqBwBX,yBrBKa;EqBJb,qBrBIa;AHgqEjB;;AwB7pEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBssEnN;;AwB1pEI;;EAKI,gDAAiF;AxB0pEzF;;AuBrpEE;ECrDA,WrBCa;EmBDX,yBnBOc;EqBLhB,qBrBKgB;AHysElB;;AK1sEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxButE7H;;AwB3sEE;EAMI,iDAAiF;AxBysEvF;;AwBpsEE;EAEE,WrBvBW;EqBwBX,yBrBlBc;EqBmBd,qBrBnBc;AHytElB;;AwB/rEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBwuEnN;;AwB5rEI;;EAKI,iDAAiF;AxB4rEzF;;AuBvrEE;ECrDA,WrBCa;EmBDX,yBnBqCa;EqBnCf,qBrBmCe;AH6sEjB;;AK5uEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxByvE7H;;AwB7uEE;EAMI,+CAAiF;AxB2uEvF;;AwBtuEE;EAEE,WrBvBW;EqBwBX,yBrBYa;EqBXb,qBrBWa;AH6tEjB;;AwBjuEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxB0wEnN;;AwB9tEI;;EAKI,+CAAiF;AxB8tEzF;;AuBztEE;ECrDA,WrBCa;EmBDX,yBnBuCa;EqBrCf,qBrBqCe;AH6uEjB;;AK9wEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxB2xE7H;;AwB/wEE;EAMI,gDAAiF;AxB6wEvF;;AwBxwEE;EAEE,WrBvBW;EqBwBX,yBrBca;EqBbb,qBrBaa;AH6vEjB;;AwBnwEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxB4yEnN;;AwBhwEI;;EAKI,gDAAiF;AxBgwEzF;;AuB3vEE;ECrDA,crBUgB;EmBVd,yBnBoCa;EqBlCf,qBrBkCe;AHkxEjB;;AKhzEE;EmBAE,crBIc;EmBVd,yBEDoF;EASpF,qBATyH;AxB6zE7H;;AwBjzEE;EAMI,gDAAiF;AxB+yEvF;;AwB1yEE;EAEE,crBdc;EqBed,yBrBWa;EqBVb,qBrBUa;AHkyEjB;;AwBryEE;;EAGE,crB1Bc;EqB2Bd,yBAtCuK;EA0CvK,qBA1C+M;AxB80EnN;;AwBlyEI;;EAKI,gDAAiF;AxBkyEzF;;AuB7xEE;ECrDA,WrBCa;EmBDX,yBnBkCa;EqBhCf,qBrBgCe;AHszEjB;;AKl1EE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxB+1E7H;;AwBn1EE;EAMI,+CAAiF;AxBi1EvF;;AwB50EE;EAEE,WrBvBW;EqBwBX,yBrBSa;EqBRb,qBrBQa;AHs0EjB;;AwBv0EE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBg3EnN;;AwBp0EI;;EAKI,+CAAiF;AxBo0EzF;;AuB/zEE;ECrDA,crBUgB;EmBVd,yBnBEc;EqBAhB,qBrBAgB;AHw3ElB;;AKp3EE;EmBAE,crBIc;EmBVd,yBEDoF;EASpF,qBATyH;AxBi4E7H;;AwBr3EE;EAMI,iDAAiF;AxBm3EvF;;AwB92EE;EAEE,crBdc;EqBed,yBrBvBc;EqBwBd,qBrBxBc;AHw4ElB;;AwBz2EE;;EAGE,crB1Bc;EqB2Bd,yBAtCuK;EA0CvK,qBA1C+M;AxBk5EnN;;AwBt2EI;;EAKI,iDAAiF;AxBs2EzF;;AuBj2EE;ECrDA,WrBCa;EmBDX,yBnBSc;EqBPhB,qBrBOgB;AHm5ElB;;AKt5EE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxBm6E7H;;AwBv5EE;EAMI,8CAAiF;AxBq5EvF;;AwBh5EE;EAEE,WrBvBW;EqBwBX,yBrBhBc;EqBiBd,qBrBjBc;AHm6ElB;;AwB34EE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBo7EnN;;AwBx4EI;;EAKI,8CAAiF;AxBw4EzF;;AuB73EE;ECJA,crBzBe;EqB0Bf,qBrB1Be;AH+5EjB;;AKv7EE;EmBqDE,WrB1DW;EqB2DX,yBrB9Ba;EqB+Bb,qBrB/Ba;AHq6EjB;;AwBn4EE;EAEE,+CrBpCa;AHy6EjB;;AwBl4EE;EAEE,crBzCa;EqB0Cb,6BAA6B;AxBo4EjC;;AwBj4EE;;EAGE,WrB7EW;EqB8EX,yBrBjDa;EqBkDb,qBrBlDa;AHq7EjB;;AwBj4EI;;EAKI,+CrBzDS;AH07EjB;;AuB75EE;ECJA,crBhDgB;EqBiDhB,qBrBjDgB;AHs9ElB;;AKv9EE;EmBqDE,WrB1DW;EqB2DX,yBrBrDc;EqBsDd,qBrBtDc;AH49ElB;;AwBn6EE;EAEE,iDrB3Dc;AHg+ElB;;AwBl6EE;EAEE,crBhEc;EqBiEd,6BAA6B;AxBo6EjC;;AwBj6EE;;EAGE,WrB7EW;EqB8EX,yBrBxEc;EqByEd,qBrBzEc;AH4+ElB;;AwBj6EI;;EAKI,iDrBhFU;AHi/ElB;;AuB77EE;ECJA,crBlBe;EqBmBf,qBrBnBe;AHw9EjB;;AKv/EE;EmBqDE,WrB1DW;EqB2DX,yBrBvBa;EqBwBb,qBrBxBa;AH89EjB;;AwBn8EE;EAEE,+CrB7Ba;AHk+EjB;;AwBl8EE;EAEE,crBlCa;EqBmCb,6BAA6B;AxBo8EjC;;AwBj8EE;;EAGE,WrB7EW;EqB8EX,yBrB1Ca;EqB2Cb,qBrB3Ca;AH8+EjB;;AwBj8EI;;EAKI,+CrBlDS;AHm/EjB;;AuB79EE;ECJA,crBhBe;EqBiBf,qBrBjBe;AHs/EjB;;AKvhFE;EmBqDE,WrB1DW;EqB2DX,yBrBrBa;EqBsBb,qBrBtBa;AH4/EjB;;AwBn+EE;EAEE,gDrB3Ba;AHggFjB;;AwBl+EE;EAEE,crBhCa;EqBiCb,6BAA6B;AxBo+EjC;;AwBj+EE;;EAGE,WrB7EW;EqB8EX,yBrBxCa;EqByCb,qBrBzCa;AH4gFjB;;AwBj+EI;;EAKI,gDrBhDS;AHihFjB;;AuB7/EE;ECJA,crBnBe;EqBoBf,qBrBpBe;AHyhFjB;;AKvjFE;EmBqDE,crBjDc;EqBkDd,yBrBxBa;EqByBb,qBrBzBa;AH+hFjB;;AwBngFE;EAEE,+CrB9Ba;AHmiFjB;;AwBlgFE;EAEE,crBnCa;EqBoCb,6BAA6B;AxBogFjC;;AwBjgFE;;EAGE,crBpEc;EqBqEd,yBrB3Ca;EqB4Cb,qBrB5Ca;AH+iFjB;;AwBjgFI;;EAKI,+CrBnDS;AHojFjB;;AuB7hFE;ECJA,crBrBe;EqBsBf,qBrBtBe;AH2jFjB;;AKvlFE;EmBqDE,WrB1DW;EqB2DX,yBrB1Ba;EqB2Bb,qBrB3Ba;AHikFjB;;AwBniFE;EAEE,+CrBhCa;AHqkFjB;;AwBliFE;EAEE,crBrCa;EqBsCb,6BAA6B;AxBoiFjC;;AwBjiFE;;EAGE,WrB7EW;EqB8EX,yBrB7Ca;EqB8Cb,qBrB9Ca;AHilFjB;;AwBjiFI;;EAKI,+CrBrDS;AHslFjB;;AuB7jFE;ECJA,crBrDgB;EqBsDhB,qBrBtDgB;AH2nFlB;;AKvnFE;EmBqDE,crBjDc;EqBkDd,yBrB1Dc;EqB2Dd,qBrB3Dc;AHioFlB;;AwBnkFE;EAEE,iDrBhEc;AHqoFlB;;AwBlkFE;EAEE,crBrEc;EqBsEd,6BAA6B;AxBokFjC;;AwBjkFE;;EAGE,crBpEc;EqBqEd,yBrB7Ec;EqB8Ed,qBrB9Ec;AHipFlB;;AwBjkFI;;EAKI,iDrBrFU;AHspFlB;;AuB7lFE;ECJA,crB9CgB;EqB+ChB,qBrB/CgB;AHopFlB;;AKvpFE;EmBqDE,WrB1DW;EqB2DX,yBrBnDc;EqBoDd,qBrBpDc;AH0pFlB;;AwBnmFE;EAEE,8CrBzDc;AH8pFlB;;AwBlmFE;EAEE,crB9Dc;EqB+Dd,6BAA6B;AxBomFjC;;AwBjmFE;;EAGE,WrB7EW;EqB8EX,yBrBtEc;EqBuEd,qBrBvEc;AH0qFlB;;AwBjmFI;;EAKI,8CrB9EU;AH+qFlB;;AuBlnFA;EACE,gBpB8M+B;EoB7M/B,cpB1Ce;EoB2Cf,qBpB6F4C;AHwhF9C;;AKxrFE;EkBsEE,cpB2F8D;EoB1F9D,0BpB2F+C;AH2hFnD;;AuB7nFA;EAYI,0BpBsF+C;EoBrF/C,gBAAgB;AvBqnFpB;;AuBloFA;EAkBI,cpBjFc;EoBkFd,oBAAoB;AvBonFxB;;AuBzmFA;ECLE,oBrBySgC;EC/Q5B,kBAtCY;EoBchB,gBrB6H+B;EO/N7B,qBPsO+B;AH++EnC;;AuB5mFA;ECTE,uBrBoSiC;EC1Q7B,mBAtCY;EoBchB,gBrB8H+B;EOhO7B,qBPuO+B;AHq/EnC;;AuB1mFA;EACE,cAAc;EACd,WAAW;AvB6mFb;;AuB/mFA;EAMI,kBpBuT+B;AHszEnC;;AuBxmFA;;;EAII,WAAW;AvB0mFf;;AyBhvFA;ELMM,gCjBsP2C;AHw/EjD;;AoBzuFI;EKXJ;ILYM,gBAAgB;EpB6uFpB;AACF;;AyB1vFA;EAII,UAAU;AzB0vFd;;AyBtvFA;EAEI,aAAa;AzBwvFjB;;AyBpvFA;EACE,kBAAkB;EAClB,SAAS;EACT,gBAAgB;ELXZ,6BjBuPwC;AH4gF9C;;AoB9vFI;EKGJ;ILFM,gBAAgB;EpBkwFpB;AACF;;A0B9wFA;;;;EAIE,kBAAkB;A1BixFpB;;A0B9wFA;EACE,mBAAmB;A1BixFrB;;A2B7vFI;EACE,qBAAqB;EACrB,oBxB0N0C;EwBzN1C,uBxBwN0C;EwBvN1C,WAAW;EAhCf,uBAA8B;EAC9B,qCAA4C;EAC5C,gBAAgB;EAChB,oCAA2C;A3BiyF7C;;A2B5uFI;EACE,cAAc;A3B+uFpB;;A0BzxFA;EACE,kBAAkB;EAClB,SAAS;EACT,OAAO;EACP,avBipBsC;EuBhpBtC,aAAa;EACb,WAAW;EACX,gBvButBuC;EuBttBvC,iBAA8B;EAC9B,oBAA4B;EtBsGxB,eAtCY;EsB9DhB,cvBXgB;EuBYhB,gBAAgB;EAChB,gBAAgB;EAChB,sBvBvBa;EuBwBb,4BAA4B;EAC5B,qCvBfa;EOZX,sBPqOgC;AHmlFpC;;A0BpxFI;EACE,WAAW;EACX,OAAO;A1BuxFb;;A0BpxFI;EACE,QAAQ;EACR,UAAU;A1BuxFhB;;Ac3wFI;EYnBA;IACE,WAAW;IACX,OAAO;E1BkyFX;E0B/xFE;IACE,QAAQ;IACR,UAAU;E1BiyFd;AACF;;ActxFI;EYnBA;IACE,WAAW;IACX,OAAO;E1B6yFX;E0B1yFE;IACE,QAAQ;IACR,UAAU;E1B4yFd;AACF;;AcjyFI;EYnBA;IACE,WAAW;IACX,OAAO;E1BwzFX;E0BrzFE;IACE,QAAQ;IACR,UAAU;E1BuzFd;AACF;;Ac5yFI;EYnBA;IACE,WAAW;IACX,OAAO;E1Bm0FX;E0Bh0FE;IACE,QAAQ;IACR,UAAU;E1Bk0Fd;AACF;;A0B5zFA;EAEI,SAAS;EACT,YAAY;EACZ,aAAa;EACb,uBvBorBuC;AH0oE3C;;A2B71FI;EACE,qBAAqB;EACrB,oBxB0N0C;EwBzN1C,uBxBwN0C;EwBvN1C,WAAW;EAzBf,aAAa;EACb,qCAA4C;EAC5C,0BAAiC;EACjC,oCAA2C;A3B03F7C;;A2B50FI;EACE,cAAc;A3B+0FpB;;A0Br0FA;EAEI,MAAM;EACN,WAAW;EACX,UAAU;EACV,aAAa;EACb,qBvBsqBuC;AHiqE3C;;A2Bp3FI;EACE,qBAAqB;EACrB,oBxB0N0C;EwBzN1C,uBxBwN0C;EwBvN1C,WAAW;EAlBf,mCAA0C;EAC1C,eAAe;EACf,sCAA6C;EAC7C,wBAA+B;A3B04FjC;;A2Bn2FI;EACE,cAAc;A3Bs2FpB;;A2Bn4FI;EDmDE,iBAAiB;A1Bo1FvB;;A0B/0FA;EAEI,MAAM;EACN,WAAW;EACX,UAAU;EACV,aAAa;EACb,sBvBqpBuC;AH4rE3C;;A2B/4FI;EACE,qBAAqB;EACrB,oBxB0N0C;EwBzN1C,uBxBwN0C;EwBvN1C,WAAW;A3Bk5FjB;;A2Bt5FI;EAgBI,aAAa;A3B04FrB;;A2Bv4FM;EACE,qBAAqB;EACrB,qBxBuMwC;EwBtMxC,uBxBqMwC;EwBpMxC,WAAW;EA9BjB,mCAA0C;EAC1C,yBAAgC;EAChC,sCAA6C;A3By6F/C;;A2Bx4FI;EACE,cAAc;A3B24FpB;;A2Br5FM;EDiDA,iBAAiB;A1Bw2FvB;;A0Bj2FA;EAKI,WAAW;EACX,YAAY;A1Bg2FhB;;A0B31FA;EE9GE,SAAS;EACT,gBAAmB;EACnB,gBAAgB;EAChB,6BzBCgB;AH48FlB;;A0B31FA;EACE,cAAc;EACd,WAAW;EACX,uBvByoBwC;EuBxoBxC,WAAW;EACX,gBvB4J+B;EuB3J/B,cvBhHgB;EuBiHhB,mBAAmB;EACnB,mBAAmB;EACnB,6BAA6B;EAC7B,SAAS;A1B81FX;;AKl9FE;EqBmIE,cvB0mBqD;EuBzmBrD,qBAAqB;EJ9IrB,yBnBEc;AHg+FlB;;A0B92FA;EAgCI,WvBnJW;EuBoJX,qBAAqB;EJrJrB,yBnB8Ba;AH08FjB;;A0Bp3FA;EAuCI,cvBpJc;EuBqJd,oBAAoB;EACpB,6BAA6B;A1Bi1FjC;;A0Bz0FA;EACE,cAAc;A1B40FhB;;A0Bx0FA;EACE,cAAc;EACd,sBvBolBwC;EuBnlBxC,gBAAgB;EtBpDZ,mBAtCY;EsB4FhB,cvBxKgB;EuByKhB,mBAAmB;A1B20FrB;;A0Bv0FA;EACE,cAAc;EACd,uBvB0kBwC;EuBzkBxC,cvB7KgB;AHu/FlB;;A6BpgGA;;EAEE,kBAAkB;EAClB,2BAAoB;EAApB,oBAAoB;EACpB,sBAAsB;A7BugGxB;;A6B3gGA;;EAOI,kBAAkB;EAClB,kBAAc;EAAd,cAAc;A7BygGlB;;AKxgGE;;EwBII,UAAU;A7BygGhB;;A6BthGA;;;;EAkBM,UAAU;A7B2gGhB;;A6BrgGA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,oBAA2B;EAA3B,2BAA2B;A7BwgG7B;;A6B3gGA;EAMI,WAAW;A7BygGf;;A6BrgGA;;EAII,iB1B8L6B;AHw0FjC;;A6B1gGA;;EnBhBI,0BmB0B8B;EnBzB9B,6BmByB8B;A7BsgGlC;;A6BhhGA;;EnBFI,yBmBiB6B;EnBhB7B,4BmBgB6B;A7BugGjC;;A6Bv/FA;EACE,wBAAmC;EACnC,uBAAkC;A7B0/FpC;;A6B5/FA;;;EAOI,cAAc;A7B2/FlB;;A6Bx/FE;EACE,eAAe;A7B2/FnB;;A6Bv/FA;EACE,uBAAsC;EACtC,sBAAqC;A7B0/FvC;;A6Bv/FA;EACE,sBAAsC;EACtC,qBAAqC;A7B0/FvC;;A6Bt+FA;EACE,0BAAsB;EAAtB,sBAAsB;EACtB,qBAAuB;EAAvB,uBAAuB;EACvB,qBAAuB;EAAvB,uBAAuB;A7By+FzB;;A6B5+FA;;EAOI,WAAW;A7B0+Ff;;A6Bj/FA;;EAYI,gB1B6G6B;AH63FjC;;A6Bt/FA;;EnBlFI,6BmBoG+B;EnBnG/B,4BmBmG+B;A7B0+FnC;;A6B5/FA;;EnBhGI,yBmBuH4B;EnBtH5B,0BmBsH4B;A7B2+FhC;;A6B19FA;;EAGI,gBAAgB;A7B49FpB;;A6B/9FA;;;;EAOM,kBAAkB;EAClB,sBAAsB;EACtB,oBAAoB;A7B+9F1B;;A8BxnGA;EACE,kBAAkB;EAClB,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,uBAAoB;EAApB,oBAAoB;EACpB,WAAW;A9B2nGb;;A8BhoGA;;;;EAWI,kBAAkB;EAClB,kBAAc;EAAd,cAAc;EAGd,SAAS;EACT,gBAAgB;A9B0nGpB;;A8B1oGA;;;;;;;;;;;;EAqBM,iB3B4M2B;AHw7FjC;;A8BzpGA;;;EA6BI,UAAU;A9BkoGd;;A8B/pGA;EAkCI,UAAU;A9BioGd;;A8BnqGA;;EpBeI,0BoBwBmD;EpBvBnD,6BoBuBmD;A9BkoGvD;;A8BzqGA;;EpB6BI,yBoBWmD;EpBVnD,4BoBUmD;A9BuoGvD;;A8B/qGA;EA8CI,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;A9BqoGvB;;A8BprGA;;EpBeI,0BoBmC6E;EpBlC7E,6BoBkC6E;A9BwoGjF;;A8B1rGA;EpB6BI,yBoBsBsE;EpBrBtE,4BoBqBsE;A9B4oG1E;;A8BjoGA;;EAEE,oBAAa;EAAb,aAAa;A9BooGf;;A8BtoGA;;EAQI,kBAAkB;EAClB,UAAU;A9BmoGd;;A8B5oGA;;EAYM,UAAU;A9BqoGhB;;A8BjpGA;;;;;;;;EAoBI,iB3B+I6B;AHy/FjC;;A8BpoGA;EAAuB,kB3B2IU;AH6/FjC;;A8BvoGA;EAAsB,iB3B0IW;AHigGjC;;A8BnoGA;EACE,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;EACnB,yB3BuRkC;E2BtRlC,gBAAgB;E1BsBZ,eAtCY;E0BkBhB,gB3BgL+B;E2B/K/B,gB3BoL+B;E2BnL/B,c3B/FgB;E2BgGhB,kBAAkB;EAClB,mBAAmB;EACnB,yB3BvGgB;E2BwGhB,yB3BtGgB;EONd,sBPqOgC;AH8gGpC;;A8BnpGA;;EAkBI,aAAa;A9BsoGjB;;A8B5nGA;;EAEE,gC3B6WqI;AHkxFvI;;A8B5nGA;;;;;;EAME,oB3BkQgC;EC/Q5B,kBAtCY;E0BqDhB,gB3BsF+B;EO/N7B,qBPsO+B;AHmiGnC;;A8B5nGA;;EAEE,kC3B2VqI;AHoyFvI;;A8B5nGA;;;;;;EAME,uB3B4OiC;EC1Q7B,mBAtCY;E0BsEhB,gB3BsE+B;EOhO7B,qBPuO+B;AHmjGnC;;A8B5nGA;;EAEE,sBAA0E;A9B+nG5E;;A8BpnGA;;;;;;EpB3JI,0BoBiK4B;EpBhK5B,6BoBgK4B;A9BwnGhC;;A8BrnGA;;;;;;EpBtJI,yBoB4J2B;EpB3J3B,4BoB2J2B;A9BynG/B;;A+B/yGA;EACE,kBAAkB;EAClB,cAAc;EACd,kBAA+C;EAC/C,oBAAqE;A/BkzGvE;;A+B/yGA;EACE,2BAAoB;EAApB,oBAAoB;EACpB,kB5Bqf0C;AH6zF5C;;A+B/yGA;EACE,kBAAkB;EAClB,WAAW;EACX,UAAU;A/BkzGZ;;A+BrzGA;EAMI,W5BpBW;E4BqBX,qB5BQa;EmB9Bb,yBnB8Ba;AH4yGjB;;A+B3zGA;EAiBM,gD5BFW;AHgzGjB;;A+B/zGA;EAsBI,qB5BqbsE;AHw3F1E;;A+Bn0GA;EA0BI,W5BxCW;E4ByCX,yB5B8e8E;E4B7e9E,qB5B6e8E;AHg0FlF;;A+Bz0GA;EAkCM,c5B1CY;AHq1GlB;;A+B70GA;EAqCQ,yB5BjDU;AH61GlB;;A+BlyGA;EACE,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;A/BqyGrB;;A+BxyGA;EAOI,kBAAkB;EAClB,YAA+E;EAC/E,aAA+D;EAC/D,cAAc;EACd,W5B0bwC;E4BzbxC,Y5BybwC;E4BxbxC,oBAAoB;EACpB,WAAW;EACX,sB5B5EW;E4B6EX,yB5BmJ6B;AHkpGjC;;A+BrzGA;EAsBI,kBAAkB;EAClB,YAA+E;EAC/E,aAA+D;EAC/D,cAAc;EACd,W5B2awC;E4B1axC,Y5B0awC;E4BzaxC,WAAW;EACX,mCAAgE;A/BmyGpE;;A+B1xGA;ErBrGI,sBPqOgC;AH8pGpC;;A+B9xGA;EAOM,6MbrEqI;AlBg2G3I;;A+BlyGA;EAaM,qB5BnFW;EmB9Bb,yBnB8Ba;AH62GjB;;A+BvyGA;EAkBM,0JbhFqI;AlBy2G3I;;A+B3yGA;EAwBM,wC5B9FW;AHq3GjB;;A+B/yGA;EA2BM,wC5BjGW;AHy3GjB;;A+B/wGA;EAGI,kB5B0Z+C;AHs3FnD;;A+BnxGA;EAQM,uJb1GqI;AlBy3G3I;;A+BvxGA;EAcM,wC5BxHW;AHq4GjB;;A+BnwGA;EACE,qBAA2D;A/BswG7D;;A+BvwGA;EAKM,cAAqD;EACrD,c5BkY+E;E4BjY/E,mBAAmB;EAEnB,qB5BgY4E;AHq4FlF;;A+B9wGA;EAaM,wBAA0I;EAC1I,0BAA+G;EAC/G,uB5B2XiI;E4B1XjI,wB5B0XiI;E4BzXjI,yB5B3KY;E4B6KZ,qB5BsX4E;EiBziB5E,iJjB8f+H;EiB9f/H,yIjB8f+H;EiB9f/H,8KjB8f+H;AH07FrI;;AoBn7GI;EW2JJ;IX1JM,gBAAgB;EpBu7GpB;AACF;;A+B9xGA;EA0BM,sB5BzLS;E4B0LT,sCAA4E;EAA5E,8BAA4E;A/BwwGlF;;A+BnyGA;EAiCM,wC5BnKW;AHy6GjB;;A+B1vGA;EACE,qBAAqB;EACrB,WAAW;EACX,mC5BwR2H;E4BvR3H,0C5BwKkC;EChQ9B,eAtCY;E2BiIhB,gB5BiE+B;E4BhE/B,gB5BqE+B;E4BpE/B,c5B9MgB;E4B+MhB,sBAAsB;EACtB,6M5BmWmI;E4BlWnI,sB5BxNa;E4ByNb,yB5BrNgB;EONd,sBPqOgC;E4BPlC,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/B2vGlB;;A+B3wGA;EAmBI,qB5B0PsE;E4BzPtE,UAAU;EAIR,gD5BvMW;AHg8GjB;;A+BjxGA;EAiCM,c5BtOY;E4BuOZ,sB5B9OS;AHk+Gf;;A+BtxGA;EAwCI,YAAY;EACZ,sB5BmIgC;E4BlIhC,sBAAsB;A/BkvG1B;;A+B5xGA;EA8CI,c5BpPc;E4BqPd,yB5BzPc;AH2+GlB;;A+BjyGA;EAoDI,aAAa;A/BivGjB;;A+B7uGA;EACE,kC5BmOqI;E4BlOrI,oB5B2HkC;E4B1HlC,uB5B0HkC;E4BzHlC,oB5B0HiC;EC1Q7B,mBAtCY;AJu6GlB;;A+B7uGA;EACE,gC5B4NqI;E4B3NrI,mB5BwHiC;E4BvHjC,sB5BuHiC;E4BtHjC,kB5BuHgC;EC/Q5B,kBAtCY;AJ+6GlB;;A+BxuGA;EACE,kBAAkB;EAClB,qBAAqB;EACrB,WAAW;EACX,mC5B0M2H;E4BzM3H,gBAAgB;A/B2uGlB;;A+BxuGA;EACE,kBAAkB;EAClB,UAAU;EACV,WAAW;EACX,mC5BkM2H;E4BjM3H,SAAS;EACT,UAAU;A/B2uGZ;;A+BjvGA;EASI,qB5B+KsE;E4B9KtE,gD5B9Qa;AH0/GjB;;A+BtvGA;EAcI,yB5B7Sc;AHyhHlB;;A+B1vGA;EAmBM,iB5BqUQ;AHs6Fd;;A+B9vGA;EAwBI,0BAA0B;A/B0uG9B;;A+BtuGA;EACE,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,OAAO;EACP,UAAU;EACV,mC5BoK2H;E4BnK3H,yB5BoDkC;E4BlDlC,gB5BlD+B;E4BmD/B,gB5B9C+B;E4B+C/B,c5BjUgB;E4BkUhB,sB5BzUa;E4B0Ub,yB5BtUgB;EONd,sBPqOgC;AHg1GpC;;A+BtvGA;EAkBI,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,UAAU;EACV,cAAc;EACd,6B5B8I+F;E4B7I/F,yB5BkCgC;E4BjChC,gB5B9D6B;E4B+D7B,c5BjVc;E4BkVd,iBAAiB;ET1VjB,yBnBGc;E4ByVd,oBAAoB;ErB7VpB,kCqB8VgF;A/BwuGpF;;A+B9tGA;EACE,WAAW;EACX,2BAA+F;EAC/F,UAAU;EACV,6BAA6B;EAC7B,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/BiuGlB;;A+BtuGA;EAQI,aAAa;A/BkuGjB;;A+B1uGA;EAY8B,gE5BrVb;AHujHjB;;A+B9uGA;EAa8B,gE5BtVb;AH2jHjB;;A+BlvGA;EAc8B,gE5BvVb;AH+jHjB;;A+BtvGA;EAkBI,SAAS;A/BwuGb;;A+B1vGA;EAsBI,W5B8N6C;E4B7N7C,Y5B6N6C;E4B5N7C,oBAAyE;ET/XzE,yBnB8Ba;E4BmWb,S5B6N0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4BzHjI,wBAAgB;EAAhB,gBAAgB;A/BuuGpB;;AoBvmHI;EWkWJ;IXjWM,gBAAgB;EpB2mHpB;AACF;;A+B3wGA;ETvWI,yBnBmmB2E;AHmhG/E;;A+B/wGA;EAsCI,W5BuMoC;E4BtMpC,c5BuMqC;E4BtMrC,kBAAkB;EAClB,e5BsMuC;E4BrMvC,yB5B7Yc;E4B8Yd,yBAAyB;ErBnZzB,mBPylBoC;AHwiGxC;;A+BzxGA;EAiDI,W5BmM6C;E4BlM7C,Y5BkM6C;EmB3lB7C,yBnB8Ba;E4B6Xb,S5BmM0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4B/FjI,qBAAgB;EAAhB,gBAAgB;A/B2uGpB;;AoBroHI;EWkWJ;IXjWM,gBAAgB;EpByoHpB;AACF;;A+BzyGA;ETvWI,yBnBmmB2E;AHijG/E;;A+B7yGA;EAgEI,W5B6KoC;E4B5KpC,c5B6KqC;E4B5KrC,kBAAkB;EAClB,e5B4KuC;E4B3KvC,yB5Bvac;E4Bwad,yBAAyB;ErB7azB,mBPylBoC;AHskGxC;;A+BvzGA;EA2EI,W5ByK6C;E4BxK7C,Y5BwK6C;E4BvK7C,aAAa;EACb,oB5BvD+B;E4BwD/B,mB5BxD+B;EmB9X/B,yBnB8Ba;E4B0Zb,S5BsK0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4BlEjI,gBAAgB;A/B+uGpB;;AoBtqHI;EWkWJ;IXjWM,gBAAgB;EpB0qHpB;AACF;;A+B10GA;ETvWI,yBnBmmB2E;AHklG/E;;A+B90GA;EA6FI,W5BgJoC;E4B/IpC,c5BgJqC;E4B/IrC,kBAAkB;EAClB,e5B+IuC;E4B9IvC,6BAA6B;EAC7B,yBAAyB;EACzB,oBAA4C;A/BqvGhD;;A+Bx1GA;EAwGI,yB5B3cc;EOLd,mBPylBoC;AH4mGxC;;A+B71GA;EA6GI,kBAAkB;EAClB,yB5Bjdc;EOLd,mBPylBoC;AHknGxC;;A+Bn2GA;EAoHM,yB5BrdY;AHwsHlB;;A+Bv2GA;EAwHM,eAAe;A/BmvGrB;;A+B32GA;EA4HM,yB5B7dY;AHgtHlB;;A+B/2GA;EAgIM,eAAe;A/BmvGrB;;A+Bn3GA;EAoIM,yB5BreY;AHwtHlB;;A+B9uGA;;;EXhfM,4GjB8f+H;AHsuGrI;;AoB/tHI;EW2eJ;;;IX1eM,gBAAgB;EpBquHpB;AACF;;AgC7uHA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,gBAAgB;AhCgvHlB;;AgC7uHA;EACE,cAAc;EACd,oB7BkqBsC;AH8kGxC;;AK/uHE;E2BEE,qBAAqB;AhCivHzB;;AgCtvHA;EAUI,c7BVc;E6BWd,oBAAoB;EACpB,eAAe;AhCgvHnB;;AgCxuHA;EACE,gC7BxBgB;AHmwHlB;;AgC5uHA;EAII,mB7BkM6B;AH0iHjC;;AgChvHA;EAQI,6BAAgD;EtB3BhD,+BP4NgC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9BzMS;AH+lIf;;AiCh7HA;EA+BI,yB9B9MW;E8B+MX,gC9B/MW;AHomIf;;AiCr7HA;EAoCI,wP9B6fsR;AHw5G1R;;AiCz7HA;EAwCI,yB9BvNW;AH4mIf;;AiC77HA;EA0CM,yB9BzNS;AHgnIf;;AKjnIE;E4B6NM,yB9B5NO;AHonIf;;AiCj5HA;EAEI,W9B/OW;AHkoIf;;AKznIE;E4ByOI,W9BlPS;AHsoIf;;AiCz5HA;EAWM,+B9BxPS;AH0oIf;;AKjoIE;E4BkPM,gC9B3PO;AH8oIf;;AiCj6HA;EAkBQ,gC9B/PO;AHkpIf;;AiCr6HA;;;;EA0BM,W9BvQS;AHypIf;;AiC56HA;EA+BI,+B9B5QW;E8B6QX,sC9B7QW;AH8pIf;;AiCj7HA;EAoCI,8P9BkcqR;AH+8GzR;;AiCr7HA;EAwCI,+B9BrRW;AHsqIf;;AiCz7HA;EA0CM,W9BvRS;AH0qIf;;AKjqIE;E4BiRM,W9B1RO;AH8qIf;;AkCjrIA;EACE,kBAAkB;EAClB,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EACtB,YAAY;EACZ,qBAAqB;EACrB,sB/BHa;E+BIb,2BAA2B;EAC3B,sC/BKa;EOZX,sBPqOgC;AHu9HpC;;AkC7rIA;EAYI,eAAe;EACf,cAAc;AlCqrIlB;;AkClsIA;ExBUI,+BP4NgC;EO3NhC,gCP2NgC;AHi+HpC;;AkCvsIA;ExBwBI,mCP8MgC;EO7MhC,kCP6MgC;AHs+HpC;;AkC/qIA;EAGE,kBAAc;EAAd,cAAc;EACd,gB/B+wByC;AHi6G3C;;AkC5qIA;EACE,sB/BywBwC;AHs6G1C;;AkC5qIA;EACE,qBAA+B;EAC/B,gBAAgB;AlC+qIlB;;AkC5qIA;EACE,gBAAgB;AlC+qIlB;;AKttIE;E6B4CE,qBAAqB;AlC8qIzB;;AkChrIA;EAMI,oB/BwvBuC;AHs7G3C;;AkCtqIA;EACE,wB/B+uByC;E+B9uBzC,gBAAgB;EAEhB,qC/BvDa;E+BwDb,6C/BxDa;AHguIf;;AkC7qIA;ExB/DI,0DwBuE8E;AlCyqIlF;;AkCjrIA;EAaM,aAAa;AlCwqInB;;AkCnqIA;EACE,wB/B6tByC;E+B5tBzC,qC/BvEa;E+BwEb,0C/BxEa;AH8uIf;;AkCzqIA;ExBjFI,0DPmzBoF;AH28GxF;;AkC9pIA;EACE,uBAAiC;EACjC,uB/B4sBwC;E+B3sBxC,sBAAgC;EAChC,gBAAgB;AlCiqIlB;;AkC9pIA;EACE,uBAAiC;EACjC,sBAAgC;AlCiqIlC;;AkC7pIA;EACE,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,OAAO;EACP,gB/BssByC;AH09G3C;;AkC7pIA;EACE,WAAW;ExBvHT,kCPmzBoF;AHq+GxF;;AkC5pIA;EACE,WAAW;ExBpHT,2CP0yBoF;EOzyBpF,4CPyyBoF;AH2+GxF;;AkC7pIA;EACE,WAAW;ExB3GT,+CP4xBoF;EO3xBpF,8CP2xBoF;AHi/GxF;;AkC3pIA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;AlC8pIxB;;AkChqIA;EAKI,mB/B6qBsD;AHk/G1D;;ActvII;EoBkFJ;IASI,uBAAmB;IAAnB,mBAAmB;IACnB,mB/BwqBsD;I+BvqBtD,kB/BuqBsD;EHy/GxD;EkC3qIF;IAcM,oBAAa;IAAb,aAAa;IAEb,gBAAY;IAAZ,YAAY;IACZ,0BAAsB;IAAtB,sBAAsB;IACtB,kB/BgqBoD;I+B/pBpD,gBAAgB;IAChB,iB/B8pBoD;EHigHxD;AACF;;AkCtpIA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;AlCypIxB;;AkC3pIA;EAOI,mB/B6oBsD;AH2gH1D;;Ac/wII;EoBgHJ;IAWI,uBAAmB;IAAnB,mBAAmB;ElCypIrB;EkCpqIF;IAgBM,gBAAY;IAAZ,YAAY;IACZ,gBAAgB;ElCupIpB;EkCxqIF;IAoBQ,cAAc;IACd,cAAc;ElCupIpB;EkC5qIF;IxBvJI,0BwBkLoC;IxBjLpC,6BwBiLoC;ElCqpItC;EkChrIF;;IAgCY,0BAA0B;ElCopIpC;EkCprIF;;IAqCY,6BAA6B;ElCmpIvC;EkCxrIF;IxBzII,yBwBmLmC;IxBlLnC,4BwBkLmC;ElCkpIrC;EkC5rIF;;IA+CY,yBAAyB;ElCipInC;EkChsIF;;IAoDY,4BAA4B;ElCgpItC;AACF;;AkCpoIA;EAEI,sB/BokBsC;AHkkH1C;;AczzII;EoBiLJ;IAMI,uB/BglBiC;I+BhlBjC,oB/BglBiC;I+BhlBjC,e/BglBiC;I+B/kBjC,2B/BglBuC;I+BhlBvC,wB/BglBuC;I+BhlBvC,mB/BglBuC;I+B/kBvC,UAAU;IACV,SAAS;ElCuoIX;EkChpIF;IAYM,qBAAqB;IACrB,WAAW;ElCuoIf;AACF;;AkC9nIA;EAEI,gBAAgB;AlCgoIpB;;AkCloIA;ExB/PI,gBwBqQ4B;AlCgoIhC;;AkCtoIA;EAUQ,gBAAgB;ExBzQpB,gBwB0Q4B;AlCgoIhC;;AkC3oIA;EAgBM,gBAAgB;ExBxPlB,6BwByPiC;ExBxPjC,4BwBwPiC;AlCgoIrC;;AkCjpIA;ExBtPI,yBwB2Q8B;ExB1Q9B,0BwB0Q8B;AlCioIlC;;AkCtpIA;EAyBM,mB/BtD2B;AHurIjC;;AmC95IA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,qBhC2gCsC;EgC1gCtC,mBhC6gCsC;EgC5gCtC,gBAAgB;EAChB,yBhCGgB;EOJd,sBPqOgC;AH8rIpC;;AmC95IA;EAGI,oBhCkgCqC;AH65GzC;;AmCl6IA;EAMM,qBAAqB;EACrB,qBhC8/BmC;EgC7/BnC,chCLY;EgCMZ,YhCmgCuC;AH65G7C;;AmCz6IA;EAoBI,0BAA0B;AnCy5I9B;;AmC76IA;EAwBI,qBAAqB;AnCy5IzB;;AmCj7IA;EA4BI,chCzBc;AHk7IlB;;AoC/7IA;EACE,oBAAa;EAAb,aAAa;E7BGb,eAAe;EACf,gBAAgB;EGAd,sBPqOgC;AH4tIpC;;AoCh8IA;EACE,kBAAkB;EAClB,cAAc;EACd,uBjCqwBwC;EiCpwBxC,iBjC6N+B;EiC5N/B,iBjCwwBsC;EiCvwBtC,cjCwBe;EiCvBf,sBjCNa;EiCOb,yBjCJgB;AHu8IlB;;AoC38IA;EAWI,UAAU;EACV,cjC2J8D;EiC1J9D,qBAAqB;EACrB,yBjCXc;EiCYd,qBjCXc;AH+8IlB;;AoCn9IA;EAmBI,UAAU;EACV,UjCiwBiC;EiChwBjC,gDjCSa;AH27IjB;;AoCh8IA;EAGM,cAAc;E1BChB,+BPuMgC;EOtMhC,kCPsMgC;AH2vIpC;;AoCt8IA;E1BVI,gCPqNgC;EOpNhC,mCPoNgC;AHgwIpC;;AoC38IA;EAcI,UAAU;EACV,WjCvCW;EiCwCX,yBjCXa;EiCYb,qBjCZa;AH68IjB;;AoCl9IA;EAqBI,cjCvCc;EiCwCd,oBAAoB;EAEpB,YAAY;EACZ,sBjCjDW;EiCkDX,qBjC/Cc;AH++IlB;;AqCt/IE;EACE,uBlC8wBsC;ECnpBpC,kBAtCY;EiCnFd,gBlC8N6B;AH2xIjC;;AqCp/IM;E3BwBF,8BPwM+B;EOvM/B,iCPuM+B;AHyxInC;;AqCp/IM;E3BKF,+BPsN+B;EOrN/B,kCPqN+B;AH8xInC;;AqCtgJE;EACE,uBlC4wBqC;ECjpBnC,mBAtCY;EiCnFd,gBlC+N6B;AH0yIjC;;AqCpgJM;E3BwBF,8BPyM+B;EOxM/B,iCPwM+B;AHwyInC;;AqCpgJM;E3BKF,+BPuN+B;EOtN/B,kCPsN+B;AH6yInC;;AsCphJA;EACE,qBAAqB;EACrB,qBnC24BsC;EC10BpC,cAAW;EkC/Db,gBnCmR+B;EmClR/B,cAAc;EACd,kBAAkB;EAClB,mBAAmB;EACnB,wBAAwB;E5BRtB,sBPqOgC;EiBpO9B,qIjBqb6I;AH2mInJ;;AoB3hJI;EkBNJ;IlBOM,gBAAgB;EpB+hJpB;AACF;;AK5hJE;EiCGI,qBAAqB;AtC6hJ3B;;AsC3iJA;EAoBI,aAAa;AtC2hJjB;;AsCthJA;EACE,kBAAkB;EAClB,SAAS;AtCyhJX;;AsClhJA;EACE,oBnCg3BsC;EmC/2BtC,mBnC+2BsC;EOn5BpC,oBPs5BqC;AHoqHzC;;AsC7gJE;ECjDA,WpCMa;EoCLb,yBpCkCe;AHgiJjB;;AKpjJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCkkJxC;;AuCrkJU;EAQJ,UAAU;EACV,+CpCuBW;AH0iJjB;;AsC5hJE;ECjDA,WpCMa;EoCLb,yBpCWgB;AHskJlB;;AKnkJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCilJxC;;AuCplJU;EAQJ,UAAU;EACV,iDpCAY;AHglJlB;;AsC3iJE;ECjDA,WpCMa;EoCLb,yBpCyCe;AHujJjB;;AKllJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCgmJxC;;AuCnmJU;EAQJ,UAAU;EACV,+CpC8BW;AHikJjB;;AsC1jJE;ECjDA,WpCMa;EoCLb,yBpC2Ce;AHokJjB;;AKjmJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC+mJxC;;AuClnJU;EAQJ,UAAU;EACV,gDpCgCW;AH8kJjB;;AsCzkJE;ECjDA,cpCegB;EoCdhB,yBpCwCe;AHslJjB;;AKhnJE;EkCVI,cpCUY;EoCTZ,yBAAkC;AvC8nJxC;;AuCjoJU;EAQJ,UAAU;EACV,+CpC6BW;AHgmJjB;;AsCxlJE;ECjDA,WpCMa;EoCLb,yBpCsCe;AHumJjB;;AK/nJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC6oJxC;;AuChpJU;EAQJ,UAAU;EACV,+CpC2BW;AHinJjB;;AsCvmJE;ECjDA,cpCegB;EoCdhB,yBpCMgB;AHspJlB;;AK9oJE;EkCVI,cpCUY;EoCTZ,yBAAkC;AvC4pJxC;;AuC/pJU;EAQJ,UAAU;EACV,iDpCLY;AHgqJlB;;AsCtnJE;ECjDA,WpCMa;EoCLb,yBpCagB;AH8pJlB;;AK7pJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC2qJxC;;AuC9qJU;EAQJ,UAAU;EACV,8CpCEY;AHwqJlB;;AwCvrJA;EACE,kBAAoD;EACpD,mBrC0yBsC;EqCxyBtC,yBrCKgB;EOJd,qBPsO+B;AHm9InC;;AcloJI;E0B5DJ;IAQI,kBrCoyBoC;EHu5HtC;AACF;;AwCxrJA;EACE,gBAAgB;EAChB,eAAe;E9BTb,gB8BUsB;AxC2rJ1B;;AyCtsJA;EACE,kBAAkB;EAClB,wBtCm8ByC;EsCl8BzC,mBtCm8BsC;EsCl8BtC,6BAA6C;E/BH3C,sBPqOgC;AHw+IpC;;AyCrsJA;EAEE,cAAc;AzCusJhB;;AyCnsJA;EACE,gBtCwQ+B;AH87IjC;;AyC9rJA;EACE,mBAAsD;AzCisJxD;;AyClsJA;EAKI,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,wBtCq6BuC;EsCp6BvC,cAAc;AzCisJlB;;AyCvrJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBwpJlE;;A0CvuJE;EACE,yBAAqC;A1C0uJzC;;A0CvuJE;EACE,cAA0B;A1C0uJ9B;;AyCrsJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBsqJlE;;A0CrvJE;EACE,yBAAqC;A1CwvJzC;;A0CrvJE;EACE,cAA0B;A1CwvJ9B;;AyCntJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBorJlE;;A0CnwJE;EACE,yBAAqC;A1CswJzC;;A0CnwJE;EACE,cAA0B;A1CswJ9B;;AyCjuJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBksJlE;;A0CjxJE;EACE,yBAAqC;A1CoxJzC;;A0CjxJE;EACE,cAA0B;A1CoxJ9B;;AyC/uJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBgtJlE;;A0C/xJE;EACE,yBAAqC;A1CkyJzC;;A0C/xJE;EACE,cAA0B;A1CkyJ9B;;AyC7vJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB8tJlE;;A0C7yJE;EACE,yBAAqC;A1CgzJzC;;A0C7yJE;EACE,cAA0B;A1CgzJ9B;;AyC3wJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB4uJlE;;A0C3zJE;EACE,yBAAqC;A1C8zJzC;;A0C3zJE;EACE,cAA0B;A1C8zJ9B;;AyCzxJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB0vJlE;;A0Cz0JE;EACE,yBAAqC;A1C40JzC;;A0Cz0JE;EACE,cAA0B;A1C40J9B;;A2Cp1JE;EACE;IAAO,2BAAuC;E3Cw1JhD;E2Cv1JE;IAAK,wBAAwB;E3C01J/B;AACF;;A2C71JE;EACE;IAAO,2BAAuC;E3Cw1JhD;E2Cv1JE;IAAK,wBAAwB;E3C01J/B;AACF;;A2Cv1JA;EACE,oBAAa;EAAb,aAAa;EACb,YxC48BsC;EwC38BtC,gBAAgB;EvCoHZ,kBAtCY;EuC5EhB,yBxCJgB;EOJd,sBPqOgC;AH8nJpC;;A2Ct1JA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EACtB,qBAAuB;EAAvB,uBAAuB;EACvB,WxCfa;EwCgBb,kBAAkB;EAClB,mBAAmB;EACnB,yBxCWe;EiB9BX,2BjBw9B4C;AHq5HlD;;AoBx2JI;EuBOJ;IvBNM,gBAAgB;EpB42JpB;AACF;;A2C51JA;ErBcE,qMAA6I;EqBZ7I,0BxCu7BsC;AHw6HxC;;A2C31JE;EACE,0DxCy7BkD;EwCz7BlD,kDxCy7BkD;AHq6HtD;;A2C51JI;EAHF;IAII,uBAAe;IAAf,eAAe;E3Cg2JnB;AACF;;A4Cx4JA;EACE,oBAAa;EAAb,aAAa;EACb,qBAAuB;EAAvB,uBAAuB;A5C24JzB;;A4Cx4JA;EACE,WAAO;EAAP,OAAO;A5C24JT;;A6C74JA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EAGtB,eAAe;EACf,gBAAgB;A7C84JlB;;A6Cr4JA;EACE,WAAW;EACX,c1CPgB;E0CQhB,mBAAmB;A7Cw4JrB;;AK94JE;EwCUE,UAAU;EACV,c1Cbc;E0Ccd,qBAAqB;EACrB,yB1CrBc;AH65JlB;;A6Cl5JA;EAcI,c1CjBc;E0CkBd,yB1CzBc;AHi6JlB;;A6C/3JA;EACE,kBAAkB;EAClB,cAAc;EACd,wB1C47ByC;E0C17BzC,mB1CuL+B;E0CrL/B,sB1C3Ca;E0C4Cb,sC1ClCa;AHk6Jf;;A6Cx4JA;EnC7BI,+BP4NgC;EO3NhC,gCP2NgC;AH8sJpC;;A6C74JA;EAeI,gBAAgB;EnC9BhB,mCP8MgC;EO7MhC,kCP6MgC;AHotJpC;;A6Cn5JA;EAqBI,c1CnDc;E0CoDd,oBAAoB;EACpB,sB1C3DW;AH67Jf;;A6Cz5JA;EA4BI,UAAU;EACV,W1CjEW;E0CkEX,yB1CrCa;E0CsCb,qB1CtCa;AHu6JjB;;A6Cp3JI;EACE,uBAAmB;EAAnB,mBAAmB;A7Cu3JzB;;A6Cx3JI;EAII,kB1C4IyB;E0C3IzB,gBAAgB;A7Cw3JxB;;A6C73JI;EnCpDA,+BPuMgC;EOtMhC,kCPsMgC;EO1LhC,0BmCgDwC;A7C03J5C;;A6Cn4JI;EAaM,eAAe;EnC/ErB,gCPqNgC;EOpNhC,mCPoNgC;EO9KhC,4BmC0C0C;A7C23J9C;;Acr6JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7C84JvB;E6C/4JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7C84JtB;E6Cn5JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7C+4J1C;E6Cx5JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7C+4J5C;AACF;;Ac17JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7Cm6JvB;E6Cp6JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7Cm6JtB;E6Cx6JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7Co6J1C;E6C76JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7Co6J5C;AACF;;Ac/8JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7Cw7JvB;E6Cz7JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7Cw7JtB;E6C77JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7Cy7J1C;E6Cl8JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7Cy7J5C;AACF;;Acp+JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7C68JvB;E6C98JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7C68JtB;E6Cl9JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7C88J1C;E6Cv9JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7C88J5C;AACF;;A6Cl8JA;EAEI,eAAe;EACf,cAAc;EnCjHd,gBmCkHwB;A7Co8J5B;;A6Cx8JA;EAOM,mB1C6G2B;AHw1JjC;;A6C58JA;EAaM,aAAa;A7Cm8JnB;;A6Ch9JA;EAmBM,gBAAgB;EAChB,gBAAgB;A7Ci8JtB;;A8CrkKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBy/JlE;;AK7jKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwkKjD;;A8C/kKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBogKlE;;A8CrlKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBygKlE;;AK7kKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwlKjD;;A8C/lKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBohKlE;;A8CrmKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByhKlE;;AK7lKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwmKjD;;A8C/mKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBoiKlE;;A8CrnKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByiKlE;;AK7mKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwnKjD;;A8C/nKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBojKlE;;A8CroKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByjKlE;;AK7nKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwoKjD;;A8C/oKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBokKlE;;A8CrpKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBykKlE;;AK7oKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwpKjD;;A8C/pKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBolKlE;;A8CrqKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBylKlE;;AK7pKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwqKjD;;A8C/qKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBomKlE;;A8CrrKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBymKlE;;AK7qKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwrKjD;;A8C/rKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBonKlE;;A+CxsKA;EACE,YAAY;E3C8HR,iBAtCY;E2CtFhB,gB5CyR+B;E4CxR/B,cAAc;EACd,W5CYa;E4CXb,yB5CCa;E4CAb,WAAW;A/C2sKb;;AKtsKE;E0CDE,W5CMW;E4CLX,qBAAqB;A/C2sKzB;;AKvsKE;E0CCI,YAAY;A/C0sKlB;;A+C/rKA;EACE,UAAU;EACV,6BAA6B;EAC7B,SAAS;EACT,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/CksKlB;;A+C5rKA;EACE,oBAAoB;A/C+rKtB;;AgDtuKA;EACE,gB7C43BuC;E6C33BvC,gBAAgB;E5C6HZ,mBAtCY;E4CpFhB,2C7CEa;E6CDb,4BAA4B;EAC5B,oC7C63BmD;E6C53BnD,gD7CSa;E6CRb,mCAA2B;EAA3B,2BAA2B;EAC3B,UAAU;EtCLR,sBPg4BsC;AH82I1C;;AgDnvKA;EAcI,sB7Cg3BsC;AHy3I1C;;AgDvvKA;EAkBI,UAAU;AhDyuKd;;AgD3vKA;EAsBI,cAAc;EACd,UAAU;AhDyuKd;;AgDhwKA;EA2BI,aAAa;AhDyuKjB;;AgDruKA;EACE,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;EACnB,wB7C41BwC;E6C31BxC,c7CtBgB;E6CuBhB,2C7C7Ba;E6C8Bb,4BAA4B;EAC5B,4C7Co2BoD;AHo4ItD;;AgDruKA;EACE,gB7Co1BwC;AHo5I1C;;AiD5wKA;EAEE,gBAAgB;AjD8wKlB;;AiDhxKA;EAKI,kBAAkB;EAClB,gBAAgB;AjD+wKpB;;AiD1wKA;EACE,eAAe;EACf,MAAM;EACN,OAAO;EACP,a9CopBsC;E8CnpBtC,aAAa;EACb,WAAW;EACX,YAAY;EACZ,gBAAgB;EAGhB,UAAU;AjD2wKZ;;AiDpwKA;EACE,kBAAkB;EAClB,WAAW;EACX,c9C63BuC;E8C33BvC,oBAAoB;AjDswKtB;;AiDnwKE;E7BrCI,2CjB27BoD;EiB37BpD,mCjB27BoD;EiB37BpD,oEjB27BoD;E8Cp5BtD,sC9Ck5BmD;E8Cl5BnD,8B9Ck5BmD;AHo3IvD;;AoBxyKI;E6BgCF;I7B/BI,gBAAgB;EpB4yKpB;AACF;;AiD1wKE;EACE,uB9Cg5BoC;E8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hLf;;AkD3+KA;EACE,iBAAgC;AlD8+KlC;;AkD/+KA;EAII,MAAM;AlD++KV;;AkDn/KA;EAOM,SAAS;EACT,6B/CgxBmC;E+C/wBnC,yB/CrDS;AHqiLf;;AkD3+KA;EACE,iB/CywBuC;AHquJzC;;AkD/+KA;EAII,QAAQ;EACR,a/CqwBqC;E+CpwBrC,c/CmwBqC;AH4uJzC;;AkDr/KA;EASM,OAAO;EACP,oC/CgwBmC;E+C/vBnC,uB/CrES;AHqjLf;;AkD39KA;EACE,gB/C+tBuC;E+C9tBvC,uB/CouBuC;E+CnuBvC,W/CvGa;E+CwGb,kBAAkB;EAClB,sB/C/Fa;EOZX,sBPqOgC;AHq2KpC;;AoD/kLA;EACE,kBAAkB;EAClB,MAAM;EACN,OAAO;EACP,ajDsqBsC;EiDrqBtC,cAAc;EACd,gBjD+1BuC;EgDp2BvC,kMhD+QiN;EgD7QjN,kBAAkB;EAClB,gBhDuR+B;EgDtR/B,gBhD2R+B;EgD1R/B,gBAAgB;EAChB,iBAAiB;EACjB,qBAAqB;EACrB,iBAAiB;EACjB,oBAAoB;EACpB,sBAAsB;EACtB,kBAAkB;EAClB,oBAAoB;EACpB,mBAAmB;EACnB,gBAAgB;E/CgHZ,mBAtCY;EgD7EhB,qBAAqB;EACrB,sBjDNa;EiDOb,4BAA4B;EAC5B,oCjDEa;EOZX,qBPsO+B;AHi4KnC;;AoD5mLA;EAoBI,kBAAkB;EAClB,cAAc;EACd,WjD81BoC;EiD71BpC,cjD81BqC;EiD71BrC,gBjDmN+B;AHy4KnC;;AoDpnLA;EA4BM,kBAAkB;EAClB,cAAc;EACd,WAAW;EACX,yBAAyB;EACzB,mBAAmB;ApD4lLzB;;AoDvlLA;EACE,qBjD+0BuC;AH2wJzC;;AoD3lLA;EAII,iCAAwE;ApD2lL5E;;AoD/lLA;EAOM,SAAS;EACT,6BAAgE;EAChE,qCjD00BiE;AHkxJvE;;AoDrmLA;EAaM,WjDqL2B;EiDpL3B,6BAAgE;EAChE,sBjD7CS;AHyoLf;;AoDvlLA;EACE,mBjD2zBuC;AH+xJzC;;AoD3lLA;EAII,+BAAsE;EACtE,ajDuzBqC;EiDtzBrC,YjDqzBoC;EiDpzBpC,gBAA2B;ApD2lL/B;;AoDlmLA;EAUM,OAAO;EACP,oCAA2F;EAC3F,uCjDmzBiE;AHyyJvE;;AoDxmLA;EAgBM,SjD8J2B;EiD7J3B,oCAA2F;EAC3F,wBjDpES;AHgqLf;;AoDvlLA;EACE,kBjDoyBuC;AHszJzC;;AoD3lLA;EAII,8BAAqE;ApD2lLzE;;AoD/lLA;EAOM,MAAM;EACN,oCAA2F;EAC3F,wCjD+xBiE;AH6zJvE;;AoDrmLA;EAaM,QjD0I2B;EiDzI3B,oCAA2F;EAC3F,yBjDxFS;AHorLf;;AoD3mLA;EAqBI,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,cAAc;EACd,WjD2wBoC;EiD1wBpC,oBAAsC;EACtC,WAAW;EACX,gCjD+vBuD;AH21J3D;;AoDtlLA;EACE,oBjDowBuC;AHq1JzC;;AoD1lLA;EAII,gCAAuE;EACvE,ajDgwBqC;EiD/vBrC,YjD8vBoC;EiD7vBpC,gBAA2B;ApD0lL/B;;AoDjmLA;EAUM,QAAQ;EACR,oCjD0vBmC;EiDzvBnC,sCjD4vBiE;AH+1JvE;;AoDvmLA;EAgBM,UjDuG2B;EiDtG3B,oCjDovBmC;EiDnvBnC,uBjD3HS;AHstLf;;AoDrkLA;EACE,uBjDqtBwC;EiDptBxC,gBAAgB;EhD3BZ,eAtCY;EgDoEhB,yBjD8sByD;EiD7sBzD,gCAAyE;E1ChJvE,0C0CiJyE;E1ChJzE,2C0CgJyE;ApDwkL7E;;AoD/kLA;EAWI,aAAa;ApDwkLjB;;AoDpkLA;EACE,uBjDssBwC;EiDrsBxC,cjDzJgB;AHguLlB;;AqDnuLA;EACE,kBAAkB;ArDsuLpB;;AqDnuLA;EACE,uBAAmB;EAAnB,mBAAmB;ArDsuLrB;;AqDnuLA;EACE,kBAAkB;EAClB,WAAW;EACX,gBAAgB;ArDsuLlB;;AsD7vLE;EACE,cAAc;EACd,WAAW;EACX,WAAW;AtDgwLf;;AqDxuLA;EACE,kBAAkB;EAClB,aAAa;EACb,WAAW;EACX,WAAW;EACX,mBAAmB;EACnB,mCAA2B;EAA3B,2BAA2B;EjC5BvB,8CjB6iCkF;EiB7iClF,sCjB6iCkF;EiB7iClF,0EjB6iCkF;AH2tJxF;;AoBnwLI;EiCiBJ;IjChBM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E,oCAAmC;AzD4/LvC;;AKl/LE;;;EoDLI,oCAAgD;AzD6/LtD;;AyDngME;EACE,oCAAmC;AzDsgMvC;;AK5/LE;;;EoDLI,oCAAgD;AzDugMtD;;AyD7gME;EACE,oCAAmC;AzDghMvC;;AKtgME;;;EoDLI,oCAAgD;AzDihMtD;;AyDvhME;EACE,oCAAmC;AzD0hMvC;;AKhhME;;;EoDLI,oCAAgD;AzD2hMtD;;AyDjiME;EACE,oCAAmC;AzDoiMvC;;AK1hME;;;EoDLI,oCAAgD;AzDqiMtD;;AyD3iME;EACE,oCAAmC;AzD8iMvC;;AKpiME;;;EoDLI,oCAAgD;AzD+iMtD;;AyDrjME;EACE,oCAAmC;AzDwjMvC;;AK9iME;;;EoDLI,oCAAgD;AzDyjMtD;;A0DxjMA;EACE,iCAAmC;A1D2jMrC;;A0DxjMA;EACE,wCAAwC;A1D2jM1C;;A2DtkMA;EAAkB,oCAAoD;A3D0kMtE;;A2DzkMA;EAAkB,wCAAwD;A3D6kM1E;;A2D5kMA;EAAkB,0CAA0D;A3DglM5E;;A2D/kMA;EAAkB,2CAA2D;A3DmlM7E;;A2DllMA;EAAkB,yCAAyD;A3DslM3E;;A2DplMA;EAAmB,oBAAoB;A3DwlMvC;;A2DvlMA;EAAmB,wBAAwB;A3D2lM3C;;A2D1lMA;EAAmB,0BAA0B;A3D8lM7C;;A2D7lMA;EAAmB,2BAA2B;A3DimM9C;;A2DhmMA;EAAmB,yBAAyB;A3DomM5C;;A2DjmME;EACE,gCAA+B;A3DomMnC;;A2DrmME;EACE,gCAA+B;A3DwmMnC;;A2DzmME;EACE,gCAA+B;A3D4mMnC;;A2D7mME;EACE,gCAA+B;A3DgnMnC;;A2DjnME;EACE,gCAA+B;A3DonMnC;;A2DrnME;EACE,gCAA+B;A3DwnMnC;;A2DznME;EACE,gCAA+B;A3D4nMnC;;A2D7nME;EACE,gCAA+B;A3DgoMnC;;A2D5nMA;EACE,6BAA+B;A3D+nMjC;;A2DxnMA;EACE,gCAA2C;A3D2nM7C;;A2DxnMA;EACE,iCAAwC;A3D2nM1C;;A2DxnMA;EACE,0CAAiD;EACjD,2CAAkD;A3D2nMpD;;A2DxnMA;EACE,2CAAkD;EAClD,8CAAqD;A3D2nMvD;;A2DxnMA;EACE,8CAAqD;EACrD,6CAAoD;A3D2nMtD;;A2DxnMA;EACE,0CAAiD;EACjD,6CAAoD;A3D2nMtD;;A2DxnMA;EACE,gCAA2C;A3D2nM7C;;A2DxnMA;EACE,6BAA6B;A3D2nM/B;;A2DxnMA;EACE,+BAAuC;A3D2nMzC;;A2DxnMA;EACE,2BAA2B;A3D2nM7B;;AsDnsME;EACE,cAAc;EACd,WAAW;EACX,WAAW;AtDssMf;;A4D/rMM;EAAwB,wBAA0B;A5DmsMxD;;A4DnsMM;EAAwB,0BAA0B;A5DusMxD;;A4DvsMM;EAAwB,gCAA0B;A5D2sMxD;;A4D3sMM;EAAwB,yBAA0B;A5D+sMxD;;A4D/sMM;EAAwB,yBAA0B;A5DmtMxD;;A4DntMM;EAAwB,6BAA0B;A5DutMxD;;A4DvtMM;EAAwB,8BAA0B;A5D2tMxD;;A4D3tMM;EAAwB,+BAA0B;EAA1B,wBAA0B;A5D+tMxD;;A4D/tMM;EAAwB,sCAA0B;EAA1B,+BAA0B;A5DmuMxD;;AclrMI;E8CjDE;IAAwB,wBAA0B;E5DwuMtD;E4DxuMI;IAAwB,0BAA0B;E5D2uMtD;E4D3uMI;IAAwB,gCAA0B;E5D8uMtD;E4D9uMI;IAAwB,yBAA0B;E5DivMtD;E4DjvMI;IAAwB,yBAA0B;E5DovMtD;E4DpvMI;IAAwB,6BAA0B;E5DuvMtD;E4DvvMI;IAAwB,8BAA0B;E5D0vMtD;E4D1vMI;IAAwB,+BAA0B;IAA1B,wBAA0B;E5D6vMtD;E4D7vMI;IAAwB,sCAA0B;IAA1B,+BAA0B;E5DgwMtD;AACF;;AchtMI;E8CjDE;IAAwB,wBAA0B;E5DswMtD;E4DtwMI;IAAwB,0BAA0B;E5DywMtD;E4DzwMI;IAAwB,gCAA0B;E5D4wMtD;E4D5wMI;IAAwB,yBAA0B;E5D+wMtD;E4D/wMI;IAAwB,yBAA0B;E5DkxMtD;E4DlxMI;IAAwB,6BAA0B;E5DqxMtD;E4DrxMI;IAAwB,8BAA0B;E5DwxMtD;E4DxxMI;IAAwB,+BAA0B;IAA1B,wBAA0B;E5D2xMtD;E4D3xMI;IAAwB,sCAA0B;IAA1B,+BAA0B;E5D8xMtD;AACF;;Ac9uMI;E8CjDE;IAAwB,wBAA0B;E5DoyMtD;E4DpyMI;IAAwB,0BAA0B;E5DuyMtD;E4DvyMI;IAAwB,gCAA0B;E5D0yMtD;E4D1yMI;IAAwB,yBAA0B;E5D6yMtD;E4D7yMI;IAAwB,yBAA0B;E5DgzMtD;E4DhzMI;IAAwB,6BAA0B;E5DmzMtD;E4DnzMI;IAAwB,8BAA0B;E5DszMtD;E4DtzMI;IAAwB,+BAA0B;IAA1B,wBAA0B;E5DyzMtD;E4DzzMI;IAAwB,sCAA0B;IAA1B,+BAA0B;E5D4zMtD;AACF;;Ac5wMI;E8CjDE;IAAwB,wBAA0B;E5Dk0MtD;E4Dl0MI;IAAwB,0BAA0B;E5Dq0MtD;E4Dr0MI;IAAwB,gCAA0B;E5Dw0MtD;E4Dx0MI;IAAwB,yBAA0B;E5D20MtD;E4D30MI;IAAwB,yBAA0B;E5D80MtD;E4D90MI;IAAwB,6BAA0B;E5Di1MtD;E4Dj1MI;IAAwB,8BAA0B;E5Do1MtD;E4Dp1MI;IAAwB,+BAA0B;IAA1B,wBAA0B;E5Du1MtD;E4Dv1MI;IAAwB,sCAA0B;IAA1B,+BAA0B;E5D01MtD;AACF;;A4Dj1MA;EAEI;IAAqB,wBAA0B;E5Do1MjD;E4Dp1ME;IAAqB,0BAA0B;E5Du1MjD;E4Dv1ME;IAAqB,gCAA0B;E5D01MjD;E4D11ME;IAAqB,yBAA0B;E5D61MjD;E4D71ME;IAAqB,yBAA0B;E5Dg2MjD;E4Dh2ME;IAAqB,6BAA0B;E5Dm2MjD;E4Dn2ME;IAAqB,8BAA0B;E5Ds2MjD;E4Dt2ME;IAAqB,+BAA0B;IAA1B,wBAA0B;E5Dy2MjD;E4Dz2ME;IAAqB,sCAA0B;IAA1B,+BAA0B;E5D42MjD;AACF;;A6Dl4MA;EACE,kBAAkB;EAClB,cAAc;EACd,WAAW;EACX,UAAU;EACV,gBAAgB;A7Dq4MlB;;A6D14MA;EAQI,cAAc;EACd,WAAW;A7Ds4Mf;;A6D/4MA;;;;;EAiBI,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,OAAO;EACP,WAAW;EACX,YAAY;EACZ,SAAS;A7Ds4Mb;;A6D93ME;EAEI,uBAA4F;A7Dg4MlG;;A6Dl4ME;EAEI,mBAA4F;A7Do4MlG;;A6Dt4ME;EAEI,gBAA4F;A7Dw4MlG;;A6D14ME;EAEI,iBAA4F;A7D44MlG;;A8Dr6MI;EAAgC,kCAA8B;EAA9B,8BAA8B;A9Dy6MlE;;A8Dx6MI;EAAgC,qCAAiC;EAAjC,iCAAiC;A9D46MrE;;A8D36MI;EAAgC,0CAAsC;EAAtC,sCAAsC;A9D+6M1E;;A8D96MI;EAAgC,6CAAyC;EAAzC,yCAAyC;A9Dk7M7E;;A8Dh7MI;EAA8B,8BAA0B;EAA1B,0BAA0B;A9Do7M5D;;A8Dn7MI;EAA8B,gCAA4B;EAA5B,4BAA4B;A9Du7M9D;;A8Dt7MI;EAA8B,sCAAkC;EAAlC,kCAAkC;A9D07MpE;;A8Dz7MI;EAA8B,6BAAyB;EAAzB,yBAAyB;A9D67M3D;;A8D57MI;EAA8B,+BAAuB;EAAvB,uBAAuB;A9Dg8MzD;;A8D/7MI;EAA8B,+BAAuB;EAAvB,uBAAuB;A9Dm8MzD;;A8Dl8MI;EAA8B,+BAAyB;EAAzB,yBAAyB;A9Ds8M3D;;A8Dr8MI;EAA8B,+BAAyB;EAAzB,yBAAyB;A9Dy8M3D;;A8Dv8MI;EAAoC,+BAAsC;EAAtC,sCAAsC;A9D28M9E;;A8D18MI;EAAoC,6BAAoC;EAApC,oCAAoC;A9D88M5E;;A8D78MI;EAAoC,gCAAkC;EAAlC,kCAAkC;A9Di9M1E;;A8Dh9MI;EAAoC,iCAAyC;EAAzC,yCAAyC;A9Do9MjF;;A8Dn9MI;EAAoC,oCAAwC;EAAxC,wCAAwC;A9Du9MhF;;A8Dr9MI;EAAiC,gCAAkC;EAAlC,kCAAkC;A9Dy9MvE;;A8Dx9MI;EAAiC,8BAAgC;EAAhC,gCAAgC;A9D49MrE;;A8D39MI;EAAiC,iCAA8B;EAA9B,8BAA8B;A9D+9MnE;;A8D99MI;EAAiC,mCAAgC;EAAhC,gCAAgC;A9Dk+MrE;;A8Dj+MI;EAAiC,kCAA+B;EAA/B,+BAA+B;A9Dq+MpE;;A8Dn+MI;EAAkC,oCAAoC;EAApC,oCAAoC;A9Du+M1E;;A8Dt+MI;EAAkC,kCAAkC;EAAlC,kCAAkC;A9D0+MxE;;A8Dz+MI;EAAkC,qCAAgC;EAAhC,gCAAgC;A9D6+MtE;;A8D5+MI;EAAkC,sCAAuC;EAAvC,uCAAuC;A9Dg/M7E;;A8D/+MI;EAAkC,yCAAsC;EAAtC,sCAAsC;A9Dm/M5E;;A8Dl/MI;EAAkC,sCAAiC;EAAjC,iCAAiC;A9Ds/MvE;;A8Dp/MI;EAAgC,oCAA2B;EAA3B,2BAA2B;A9Dw/M/D;;A8Dv/MI;EAAgC,qCAAiC;EAAjC,iCAAiC;A9D2/MrE;;A8D1/MI;EAAgC,mCAA+B;EAA/B,+BAA+B;A9D8/MnE;;A8D7/MI;EAAgC,sCAA6B;EAA7B,6BAA6B;A9DigNjE;;A8DhgNI;EAAgC,wCAA+B;EAA/B,+BAA+B;A9DogNnE;;A8DngNI;EAAgC,uCAA8B;EAA9B,8BAA8B;A9DugNlE;;Ac3/MI;EgDlDA;IAAgC,kCAA8B;IAA9B,8BAA8B;E9DkjNhE;E8DjjNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9DojNnE;E8DnjNE;IAAgC,0CAAsC;IAAtC,sCAAsC;E9DsjNxE;E8DrjNE;IAAgC,6CAAyC;IAAzC,yCAAyC;E9DwjN3E;E8DtjNE;IAA8B,8BAA0B;IAA1B,0BAA0B;E9DyjN1D;E8DxjNE;IAA8B,gCAA4B;IAA5B,4BAA4B;E9D2jN5D;E8D1jNE;IAA8B,sCAAkC;IAAlC,kCAAkC;E9D6jNlE;E8D5jNE;IAA8B,6BAAyB;IAAzB,yBAAyB;E9D+jNzD;E8D9jNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9DikNvD;E8DhkNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9DmkNvD;E8DlkNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9DqkNzD;E8DpkNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9DukNzD;E8DrkNE;IAAoC,+BAAsC;IAAtC,sCAAsC;E9DwkN5E;E8DvkNE;IAAoC,6BAAoC;IAApC,oCAAoC;E9D0kN1E;E8DzkNE;IAAoC,gCAAkC;IAAlC,kCAAkC;E9D4kNxE;E8D3kNE;IAAoC,iCAAyC;IAAzC,yCAAyC;E9D8kN/E;E8D7kNE;IAAoC,oCAAwC;IAAxC,wCAAwC;E9DglN9E;E8D9kNE;IAAiC,gCAAkC;IAAlC,kCAAkC;E9DilNrE;E8DhlNE;IAAiC,8BAAgC;IAAhC,gCAAgC;E9DmlNnE;E8DllNE;IAAiC,iCAA8B;IAA9B,8BAA8B;E9DqlNjE;E8DplNE;IAAiC,mCAAgC;IAAhC,gCAAgC;E9DulNnE;E8DtlNE;IAAiC,kCAA+B;IAA/B,+BAA+B;E9DylNlE;E8DvlNE;IAAkC,oCAAoC;IAApC,oCAAoC;E9D0lNxE;E8DzlNE;IAAkC,kCAAkC;IAAlC,kCAAkC;E9D4lNtE;E8D3lNE;IAAkC,qCAAgC;IAAhC,gCAAgC;E9D8lNpE;E8D7lNE;IAAkC,sCAAuC;IAAvC,uCAAuC;E9DgmN3E;E8D/lNE;IAAkC,yCAAsC;IAAtC,sCAAsC;E9DkmN1E;E8DjmNE;IAAkC,sCAAiC;IAAjC,iCAAiC;E9DomNrE;E8DlmNE;IAAgC,oCAA2B;IAA3B,2BAA2B;E9DqmN7D;E8DpmNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9DumNnE;E8DtmNE;IAAgC,mCAA+B;IAA/B,+BAA+B;E9DymNjE;E8DxmNE;IAAgC,sCAA6B;IAA7B,6BAA6B;E9D2mN/D;E8D1mNE;IAAgC,wCAA+B;IAA/B,+BAA+B;E9D6mNjE;E8D5mNE;IAAgC,uCAA8B;IAA9B,8BAA8B;E9D+mNhE;AACF;;AcpmNI;EgDlDA;IAAgC,kCAA8B;IAA9B,8BAA8B;E9D2pNhE;E8D1pNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9D6pNnE;E8D5pNE;IAAgC,0CAAsC;IAAtC,sCAAsC;E9D+pNxE;E8D9pNE;IAAgC,6CAAyC;IAAzC,yCAAyC;E9DiqN3E;E8D/pNE;IAA8B,8BAA0B;IAA1B,0BAA0B;E9DkqN1D;E8DjqNE;IAA8B,gCAA4B;IAA5B,4BAA4B;E9DoqN5D;E8DnqNE;IAA8B,sCAAkC;IAAlC,kCAAkC;E9DsqNlE;E8DrqNE;IAA8B,6BAAyB;IAAzB,yBAAyB;E9DwqNzD;E8DvqNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9D0qNvD;E8DzqNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9D4qNvD;E8D3qNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9D8qNzD;E8D7qNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9DgrNzD;E8D9qNE;IAAoC,+BAAsC;IAAtC,sCAAsC;E9DirN5E;E8DhrNE;IAAoC,6BAAoC;IAApC,oCAAoC;E9DmrN1E;E8DlrNE;IAAoC,gCAAkC;IAAlC,kCAAkC;E9DqrNxE;E8DprNE;IAAoC,iCAAyC;IAAzC,yCAAyC;E9DurN/E;E8DtrNE;IAAoC,oCAAwC;IAAxC,wCAAwC;E9DyrN9E;E8DvrNE;IAAiC,gCAAkC;IAAlC,kCAAkC;E9D0rNrE;E8DzrNE;IAAiC,8BAAgC;IAAhC,gCAAgC;E9D4rNnE;E8D3rNE;IAAiC,iCAA8B;IAA9B,8BAA8B;E9D8rNjE;E8D7rNE;IAAiC,mCAAgC;IAAhC,gCAAgC;E9DgsNnE;E8D/rNE;IAAiC,kCAA+B;IAA/B,+BAA+B;E9DksNlE;E8DhsNE;IAAkC,oCAAoC;IAApC,oCAAoC;E9DmsNxE;E8DlsNE;IAAkC,kCAAkC;IAAlC,kCAAkC;E9DqsNtE;E8DpsNE;IAAkC,qCAAgC;IAAhC,gCAAgC;E9DusNpE;E8DtsNE;IAAkC,sCAAuC;IAAvC,uCAAuC;E9DysN3E;E8DxsNE;IAAkC,yCAAsC;IAAtC,sCAAsC;E9D2sN1E;E8D1sNE;IAAkC,sCAAiC;IAAjC,iCAAiC;E9D6sNrE;E8D3sNE;IAAgC,oCAA2B;IAA3B,2BAA2B;E9D8sN7D;E8D7sNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9DgtNnE;E8D/sNE;IAAgC,mCAA+B;IAA/B,+BAA+B;E9DktNjE;E8DjtNE;IAAgC,sCAA6B;IAA7B,6BAA6B;E9DotN/D;E8DntNE;IAAgC,wCAA+B;IAA/B,+BAA+B;E9DstNjE;E8DrtNE;IAAgC,uCAA8B;IAA9B,8BAA8B;E9DwtNhE;AACF;;Ac7sNI;EgDlDA;IAAgC,kCAA8B;IAA9B,8BAA8B;E9DowNhE;E8DnwNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9DswNnE;E8DrwNE;IAAgC,0CAAsC;IAAtC,sCAAsC;E9DwwNxE;E8DvwNE;IAAgC,6CAAyC;IAAzC,yCAAyC;E9D0wN3E;E8DxwNE;IAA8B,8BAA0B;IAA1B,0BAA0B;E9D2wN1D;E8D1wNE;IAA8B,gCAA4B;IAA5B,4BAA4B;E9D6wN5D;E8D5wNE;IAA8B,sCAAkC;IAAlC,kCAAkC;E9D+wNlE;E8D9wNE;IAA8B,6BAAyB;IAAzB,yBAAyB;E9DixNzD;E8DhxNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9DmxNvD;E8DlxNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9DqxNvD;E8DpxNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9DuxNzD;E8DtxNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9DyxNzD;E8DvxNE;IAAoC,+BAAsC;IAAtC,sCAAsC;E9D0xN5E;E8DzxNE;IAAoC,6BAAoC;IAApC,oCAAoC;E9D4xN1E;E8D3xNE;IAAoC,gCAAkC;IAAlC,kCAAkC;E9D8xNxE;E8D7xNE;IAAoC,iCAAyC;IAAzC,yCAAyC;E9DgyN/E;E8D/xNE;IAAoC,oCAAwC;IAAxC,wCAAwC;E9DkyN9E;E8DhyNE;IAAiC,gCAAkC;IAAlC,kCAAkC;E9DmyNrE;E8DlyNE;IAAiC,8BAAgC;IAAhC,gCAAgC;E9DqyNnE;E8DpyNE;IAAiC,iCAA8B;IAA9B,8BAA8B;E9DuyNjE;E8DtyNE;IAAiC,mCAAgC;IAAhC,gCAAgC;E9DyyNnE;E8DxyNE;IAAiC,kCAA+B;IAA/B,+BAA+B;E9D2yNlE;E8DzyNE;IAAkC,oCAAoC;IAApC,oCAAoC;E9D4yNxE;E8D3yNE;IAAkC,kCAAkC;IAAlC,kCAAkC;E9D8yNtE;E8D7yNE;IAAkC,qCAAgC;IAAhC,gCAAgC;E9DgzNpE;E8D/yNE;IAAkC,sCAAuC;IAAvC,uCAAuC;E9DkzN3E;E8DjzNE;IAAkC,yCAAsC;IAAtC,sCAAsC;E9DozN1E;E8DnzNE;IAAkC,sCAAiC;IAAjC,iCAAiC;E9DszNrE;E8DpzNE;IAAgC,oCAA2B;IAA3B,2BAA2B;E9DuzN7D;E8DtzNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9DyzNnE;E8DxzNE;IAAgC,mCAA+B;IAA/B,+BAA+B;E9D2zNjE;E8D1zNE;IAAgC,sCAA6B;IAA7B,6BAA6B;E9D6zN/D;E8D5zNE;IAAgC,wCAA+B;IAA/B,+BAA+B;E9D+zNjE;E8D9zNE;IAAgC,uCAA8B;IAA9B,8BAA8B;E9Di0NhE;AACF;;ActzNI;EgDlDA;IAAgC,kCAA8B;IAA9B,8BAA8B;E9D62NhE;E8D52NE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9D+2NnE;E8D92NE;IAAgC,0CAAsC;IAAtC,sCAAsC;E9Di3NxE;E8Dh3NE;IAAgC,6CAAyC;IAAzC,yCAAyC;E9Dm3N3E;E8Dj3NE;IAA8B,8BAA0B;IAA1B,0BAA0B;E9Do3N1D;E8Dn3NE;IAA8B,gCAA4B;IAA5B,4BAA4B;E9Ds3N5D;E8Dr3NE;IAA8B,sCAAkC;IAAlC,kCAAkC;E9Dw3NlE;E8Dv3NE;IAA8B,6BAAyB;IAAzB,yBAAyB;E9D03NzD;E8Dz3NE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9D43NvD;E8D33NE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9D83NvD;E8D73NE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9Dg4NzD;E8D/3NE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9Dk4NzD;E8Dh4NE;IAAoC,+BAAsC;IAAtC,sCAAsC;E9Dm4N5E;E8Dl4NE;IAAoC,6BAAoC;IAApC,oCAAoC;E9Dq4N1E;E8Dp4NE;IAAoC,gCAAkC;IAAlC,kCAAkC;E9Du4NxE;E8Dt4NE;IAAoC,iCAAyC;IAAzC,yCAAyC;E9Dy4N/E;E8Dx4NE;IAAoC,oCAAwC;IAAxC,wCAAwC;E9D24N9E;E8Dz4NE;IAAiC,gCAAkC;IAAlC,kCAAkC;E9D44NrE;E8D34NE;IAAiC,8BAAgC;IAAhC,gCAAgC;E9D84NnE;E8D74NE;IAAiC,iCAA8B;IAA9B,8BAA8B;E9Dg5NjE;E8D/4NE;IAAiC,mCAAgC;IAAhC,gCAAgC;E9Dk5NnE;E8Dj5NE;IAAiC,kCAA+B;IAA/B,+BAA+B;E9Do5NlE;E8Dl5NE;IAAkC,oCAAoC;IAApC,oCAAoC;E9Dq5NxE;E8Dp5NE;IAAkC,kCAAkC;IAAlC,kCAAkC;E9Du5NtE;E8Dt5NE;IAAkC,qCAAgC;IAAhC,gCAAgC;E9Dy5NpE;E8Dx5NE;IAAkC,sCAAuC;IAAvC,uCAAuC;E9D25N3E;E8D15NE;IAAkC,yCAAsC;IAAtC,sCAAsC;E9D65N1E;E8D55NE;IAAkC,sCAAiC;IAAjC,iCAAiC;E9D+5NrE;E8D75NE;IAAgC,oCAA2B;IAA3B,2BAA2B;E9Dg6N7D;E8D/5NE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9Dk6NnE;E8Dj6NE;IAAgC,mCAA+B;IAA/B,+BAA+B;E9Do6NjE;E8Dn6NE;IAAgC,sCAA6B;IAA7B,6BAA6B;E9Ds6N/D;E8Dr6NE;IAAgC,wCAA+B;IAA/B,+BAA+B;E9Dw6NjE;E8Dv6NE;IAAgC,uCAA8B;IAA9B,8BAA8B;E9D06NhE;AACF;;A+Dr9NI;EAAwB,sBAAsB;A/Dy9NlD;;A+Dx9NI;EAAwB,uBAAuB;A/D49NnD;;A+D39NI;EAAwB,sBAAsB;A/D+9NlD;;Ac36NI;EiDtDA;IAAwB,sBAAsB;E/Ds+NhD;E+Dr+NE;IAAwB,uBAAuB;E/Dw+NjD;E+Dv+NE;IAAwB,sBAAsB;E/D0+NhD;AACF;;Acv7NI;EiDtDA;IAAwB,sBAAsB;E/Dk/NhD;E+Dj/NE;IAAwB,uBAAuB;E/Do/NjD;E+Dn/NE;IAAwB,sBAAsB;E/Ds/NhD;AACF;;Acn8NI;EiDtDA;IAAwB,sBAAsB;E/D8/NhD;E+D7/NE;IAAwB,uBAAuB;E/DggOjD;E+D//NE;IAAwB,sBAAsB;E/DkgOhD;AACF;;Ac/8NI;EiDtDA;IAAwB,sBAAsB;E/D0gOhD;E+DzgOE;IAAwB,uBAAuB;E/D4gOjD;E+D3gOE;IAAwB,sBAAsB;E/D8gOhD;AACF;;AgEphOE;EAAsB,yBAA2B;AhEwhOnD;;AgExhOE;EAAsB,2BAA2B;AhE4hOnD;;AiE3hOE;EAAyB,2BAA8B;AjE+hOzD;;AiE/hOE;EAAyB,6BAA8B;AjEmiOzD;;AiEniOE;EAAyB,6BAA8B;AjEuiOzD;;AiEviOE;EAAyB,0BAA8B;AjE2iOzD;;AiE3iOE;EAAyB,mCAA8B;EAA9B,2BAA8B;AjE+iOzD;;AiE1iOA;EACE,eAAe;EACf,MAAM;EACN,QAAQ;EACR,OAAO;EACP,a9DypBsC;AHo5MxC;;AiE1iOA;EACE,eAAe;EACf,QAAQ;EACR,SAAS;EACT,OAAO;EACP,a9DipBsC;AH45MxC;;AiEziO8B;EAD9B;IAEI,wBAAgB;IAAhB,gBAAgB;IAChB,MAAM;IACN,a9DyoBoC;EHo6MtC;AACF;;AkEvkOA;ECEE,kBAAkB;EAClB,UAAU;EACV,WAAW;EACX,UAAU;EACV,gBAAgB;EAChB,sBAAsB;EACtB,mBAAmB;EACnB,SAAS;AnEykOX;;AmE/jOE;EAEE,gBAAgB;EAChB,WAAW;EACX,YAAY;EACZ,iBAAiB;EACjB,UAAU;EACV,mBAAmB;AnEikOvB;;AoE7lOA;EAAa,8DAAqC;ApEimOlD;;AoEhmOA;EAAU,wDAAkC;ApEomO5C;;AoEnmOA;EAAa,uDAAqC;ApEumOlD;;AoEtmOA;EAAe,2BAA2B;ApE0mO1C;;AqEzmOI;EAAuB,qBAA4B;ArE6mOvD;;AqE7mOI;EAAuB,qBAA4B;ArEinOvD;;AqEjnOI;EAAuB,qBAA4B;ArEqnOvD;;AqErnOI;EAAuB,sBAA4B;ArEynOvD;;AqEznOI;EAAuB,sBAA4B;ArE6nOvD;;AqE7nOI;EAAuB,sBAA4B;ArEioOvD;;AqEjoOI;EAAuB,sBAA4B;ArEqoOvD;;AqEroOI;EAAuB,sBAA4B;ArEyoOvD;;AqEzoOI;EAAuB,uBAA4B;ArE6oOvD;;AqE7oOI;EAAuB,uBAA4B;ArEipOvD;;AqE7oOA;EAAU,0BAA0B;ArEipOpC;;AqEhpOA;EAAU,2BAA2B;ArEopOrC;;AqEhpOA;EAAc,2BAA2B;ArEopOzC;;AqEnpOA;EAAc,4BAA4B;ArEupO1C;;AqErpOA;EAAU,uBAAuB;ArEypOjC;;AqExpOA;EAAU,wBAAwB;ArE4pOlC;;AsE3qOA;EAEI,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,OAAO;EACP,UAAU;EAEV,oBAAoB;EACpB,WAAW;EAEX,kCAAkC;AtE2qOtC;;AuEjrOQ;EAAgC,oBAA4B;AvEqrOpE;;AuEprOQ;;EAEE,wBAAoC;AvEurO9C;;AuErrOQ;;EAEE,0BAAwC;AvEwrOlD;;AuEtrOQ;;EAEE,2BAA0C;AvEyrOpD;;AuEvrOQ;;EAEE,yBAAsC;AvE0rOhD;;AuEzsOQ;EAAgC,0BAA4B;AvE6sOpE;;AuE5sOQ;;EAEE,8BAAoC;AvE+sO9C;;AuE7sOQ;;EAEE,gCAAwC;AvEgtOlD;;AuE9sOQ;;EAEE,iCAA0C;AvEitOpD;;AuE/sOQ;;EAEE,+BAAsC;AvEktOhD;;AuEjuOQ;EAAgC,yBAA4B;AvEquOpE;;AuEpuOQ;;EAEE,6BAAoC;AvEuuO9C;;AuEruOQ;;EAEE,+BAAwC;AvEwuOlD;;AuEtuOQ;;EAEE,gCAA0C;AvEyuOpD;;AuEvuOQ;;EAEE,8BAAsC;AvE0uOhD;;AuEzvOQ;EAAgC,uBAA4B;AvE6vOpE;;AuE5vOQ;;EAEE,2BAAoC;AvE+vO9C;;AuE7vOQ;;EAEE,6BAAwC;AvEgwOlD;;AuE9vOQ;;EAEE,8BAA0C;AvEiwOpD;;AuE/vOQ;;EAEE,4BAAsC;AvEkwOhD;;AuEjxOQ;EAAgC,yBAA4B;AvEqxOpE;;AuEpxOQ;;EAEE,6BAAoC;AvEuxO9C;;AuErxOQ;;EAEE,+BAAwC;AvEwxOlD;;AuEtxOQ;;EAEE,gCAA0C;AvEyxOpD;;AuEvxOQ;;EAEE,8BAAsC;AvE0xOhD;;AuEzyOQ;EAAgC,uBAA4B;AvE6yOpE;;AuE5yOQ;;EAEE,2BAAoC;AvE+yO9C;;AuE7yOQ;;EAEE,6BAAwC;AvEgzOlD;;AuE9yOQ;;EAEE,8BAA0C;AvEizOpD;;AuE/yOQ;;EAEE,4BAAsC;AvEkzOhD;;AuEj0OQ;EAAgC,qBAA4B;AvEq0OpE;;AuEp0OQ;;EAEE,yBAAoC;AvEu0O9C;;AuEr0OQ;;EAEE,2BAAwC;AvEw0OlD;;AuEt0OQ;;EAEE,4BAA0C;AvEy0OpD;;AuEv0OQ;;EAEE,0BAAsC;AvE00OhD;;AuEz1OQ;EAAgC,2BAA4B;AvE61OpE;;AuE51OQ;;EAEE,+BAAoC;AvE+1O9C;;AuE71OQ;;EAEE,iCAAwC;AvEg2OlD;;AuE91OQ;;EAEE,kCAA0C;AvEi2OpD;;AuE/1OQ;;EAEE,gCAAsC;AvEk2OhD;;AuEj3OQ;EAAgC,0BAA4B;AvEq3OpE;;AuEp3OQ;;EAEE,8BAAoC;AvEu3O9C;;AuEr3OQ;;EAEE,gCAAwC;AvEw3OlD;;AuEt3OQ;;EAEE,iCAA0C;AvEy3OpD;;AuEv3OQ;;EAEE,+BAAsC;AvE03OhD;;AuEz4OQ;EAAgC,wBAA4B;AvE64OpE;;AuE54OQ;;EAEE,4BAAoC;AvE+4O9C;;AuE74OQ;;EAEE,8BAAwC;AvEg5OlD;;AuE94OQ;;EAEE,+BAA0C;AvEi5OpD;;AuE/4OQ;;EAEE,6BAAsC;AvEk5OhD;;AuEj6OQ;EAAgC,0BAA4B;AvEq6OpE;;AuEp6OQ;;EAEE,8BAAoC;AvEu6O9C;;AuEr6OQ;;EAEE,gCAAwC;AvEw6OlD;;AuEt6OQ;;EAEE,iCAA0C;AvEy6OpD;;AuEv6OQ;;EAEE,+BAAsC;AvE06OhD;;AuEz7OQ;EAAgC,wBAA4B;AvE67OpE;;AuE57OQ;;EAEE,4BAAoC;AvE+7O9C;;AuE77OQ;;EAEE,8BAAwC;AvEg8OlD;;AuE97OQ;;EAEE,+BAA0C;AvEi8OpD;;AuE/7OQ;;EAEE,6BAAsC;AvEk8OhD;;AuE17OQ;EAAwB,2BAA2B;AvE87O3D;;AuE77OQ;;EAEE,+BAA+B;AvEg8OzC;;AuE97OQ;;EAEE,iCAAiC;AvEi8O3C;;AuE/7OQ;;EAEE,kCAAkC;AvEk8O5C;;AuEh8OQ;;EAEE,gCAAgC;AvEm8O1C;;AuEl9OQ;EAAwB,0BAA2B;AvEs9O3D;;AuEr9OQ;;EAEE,8BAA+B;AvEw9OzC;;AuEt9OQ;;EAEE,gCAAiC;AvEy9O3C;;AuEv9OQ;;EAEE,iCAAkC;AvE09O5C;;AuEx9OQ;;EAEE,+BAAgC;AvE29O1C;;AuE1+OQ;EAAwB,wBAA2B;AvE8+O3D;;AuE7+OQ;;EAEE,4BAA+B;AvEg/OzC;;AuE9+OQ;;EAEE,8BAAiC;AvEi/O3C;;AuE/+OQ;;EAEE,+BAAkC;AvEk/O5C;;AuEh/OQ;;EAEE,6BAAgC;AvEm/O1C;;AuElgPQ;EAAwB,0BAA2B;AvEsgP3D;;AuErgPQ;;EAEE,8BAA+B;AvEwgPzC;;AuEtgPQ;;EAEE,gCAAiC;AvEygP3C;;AuEvgPQ;;EAEE,iCAAkC;AvE0gP5C;;AuExgPQ;;EAEE,+BAAgC;AvE2gP1C;;AuE1hPQ;EAAwB,wBAA2B;AvE8hP3D;;AuE7hPQ;;EAEE,4BAA+B;AvEgiPzC;;AuE9hPQ;;EAEE,8BAAiC;AvEiiP3C;;AuE/hPQ;;EAEE,+BAAkC;AvEkiP5C;;AuEhiPQ;;EAEE,6BAAgC;AvEmiP1C;;AuE7hPI;EAAmB,uBAAuB;AvEiiP9C;;AuEhiPI;;EAEE,2BAA2B;AvEmiPjC;;AuEjiPI;;EAEE,6BAA6B;AvEoiPnC;;AuEliPI;;EAEE,8BAA8B;AvEqiPpC;;AuEniPI;;EAEE,4BAA4B;AvEsiPlC;;Ac/iPI;EyDlDI;IAAgC,oBAA4B;EvEsmPlE;EuErmPM;;IAEE,wBAAoC;EvEumP5C;EuErmPM;;IAEE,0BAAwC;EvEumPhD;EuErmPM;;IAEE,2BAA0C;EvEumPlD;EuErmPM;;IAEE,yBAAsC;EvEumP9C;EuEtnPM;IAAgC,0BAA4B;EvEynPlE;EuExnPM;;IAEE,8BAAoC;EvE0nP5C;EuExnPM;;IAEE,gCAAwC;EvE0nPhD;EuExnPM;;IAEE,iCAA0C;EvE0nPlD;EuExnPM;;IAEE,+BAAsC;EvE0nP9C;EuEzoPM;IAAgC,yBAA4B;EvE4oPlE;EuE3oPM;;IAEE,6BAAoC;EvE6oP5C;EuE3oPM;;IAEE,+BAAwC;EvE6oPhD;EuE3oPM;;IAEE,gCAA0C;EvE6oPlD;EuE3oPM;;IAEE,8BAAsC;EvE6oP9C;EuE5pPM;IAAgC,uBAA4B;EvE+pPlE;EuE9pPM;;IAEE,2BAAoC;EvEgqP5C;EuE9pPM;;IAEE,6BAAwC;EvEgqPhD;EuE9pPM;;IAEE,8BAA0C;EvEgqPlD;EuE9pPM;;IAEE,4BAAsC;EvEgqP9C;EuE/qPM;IAAgC,yBAA4B;EvEkrPlE;EuEjrPM;;IAEE,6BAAoC;EvEmrP5C;EuEjrPM;;IAEE,+BAAwC;EvEmrPhD;EuEjrPM;;IAEE,gCAA0C;EvEmrPlD;EuEjrPM;;IAEE,8BAAsC;EvEmrP9C;EuElsPM;IAAgC,uBAA4B;EvEqsPlE;EuEpsPM;;IAEE,2BAAoC;EvEssP5C;EuEpsPM;;IAEE,6BAAwC;EvEssPhD;EuEpsPM;;IAEE,8BAA0C;EvEssPlD;EuEpsPM;;IAEE,4BAAsC;EvEssP9C;EuErtPM;IAAgC,qBAA4B;EvEwtPlE;EuEvtPM;;IAEE,yBAAoC;EvEytP5C;EuEvtPM;;IAEE,2BAAwC;EvEytPhD;EuEvtPM;;IAEE,4BAA0C;EvEytPlD;EuEvtPM;;IAEE,0BAAsC;EvEytP9C;EuExuPM;IAAgC,2BAA4B;EvE2uPlE;EuE1uPM;;IAEE,+BAAoC;EvE4uP5C;EuE1uPM;;IAEE,iCAAwC;EvE4uPhD;EuE1uPM;;IAEE,kCAA0C;EvE4uPlD;EuE1uPM;;IAEE,gCAAsC;EvE4uP9C;EuE3vPM;IAAgC,0BAA4B;EvE8vPlE;EuE7vPM;;IAEE,8BAAoC;EvE+vP5C;EuE7vPM;;IAEE,gCAAwC;EvE+vPhD;EuE7vPM;;IAEE,iCAA0C;EvE+vPlD;EuE7vPM;;IAEE,+BAAsC;EvE+vP9C;EuE9wPM;IAAgC,wBAA4B;EvEixPlE;EuEhxPM;;IAEE,4BAAoC;EvEkxP5C;EuEhxPM;;IAEE,8BAAwC;EvEkxPhD;EuEhxPM;;IAEE,+BAA0C;EvEkxPlD;EuEhxPM;;IAEE,6BAAsC;EvEkxP9C;EuEjyPM;IAAgC,0BAA4B;EvEoyPlE;EuEnyPM;;IAEE,8BAAoC;EvEqyP5C;EuEnyPM;;IAEE,gCAAwC;EvEqyPhD;EuEnyPM;;IAEE,iCAA0C;EvEqyPlD;EuEnyPM;;IAEE,+BAAsC;EvEqyP9C;EuEpzPM;IAAgC,wBAA4B;EvEuzPlE;EuEtzPM;;IAEE,4BAAoC;EvEwzP5C;EuEtzPM;;IAEE,8BAAwC;EvEwzPhD;EuEtzPM;;IAEE,+BAA0C;EvEwzPlD;EuEtzPM;;IAEE,6BAAsC;EvEwzP9C;EuEhzPM;IAAwB,2BAA2B;EvEmzPzD;EuElzPM;;IAEE,+BAA+B;EvEozPvC;EuElzPM;;IAEE,iCAAiC;EvEozPzC;EuElzPM;;IAEE,kCAAkC;EvEozP1C;EuElzPM;;IAEE,gCAAgC;EvEozPxC;EuEn0PM;IAAwB,0BAA2B;EvEs0PzD;EuEr0PM;;IAEE,8BAA+B;EvEu0PvC;EuEr0PM;;IAEE,gCAAiC;EvEu0PzC;EuEr0PM;;IAEE,iCAAkC;EvEu0P1C;EuEr0PM;;IAEE,+BAAgC;EvEu0PxC;EuEt1PM;IAAwB,wBAA2B;EvEy1PzD;EuEx1PM;;IAEE,4BAA+B;EvE01PvC;EuEx1PM;;IAEE,8BAAiC;EvE01PzC;EuEx1PM;;IAEE,+BAAkC;EvE01P1C;EuEx1PM;;IAEE,6BAAgC;EvE01PxC;EuEz2PM;IAAwB,0BAA2B;EvE42PzD;EuE32PM;;IAEE,8BAA+B;EvE62PvC;EuE32PM;;IAEE,gCAAiC;EvE62PzC;EuE32PM;;IAEE,iCAAkC;EvE62P1C;EuE32PM;;IAEE,+BAAgC;EvE62PxC;EuE53PM;IAAwB,wBAA2B;EvE+3PzD;EuE93PM;;IAEE,4BAA+B;EvEg4PvC;EuE93PM;;IAEE,8BAAiC;EvEg4PzC;EuE93PM;;IAEE,+BAAkC;EvEg4P1C;EuE93PM;;IAEE,6BAAgC;EvEg4PxC;EuE13PE;IAAmB,uBAAuB;EvE63P5C;EuE53PE;;IAEE,2BAA2B;EvE83P/B;EuE53PE;;IAEE,6BAA6B;EvE83PjC;EuE53PE;;IAEE,8BAA8B;EvE83PlC;EuE53PE;;IAEE,4BAA4B;EvE83PhC;AACF;;Acx4PI;EyDlDI;IAAgC,oBAA4B;EvE+7PlE;EuE97PM;;IAEE,wBAAoC;EvEg8P5C;EuE97PM;;IAEE,0BAAwC;EvEg8PhD;EuE97PM;;IAEE,2BAA0C;EvEg8PlD;EuE97PM;;IAEE,yBAAsC;EvEg8P9C;EuE/8PM;IAAgC,0BAA4B;EvEk9PlE;EuEj9PM;;IAEE,8BAAoC;EvEm9P5C;EuEj9PM;;IAEE,gCAAwC;EvEm9PhD;EuEj9PM;;IAEE,iCAA0C;EvEm9PlD;EuEj9PM;;IAEE,+BAAsC;EvEm9P9C;EuEl+PM;IAAgC,yBAA4B;EvEq+PlE;EuEp+PM;;IAEE,6BAAoC;EvEs+P5C;EuEp+PM;;IAEE,+BAAwC;EvEs+PhD;EuEp+PM;;IAEE,gCAA0C;EvEs+PlD;EuEp+PM;;IAEE,8BAAsC;EvEs+P9C;EuEr/PM;IAAgC,uBAA4B;EvEw/PlE;EuEv/PM;;IAEE,2BAAoC;EvEy/P5C;EuEv/PM;;IAEE,6BAAwC;EvEy/PhD;EuEv/PM;;IAEE,8BAA0C;EvEy/PlD;EuEv/PM;;IAEE,4BAAsC;EvEy/P9C;EuExgQM;IAAgC,yBAA4B;EvE2gQlE;EuE1gQM;;IAEE,6BAAoC;EvE4gQ5C;EuE1gQM;;IAEE,+BAAwC;EvE4gQhD;EuE1gQM;;IAEE,gCAA0C;EvE4gQlD;EuE1gQM;;IAEE,8BAAsC;EvE4gQ9C;EuE3hQM;IAAgC,uBAA4B;EvE8hQlE;EuE7hQM;;IAEE,2BAAoC;EvE+hQ5C;EuE7hQM;;IAEE,6BAAwC;EvE+hQhD;EuE7hQM;;IAEE,8BAA0C;EvE+hQlD;EuE7hQM;;IAEE,4BAAsC;EvE+hQ9C;EuE9iQM;IAAgC,qBAA4B;EvEijQlE;EuEhjQM;;IAEE,yBAAoC;EvEkjQ5C;EuEhjQM;;IAEE,2BAAwC;EvEkjQhD;EuEhjQM;;IAEE,4BAA0C;EvEkjQlD;EuEhjQM;;IAEE,0BAAsC;EvEkjQ9C;EuEjkQM;IAAgC,2BAA4B;EvEokQlE;EuEnkQM;;IAEE,+BAAoC;EvEqkQ5C;EuEnkQM;;IAEE,iCAAwC;EvEqkQhD;EuEnkQM;;IAEE,kCAA0C;EvEqkQlD;EuEnkQM;;IAEE,gCAAsC;EvEqkQ9C;EuEplQM;IAAgC,0BAA4B;EvEulQlE;EuEtlQM;;IAEE,8BAAoC;EvEwlQ5C;EuEtlQM;;IAEE,gCAAwC;EvEwlQhD;EuEtlQM;;IAEE,iCAA0C;EvEwlQlD;EuEtlQM;;IAEE,+BAAsC;EvEwlQ9C;EuEvmQM;IAAgC,wBAA4B;EvE0mQlE;EuEzmQM;;IAEE,4BAAoC;EvE2mQ5C;EuEzmQM;;IAEE,8BAAwC;EvE2mQhD;EuEzmQM;;IAEE,+BAA0C;EvE2mQlD;EuEzmQM;;IAEE,6BAAsC;EvE2mQ9C;EuE1nQM;IAAgC,0BAA4B;EvE6nQlE;EuE5nQM;;IAEE,8BAAoC;EvE8nQ5C;EuE5nQM;;IAEE,gCAAwC;EvE8nQhD;EuE5nQM;;IAEE,iCAA0C;EvE8nQlD;EuE5nQM;;IAEE,+BAAsC;EvE8nQ9C;EuE7oQM;IAAgC,wBAA4B;EvEgpQlE;EuE/oQM;;IAEE,4BAAoC;EvEipQ5C;EuE/oQM;;IAEE,8BAAwC;EvEipQhD;EuE/oQM;;IAEE,+BAA0C;EvEipQlD;EuE/oQM;;IAEE,6BAAsC;EvEipQ9C;EuEzoQM;IAAwB,2BAA2B;EvE4oQzD;EuE3oQM;;IAEE,+BAA+B;EvE6oQvC;EuE3oQM;;IAEE,iCAAiC;EvE6oQzC;EuE3oQM;;IAEE,kCAAkC;EvE6oQ1C;EuE3oQM;;IAEE,gCAAgC;EvE6oQxC;EuE5pQM;IAAwB,0BAA2B;EvE+pQzD;EuE9pQM;;IAEE,8BAA+B;EvEgqQvC;EuE9pQM;;IAEE,gCAAiC;EvEgqQzC;EuE9pQM;;IAEE,iCAAkC;EvEgqQ1C;EuE9pQM;;IAEE,+BAAgC;EvEgqQxC;EuE/qQM;IAAwB,wBAA2B;EvEkrQzD;EuEjrQM;;IAEE,4BAA+B;EvEmrQvC;EuEjrQM;;IAEE,8BAAiC;EvEmrQzC;EuEjrQM;;IAEE,+BAAkC;EvEmrQ1C;EuEjrQM;;IAEE,6BAAgC;EvEmrQxC;EuElsQM;IAAwB,0BAA2B;EvEqsQzD;EuEpsQM;;IAEE,8BAA+B;EvEssQvC;EuEpsQM;;IAEE,gCAAiC;EvEssQzC;EuEpsQM;;IAEE,iCAAkC;EvEssQ1C;EuEpsQM;;IAEE,+BAAgC;EvEssQxC;EuErtQM;IAAwB,wBAA2B;EvEwtQzD;EuEvtQM;;IAEE,4BAA+B;EvEytQvC;EuEvtQM;;IAEE,8BAAiC;EvEytQzC;EuEvtQM;;IAEE,+BAAkC;EvEytQ1C;EuEvtQM;;IAEE,6BAAgC;EvEytQxC;EuEntQE;IAAmB,uBAAuB;EvEstQ5C;EuErtQE;;IAEE,2BAA2B;EvEutQ/B;EuErtQE;;IAEE,6BAA6B;EvEutQjC;EuErtQE;;IAEE,8BAA8B;EvEutQlC;EuErtQE;;IAEE,4BAA4B;EvEutQhC;AACF;;AcjuQI;EyDlDI;IAAgC,oBAA4B;EvEwxQlE;EuEvxQM;;IAEE,wBAAoC;EvEyxQ5C;EuEvxQM;;IAEE,0BAAwC;EvEyxQhD;EuEvxQM;;IAEE,2BAA0C;EvEyxQlD;EuEvxQM;;IAEE,yBAAsC;EvEyxQ9C;EuExyQM;IAAgC,0BAA4B;EvE2yQlE;EuE1yQM;;IAEE,8BAAoC;EvE4yQ5C;EuE1yQM;;IAEE,gCAAwC;EvE4yQhD;EuE1yQM;;IAEE,iCAA0C;EvE4yQlD;EuE1yQM;;IAEE,+BAAsC;EvE4yQ9C;EuE3zQM;IAAgC,yBAA4B;EvE8zQlE;EuE7zQM;;IAEE,6BAAoC;EvE+zQ5C;EuE7zQM;;IAEE,+BAAwC;EvE+zQhD;EuE7zQM;;IAEE,gCAA0C;EvE+zQlD;EuE7zQM;;IAEE,8BAAsC;EvE+zQ9C;EuE90QM;IAAgC,uBAA4B;EvEi1QlE;EuEh1QM;;IAEE,2BAAoC;EvEk1Q5C;EuEh1QM;;IAEE,6BAAwC;EvEk1QhD;EuEh1QM;;IAEE,8BAA0C;EvEk1QlD;EuEh1QM;;IAEE,4BAAsC;EvEk1Q9C;EuEj2QM;IAAgC,yBAA4B;EvEo2QlE;EuEn2QM;;IAEE,6BAAoC;EvEq2Q5C;EuEn2QM;;IAEE,+BAAwC;EvEq2QhD;EuEn2QM;;IAEE,gCAA0C;EvEq2QlD;EuEn2QM;;IAEE,8BAAsC;EvEq2Q9C;EuEp3QM;IAAgC,uBAA4B;EvEu3QlE;EuEt3QM;;IAEE,2BAAoC;EvEw3Q5C;EuEt3QM;;IAEE,6BAAwC;EvEw3QhD;EuEt3QM;;IAEE,8BAA0C;EvEw3QlD;EuEt3QM;;IAEE,4BAAsC;EvEw3Q9C;EuEv4QM;IAAgC,qBAA4B;EvE04QlE;EuEz4QM;;IAEE,yBAAoC;EvE24Q5C;EuEz4QM;;IAEE,2BAAwC;EvE24QhD;EuEz4QM;;IAEE,4BAA0C;EvE24QlD;EuEz4QM;;IAEE,0BAAsC;EvE24Q9C;EuE15QM;IAAgC,2BAA4B;EvE65QlE;EuE55QM;;IAEE,+BAAoC;EvE85Q5C;EuE55QM;;IAEE,iCAAwC;EvE85QhD;EuE55QM;;IAEE,kCAA0C;EvE85QlD;EuE55QM;;IAEE,gCAAsC;EvE85Q9C;EuE76QM;IAAgC,0BAA4B;EvEg7QlE;EuE/6QM;;IAEE,8BAAoC;EvEi7Q5C;EuE/6QM;;IAEE,gCAAwC;EvEi7QhD;EuE/6QM;;IAEE,iCAA0C;EvEi7QlD;EuE/6QM;;IAEE,+BAAsC;EvEi7Q9C;EuEh8QM;IAAgC,wBAA4B;EvEm8QlE;EuEl8QM;;IAEE,4BAAoC;EvEo8Q5C;EuEl8QM;;IAEE,8BAAwC;EvEo8QhD;EuEl8QM;;IAEE,+BAA0C;EvEo8QlD;EuEl8QM;;IAEE,6BAAsC;EvEo8Q9C;EuEn9QM;IAAgC,0BAA4B;EvEs9QlE;EuEr9QM;;IAEE,8BAAoC;EvEu9Q5C;EuEr9QM;;IAEE,gCAAwC;EvEu9QhD;EuEr9QM;;IAEE,iCAA0C;EvEu9QlD;EuEr9QM;;IAEE,+BAAsC;EvEu9Q9C;EuEt+QM;IAAgC,wBAA4B;EvEy+QlE;EuEx+QM;;IAEE,4BAAoC;EvE0+Q5C;EuEx+QM;;IAEE,8BAAwC;EvE0+QhD;EuEx+QM;;IAEE,+BAA0C;EvE0+QlD;EuEx+QM;;IAEE,6BAAsC;EvE0+Q9C;EuEl+QM;IAAwB,2BAA2B;EvEq+QzD;EuEp+QM;;IAEE,+BAA+B;EvEs+QvC;EuEp+QM;;IAEE,iCAAiC;EvEs+QzC;EuEp+QM;;IAEE,kCAAkC;EvEs+Q1C;EuEp+QM;;IAEE,gCAAgC;EvEs+QxC;EuEr/QM;IAAwB,0BAA2B;EvEw/QzD;EuEv/QM;;IAEE,8BAA+B;EvEy/QvC;EuEv/QM;;IAEE,gCAAiC;EvEy/QzC;EuEv/QM;;IAEE,iCAAkC;EvEy/Q1C;EuEv/QM;;IAEE,+BAAgC;EvEy/QxC;EuExgRM;IAAwB,wBAA2B;EvE2gRzD;EuE1gRM;;IAEE,4BAA+B;EvE4gRvC;EuE1gRM;;IAEE,8BAAiC;EvE4gRzC;EuE1gRM;;IAEE,+BAAkC;EvE4gR1C;EuE1gRM;;IAEE,6BAAgC;EvE4gRxC;EuE3hRM;IAAwB,0BAA2B;EvE8hRzD;EuE7hRM;;IAEE,8BAA+B;EvE+hRvC;EuE7hRM;;IAEE,gCAAiC;EvE+hRzC;EuE7hRM;;IAEE,iCAAkC;EvE+hR1C;EuE7hRM;;IAEE,+BAAgC;EvE+hRxC;EuE9iRM;IAAwB,wBAA2B;EvEijRzD;EuEhjRM;;IAEE,4BAA+B;EvEkjRvC;EuEhjRM;;IAEE,8BAAiC;EvEkjRzC;EuEhjRM;;IAEE,+BAAkC;EvEkjR1C;EuEhjRM;;IAEE,6BAAgC;EvEkjRxC;EuE5iRE;IAAmB,uBAAuB;EvE+iR5C;EuE9iRE;;IAEE,2BAA2B;EvEgjR/B;EuE9iRE;;IAEE,6BAA6B;EvEgjRjC;EuE9iRE;;IAEE,8BAA8B;EvEgjRlC;EuE9iRE;;IAEE,4BAA4B;EvEgjRhC;AACF;;Ac1jRI;EyDlDI;IAAgC,oBAA4B;EvEinRlE;EuEhnRM;;IAEE,wBAAoC;EvEknR5C;EuEhnRM;;IAEE,0BAAwC;EvEknRhD;EuEhnRM;;IAEE,2BAA0C;EvEknRlD;EuEhnRM;;IAEE,yBAAsC;EvEknR9C;EuEjoRM;IAAgC,0BAA4B;EvEooRlE;EuEnoRM;;IAEE,8BAAoC;EvEqoR5C;EuEnoRM;;IAEE,gCAAwC;EvEqoRhD;EuEnoRM;;IAEE,iCAA0C;EvEqoRlD;EuEnoRM;;IAEE,+BAAsC;EvEqoR9C;EuEppRM;IAAgC,yBAA4B;EvEupRlE;EuEtpRM;;IAEE,6BAAoC;EvEwpR5C;EuEtpRM;;IAEE,+BAAwC;EvEwpRhD;EuEtpRM;;IAEE,gCAA0C;EvEwpRlD;EuEtpRM;;IAEE,8BAAsC;EvEwpR9C;EuEvqRM;IAAgC,uBAA4B;EvE0qRlE;EuEzqRM;;IAEE,2BAAoC;EvE2qR5C;EuEzqRM;;IAEE,6BAAwC;EvE2qRhD;EuEzqRM;;IAEE,8BAA0C;EvE2qRlD;EuEzqRM;;IAEE,4BAAsC;EvE2qR9C;EuE1rRM;IAAgC,yBAA4B;EvE6rRlE;EuE5rRM;;IAEE,6BAAoC;EvE8rR5C;EuE5rRM;;IAEE,+BAAwC;EvE8rRhD;EuE5rRM;;IAEE,gCAA0C;EvE8rRlD;EuE5rRM;;IAEE,8BAAsC;EvE8rR9C;EuE7sRM;IAAgC,uBAA4B;EvEgtRlE;EuE/sRM;;IAEE,2BAAoC;EvEitR5C;EuE/sRM;;IAEE,6BAAwC;EvEitRhD;EuE/sRM;;IAEE,8BAA0C;EvEitRlD;EuE/sRM;;IAEE,4BAAsC;EvEitR9C;EuEhuRM;IAAgC,qBAA4B;EvEmuRlE;EuEluRM;;IAEE,yBAAoC;EvEouR5C;EuEluRM;;IAEE,2BAAwC;EvEouRhD;EuEluRM;;IAEE,4BAA0C;EvEouRlD;EuEluRM;;IAEE,0BAAsC;EvEouR9C;EuEnvRM;IAAgC,2BAA4B;EvEsvRlE;EuErvRM;;IAEE,+BAAoC;EvEuvR5C;EuErvRM;;IAEE,iCAAwC;EvEuvRhD;EuErvRM;;IAEE,kCAA0C;EvEuvRlD;EuErvRM;;IAEE,gCAAsC;EvEuvR9C;EuEtwRM;IAAgC,0BAA4B;EvEywRlE;EuExwRM;;IAEE,8BAAoC;EvE0wR5C;EuExwRM;;IAEE,gCAAwC;EvE0wRhD;EuExwRM;;IAEE,iCAA0C;EvE0wRlD;EuExwRM;;IAEE,+BAAsC;EvE0wR9C;EuEzxRM;IAAgC,wBAA4B;EvE4xRlE;EuE3xRM;;IAEE,4BAAoC;EvE6xR5C;EuE3xRM;;IAEE,8BAAwC;EvE6xRhD;EuE3xRM;;IAEE,+BAA0C;EvE6xRlD;EuE3xRM;;IAEE,6BAAsC;EvE6xR9C;EuE5yRM;IAAgC,0BAA4B;EvE+yRlE;EuE9yRM;;IAEE,8BAAoC;EvEgzR5C;EuE9yRM;;IAEE,gCAAwC;EvEgzRhD;EuE9yRM;;IAEE,iCAA0C;EvEgzRlD;EuE9yRM;;IAEE,+BAAsC;EvEgzR9C;EuE/zRM;IAAgC,wBAA4B;EvEk0RlE;EuEj0RM;;IAEE,4BAAoC;EvEm0R5C;EuEj0RM;;IAEE,8BAAwC;EvEm0RhD;EuEj0RM;;IAEE,+BAA0C;EvEm0RlD;EuEj0RM;;IAEE,6BAAsC;EvEm0R9C;EuE3zRM;IAAwB,2BAA2B;EvE8zRzD;EuE7zRM;;IAEE,+BAA+B;EvE+zRvC;EuE7zRM;;IAEE,iCAAiC;EvE+zRzC;EuE7zRM;;IAEE,kCAAkC;EvE+zR1C;EuE7zRM;;IAEE,gCAAgC;EvE+zRxC;EuE90RM;IAAwB,0BAA2B;EvEi1RzD;EuEh1RM;;IAEE,8BAA+B;EvEk1RvC;EuEh1RM;;IAEE,gCAAiC;EvEk1RzC;EuEh1RM;;IAEE,iCAAkC;EvEk1R1C;EuEh1RM;;IAEE,+BAAgC;EvEk1RxC;EuEj2RM;IAAwB,wBAA2B;EvEo2RzD;EuEn2RM;;IAEE,4BAA+B;EvEq2RvC;EuEn2RM;;IAEE,8BAAiC;EvEq2RzC;EuEn2RM;;IAEE,+BAAkC;EvEq2R1C;EuEn2RM;;IAEE,6BAAgC;EvEq2RxC;EuEp3RM;IAAwB,0BAA2B;EvEu3RzD;EuEt3RM;;IAEE,8BAA+B;EvEw3RvC;EuEt3RM;;IAEE,gCAAiC;EvEw3RzC;EuEt3RM;;IAEE,iCAAkC;EvEw3R1C;EuEt3RM;;IAEE,+BAAgC;EvEw3RxC;EuEv4RM;IAAwB,wBAA2B;EvE04RzD;EuEz4RM;;IAEE,4BAA+B;EvE24RvC;EuEz4RM;;IAEE,8BAAiC;EvE24RzC;EuEz4RM;;IAEE,+BAAkC;EvE24R1C;EuEz4RM;;IAEE,6BAAgC;EvE24RxC;EuEr4RE;IAAmB,uBAAuB;EvEw4R5C;EuEv4RE;;IAEE,2BAA2B;EvEy4R/B;EuEv4RE;;IAEE,6BAA6B;EvEy4RjC;EuEv4RE;;IAEE,8BAA8B;EvEy4RlC;EuEv4RE;;IAEE,4BAA4B;EvEy4RhC;AACF;;AwEz8RA;EAAkB,4GAA8C;AxE68RhE;;AwEz8RA;EAAiB,8BAA8B;AxE68R/C;;AwE58RA;EAAiB,8BAA8B;AxEg9R/C;;AwE/8RA;EAAiB,8BAA8B;AxEm9R/C;;AwEl9RA;ECTE,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;AzE+9RrB;;AwEh9RI;EAAwB,2BAA2B;AxEo9RvD;;AwEn9RI;EAAwB,4BAA4B;AxEu9RxD;;AwEt9RI;EAAwB,6BAA6B;AxE09RzD;;Acr7RI;E0DvCA;IAAwB,2BAA2B;ExEi+RrD;EwEh+RE;IAAwB,4BAA4B;ExEm+RtD;EwEl+RE;IAAwB,6BAA6B;ExEq+RvD;AACF;;Acj8RI;E0DvCA;IAAwB,2BAA2B;ExE6+RrD;EwE5+RE;IAAwB,4BAA4B;ExE++RtD;EwE9+RE;IAAwB,6BAA6B;ExEi/RvD;AACF;;Ac78RI;E0DvCA;IAAwB,2BAA2B;ExEy/RrD;EwEx/RE;IAAwB,4BAA4B;ExE2/RtD;EwE1/RE;IAAwB,6BAA6B;ExE6/RvD;AACF;;Acz9RI;E0DvCA;IAAwB,2BAA2B;ExEqgSrD;EwEpgSE;IAAwB,4BAA4B;ExEugStD;EwEtgSE;IAAwB,6BAA6B;ExEygSvD;AACF;;AwEpgSA;EAAmB,oCAAoC;AxEwgSvD;;AwEvgSA;EAAmB,oCAAoC;AxE2gSvD;;AwE1gSA;EAAmB,qCAAqC;AxE8gSxD;;AwE1gSA;EAAuB,2BAA0C;AxE8gSjE;;AwE7gSA;EAAuB,+BAA4C;AxEihSnE;;AwEhhSA;EAAuB,2BAA2C;AxEohSlE;;AwEnhSA;EAAuB,2BAAyC;AxEuhShE;;AwEthSA;EAAuB,8BAA2C;AxE0hSlE;;AwEzhSA;EAAuB,6BAA6B;AxE6hSpD;;AwEzhSA;EAAc,sBAAwB;AxE6hStC;;A0EpkSE;EACE,yBAAwB;A1EukS5B;;AK7jSE;EqELM,yBAA0E;A1EskSlF;;A0E5kSE;EACE,yBAAwB;A1E+kS5B;;AKrkSE;EqELM,yBAA0E;A1E8kSlF;;A0EplSE;EACE,yBAAwB;A1EulS5B;;AK7kSE;EqELM,yBAA0E;A1EslSlF;;A0E5lSE;EACE,yBAAwB;A1E+lS5B;;AKrlSE;EqELM,yBAA0E;A1E8lSlF;;A0EpmSE;EACE,yBAAwB;A1EumS5B;;AK7lSE;EqELM,yBAA0E;A1EsmSlF;;A0E5mSE;EACE,yBAAwB;A1E+mS5B;;AKrmSE;EqELM,yBAA0E;A1E8mSlF;;A0EpnSE;EACE,yBAAwB;A1EunS5B;;AK7mSE;EqELM,yBAA0E;A1EsnSlF;;A0E5nSE;EACE,yBAAwB;A1E+nS5B;;AKrnSE;EqELM,yBAA0E;A1E8nSlF;;AwEvlSA;EAAa,yBAA6B;AxE2lS1C;;AwE1lSA;EAAc,yBAA6B;AxE8lS3C;;AwE5lSA;EAAiB,oCAAkC;AxEgmSnD;;AwE/lSA;EAAiB,0CAAkC;AxEmmSnD;;AwE/lSA;EGvDE,WAAW;EACX,kBAAkB;EAClB,iBAAiB;EACjB,6BAA6B;EAC7B,SAAS;A3E0pSX;;AwEnmSA;EAAwB,gCAAgC;AxEumSxD;;AwErmSA;EACE,iCAAiC;EACjC,oCAAoC;AxEwmStC;;AwEnmSA;EAAc,yBAAyB;AxEumSvC;;A4ExqSA;EACE,8BAA8B;A5E2qShC;;A4ExqSA;EACE,6BAA6B;A5E2qS/B;;A6E3qSE;E3EOF;;;I2EDM,4BAA4B;IAE5B,2BAA2B;E7E2qS/B;E6ExqSE;IAEI,0BAA0B;E7EyqShC;E6EhqSE;IACE,6BAA6B;E7EkqSjC;EEn+RF;I2EhLM,gCAAgC;E7EspSpC;E6EppSE;;IAEE,yB1EzCY;I0E0CZ,wBAAwB;E7EspS5B;E6E9oSE;IACE,2BAA2B;E7EgpS/B;E6E7oSE;;IAEE,wBAAwB;E7E+oS5B;E6E5oSE;;;IAGE,UAAU;IACV,SAAS;E7E8oSb;E6E3oSE;;IAEE,uBAAuB;E7E6oS3B;E6EroSE;IACE,Q1EwgCgC;EH+nQpC;EEnrSF;I2E+CM,2BAA2C;E7EuoS/C;EY9tSA;IiE0FI,2BAA2C;E7EuoS/C;EiCrtSF;I4CmFM,aAAa;E7EqoSjB;EsCpuSF;IuCkGM,sB1EtFS;EH2tSb;EgBxuSF;I6DuGM,oCAAoC;E7EooSxC;E6EroSE;;IAKI,iCAAmC;E7EooSzC;EgBvsSF;;I6D0EQ,oCAAsC;E7EioS5C;EgBtnSF;I6DNM,cAAc;E7E+nSlB;EiBrvSA;;;;I4D4HM,qB1EvHU;EHsvShB;EgBjpSF;I6DuBM,cAAc;IACd,qB1E7HY;EH0vShB;AACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n","/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n color: #212529;\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #343a40;\n border-color: #454d55;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.form-control-lg {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #28a745;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #28a745;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #34ce57;\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #dc3545;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #e4606d;\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n color: #212529;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #212529;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n text-decoration: none;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 992px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1200px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n background-color: #fff;\n border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: -2.25rem;\n width: 1.75rem;\n pointer-events: all;\n border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0.25rem + 2px);\n left: calc(-2.25rem + 2px);\n width: calc(1rem - 4px);\n height: calc(1rem - 4px);\n background-color: #adb5bd;\n border-radius: 0.5rem;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(1.5em + 1rem + 2px);\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: calc(1.5em + 0.75rem);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: inherit;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.4rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.2rem;\n margin-left: 0.2rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion > .card {\n overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n margin-bottom: -1px;\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #fff;\n background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #fff;\n background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #212529;\n background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #212529;\n background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n backdrop-filter: blur(10px);\n opacity: 0;\n border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.25rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.75rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n padding: 1rem 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 1rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.5rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.5rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.5rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 800px;\n }\n}\n\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0056b3 !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #494f54 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #19692c !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #0f6674 !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #ba8b00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #a71d2a !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #cbd3da !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #121416 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer / 2 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\n$input-height-inner-half: calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n\n$input-height: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\n$input-height-sm: calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\n$input-height-lg: calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default;\n$custom-switch-indicator-size: calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer / 2 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n","// stylelint-disable declaration-no-important, selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n @include font-size($display1-size);\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n @include font-size($display2-size);\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n @include font-size($display3-size);\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n @include font-size($display4-size);\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n @include font-size($small-font-size);\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size(90%);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n display: block;\n @include font-size($blockquote-small-font-size);\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all ``s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer / 2;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/#feat=css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n","// stylelint-disable property-blacklist\n// Single side border-radius\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-top-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n }\n}\n\n@mixin border-top-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-right-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-left-radius($radius) {\n @if $enable-rounded {\n border-bottom-left-radius: $radius;\n }\n}\n","// Inline code\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-break: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n @include font-size(100%);\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: 2 * $table-border-width;\n }\n }\n}\n\n.table-borderless {\n th,\n td,\n thead th,\n tbody + tbody {\n border: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(#{$table-striped-order}) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n color: $table-hover-color;\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n .thead-dark {\n th {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n border-color: $table-dark-border-color;\n }\n }\n\n .thead-light {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n border-color: $table-border-color;\n }\n }\n}\n\n.table-dark {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n\n th,\n td,\n thead th {\n border-color: $table-dark-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-dark-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n color: $table-dark-hover-color;\n background-color: $table-dark-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n > .table-bordered {\n border: 0;\n }\n }\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n }\n\n @if $border != null {\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $border;\n }\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// Color contrast\n@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {\n $r: red($color);\n $g: green($color);\n $b: blue($color);\n\n $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;\n\n @if ($yiq >= $yiq-contrasted-threshold) {\n @return $dark;\n } @else {\n @return $light;\n }\n}\n\n// Retrieve color Sass maps\n@function color($key: \"blue\") {\n @return map-get($colors, $key);\n}\n\n@function theme-color($key: \"primary\") {\n @return map-get($theme-colors, $key);\n}\n\n@function gray($key: \"100\") {\n @return map-get($grays, $key);\n}\n\n// Request a theme color level\n@function theme-color-level($color-name: \"primary\", $level: 0) {\n $color: theme-color($color-name);\n $color-base: if($level > 0, $black, $white);\n $level: abs($level);\n\n @return mix($color-base, $color, $level * $theme-color-interval);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n\n // Note: This has no effect on `s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on ` receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-padding-y} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\n margin-bottom: 0; // Override the `` elements\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @include button-variant($value, $value);\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value);\n }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n font-weight: $font-weight-normal;\n color: $link-color;\n text-decoration: $link-decoration;\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus,\n &.focus {\n text-decoration: $link-hover-decoration;\n box-shadow: none;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n pointer-events: none;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\n}\n\n\n//\n// Block button\n//\n\n.btn-block {\n display: block;\n width: 100%;\n\n // Vertically space out multiple block buttons\n + .btn-block {\n margin-top: $btn-block-spacing-y;\n }\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {\n color: color-yiq($background);\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n @include hover {\n color: color-yiq($hover-background);\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n &:focus,\n &.focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n color: color-yiq($background);\n background-color: $background;\n border-color: $border;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n @if $enable-gradients {\n background-image: none; // Remove the gradient for the pressed/active state\n }\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n }\n }\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\n color: $color;\n border-color: $color;\n\n @include hover {\n color: $color-hover;\n background-color: $active-background;\n border-color: $active-border;\n }\n\n &:focus,\n &.focus {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n}\n","// The dropdown wrapper (`
`)\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret;\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y 0;\n margin: $dropdown-spacer 0 0; // override default ul\n @include font-size($dropdown-font-size);\n color: $dropdown-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n}\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-left {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu#{$infix}-right {\n right: 0;\n left: auto;\n }\n }\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropright {\n .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(right);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropleft {\n .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(left);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n// When enabled Popper.js, reset basic dropdown position\n// stylelint-disable-next-line no-duplicate-selectors\n.dropdown-menu {\n &[x-placement^=\"top\"],\n &[x-placement^=\"right\"],\n &[x-placement^=\"bottom\"],\n &[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n }\n}\n\n// Dividers (basically an `
`) within the dropdown\n.dropdown-divider {\n @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:vn},Ln="show",xn="out",Pn={HIDE:"hide"+Tn,HIDDEN:"hidden"+Tn,SHOW:"show"+Tn,SHOWN:"shown"+Tn,INSERTED:"inserted"+Tn,CLICK:"click"+Tn,FOCUSIN:"focusin"+Tn,FOCUSOUT:"focusout"+Tn,MOUSEENTER:"mouseenter"+Tn,MOUSELEAVE:"mouseleave"+Tn},Hn="fade",jn="show",Rn=".tooltip-inner",Fn=".arrow",Mn="hover",Wn="focus",Un="click",Bn="manual",qn=function(){function i(t,e){if("undefined"==typeof be)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=p(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(jn))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var t=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(t);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(Hn);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new be(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Fn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),p(o).addClass(jn),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,p(e.element).trigger(e.constructor.Event.SHOWN),t===xn&&e._leave(null,e)};if(p(this.tip).hasClass(Hn)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=p.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==Ln&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),p(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(p(this.element).trigger(i),!i.isDefaultPrevented()){if(p(n).removeClass(jn),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Un]=!1,this._activeTrigger[Wn]=!1,this._activeTrigger[Mn]=!1,p(this.tip).hasClass(Hn)){var r=m.getTransitionDurationFromElement(n);p(n).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){p(this.getTipElement()).addClass(Dn+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(p(t.querySelectorAll(Rn)),this.getTitle()),p(t).removeClass(Hn+" "+jn)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=bn(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?p(e).parent().is(t)||t.empty().append(e):t.text(p(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},t._getAttachment=function(t){return Nn[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Bn){var e=t===Mn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Mn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),p(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Wn:Mn]=!0),p(e.getTipElement()).hasClass(jn)||e._hoverState===Ln?e._hoverState=Ln:(clearTimeout(e._timeout),e._hoverState=Ln,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===Ln&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Wn:Mn]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=xn,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===xn&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=p(this.element).data();return Object.keys(e).forEach(function(t){-1!==An.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),m.typeCheckConfig(wn,t,this.constructor.DefaultType),t.sanitize&&(t.template=bn(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(In);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(p(t).removeClass(Hn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(Cn),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(Cn,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return kn}},{key:"NAME",get:function(){return wn}},{key:"DATA_KEY",get:function(){return Cn}},{key:"Event",get:function(){return Pn}},{key:"EVENT_KEY",get:function(){return Tn}},{key:"DefaultType",get:function(){return On}}]),i}();p.fn[wn]=qn._jQueryInterface,p.fn[wn].Constructor=qn,p.fn[wn].noConflict=function(){return p.fn[wn]=Sn,qn._jQueryInterface};var Kn="popover",Qn="bs.popover",Vn="."+Qn,Yn=p.fn[Kn],zn="bs-popover",Xn=new RegExp("(^|\\s)"+zn+"\\S+","g"),Gn=l({},qn.Default,{placement:"right",trigger:"click",content:"",template:''}),$n=l({},qn.DefaultType,{content:"(string|element|function)"}),Jn="fade",Zn="show",ti=".popover-header",ei=".popover-body",ni={HIDE:"hide"+Vn,HIDDEN:"hidden"+Vn,SHOW:"show"+Vn,SHOWN:"shown"+Vn,INSERTED:"inserted"+Vn,CLICK:"click"+Vn,FOCUSIN:"focusin"+Vn,FOCUSOUT:"focusout"+Vn,MOUSEENTER:"mouseenter"+Vn,MOUSELEAVE:"mouseleave"+Vn},ii=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){p(this.getTipElement()).addClass(zn+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},o.setContent=function(){var t=p(this.getTipElement());this.setElementContent(t.find(ti),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(ei),e),t.removeClass(Jn+" "+Zn)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(Xn);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (err) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n // TODO: Remove in v5\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value)\n ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Selector = {\n DISMISS : '[data-dismiss=\"alert\"]'\n}\n\nconst Event = {\n CLOSE : `close${EVENT_KEY}`,\n CLOSED : `closed${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ALERT : 'alert',\n FADE : 'fade',\n SHOW : 'show'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n close(element) {\n let rootElement = this._element\n if (element) {\n rootElement = this._getRootElement(element)\n }\n\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent.isDefaultPrevented()) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _getRootElement(element) {\n const selector = Util.getSelectorFromElement(element)\n let parent = false\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n if (!parent) {\n parent = $(element).closest(`.${ClassName.ALERT}`)[0]\n }\n\n return parent\n }\n\n _triggerCloseEvent(element) {\n const closeEvent = $.Event(Event.CLOSE)\n\n $(element).trigger(closeEvent)\n return closeEvent\n }\n\n _removeElement(element) {\n $(element).removeClass(ClassName.SHOW)\n\n if (!$(element).hasClass(ClassName.FADE)) {\n this._destroyElement(element)\n return\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n $(element)\n .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\n .emulateTransitionEnd(transitionDuration)\n }\n\n _destroyElement(element) {\n $(element)\n .detach()\n .trigger(Event.CLOSED)\n .remove()\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Alert(this)\n $element.data(DATA_KEY, data)\n }\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(\n Event.CLICK_DATA_API,\n Selector.DISMISS,\n Alert._handleDismiss(new Alert())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst ClassName = {\n ACTIVE : 'active',\n BUTTON : 'btn',\n FOCUS : 'focus'\n}\n\nconst Selector = {\n DATA_TOGGLE_CARROT : '[data-toggle^=\"button\"]',\n DATA_TOGGLE : '[data-toggle=\"buttons\"]',\n INPUT : 'input:not([type=\"hidden\"])',\n ACTIVE : '.active',\n BUTTON : '.btn'\n}\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\n `blur${EVENT_KEY}${DATA_API_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n toggle() {\n let triggerChangeEvent = true\n let addAriaPressed = true\n const rootElement = $(this._element).closest(\n Selector.DATA_TOGGLE\n )[0]\n\n if (rootElement) {\n const input = this._element.querySelector(Selector.INPUT)\n\n if (input) {\n if (input.type === 'radio') {\n if (input.checked &&\n this._element.classList.contains(ClassName.ACTIVE)) {\n triggerChangeEvent = false\n } else {\n const activeElement = rootElement.querySelector(Selector.ACTIVE)\n\n if (activeElement) {\n $(activeElement).removeClass(ClassName.ACTIVE)\n }\n }\n }\n\n if (triggerChangeEvent) {\n if (input.hasAttribute('disabled') ||\n rootElement.hasAttribute('disabled') ||\n input.classList.contains('disabled') ||\n rootElement.classList.contains('disabled')) {\n return\n }\n input.checked = !this._element.classList.contains(ClassName.ACTIVE)\n $(input).trigger('change')\n }\n\n input.focus()\n addAriaPressed = false\n }\n }\n\n if (addAriaPressed) {\n this._element.setAttribute('aria-pressed',\n !this._element.classList.contains(ClassName.ACTIVE))\n }\n\n if (triggerChangeEvent) {\n $(this._element).toggleClass(ClassName.ACTIVE)\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new Button(this)\n $(this).data(DATA_KEY, data)\n }\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n event.preventDefault()\n\n let button = event.target\n\n if (!$(button).hasClass(ClassName.BUTTON)) {\n button = $(button).closest(Selector.BUTTON)\n }\n\n Button._jQueryInterface.call($(button), 'toggle')\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval : 5000,\n keyboard : true,\n slide : false,\n pause : 'hover',\n wrap : true,\n touch : true\n}\n\nconst DefaultType = {\n interval : '(number|boolean)',\n keyboard : 'boolean',\n slide : '(boolean|string)',\n pause : '(string|boolean)',\n wrap : 'boolean',\n touch : 'boolean'\n}\n\nconst Direction = {\n NEXT : 'next',\n PREV : 'prev',\n LEFT : 'left',\n RIGHT : 'right'\n}\n\nconst Event = {\n SLIDE : `slide${EVENT_KEY}`,\n SLID : `slid${EVENT_KEY}`,\n KEYDOWN : `keydown${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`,\n TOUCHSTART : `touchstart${EVENT_KEY}`,\n TOUCHMOVE : `touchmove${EVENT_KEY}`,\n TOUCHEND : `touchend${EVENT_KEY}`,\n POINTERDOWN : `pointerdown${EVENT_KEY}`,\n POINTERUP : `pointerup${EVENT_KEY}`,\n DRAG_START : `dragstart${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n CAROUSEL : 'carousel',\n ACTIVE : 'active',\n SLIDE : 'slide',\n RIGHT : 'carousel-item-right',\n LEFT : 'carousel-item-left',\n NEXT : 'carousel-item-next',\n PREV : 'carousel-item-prev',\n ITEM : 'carousel-item',\n POINTER_EVENT : 'pointer-event'\n}\n\nconst Selector = {\n ACTIVE : '.active',\n ACTIVE_ITEM : '.active.carousel-item',\n ITEM : '.carousel-item',\n ITEM_IMG : '.carousel-item img',\n NEXT_PREV : '.carousel-item-next, .carousel-item-prev',\n INDICATORS : '.carousel-indicators',\n DATA_SLIDE : '[data-slide], [data-slide-to]',\n DATA_RIDE : '[data-ride=\"carousel\"]'\n}\n\nconst PointerType = {\n TOUCH : 'touch',\n PEN : 'pen'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel {\n constructor(element, config) {\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._element = element\n this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n next() {\n if (!this._isSliding) {\n this._slide(Direction.NEXT)\n }\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden &&\n ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\n this.next()\n }\n }\n\n prev() {\n if (!this._isSliding) {\n this._slide(Direction.PREV)\n }\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (this._element.querySelector(Selector.NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n $(this._element).one(Event.SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const direction = index > activeIndex\n ? Direction.NEXT\n : Direction.PREV\n\n this._slide(direction, this._items[index])\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n $.removeData(this._element, DATA_KEY)\n\n this._items = null\n this._config = null\n this._element = null\n this._interval = null\n this._isPaused = null\n this._isSliding = null\n this._activeElement = null\n this._indicatorsElement = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n // swipe left\n if (direction > 0) {\n this.prev()\n }\n\n // swipe right\n if (direction < 0) {\n this.next()\n }\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n $(this._element)\n .on(Event.KEYDOWN, (event) => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n $(this._element)\n .on(Event.MOUSEENTER, (event) => this.pause(event))\n .on(Event.MOUSELEAVE, (event) => this.cycle(event))\n }\n\n if (this._config.touch) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n if (!this._touchSupported) {\n return\n }\n\n const start = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchStartX = event.originalEvent.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.originalEvent.touches[0].clientX\n }\n }\n\n const move = (event) => {\n // ensure swiping with one touch and not pinching\n if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n this.touchDeltaX = 0\n } else {\n this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\n }\n }\n\n const end = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\n if (this._pointerEvent) {\n $(this._element).on(Event.POINTERDOWN, (event) => start(event))\n $(this._element).on(Event.POINTERUP, (event) => end(event))\n\n this._element.classList.add(ClassName.POINTER_EVENT)\n } else {\n $(this._element).on(Event.TOUCHSTART, (event) => start(event))\n $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\n $(this._element).on(Event.TOUCHEND, (event) => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault()\n this.prev()\n break\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault()\n this.next()\n break\n default:\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode\n ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\n : []\n return this._items.indexOf(element)\n }\n\n _getItemByDirection(direction, activeElement) {\n const isNextDirection = direction === Direction.NEXT\n const isPrevDirection = direction === Direction.PREV\n const activeIndex = this._getItemIndex(activeElement)\n const lastItemIndex = this._items.length - 1\n const isGoingToWrap = isPrevDirection && activeIndex === 0 ||\n isNextDirection && activeIndex === lastItemIndex\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement\n }\n\n const delta = direction === Direction.PREV ? -1 : 1\n const itemIndex = (activeIndex + delta) % this._items.length\n\n return itemIndex === -1\n ? this._items[this._items.length - 1] : this._items[itemIndex]\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\n const slideEvent = $.Event(Event.SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n\n $(this._element).trigger(slideEvent)\n\n return slideEvent\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\n $(indicators)\n .removeClass(ClassName.ACTIVE)\n\n const nextIndicator = this._indicatorsElement.children[\n this._getItemIndex(element)\n ]\n\n if (nextIndicator) {\n $(nextIndicator).addClass(ClassName.ACTIVE)\n }\n }\n }\n\n _slide(direction, element) {\n const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || activeElement &&\n this._getItemByDirection(direction, activeElement)\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n let directionalClassName\n let orderClassName\n let eventDirectionName\n\n if (direction === Direction.NEXT) {\n directionalClassName = ClassName.LEFT\n orderClassName = ClassName.NEXT\n eventDirectionName = Direction.LEFT\n } else {\n directionalClassName = ClassName.RIGHT\n orderClassName = ClassName.PREV\n eventDirectionName = Direction.RIGHT\n }\n\n if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\n this._isSliding = false\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.isDefaultPrevented()) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n\n const slidEvent = $.Event(Event.SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n\n if ($(this._element).hasClass(ClassName.SLIDE)) {\n $(nextElement).addClass(orderClassName)\n\n Util.reflow(nextElement)\n\n $(activeElement).addClass(directionalClassName)\n $(nextElement).addClass(directionalClassName)\n\n const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\n if (nextElementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = nextElementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n $(activeElement)\n .one(Util.TRANSITION_END, () => {\n $(nextElement)\n .removeClass(`${directionalClassName} ${orderClassName}`)\n .addClass(ClassName.ACTIVE)\n\n $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n this._isSliding = false\n\n setTimeout(() => $(this._element).trigger(slidEvent), 0)\n })\n .emulateTransitionEnd(transitionDuration)\n } else {\n $(activeElement).removeClass(ClassName.ACTIVE)\n $(nextElement).addClass(ClassName.ACTIVE)\n\n this._isSliding = false\n $(this._element).trigger(slidEvent)\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n let _config = {\n ...Default,\n ...$(this).data()\n }\n\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (!data) {\n data = new Carousel(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n })\n }\n\n static _dataApiClickHandler(event) {\n const selector = Util.getSelectorFromElement(this)\n\n if (!selector) {\n return\n }\n\n const target = $(selector)[0]\n\n if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\n return\n }\n\n const config = {\n ...$(target).data(),\n ...$(this).data()\n }\n const slideIndex = this.getAttribute('data-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel._jQueryInterface.call($(target), config)\n\n if (slideIndex) {\n $(target).data(DATA_KEY).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\n for (let i = 0, len = carousels.length; i < len; i++) {\n const $carousel = $(carousels[i])\n Carousel._jQueryInterface.call($carousel, $carousel.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n toggle : true,\n parent : ''\n}\n\nconst DefaultType = {\n toggle : 'boolean',\n parent : '(string|element)'\n}\n\nconst Event = {\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SHOW : 'show',\n COLLAPSE : 'collapse',\n COLLAPSING : 'collapsing',\n COLLAPSED : 'collapsed'\n}\n\nconst Dimension = {\n WIDTH : 'width',\n HEIGHT : 'height'\n}\n\nconst Selector = {\n ACTIVES : '.show, .collapsing',\n DATA_TOGGLE : '[data-toggle=\"collapse\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse {\n constructor(element, config) {\n this._isTransitioning = false\n this._element = element\n this._config = this._getConfig(config)\n this._triggerArray = [].slice.call(document.querySelectorAll(\n `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n ))\n\n const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = Util.getSelectorFromElement(elem)\n const filterElement = [].slice.call(document.querySelectorAll(selector))\n .filter((foundElem) => foundElem === element)\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle() {\n if ($(this._element).hasClass(ClassName.SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning ||\n $(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\n .filter((elem) => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-parent') === this._config.parent\n }\n\n return elem.classList.contains(ClassName.COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n if (actives) {\n activesData = $(actives).not(this._selector).data(DATA_KEY)\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = $.Event(Event.SHOW)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n if (!activesData) {\n $(actives).data(DATA_KEY, null)\n }\n }\n\n const dimension = this._getDimension()\n\n $(this._element)\n .removeClass(ClassName.COLLAPSE)\n .addClass(ClassName.COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n $(this._triggerArray)\n .removeClass(ClassName.COLLAPSED)\n .attr('aria-expanded', true)\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .addClass(ClassName.SHOW)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n $(this._element).trigger(Event.SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning ||\n !$(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n const startEvent = $.Event(Event.HIDE)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n Util.reflow(this._element)\n\n $(this._element)\n .addClass(ClassName.COLLAPSING)\n .removeClass(ClassName.COLLAPSE)\n .removeClass(ClassName.SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const selector = Util.getSelectorFromElement(trigger)\n\n if (selector !== null) {\n const $elem = $([].slice.call(document.querySelectorAll(selector)))\n if (!$elem.hasClass(ClassName.SHOW)) {\n $(trigger).addClass(ClassName.COLLAPSED)\n .attr('aria-expanded', false)\n }\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .trigger(Event.HIDDEN)\n }\n\n this._element.style[dimension] = ''\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._parent = null\n this._element = null\n this._triggerArray = null\n this._isTransitioning = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\n return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\n }\n\n _getParent() {\n let parent\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent\n\n // It's a jQuery object\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0]\n }\n } else {\n parent = document.querySelector(this._config.parent)\n }\n\n const selector =\n `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n\n const children = [].slice.call(parent.querySelectorAll(selector))\n $(children).each((i, element) => {\n this._addAriaAndCollapsedClass(\n Collapse._getTargetFromElement(element),\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n const isOpen = $(element).hasClass(ClassName.SHOW)\n\n if (triggerArray.length) {\n $(triggerArray)\n .toggleClass(ClassName.COLLAPSED, !isOpen)\n .attr('aria-expanded', isOpen)\n }\n }\n\n // Static\n\n static _getTargetFromElement(element) {\n const selector = Util.getSelectorFromElement(element)\n return selector ? document.querySelector(selector) : null\n }\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n const _config = {\n ...Default,\n ...$this.data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data && _config.toggle && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(this, _config)\n $this.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault()\n }\n\n const $trigger = $(this)\n const selector = Util.getSelectorFromElement(this)\n const selectors = [].slice.call(document.querySelectorAll(selector))\n\n $(selectors).each(function () {\n const $target = $(this)\n const data = $target.data(DATA_KEY)\n const config = data ? 'toggle' : $trigger.data()\n Collapse._jQueryInterface.call($target, config)\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.14.7\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nvar longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\nvar timeoutDuration = 0;\nfor (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n timeoutDuration = 1;\n break;\n }\n}\n\nfunction microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n}\n\nfunction taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var window = element.ownerDocument.defaultView;\n var css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n\n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n var noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent || null;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n var nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TH, TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n\n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n\n // Both nodes are inside #document\n\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\nvar defineProperty = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n var rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n\n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n\n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n var width = sizes.width || element.clientWidth || result.right - result.left;\n var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var isIE10 = isIE(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n\n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && isHTML) {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop, 10);\n var marginLeft = parseFloat(styles.marginLeft, 10);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n\n return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n var parentNode = getParentNode(element);\n if (!parentNode) {\n return false;\n }\n return isFixed(parentNode);\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n // NOTE: 1 DOM access here\n\n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n\n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n padding = padding || 0;\n var isPaddingNumber = typeof padding === 'number';\n boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n return boundaries;\n}\n\nfunction getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n\n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n\n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n var variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n var window = element.ownerDocument.defaultView;\n var styles = window.getComputedStyle(element);\n var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.
\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicity asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nfunction getRoundedOffsets(data, shouldRound) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n var round = Math.round,\n floor = Math.floor;\n\n var noRound = function noRound(v) {\n return v;\n };\n\n var referenceWidth = round(reference.width);\n var popperWidth = round(popper.width);\n\n var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n var isVariation = data.placement.indexOf('-') !== -1;\n var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n var verticalToInteger = !shouldRound ? noRound : round;\n\n return {\n left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n top: verticalToInteger(popper.top),\n bottom: verticalToInteger(popper.bottom),\n right: horizontalToInteger(popper.right)\n };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n\n // Remove this legacy support in Popper.js v2\n\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n var styles = {\n position: popper.position\n };\n\n var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n // when offsetParent is the positioning is relative to the bottom of the screen (excluding the scrollbar)\n // and not the bottom of the html element\n if (offsetParent.nodeName === 'HTML') {\n top = -offsetParent.clientHeight + offsets.bottom;\n } else {\n top = -offsetParentRect.height + offsets.bottom;\n }\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n if (offsetParent.nodeName === 'HTML') {\n left = -offsetParent.clientWidth + offsets.right;\n } else {\n left = -offsetParentRect.width + offsets.right;\n }\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n\n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.
\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n\n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n\n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n var _data$offsets$arrow;\n\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n var arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n\n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjunction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.
\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.
\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var basePlacement = placement.split('-')[0];\n\n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n var order = options.priority;\n var popper = data.offsets.popper;\n\n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty({}, mainSide, value);\n }\n };\n\n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n var shiftOffsets = {\n start: defineProperty({}, side, reference[side]),\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.
\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.
\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.
\n * It will read the variation of the `placement` property.
\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unit-less, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.
\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the `height`.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.
\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.
\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * A scenario exists where the reference itself is not within the boundaries.
\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".
\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper. This makes sure the popper always has a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near each other\n * without leaving any gap between the two. Especially useful when the arrow is\n * enabled and you want to ensure that it points to its reference element.\n * It cares only about the first axis. You can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjunction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations)\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position.\n * The popper will never be placed outside of the defined boundaries\n * (except if `keepTogether` is enabled)\n */\n boundariesElement: 'viewport'\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define your own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: undefined\n }\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.
\n * These can be overridden using the `options` argument of Popper.js.
\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n /**\n * Popper's placement.\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled.\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.
\n * By default, it is set to no-op.
\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n\n /**\n * Callback called when the popper is updated. This callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.
\n * By default, it is set to no-op.
\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js.\n * @prop {modifiers}\n */\n modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n /**\n * Creates a new Popper.js instance.\n * @class Popper\n * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as the popper\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n\n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n\n\n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedules an update. It will run on the next UI update available.\n * @method scheduleUpdate\n * @memberof Popper\n */\n\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n\n }]);\n return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.
\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\nexport default Popper;\n//# sourceMappingURL=popper.js.map\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DISABLED : 'disabled',\n SHOW : 'show',\n DROPUP : 'dropup',\n DROPRIGHT : 'dropright',\n DROPLEFT : 'dropleft',\n MENURIGHT : 'dropdown-menu-right',\n MENULEFT : 'dropdown-menu-left',\n POSITION_STATIC : 'position-static'\n}\n\nconst Selector = {\n DATA_TOGGLE : '[data-toggle=\"dropdown\"]',\n FORM_CHILD : '.dropdown form',\n MENU : '.dropdown-menu',\n NAVBAR_NAV : '.navbar-nav',\n VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n}\n\nconst AttachmentMap = {\n TOP : 'top-start',\n TOPEND : 'top-end',\n BOTTOM : 'bottom-start',\n BOTTOMEND : 'bottom-end',\n RIGHT : 'right-start',\n RIGHTEND : 'right-end',\n LEFT : 'left-start',\n LEFTEND : 'left-end'\n}\n\nconst Default = {\n offset : 0,\n flip : true,\n boundary : 'scrollParent',\n reference : 'toggle',\n display : 'dynamic'\n}\n\nconst DefaultType = {\n offset : '(number|string|function)',\n flip : 'boolean',\n boundary : '(string|element)',\n reference : '(string|element)',\n display : 'string'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown {\n constructor(element, config) {\n this._element = element\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n toggle() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this._element)\n const isActive = $(this._menu).hasClass(ClassName.SHOW)\n\n Dropdown._clearMenus()\n\n if (isActive) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n // Disable totally Popper.js for Dropdown in Navbar\n if (!this._inNavbar) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference\n\n // Check if it's jQuery element\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0]\n }\n }\n\n // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n if (this._config.boundary !== 'scrollParent') {\n $(parent).addClass(ClassName.POSITION_STATIC)\n }\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n }\n\n show() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n }\n\n hide() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._element).off(EVENT_KEY)\n this._element = null\n this._menu = null\n if (this._popper !== null) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Private\n\n _addEventListeners() {\n $(this._element).on(Event.CLICK, (event) => {\n event.preventDefault()\n event.stopPropagation()\n this.toggle()\n })\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...$(this._element).data(),\n ...config\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _getMenuElement() {\n if (!this._menu) {\n const parent = Dropdown._getParentFromElement(this._element)\n\n if (parent) {\n this._menu = parent.querySelector(Selector.MENU)\n }\n }\n return this._menu\n }\n\n _getPlacement() {\n const $parentDropdown = $(this._element.parentNode)\n let placement = AttachmentMap.BOTTOM\n\n // Handle dropup\n if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n placement = AttachmentMap.TOP\n if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.TOPEND\n }\n } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n placement = AttachmentMap.RIGHT\n } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n placement = AttachmentMap.LEFT\n } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.BOTTOMEND\n }\n return placement\n }\n\n _detectNavbar() {\n return $(this._element).closest('.navbar').length > 0\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this._config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this._config.offset(data.offsets, this._element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this._config.offset\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: this._getOffset(),\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n }\n }\n\n // Disable Popper.js if we have a static display\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n }\n }\n\n return popperConfig\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data) {\n data = new Dropdown(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n\n static _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return\n }\n\n const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const parent = Dropdown._getParentFromElement(toggles[i])\n const context = $(toggles[i]).data(DATA_KEY)\n const relatedTarget = {\n relatedTarget: toggles[i]\n }\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n if (!context) {\n continue\n }\n\n const dropdownMenu = context._menu\n if (!$(parent).hasClass(ClassName.SHOW)) {\n continue\n }\n\n if (event && (event.type === 'click' &&\n /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n $.contains(parent, event.target)) {\n continue\n }\n\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n $(parent).trigger(hideEvent)\n if (hideEvent.isDefaultPrevented()) {\n continue\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n toggles[i].setAttribute('aria-expanded', 'false')\n\n $(dropdownMenu).removeClass(ClassName.SHOW)\n $(parent)\n .removeClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n }\n\n static _getParentFromElement(element) {\n let parent\n const selector = Util.getSelectorFromElement(element)\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n return parent || element.parentNode\n }\n\n // eslint-disable-next-line complexity\n static _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName)\n ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this)\n const isActive = $(parent).hasClass(ClassName.SHOW)\n\n if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n const toggle = parent.querySelector(Selector.DATA_TOGGLE)\n $(toggle).trigger('focus')\n }\n\n $(this).trigger('click')\n return\n }\n\n const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\n\n if (items.length === 0) {\n return\n }\n\n let index = items.indexOf(event.target)\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n index--\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n index++\n }\n\n if (index < 0) {\n index = 0\n }\n\n items[index].focus()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\n .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n event.stopPropagation()\n Dropdown._jQueryInterface.call($(this), 'toggle')\n })\n .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\n e.stopPropagation()\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Dropdown._jQueryInterface\n}\n\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst Default = {\n backdrop : true,\n keyboard : true,\n focus : true,\n show : true\n}\n\nconst DefaultType = {\n backdrop : '(boolean|string)',\n keyboard : 'boolean',\n focus : 'boolean',\n show : 'boolean'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n RESIZE : `resize${EVENT_KEY}`,\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,\n MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,\n MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLLABLE : 'modal-dialog-scrollable',\n SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\n BACKDROP : 'modal-backdrop',\n OPEN : 'modal-open',\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n DIALOG : '.modal-dialog',\n MODAL_BODY : '.modal-body',\n DATA_TOGGLE : '[data-toggle=\"modal\"]',\n DATA_DISMISS : '[data-dismiss=\"modal\"]',\n FIXED_CONTENT : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n STICKY_CONTENT : '.sticky-top'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n this._dialog = element.querySelector(Selector.DIALOG)\n this._backdrop = null\n this._isShown = false\n this._isBodyOverflowing = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollbarWidth = 0\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n this._isTransitioning = true\n }\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget\n })\n\n $(this._element).trigger(showEvent)\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = true\n\n this._checkScrollbar()\n this._setScrollbar()\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n (event) => this.hide(event)\n )\n\n $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\n $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\n if ($(event.target).is(this._element)) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = $.Event(Event.HIDE)\n\n $(this._element).trigger(hideEvent)\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = false\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (transition) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(document).off(Event.FOCUSIN)\n\n $(this._element).removeClass(ClassName.SHOW)\n\n $(this._element).off(Event.CLICK_DISMISS)\n $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\n\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, (event) => this._hideModal(event))\n .emulateTransitionEnd(transitionDuration)\n } else {\n this._hideModal()\n }\n }\n\n dispose() {\n [window, this._element, this._dialog]\n .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\n\n /**\n * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `Event.CLICK_DATA_API` event that should remain\n */\n $(document).off(Event.FOCUSIN)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._dialog = null\n this._backdrop = null\n this._isShown = null\n this._isBodyOverflowing = null\n this._ignoreBackdropClick = null\n this._isTransitioning = null\n this._scrollbarWidth = null\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (!this._element.parentNode ||\n this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n\n if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\n this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\n } else {\n this._element.scrollTop = 0\n }\n\n if (transition) {\n Util.reflow(this._element)\n }\n\n $(this._element).addClass(ClassName.SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget\n })\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n this._isTransitioning = false\n $(this._element).trigger(shownEvent)\n }\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n $(this._dialog)\n .one(Util.TRANSITION_END, transitionComplete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n transitionComplete()\n }\n }\n\n _enforceFocus() {\n $(document)\n .off(Event.FOCUSIN) // Guard against infinite focus loop\n .on(Event.FOCUSIN, (event) => {\n if (document !== event.target &&\n this._element !== event.target &&\n $(this._element).has(event.target).length === 0) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown && this._config.keyboard) {\n $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\n if (event.which === ESCAPE_KEYCODE) {\n event.preventDefault()\n this.hide()\n }\n })\n } else if (!this._isShown) {\n $(this._element).off(Event.KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n $(window).on(Event.RESIZE, (event) => this.handleUpdate(event))\n } else {\n $(window).off(Event.RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._isTransitioning = false\n this._showBackdrop(() => {\n $(document.body).removeClass(ClassName.OPEN)\n this._resetAdjustments()\n this._resetScrollbar()\n $(this._element).trigger(Event.HIDDEN)\n })\n }\n\n _removeBackdrop() {\n if (this._backdrop) {\n $(this._backdrop).remove()\n this._backdrop = null\n }\n }\n\n _showBackdrop(callback) {\n const animate = $(this._element).hasClass(ClassName.FADE)\n ? ClassName.FADE : ''\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div')\n this._backdrop.className = ClassName.BACKDROP\n\n if (animate) {\n this._backdrop.classList.add(animate)\n }\n\n $(this._backdrop).appendTo(document.body)\n\n $(this._element).on(Event.CLICK_DISMISS, (event) => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n if (event.target !== event.currentTarget) {\n return\n }\n if (this._config.backdrop === 'static') {\n this._element.focus()\n } else {\n this.hide()\n }\n })\n\n if (animate) {\n Util.reflow(this._backdrop)\n }\n\n $(this._backdrop).addClass(ClassName.SHOW)\n\n if (!callback) {\n return\n }\n\n if (!animate) {\n callback()\n return\n }\n\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callback)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else if (!this._isShown && this._backdrop) {\n $(this._backdrop).removeClass(ClassName.SHOW)\n\n const callbackRemove = () => {\n this._removeBackdrop()\n if (callback) {\n callback()\n }\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callbackRemove)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else {\n callbackRemove()\n }\n } else if (callback) {\n callback()\n }\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing =\n this._element.scrollHeight > document.documentElement.clientHeight\n\n if (!this._isBodyOverflowing && isModalOverflowing) {\n this._element.style.paddingLeft = `${this._scrollbarWidth}px`\n }\n\n if (this._isBodyOverflowing && !isModalOverflowing) {\n this._element.style.paddingRight = `${this._scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n _checkScrollbar() {\n const rect = document.body.getBoundingClientRect()\n this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\n this._scrollbarWidth = this._getScrollbarWidth()\n }\n\n _setScrollbar() {\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n const stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT))\n\n // Adjust fixed content padding\n $(fixedContent).each((index, element) => {\n const actualPadding = element.style.paddingRight\n const calculatedPadding = $(element).css('padding-right')\n $(element)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n })\n\n // Adjust sticky content margin\n $(stickyContent).each((index, element) => {\n const actualMargin = element.style.marginRight\n const calculatedMargin = $(element).css('margin-right')\n $(element)\n .data('margin-right', actualMargin)\n .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\n })\n\n // Adjust body padding\n const actualPadding = document.body.style.paddingRight\n const calculatedPadding = $(document.body).css('padding-right')\n $(document.body)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n }\n\n $(document.body).addClass(ClassName.OPEN)\n }\n\n _resetScrollbar() {\n // Restore fixed content padding\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n $(fixedContent).each((index, element) => {\n const padding = $(element).data('padding-right')\n $(element).removeData('padding-right')\n element.style.paddingRight = padding ? padding : ''\n })\n\n // Restore sticky content\n const elements = [].slice.call(document.querySelectorAll(`${Selector.STICKY_CONTENT}`))\n $(elements).each((index, element) => {\n const margin = $(element).data('margin-right')\n if (typeof margin !== 'undefined') {\n $(element).css('margin-right', margin).removeData('margin-right')\n }\n })\n\n // Restore body padding\n const padding = $(document.body).data('padding-right')\n $(document.body).removeData('padding-right')\n document.body.style.paddingRight = padding ? padding : ''\n }\n\n _getScrollbarWidth() { // thx d.walsh\n const scrollDiv = document.createElement('div')\n scrollDiv.className = ClassName.SCROLLBAR_MEASURER\n document.body.appendChild(scrollDiv)\n const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n document.body.removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Modal(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config](relatedTarget)\n } else if (_config.show) {\n data.show(relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n let target\n const selector = Util.getSelectorFromElement(this)\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n const config = $(target).data(DATA_KEY)\n ? 'toggle' : {\n ...$(target).data(),\n ...$(this).data()\n }\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault()\n }\n\n const $target = $(target).one(Event.SHOW, (showEvent) => {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return\n }\n\n $target.one(Event.HIDDEN, () => {\n if ($(this).is(':visible')) {\n this.focus()\n }\n })\n })\n\n Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.indexOf(attrName) !== -1) {\n if (uriAttrs.indexOf(attrName) !== -1) {\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, l = regExp.length; i < l; i++) {\n if (attrName.match(regExp[i])) {\n return true\n }\n }\n\n return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const whitelistKeys = Object.keys(whiteList)\n const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n const attributeList = [].slice.call(el.attributes)\n const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n attributeList.forEach((attr) => {\n if (!allowedAttribute(attr, whitelistedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n DefaultWhitelist,\n sanitizeHtml\n} from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst DefaultType = {\n animation : 'boolean',\n template : 'string',\n title : '(string|element|function)',\n trigger : 'string',\n delay : '(number|object)',\n html : 'boolean',\n selector : '(string|boolean)',\n placement : '(string|function)',\n offset : '(number|string|function)',\n container : '(string|element|boolean)',\n fallbackPlacement : '(string|array)',\n boundary : '(string|element)',\n sanitize : 'boolean',\n sanitizeFn : '(null|function)',\n whiteList : 'object'\n}\n\nconst AttachmentMap = {\n AUTO : 'auto',\n TOP : 'top',\n RIGHT : 'right',\n BOTTOM : 'bottom',\n LEFT : 'left'\n}\n\nconst Default = {\n animation : true,\n template : '
' +\n '
' +\n '
',\n trigger : 'hover focus',\n title : '',\n delay : 0,\n html : false,\n selector : false,\n placement : 'top',\n offset : 0,\n container : false,\n fallbackPlacement : 'flip',\n boundary : 'scrollParent',\n sanitize : true,\n sanitizeFn : null,\n whiteList : DefaultWhitelist\n}\n\nconst HoverState = {\n SHOW : 'show',\n OUT : 'out'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TOOLTIP : '.tooltip',\n TOOLTIP_INNER : '.tooltip-inner',\n ARROW : '.arrow'\n}\n\nconst Trigger = {\n HOVER : 'hover',\n FOCUS : 'focus',\n CLICK : 'click',\n MANUAL : 'manual'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip {\n constructor(element, config) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)')\n }\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this.element = element\n this.config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const dataKey = this.constructor.DATA_KEY\n let context = $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n $.removeData(this.element, this.constructor.DATA_KEY)\n\n $(this.element).off(this.constructor.EVENT_KEY)\n $(this.element).closest('.modal').off('hide.bs.modal')\n\n if (this.tip) {\n $(this.tip).remove()\n }\n\n this._isEnabled = null\n this._timeout = null\n this._hoverState = null\n this._activeTrigger = null\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n this._popper = null\n this.element = null\n this.config = null\n this.tip = null\n }\n\n show() {\n if ($(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n const showEvent = $.Event(this.constructor.Event.SHOW)\n if (this.isWithContent() && this._isEnabled) {\n $(this.element).trigger(showEvent)\n\n const shadowRoot = Util.findShadowRoot(this.element)\n const isInTheDom = $.contains(\n shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n this.element\n )\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = Util.getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this.element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this.config.animation) {\n $(tip).addClass(ClassName.FADE)\n }\n\n const placement = typeof this.config.placement === 'function'\n ? this.config.placement.call(this, tip, this.element)\n : this.config.placement\n\n const attachment = this._getAttachment(placement)\n this.addAttachmentClass(attachment)\n\n const container = this._getContainer()\n $(tip).data(this.constructor.DATA_KEY, this)\n\n if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $(tip).appendTo(container)\n }\n\n $(this.element).trigger(this.constructor.Event.INSERTED)\n\n this._popper = new Popper(this.element, tip, {\n placement: attachment,\n modifiers: {\n offset: this._getOffset(),\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: Selector.ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: (data) => {\n if (data.originalPlacement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n },\n onUpdate: (data) => this._handlePopperPlacementChange(data)\n })\n\n $(tip).addClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n const complete = () => {\n if (this.config.animation) {\n this._fixTransition()\n }\n const prevHoverState = this._hoverState\n this._hoverState = null\n\n $(this.element).trigger(this.constructor.Event.SHOWN)\n\n if (prevHoverState === HoverState.OUT) {\n this._leave(null, this)\n }\n }\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n $(this.tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n }\n\n hide(callback) {\n const tip = this.getTipElement()\n const hideEvent = $.Event(this.constructor.Event.HIDE)\n const complete = () => {\n if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip)\n }\n\n this._cleanTipClass()\n this.element.removeAttribute('aria-describedby')\n $(this.element).trigger(this.constructor.Event.HIDDEN)\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n if (callback) {\n callback()\n }\n }\n\n $(this.element).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(tip).removeClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n this._activeTrigger[Trigger.CLICK] = false\n this._activeTrigger[Trigger.FOCUS] = false\n this._activeTrigger[Trigger.HOVER] = false\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n $(tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\n $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n setElementContent($element, content) {\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (this.config.html) {\n if (!$(content).parent().is($element)) {\n $element.empty().append(content)\n }\n } else {\n $element.text($(content).text())\n }\n\n return\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n }\n\n $element.html(content)\n } else {\n $element.text(content)\n }\n }\n\n getTitle() {\n let title = this.element.getAttribute('data-original-title')\n\n if (!title) {\n title = typeof this.config.title === 'function'\n ? this.config.title.call(this.element)\n : this.config.title\n }\n\n return title\n }\n\n // Private\n\n _getOffset() {\n const offset = {}\n\n if (typeof this.config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this.config.offset(data.offsets, this.element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this.config.offset\n }\n\n return offset\n }\n\n _getContainer() {\n if (this.config.container === false) {\n return document.body\n }\n\n if (Util.isElement(this.config.container)) {\n return $(this.config.container)\n }\n\n return $(document).find(this.config.container)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this.config.trigger.split(' ')\n\n triggers.forEach((trigger) => {\n if (trigger === 'click') {\n $(this.element).on(\n this.constructor.Event.CLICK,\n this.config.selector,\n (event) => this.toggle(event)\n )\n } else if (trigger !== Trigger.MANUAL) {\n const eventIn = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSEENTER\n : this.constructor.Event.FOCUSIN\n const eventOut = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSELEAVE\n : this.constructor.Event.FOCUSOUT\n\n $(this.element)\n .on(\n eventIn,\n this.config.selector,\n (event) => this._enter(event)\n )\n .on(\n eventOut,\n this.config.selector,\n (event) => this._leave(event)\n )\n }\n })\n\n $(this.element).closest('.modal').on(\n 'hide.bs.modal',\n () => {\n if (this.element) {\n this.hide()\n }\n }\n )\n\n if (this.config.selector) {\n this.config = {\n ...this.config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const titleType = typeof this.element.getAttribute('data-original-title')\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute(\n 'data-original-title',\n this.element.getAttribute('title') || ''\n )\n\n this.element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\n ] = true\n }\n\n if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n context._hoverState = HoverState.SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.SHOW\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.SHOW) {\n context.show()\n }\n }, context.config.delay.show)\n }\n\n _leave(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\n ] = false\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.OUT\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.OUT) {\n context.hide()\n }\n }, context.config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = $(this.element).data()\n\n Object.keys(dataAttributes)\n .forEach((dataAttr) => {\n if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this.config) {\n for (const key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n const popperInstance = popperData.instance\n this.tip = popperInstance.popper\n this._cleanTipClass()\n this.addAttachmentClass(this._getAttachment(popperData.placement))\n }\n\n _fixTransition() {\n const tip = this.getTipElement()\n const initConfigAnimation = this.config.animation\n\n if (tip.getAttribute('x-placement') !== null) {\n return\n }\n\n $(tip).removeClass(ClassName.FADE)\n this.config.animation = false\n this.hide()\n this.show()\n this.config.animation = initConfigAnimation\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Tooltip(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement : 'right',\n trigger : 'click',\n content : '',\n template : '
' +\n '
' +\n '

' +\n '
'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content : '(string|element|function)'\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TITLE : '.popover-header',\n CONTENT : '.popover-body'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const $tip = $(this.getTipElement())\n\n // We use append for html objects to maintain js events\n this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this.element)\n }\n this.setElementContent($tip.find(Selector.CONTENT), content)\n\n $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n // Private\n\n _getContent() {\n return this.element.getAttribute('data-content') ||\n this.config.content\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Popover(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst DefaultType = {\n offset : 'number',\n method : 'string',\n target : '(string|element)'\n}\n\nconst Event = {\n ACTIVATE : `activate${EVENT_KEY}`,\n SCROLL : `scroll${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DROPDOWN_ITEM : 'dropdown-item',\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active'\n}\n\nconst Selector = {\n DATA_SPY : '[data-spy=\"scroll\"]',\n ACTIVE : '.active',\n NAV_LIST_GROUP : '.nav, .list-group',\n NAV_LINKS : '.nav-link',\n NAV_ITEMS : '.nav-item',\n LIST_ITEMS : '.list-group-item',\n DROPDOWN : '.dropdown',\n DROPDOWN_ITEMS : '.dropdown-item',\n DROPDOWN_TOGGLE : '.dropdown-toggle'\n}\n\nconst OffsetMethod = {\n OFFSET : 'offset',\n POSITION : 'position'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy {\n constructor(element, config) {\n this._element = element\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +\n `${this._config.target} ${Selector.LIST_ITEMS},` +\n `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window\n ? OffsetMethod.OFFSET : OffsetMethod.POSITION\n\n const offsetMethod = this._config.method === 'auto'\n ? autoMethod : this._config.method\n\n const offsetBase = offsetMethod === OffsetMethod.POSITION\n ? this._getScrollTop() : 0\n\n this._offsets = []\n this._targets = []\n\n this._scrollHeight = this._getScrollHeight()\n\n const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n targets\n .map((element) => {\n let target\n const targetSelector = Util.getSelectorFromElement(element)\n\n if (targetSelector) {\n target = document.querySelector(targetSelector)\n }\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [\n $(target)[offsetMethod]().top + offsetBase,\n targetSelector\n ]\n }\n }\n return null\n })\n .filter((item) => item)\n .sort((a, b) => a[0] - b[0])\n .forEach((item) => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.target !== 'string') {\n let id = $(config.target).attr('id')\n if (!id) {\n id = Util.getUID(NAME)\n $(config.target).attr('id', id)\n }\n config.target = `#${id}`\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window\n ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window\n ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset +\n scrollHeight -\n this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n const offsetLength = this._offsets.length\n for (let i = offsetLength; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' ||\n scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector\n .split(',')\n .map((selector) => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\n $link.addClass(ClassName.ACTIVE)\n } else {\n // Set triggered link as active\n $link.addClass(ClassName.ACTIVE)\n // Set triggered links parents as active\n // With both
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (err) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n // TODO: Remove in v5\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value)\n ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Selector = {\n DISMISS : '[data-dismiss=\"alert\"]'\n}\n\nconst Event = {\n CLOSE : `close${EVENT_KEY}`,\n CLOSED : `closed${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ALERT : 'alert',\n FADE : 'fade',\n SHOW : 'show'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n close(element) {\n let rootElement = this._element\n if (element) {\n rootElement = this._getRootElement(element)\n }\n\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent.isDefaultPrevented()) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _getRootElement(element) {\n const selector = Util.getSelectorFromElement(element)\n let parent = false\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n if (!parent) {\n parent = $(element).closest(`.${ClassName.ALERT}`)[0]\n }\n\n return parent\n }\n\n _triggerCloseEvent(element) {\n const closeEvent = $.Event(Event.CLOSE)\n\n $(element).trigger(closeEvent)\n return closeEvent\n }\n\n _removeElement(element) {\n $(element).removeClass(ClassName.SHOW)\n\n if (!$(element).hasClass(ClassName.FADE)) {\n this._destroyElement(element)\n return\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n $(element)\n .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\n .emulateTransitionEnd(transitionDuration)\n }\n\n _destroyElement(element) {\n $(element)\n .detach()\n .trigger(Event.CLOSED)\n .remove()\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Alert(this)\n $element.data(DATA_KEY, data)\n }\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(\n Event.CLICK_DATA_API,\n Selector.DISMISS,\n Alert._handleDismiss(new Alert())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst ClassName = {\n ACTIVE : 'active',\n BUTTON : 'btn',\n FOCUS : 'focus'\n}\n\nconst Selector = {\n DATA_TOGGLE_CARROT : '[data-toggle^=\"button\"]',\n DATA_TOGGLE : '[data-toggle=\"buttons\"]',\n INPUT : 'input:not([type=\"hidden\"])',\n ACTIVE : '.active',\n BUTTON : '.btn'\n}\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\n `blur${EVENT_KEY}${DATA_API_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n toggle() {\n let triggerChangeEvent = true\n let addAriaPressed = true\n const rootElement = $(this._element).closest(\n Selector.DATA_TOGGLE\n )[0]\n\n if (rootElement) {\n const input = this._element.querySelector(Selector.INPUT)\n\n if (input) {\n if (input.type === 'radio') {\n if (input.checked &&\n this._element.classList.contains(ClassName.ACTIVE)) {\n triggerChangeEvent = false\n } else {\n const activeElement = rootElement.querySelector(Selector.ACTIVE)\n\n if (activeElement) {\n $(activeElement).removeClass(ClassName.ACTIVE)\n }\n }\n }\n\n if (triggerChangeEvent) {\n if (input.hasAttribute('disabled') ||\n rootElement.hasAttribute('disabled') ||\n input.classList.contains('disabled') ||\n rootElement.classList.contains('disabled')) {\n return\n }\n input.checked = !this._element.classList.contains(ClassName.ACTIVE)\n $(input).trigger('change')\n }\n\n input.focus()\n addAriaPressed = false\n }\n }\n\n if (addAriaPressed) {\n this._element.setAttribute('aria-pressed',\n !this._element.classList.contains(ClassName.ACTIVE))\n }\n\n if (triggerChangeEvent) {\n $(this._element).toggleClass(ClassName.ACTIVE)\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new Button(this)\n $(this).data(DATA_KEY, data)\n }\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n event.preventDefault()\n\n let button = event.target\n\n if (!$(button).hasClass(ClassName.BUTTON)) {\n button = $(button).closest(Selector.BUTTON)\n }\n\n Button._jQueryInterface.call($(button), 'toggle')\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval : 5000,\n keyboard : true,\n slide : false,\n pause : 'hover',\n wrap : true,\n touch : true\n}\n\nconst DefaultType = {\n interval : '(number|boolean)',\n keyboard : 'boolean',\n slide : '(boolean|string)',\n pause : '(string|boolean)',\n wrap : 'boolean',\n touch : 'boolean'\n}\n\nconst Direction = {\n NEXT : 'next',\n PREV : 'prev',\n LEFT : 'left',\n RIGHT : 'right'\n}\n\nconst Event = {\n SLIDE : `slide${EVENT_KEY}`,\n SLID : `slid${EVENT_KEY}`,\n KEYDOWN : `keydown${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`,\n TOUCHSTART : `touchstart${EVENT_KEY}`,\n TOUCHMOVE : `touchmove${EVENT_KEY}`,\n TOUCHEND : `touchend${EVENT_KEY}`,\n POINTERDOWN : `pointerdown${EVENT_KEY}`,\n POINTERUP : `pointerup${EVENT_KEY}`,\n DRAG_START : `dragstart${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n CAROUSEL : 'carousel',\n ACTIVE : 'active',\n SLIDE : 'slide',\n RIGHT : 'carousel-item-right',\n LEFT : 'carousel-item-left',\n NEXT : 'carousel-item-next',\n PREV : 'carousel-item-prev',\n ITEM : 'carousel-item',\n POINTER_EVENT : 'pointer-event'\n}\n\nconst Selector = {\n ACTIVE : '.active',\n ACTIVE_ITEM : '.active.carousel-item',\n ITEM : '.carousel-item',\n ITEM_IMG : '.carousel-item img',\n NEXT_PREV : '.carousel-item-next, .carousel-item-prev',\n INDICATORS : '.carousel-indicators',\n DATA_SLIDE : '[data-slide], [data-slide-to]',\n DATA_RIDE : '[data-ride=\"carousel\"]'\n}\n\nconst PointerType = {\n TOUCH : 'touch',\n PEN : 'pen'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel {\n constructor(element, config) {\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._element = element\n this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n next() {\n if (!this._isSliding) {\n this._slide(Direction.NEXT)\n }\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden &&\n ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\n this.next()\n }\n }\n\n prev() {\n if (!this._isSliding) {\n this._slide(Direction.PREV)\n }\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (this._element.querySelector(Selector.NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n $(this._element).one(Event.SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const direction = index > activeIndex\n ? Direction.NEXT\n : Direction.PREV\n\n this._slide(direction, this._items[index])\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n $.removeData(this._element, DATA_KEY)\n\n this._items = null\n this._config = null\n this._element = null\n this._interval = null\n this._isPaused = null\n this._isSliding = null\n this._activeElement = null\n this._indicatorsElement = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n // swipe left\n if (direction > 0) {\n this.prev()\n }\n\n // swipe right\n if (direction < 0) {\n this.next()\n }\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n $(this._element)\n .on(Event.KEYDOWN, (event) => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n $(this._element)\n .on(Event.MOUSEENTER, (event) => this.pause(event))\n .on(Event.MOUSELEAVE, (event) => this.cycle(event))\n }\n\n if (this._config.touch) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n if (!this._touchSupported) {\n return\n }\n\n const start = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchStartX = event.originalEvent.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.originalEvent.touches[0].clientX\n }\n }\n\n const move = (event) => {\n // ensure swiping with one touch and not pinching\n if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n this.touchDeltaX = 0\n } else {\n this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\n }\n }\n\n const end = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\n if (this._pointerEvent) {\n $(this._element).on(Event.POINTERDOWN, (event) => start(event))\n $(this._element).on(Event.POINTERUP, (event) => end(event))\n\n this._element.classList.add(ClassName.POINTER_EVENT)\n } else {\n $(this._element).on(Event.TOUCHSTART, (event) => start(event))\n $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\n $(this._element).on(Event.TOUCHEND, (event) => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault()\n this.prev()\n break\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault()\n this.next()\n break\n default:\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode\n ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\n : []\n return this._items.indexOf(element)\n }\n\n _getItemByDirection(direction, activeElement) {\n const isNextDirection = direction === Direction.NEXT\n const isPrevDirection = direction === Direction.PREV\n const activeIndex = this._getItemIndex(activeElement)\n const lastItemIndex = this._items.length - 1\n const isGoingToWrap = isPrevDirection && activeIndex === 0 ||\n isNextDirection && activeIndex === lastItemIndex\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement\n }\n\n const delta = direction === Direction.PREV ? -1 : 1\n const itemIndex = (activeIndex + delta) % this._items.length\n\n return itemIndex === -1\n ? this._items[this._items.length - 1] : this._items[itemIndex]\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\n const slideEvent = $.Event(Event.SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n\n $(this._element).trigger(slideEvent)\n\n return slideEvent\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\n $(indicators)\n .removeClass(ClassName.ACTIVE)\n\n const nextIndicator = this._indicatorsElement.children[\n this._getItemIndex(element)\n ]\n\n if (nextIndicator) {\n $(nextIndicator).addClass(ClassName.ACTIVE)\n }\n }\n }\n\n _slide(direction, element) {\n const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || activeElement &&\n this._getItemByDirection(direction, activeElement)\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n let directionalClassName\n let orderClassName\n let eventDirectionName\n\n if (direction === Direction.NEXT) {\n directionalClassName = ClassName.LEFT\n orderClassName = ClassName.NEXT\n eventDirectionName = Direction.LEFT\n } else {\n directionalClassName = ClassName.RIGHT\n orderClassName = ClassName.PREV\n eventDirectionName = Direction.RIGHT\n }\n\n if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\n this._isSliding = false\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.isDefaultPrevented()) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n\n const slidEvent = $.Event(Event.SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n\n if ($(this._element).hasClass(ClassName.SLIDE)) {\n $(nextElement).addClass(orderClassName)\n\n Util.reflow(nextElement)\n\n $(activeElement).addClass(directionalClassName)\n $(nextElement).addClass(directionalClassName)\n\n const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\n if (nextElementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = nextElementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n $(activeElement)\n .one(Util.TRANSITION_END, () => {\n $(nextElement)\n .removeClass(`${directionalClassName} ${orderClassName}`)\n .addClass(ClassName.ACTIVE)\n\n $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n this._isSliding = false\n\n setTimeout(() => $(this._element).trigger(slidEvent), 0)\n })\n .emulateTransitionEnd(transitionDuration)\n } else {\n $(activeElement).removeClass(ClassName.ACTIVE)\n $(nextElement).addClass(ClassName.ACTIVE)\n\n this._isSliding = false\n $(this._element).trigger(slidEvent)\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n let _config = {\n ...Default,\n ...$(this).data()\n }\n\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (!data) {\n data = new Carousel(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n })\n }\n\n static _dataApiClickHandler(event) {\n const selector = Util.getSelectorFromElement(this)\n\n if (!selector) {\n return\n }\n\n const target = $(selector)[0]\n\n if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\n return\n }\n\n const config = {\n ...$(target).data(),\n ...$(this).data()\n }\n const slideIndex = this.getAttribute('data-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel._jQueryInterface.call($(target), config)\n\n if (slideIndex) {\n $(target).data(DATA_KEY).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\n for (let i = 0, len = carousels.length; i < len; i++) {\n const $carousel = $(carousels[i])\n Carousel._jQueryInterface.call($carousel, $carousel.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n toggle : true,\n parent : ''\n}\n\nconst DefaultType = {\n toggle : 'boolean',\n parent : '(string|element)'\n}\n\nconst Event = {\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SHOW : 'show',\n COLLAPSE : 'collapse',\n COLLAPSING : 'collapsing',\n COLLAPSED : 'collapsed'\n}\n\nconst Dimension = {\n WIDTH : 'width',\n HEIGHT : 'height'\n}\n\nconst Selector = {\n ACTIVES : '.show, .collapsing',\n DATA_TOGGLE : '[data-toggle=\"collapse\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse {\n constructor(element, config) {\n this._isTransitioning = false\n this._element = element\n this._config = this._getConfig(config)\n this._triggerArray = [].slice.call(document.querySelectorAll(\n `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n ))\n\n const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = Util.getSelectorFromElement(elem)\n const filterElement = [].slice.call(document.querySelectorAll(selector))\n .filter((foundElem) => foundElem === element)\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle() {\n if ($(this._element).hasClass(ClassName.SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning ||\n $(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\n .filter((elem) => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-parent') === this._config.parent\n }\n\n return elem.classList.contains(ClassName.COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n if (actives) {\n activesData = $(actives).not(this._selector).data(DATA_KEY)\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = $.Event(Event.SHOW)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n if (!activesData) {\n $(actives).data(DATA_KEY, null)\n }\n }\n\n const dimension = this._getDimension()\n\n $(this._element)\n .removeClass(ClassName.COLLAPSE)\n .addClass(ClassName.COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n $(this._triggerArray)\n .removeClass(ClassName.COLLAPSED)\n .attr('aria-expanded', true)\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .addClass(ClassName.SHOW)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n $(this._element).trigger(Event.SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning ||\n !$(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n const startEvent = $.Event(Event.HIDE)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n Util.reflow(this._element)\n\n $(this._element)\n .addClass(ClassName.COLLAPSING)\n .removeClass(ClassName.COLLAPSE)\n .removeClass(ClassName.SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const selector = Util.getSelectorFromElement(trigger)\n\n if (selector !== null) {\n const $elem = $([].slice.call(document.querySelectorAll(selector)))\n if (!$elem.hasClass(ClassName.SHOW)) {\n $(trigger).addClass(ClassName.COLLAPSED)\n .attr('aria-expanded', false)\n }\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .trigger(Event.HIDDEN)\n }\n\n this._element.style[dimension] = ''\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._parent = null\n this._element = null\n this._triggerArray = null\n this._isTransitioning = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\n return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\n }\n\n _getParent() {\n let parent\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent\n\n // It's a jQuery object\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0]\n }\n } else {\n parent = document.querySelector(this._config.parent)\n }\n\n const selector =\n `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n\n const children = [].slice.call(parent.querySelectorAll(selector))\n $(children).each((i, element) => {\n this._addAriaAndCollapsedClass(\n Collapse._getTargetFromElement(element),\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n const isOpen = $(element).hasClass(ClassName.SHOW)\n\n if (triggerArray.length) {\n $(triggerArray)\n .toggleClass(ClassName.COLLAPSED, !isOpen)\n .attr('aria-expanded', isOpen)\n }\n }\n\n // Static\n\n static _getTargetFromElement(element) {\n const selector = Util.getSelectorFromElement(element)\n return selector ? document.querySelector(selector) : null\n }\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n const _config = {\n ...Default,\n ...$this.data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data && _config.toggle && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(this, _config)\n $this.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault()\n }\n\n const $trigger = $(this)\n const selector = Util.getSelectorFromElement(this)\n const selectors = [].slice.call(document.querySelectorAll(selector))\n\n $(selectors).each(function () {\n const $target = $(this)\n const data = $target.data(DATA_KEY)\n const config = data ? 'toggle' : $trigger.data()\n Collapse._jQueryInterface.call($target, config)\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DISABLED : 'disabled',\n SHOW : 'show',\n DROPUP : 'dropup',\n DROPRIGHT : 'dropright',\n DROPLEFT : 'dropleft',\n MENURIGHT : 'dropdown-menu-right',\n MENULEFT : 'dropdown-menu-left',\n POSITION_STATIC : 'position-static'\n}\n\nconst Selector = {\n DATA_TOGGLE : '[data-toggle=\"dropdown\"]',\n FORM_CHILD : '.dropdown form',\n MENU : '.dropdown-menu',\n NAVBAR_NAV : '.navbar-nav',\n VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n}\n\nconst AttachmentMap = {\n TOP : 'top-start',\n TOPEND : 'top-end',\n BOTTOM : 'bottom-start',\n BOTTOMEND : 'bottom-end',\n RIGHT : 'right-start',\n RIGHTEND : 'right-end',\n LEFT : 'left-start',\n LEFTEND : 'left-end'\n}\n\nconst Default = {\n offset : 0,\n flip : true,\n boundary : 'scrollParent',\n reference : 'toggle',\n display : 'dynamic'\n}\n\nconst DefaultType = {\n offset : '(number|string|function)',\n flip : 'boolean',\n boundary : '(string|element)',\n reference : '(string|element)',\n display : 'string'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown {\n constructor(element, config) {\n this._element = element\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n toggle() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this._element)\n const isActive = $(this._menu).hasClass(ClassName.SHOW)\n\n Dropdown._clearMenus()\n\n if (isActive) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n // Disable totally Popper.js for Dropdown in Navbar\n if (!this._inNavbar) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference\n\n // Check if it's jQuery element\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0]\n }\n }\n\n // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n if (this._config.boundary !== 'scrollParent') {\n $(parent).addClass(ClassName.POSITION_STATIC)\n }\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n }\n\n show() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n }\n\n hide() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._element).off(EVENT_KEY)\n this._element = null\n this._menu = null\n if (this._popper !== null) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Private\n\n _addEventListeners() {\n $(this._element).on(Event.CLICK, (event) => {\n event.preventDefault()\n event.stopPropagation()\n this.toggle()\n })\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...$(this._element).data(),\n ...config\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _getMenuElement() {\n if (!this._menu) {\n const parent = Dropdown._getParentFromElement(this._element)\n\n if (parent) {\n this._menu = parent.querySelector(Selector.MENU)\n }\n }\n return this._menu\n }\n\n _getPlacement() {\n const $parentDropdown = $(this._element.parentNode)\n let placement = AttachmentMap.BOTTOM\n\n // Handle dropup\n if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n placement = AttachmentMap.TOP\n if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.TOPEND\n }\n } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n placement = AttachmentMap.RIGHT\n } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n placement = AttachmentMap.LEFT\n } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.BOTTOMEND\n }\n return placement\n }\n\n _detectNavbar() {\n return $(this._element).closest('.navbar').length > 0\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this._config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this._config.offset(data.offsets, this._element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this._config.offset\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: this._getOffset(),\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n }\n }\n\n // Disable Popper.js if we have a static display\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n }\n }\n\n return popperConfig\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data) {\n data = new Dropdown(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n\n static _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return\n }\n\n const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const parent = Dropdown._getParentFromElement(toggles[i])\n const context = $(toggles[i]).data(DATA_KEY)\n const relatedTarget = {\n relatedTarget: toggles[i]\n }\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n if (!context) {\n continue\n }\n\n const dropdownMenu = context._menu\n if (!$(parent).hasClass(ClassName.SHOW)) {\n continue\n }\n\n if (event && (event.type === 'click' &&\n /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n $.contains(parent, event.target)) {\n continue\n }\n\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n $(parent).trigger(hideEvent)\n if (hideEvent.isDefaultPrevented()) {\n continue\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n toggles[i].setAttribute('aria-expanded', 'false')\n\n $(dropdownMenu).removeClass(ClassName.SHOW)\n $(parent)\n .removeClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n }\n\n static _getParentFromElement(element) {\n let parent\n const selector = Util.getSelectorFromElement(element)\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n return parent || element.parentNode\n }\n\n // eslint-disable-next-line complexity\n static _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName)\n ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this)\n const isActive = $(parent).hasClass(ClassName.SHOW)\n\n if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n const toggle = parent.querySelector(Selector.DATA_TOGGLE)\n $(toggle).trigger('focus')\n }\n\n $(this).trigger('click')\n return\n }\n\n const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\n\n if (items.length === 0) {\n return\n }\n\n let index = items.indexOf(event.target)\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n index--\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n index++\n }\n\n if (index < 0) {\n index = 0\n }\n\n items[index].focus()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\n .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n event.stopPropagation()\n Dropdown._jQueryInterface.call($(this), 'toggle')\n })\n .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\n e.stopPropagation()\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Dropdown._jQueryInterface\n}\n\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst Default = {\n backdrop : true,\n keyboard : true,\n focus : true,\n show : true\n}\n\nconst DefaultType = {\n backdrop : '(boolean|string)',\n keyboard : 'boolean',\n focus : 'boolean',\n show : 'boolean'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n RESIZE : `resize${EVENT_KEY}`,\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,\n MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,\n MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLLABLE : 'modal-dialog-scrollable',\n SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\n BACKDROP : 'modal-backdrop',\n OPEN : 'modal-open',\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n DIALOG : '.modal-dialog',\n MODAL_BODY : '.modal-body',\n DATA_TOGGLE : '[data-toggle=\"modal\"]',\n DATA_DISMISS : '[data-dismiss=\"modal\"]',\n FIXED_CONTENT : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n STICKY_CONTENT : '.sticky-top'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n this._dialog = element.querySelector(Selector.DIALOG)\n this._backdrop = null\n this._isShown = false\n this._isBodyOverflowing = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollbarWidth = 0\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n this._isTransitioning = true\n }\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget\n })\n\n $(this._element).trigger(showEvent)\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = true\n\n this._checkScrollbar()\n this._setScrollbar()\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n (event) => this.hide(event)\n )\n\n $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\n $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\n if ($(event.target).is(this._element)) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = $.Event(Event.HIDE)\n\n $(this._element).trigger(hideEvent)\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = false\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (transition) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(document).off(Event.FOCUSIN)\n\n $(this._element).removeClass(ClassName.SHOW)\n\n $(this._element).off(Event.CLICK_DISMISS)\n $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\n\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, (event) => this._hideModal(event))\n .emulateTransitionEnd(transitionDuration)\n } else {\n this._hideModal()\n }\n }\n\n dispose() {\n [window, this._element, this._dialog]\n .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\n\n /**\n * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `Event.CLICK_DATA_API` event that should remain\n */\n $(document).off(Event.FOCUSIN)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._dialog = null\n this._backdrop = null\n this._isShown = null\n this._isBodyOverflowing = null\n this._ignoreBackdropClick = null\n this._isTransitioning = null\n this._scrollbarWidth = null\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (!this._element.parentNode ||\n this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n\n if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\n this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\n } else {\n this._element.scrollTop = 0\n }\n\n if (transition) {\n Util.reflow(this._element)\n }\n\n $(this._element).addClass(ClassName.SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget\n })\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n this._isTransitioning = false\n $(this._element).trigger(shownEvent)\n }\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n $(this._dialog)\n .one(Util.TRANSITION_END, transitionComplete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n transitionComplete()\n }\n }\n\n _enforceFocus() {\n $(document)\n .off(Event.FOCUSIN) // Guard against infinite focus loop\n .on(Event.FOCUSIN, (event) => {\n if (document !== event.target &&\n this._element !== event.target &&\n $(this._element).has(event.target).length === 0) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown && this._config.keyboard) {\n $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\n if (event.which === ESCAPE_KEYCODE) {\n event.preventDefault()\n this.hide()\n }\n })\n } else if (!this._isShown) {\n $(this._element).off(Event.KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n $(window).on(Event.RESIZE, (event) => this.handleUpdate(event))\n } else {\n $(window).off(Event.RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._isTransitioning = false\n this._showBackdrop(() => {\n $(document.body).removeClass(ClassName.OPEN)\n this._resetAdjustments()\n this._resetScrollbar()\n $(this._element).trigger(Event.HIDDEN)\n })\n }\n\n _removeBackdrop() {\n if (this._backdrop) {\n $(this._backdrop).remove()\n this._backdrop = null\n }\n }\n\n _showBackdrop(callback) {\n const animate = $(this._element).hasClass(ClassName.FADE)\n ? ClassName.FADE : ''\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div')\n this._backdrop.className = ClassName.BACKDROP\n\n if (animate) {\n this._backdrop.classList.add(animate)\n }\n\n $(this._backdrop).appendTo(document.body)\n\n $(this._element).on(Event.CLICK_DISMISS, (event) => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n if (event.target !== event.currentTarget) {\n return\n }\n if (this._config.backdrop === 'static') {\n this._element.focus()\n } else {\n this.hide()\n }\n })\n\n if (animate) {\n Util.reflow(this._backdrop)\n }\n\n $(this._backdrop).addClass(ClassName.SHOW)\n\n if (!callback) {\n return\n }\n\n if (!animate) {\n callback()\n return\n }\n\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callback)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else if (!this._isShown && this._backdrop) {\n $(this._backdrop).removeClass(ClassName.SHOW)\n\n const callbackRemove = () => {\n this._removeBackdrop()\n if (callback) {\n callback()\n }\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callbackRemove)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else {\n callbackRemove()\n }\n } else if (callback) {\n callback()\n }\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing =\n this._element.scrollHeight > document.documentElement.clientHeight\n\n if (!this._isBodyOverflowing && isModalOverflowing) {\n this._element.style.paddingLeft = `${this._scrollbarWidth}px`\n }\n\n if (this._isBodyOverflowing && !isModalOverflowing) {\n this._element.style.paddingRight = `${this._scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n _checkScrollbar() {\n const rect = document.body.getBoundingClientRect()\n this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\n this._scrollbarWidth = this._getScrollbarWidth()\n }\n\n _setScrollbar() {\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n const stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT))\n\n // Adjust fixed content padding\n $(fixedContent).each((index, element) => {\n const actualPadding = element.style.paddingRight\n const calculatedPadding = $(element).css('padding-right')\n $(element)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n })\n\n // Adjust sticky content margin\n $(stickyContent).each((index, element) => {\n const actualMargin = element.style.marginRight\n const calculatedMargin = $(element).css('margin-right')\n $(element)\n .data('margin-right', actualMargin)\n .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\n })\n\n // Adjust body padding\n const actualPadding = document.body.style.paddingRight\n const calculatedPadding = $(document.body).css('padding-right')\n $(document.body)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n }\n\n $(document.body).addClass(ClassName.OPEN)\n }\n\n _resetScrollbar() {\n // Restore fixed content padding\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n $(fixedContent).each((index, element) => {\n const padding = $(element).data('padding-right')\n $(element).removeData('padding-right')\n element.style.paddingRight = padding ? padding : ''\n })\n\n // Restore sticky content\n const elements = [].slice.call(document.querySelectorAll(`${Selector.STICKY_CONTENT}`))\n $(elements).each((index, element) => {\n const margin = $(element).data('margin-right')\n if (typeof margin !== 'undefined') {\n $(element).css('margin-right', margin).removeData('margin-right')\n }\n })\n\n // Restore body padding\n const padding = $(document.body).data('padding-right')\n $(document.body).removeData('padding-right')\n document.body.style.paddingRight = padding ? padding : ''\n }\n\n _getScrollbarWidth() { // thx d.walsh\n const scrollDiv = document.createElement('div')\n scrollDiv.className = ClassName.SCROLLBAR_MEASURER\n document.body.appendChild(scrollDiv)\n const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n document.body.removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Modal(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config](relatedTarget)\n } else if (_config.show) {\n data.show(relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n let target\n const selector = Util.getSelectorFromElement(this)\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n const config = $(target).data(DATA_KEY)\n ? 'toggle' : {\n ...$(target).data(),\n ...$(this).data()\n }\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault()\n }\n\n const $target = $(target).one(Event.SHOW, (showEvent) => {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return\n }\n\n $target.one(Event.HIDDEN, () => {\n if ($(this).is(':visible')) {\n this.focus()\n }\n })\n })\n\n Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.indexOf(attrName) !== -1) {\n if (uriAttrs.indexOf(attrName) !== -1) {\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, l = regExp.length; i < l; i++) {\n if (attrName.match(regExp[i])) {\n return true\n }\n }\n\n return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const whitelistKeys = Object.keys(whiteList)\n const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n const attributeList = [].slice.call(el.attributes)\n const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n attributeList.forEach((attr) => {\n if (!allowedAttribute(attr, whitelistedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n DefaultWhitelist,\n sanitizeHtml\n} from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst DefaultType = {\n animation : 'boolean',\n template : 'string',\n title : '(string|element|function)',\n trigger : 'string',\n delay : '(number|object)',\n html : 'boolean',\n selector : '(string|boolean)',\n placement : '(string|function)',\n offset : '(number|string|function)',\n container : '(string|element|boolean)',\n fallbackPlacement : '(string|array)',\n boundary : '(string|element)',\n sanitize : 'boolean',\n sanitizeFn : '(null|function)',\n whiteList : 'object'\n}\n\nconst AttachmentMap = {\n AUTO : 'auto',\n TOP : 'top',\n RIGHT : 'right',\n BOTTOM : 'bottom',\n LEFT : 'left'\n}\n\nconst Default = {\n animation : true,\n template : '
' +\n '
' +\n '
',\n trigger : 'hover focus',\n title : '',\n delay : 0,\n html : false,\n selector : false,\n placement : 'top',\n offset : 0,\n container : false,\n fallbackPlacement : 'flip',\n boundary : 'scrollParent',\n sanitize : true,\n sanitizeFn : null,\n whiteList : DefaultWhitelist\n}\n\nconst HoverState = {\n SHOW : 'show',\n OUT : 'out'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TOOLTIP : '.tooltip',\n TOOLTIP_INNER : '.tooltip-inner',\n ARROW : '.arrow'\n}\n\nconst Trigger = {\n HOVER : 'hover',\n FOCUS : 'focus',\n CLICK : 'click',\n MANUAL : 'manual'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip {\n constructor(element, config) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)')\n }\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this.element = element\n this.config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const dataKey = this.constructor.DATA_KEY\n let context = $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n $.removeData(this.element, this.constructor.DATA_KEY)\n\n $(this.element).off(this.constructor.EVENT_KEY)\n $(this.element).closest('.modal').off('hide.bs.modal')\n\n if (this.tip) {\n $(this.tip).remove()\n }\n\n this._isEnabled = null\n this._timeout = null\n this._hoverState = null\n this._activeTrigger = null\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n this._popper = null\n this.element = null\n this.config = null\n this.tip = null\n }\n\n show() {\n if ($(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n const showEvent = $.Event(this.constructor.Event.SHOW)\n if (this.isWithContent() && this._isEnabled) {\n $(this.element).trigger(showEvent)\n\n const shadowRoot = Util.findShadowRoot(this.element)\n const isInTheDom = $.contains(\n shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n this.element\n )\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = Util.getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this.element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this.config.animation) {\n $(tip).addClass(ClassName.FADE)\n }\n\n const placement = typeof this.config.placement === 'function'\n ? this.config.placement.call(this, tip, this.element)\n : this.config.placement\n\n const attachment = this._getAttachment(placement)\n this.addAttachmentClass(attachment)\n\n const container = this._getContainer()\n $(tip).data(this.constructor.DATA_KEY, this)\n\n if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $(tip).appendTo(container)\n }\n\n $(this.element).trigger(this.constructor.Event.INSERTED)\n\n this._popper = new Popper(this.element, tip, {\n placement: attachment,\n modifiers: {\n offset: this._getOffset(),\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: Selector.ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: (data) => {\n if (data.originalPlacement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n },\n onUpdate: (data) => this._handlePopperPlacementChange(data)\n })\n\n $(tip).addClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n const complete = () => {\n if (this.config.animation) {\n this._fixTransition()\n }\n const prevHoverState = this._hoverState\n this._hoverState = null\n\n $(this.element).trigger(this.constructor.Event.SHOWN)\n\n if (prevHoverState === HoverState.OUT) {\n this._leave(null, this)\n }\n }\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n $(this.tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n }\n\n hide(callback) {\n const tip = this.getTipElement()\n const hideEvent = $.Event(this.constructor.Event.HIDE)\n const complete = () => {\n if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip)\n }\n\n this._cleanTipClass()\n this.element.removeAttribute('aria-describedby')\n $(this.element).trigger(this.constructor.Event.HIDDEN)\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n if (callback) {\n callback()\n }\n }\n\n $(this.element).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(tip).removeClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n this._activeTrigger[Trigger.CLICK] = false\n this._activeTrigger[Trigger.FOCUS] = false\n this._activeTrigger[Trigger.HOVER] = false\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n $(tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\n $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n setElementContent($element, content) {\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (this.config.html) {\n if (!$(content).parent().is($element)) {\n $element.empty().append(content)\n }\n } else {\n $element.text($(content).text())\n }\n\n return\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n }\n\n $element.html(content)\n } else {\n $element.text(content)\n }\n }\n\n getTitle() {\n let title = this.element.getAttribute('data-original-title')\n\n if (!title) {\n title = typeof this.config.title === 'function'\n ? this.config.title.call(this.element)\n : this.config.title\n }\n\n return title\n }\n\n // Private\n\n _getOffset() {\n const offset = {}\n\n if (typeof this.config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this.config.offset(data.offsets, this.element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this.config.offset\n }\n\n return offset\n }\n\n _getContainer() {\n if (this.config.container === false) {\n return document.body\n }\n\n if (Util.isElement(this.config.container)) {\n return $(this.config.container)\n }\n\n return $(document).find(this.config.container)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this.config.trigger.split(' ')\n\n triggers.forEach((trigger) => {\n if (trigger === 'click') {\n $(this.element).on(\n this.constructor.Event.CLICK,\n this.config.selector,\n (event) => this.toggle(event)\n )\n } else if (trigger !== Trigger.MANUAL) {\n const eventIn = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSEENTER\n : this.constructor.Event.FOCUSIN\n const eventOut = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSELEAVE\n : this.constructor.Event.FOCUSOUT\n\n $(this.element)\n .on(\n eventIn,\n this.config.selector,\n (event) => this._enter(event)\n )\n .on(\n eventOut,\n this.config.selector,\n (event) => this._leave(event)\n )\n }\n })\n\n $(this.element).closest('.modal').on(\n 'hide.bs.modal',\n () => {\n if (this.element) {\n this.hide()\n }\n }\n )\n\n if (this.config.selector) {\n this.config = {\n ...this.config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const titleType = typeof this.element.getAttribute('data-original-title')\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute(\n 'data-original-title',\n this.element.getAttribute('title') || ''\n )\n\n this.element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\n ] = true\n }\n\n if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n context._hoverState = HoverState.SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.SHOW\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.SHOW) {\n context.show()\n }\n }, context.config.delay.show)\n }\n\n _leave(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\n ] = false\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.OUT\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.OUT) {\n context.hide()\n }\n }, context.config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = $(this.element).data()\n\n Object.keys(dataAttributes)\n .forEach((dataAttr) => {\n if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this.config) {\n for (const key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n const popperInstance = popperData.instance\n this.tip = popperInstance.popper\n this._cleanTipClass()\n this.addAttachmentClass(this._getAttachment(popperData.placement))\n }\n\n _fixTransition() {\n const tip = this.getTipElement()\n const initConfigAnimation = this.config.animation\n\n if (tip.getAttribute('x-placement') !== null) {\n return\n }\n\n $(tip).removeClass(ClassName.FADE)\n this.config.animation = false\n this.hide()\n this.show()\n this.config.animation = initConfigAnimation\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Tooltip(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement : 'right',\n trigger : 'click',\n content : '',\n template : '
' +\n '
' +\n '

' +\n '
'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content : '(string|element|function)'\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TITLE : '.popover-header',\n CONTENT : '.popover-body'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const $tip = $(this.getTipElement())\n\n // We use append for html objects to maintain js events\n this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this.element)\n }\n this.setElementContent($tip.find(Selector.CONTENT), content)\n\n $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n // Private\n\n _getContent() {\n return this.element.getAttribute('data-content') ||\n this.config.content\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Popover(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst DefaultType = {\n offset : 'number',\n method : 'string',\n target : '(string|element)'\n}\n\nconst Event = {\n ACTIVATE : `activate${EVENT_KEY}`,\n SCROLL : `scroll${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DROPDOWN_ITEM : 'dropdown-item',\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active'\n}\n\nconst Selector = {\n DATA_SPY : '[data-spy=\"scroll\"]',\n ACTIVE : '.active',\n NAV_LIST_GROUP : '.nav, .list-group',\n NAV_LINKS : '.nav-link',\n NAV_ITEMS : '.nav-item',\n LIST_ITEMS : '.list-group-item',\n DROPDOWN : '.dropdown',\n DROPDOWN_ITEMS : '.dropdown-item',\n DROPDOWN_TOGGLE : '.dropdown-toggle'\n}\n\nconst OffsetMethod = {\n OFFSET : 'offset',\n POSITION : 'position'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy {\n constructor(element, config) {\n this._element = element\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +\n `${this._config.target} ${Selector.LIST_ITEMS},` +\n `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window\n ? OffsetMethod.OFFSET : OffsetMethod.POSITION\n\n const offsetMethod = this._config.method === 'auto'\n ? autoMethod : this._config.method\n\n const offsetBase = offsetMethod === OffsetMethod.POSITION\n ? this._getScrollTop() : 0\n\n this._offsets = []\n this._targets = []\n\n this._scrollHeight = this._getScrollHeight()\n\n const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n targets\n .map((element) => {\n let target\n const targetSelector = Util.getSelectorFromElement(element)\n\n if (targetSelector) {\n target = document.querySelector(targetSelector)\n }\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [\n $(target)[offsetMethod]().top + offsetBase,\n targetSelector\n ]\n }\n }\n return null\n })\n .filter((item) => item)\n .sort((a, b) => a[0] - b[0])\n .forEach((item) => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.target !== 'string') {\n let id = $(config.target).attr('id')\n if (!id) {\n id = Util.getUID(NAME)\n $(config.target).attr('id', id)\n }\n config.target = `#${id}`\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window\n ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window\n ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset +\n scrollHeight -\n this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n const offsetLength = this._offsets.length\n for (let i = offsetLength; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' ||\n scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector\n .split(',')\n .map((selector) => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\n $link.addClass(ClassName.ACTIVE)\n } else {\n // Set triggered link as active\n $link.addClass(ClassName.ACTIVE)\n // Set triggered links parents as active\n // With both
    and

&dY28AO zPbl3e#DmLs_9|cn_+Fbu?2)c#s^$2Dv?C}0d?Q^%tqYCuq*{)_9Loz3UEQT{`1qAs zy;4Jt#isxZ3VVpqD>DZxydG`VEtPV#x!D|LI?4;shisM^qp&!2L}89LH=CnONBJpW zRm!cmGn6kw>yg47V{^+D05(d;C`s2dgVHf_bITQgLu3n;`b%ax(c95FBU%8Plg&-0 zCsu#~8b|Nopm4ccM-=6_!RDrIPwW)1B1CUbq2>ph<494C>!bss1ps^M8hbu)gmgWV z%TaUjPqec{3&6GXZ`6jw3h>VY>X=xL8#JdJMMr?~hO~!MBlm!!-XOd%2?$&+KXMAOO#5d zfED36ZKfP89YB?jA*p+0jya6A+{TnyPLLyWcvhQHDi(krjxQN3`=oV}bO6cRjk-9o z#vXE7gerQ|>vOc+nZqWTQ7RTdJSlBVmJVQ$JE(N<252nNSa&8?j%<$E-2WR?v7P_0 zdn<#^{g~jMt61@~wo!yJ?9K5%HfC>c?;N>3#NM-*a;|#Ss(J)aZM(gEEU}uVNP8IM zI@7c}3YB|GJK8Yb>5S#BMiVAXxYjvCT#gjrG38#7T229*+*1r}Z*F6+wl9@7^3U5x zpX}@R?AR$&E!Wo8)~94wq}Br1W2V)d>$w*iuu$5nKIT7!OwN7)9c*8y%`EnUWwml1 zJs8Z+y^Y93x!mOs86@Ulv*I(w(SR}hw?7)&PCWqvVT*F}*EQ%;fb5~c_2{Nlf`{QjN znGX6q6J;MgmQ(A89Z^PFfZR=n4$)PK>Hw|5%*XMz1U@12L5~9 z&KdCCr*Jv$uFv{poM+JX*xvg19Le3A440Aq2->aiF4o z#G{|k(yuF~^~pF(Z47)furEbM{Jp}63y?xGJ4kMy%#_%7gi+YHs93wC9X1AIWxqol z5o3D)&VT9%7au{J5)-Q6d*x3}NH=1khzepbwH*?t8%9A3&c jXwaZRg9e8eO-=s-a*u7ssM(+600000NkvXXu0mjf%Hs^< literal 0 HcmV?d00001 diff --git a/Assets/overlays/feather.png b/Assets/overlays/feather.png new file mode 100644 index 0000000000000000000000000000000000000000..efecea3633bb8a90eabcc3246b689ffd3a3ab657 GIT binary patch literal 1844 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/fireplace.png b/Assets/overlays/fireplace.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb5d85f91f4afe909a4f74e16eba0e40a69ba24 GIT binary patch literal 1538 zcmV+d2L1VoP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00oLkL_t(|UhSG|s8m%H$7jadV3w6w6w%|BNM>e2=9frJ8CU0>;P3m*n&L@3YzL zX)?8yQmHgW-^-ExGQ}pRvLP7!_D&7nu)ayccB$=!rGGP>cLf%U!ir5pTYx_MkbTU+ zRWfxH67VC}f@_FpTBf>bXbUj-2fJnP27_N(C=@nGjYaGgz~C1k2T8y}nYsdEI!;WB zk&`mjMeG$oM^ALy;0=q3*q)SHH?dX#d+iE}VLI#Bl|Kp+5c{?mcLhA(t%El#Hj)tQ zwpjNHVD{J0!I0Fhh9nGdVXQ0Gx)Q(%v&ctOyXMLt1+m&~@m40RBvVRC4FX$$eZGg{ zB2SyO9A$glpn50)huAm$QfDPx9}bg%%cM5G_LbO0N_7C|qMpG_`~# zCns0+_4O^`9B;{#7>UPg&js8!1DH+j*l_Gtq<}miQ=&8yZ`qyK5cAM=0te{7{qdaKW*-vl;xd%B^A$G5=3I2B#zXRR4UTz2ab4X}* zvF+Aj4)h6%Gv%HU+Q*JJ5<7tx$|=kycU5TehSxH{w}^keu{!6uN2&w;JY>?fE(6<5 zYBD1hn-23ao7`1N{5gOQLrWX3WjXsZ&Q-pMyd%|tem_#}llyX&Eg|s)aP_`K)d1L^ zW2Q0qlD{OGE5r#*3U|4g-0e`sK1)e>J};#37Lc5Dc+pua@eA&3;nfh<{3^y5X2n zj(w4VFQPs~LhqEzd?oacr8Y%UD_{;1dN?7@wG3h()vcbTHngo=svlr`h4LrPQTaIh z2?;o;dh3X@r?3yJi4V5o*w|P9HUPekz6(67(ubML z=JWaW6a`fKRQ9#!IR!TRGsAsUM?6b3oa=GKR#oeXn^AoB6(<0;V~Be?M71mVONe{x zW9Gl0xIo9QFt<8 literal 0 HcmV?d00001 diff --git a/Assets/overlays/fishing-net.png b/Assets/overlays/fishing-net.png new file mode 100644 index 0000000000000000000000000000000000000000..01e068d790fdfab63a1f40e84ffaed4484ecf0f2 GIT binary patch literal 3668 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/flat-paw-print.png b/Assets/overlays/flat-paw-print.png new file mode 100644 index 0000000000000000000000000000000000000000..ec9e38d34cff5ecd3f861ca81b75c99f2bb18f8b GIT binary patch literal 1981 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/floor-hatch.png b/Assets/overlays/floor-hatch.png new file mode 100644 index 0000000000000000000000000000000000000000..435052e280725ca725f668e9a979862d24fde3e9 GIT binary patch literal 1941 zcmV;G2Wt3Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00$jOL_t(|UhSG|h*V`5$K9KGElXB&H?0Uv$cjWQqa-UTP|Pn~DKIR*lysvAg6KmZ z5-X&LqQLNyCfWsdbTuzwuDd(4yZxSX{xi)xb7tnu%$eDR&JP~m z^FHtYdEWQD=l;$Ni;0PeiHV7ci77#UfB)oEDz$`i19o6wV4zt|b%(x(V-2d-4(o)S zU4i|?wgbL-lGPphezdQzZwuuFxoQWUe4>4J!2hNsb%n0&pzPBa4r6zysW#BTgVtFt z_>WSwNLDxK_hx?tKGcnsY>tp5S~@#B$I!uPzdINF3ni-?ocbTC`&?d@BzoAFZJQ(wg!We@Eeg723UR<6`ZBBvI%>tb)o(6KC38SO7VDKJ z5Zb%2@d^n9Su>j7{0JBPvn8uNbhcjoI^f?=(Ii<0{DJq5T+ltDkU(g^Us4C|37<+* zAByb|ZFftS0pGo9E(*GJ3dw_JyZ`L*m3iDGS^X$982mp{IPd59?(a3Sb>6rCUUhv9<% z8_7JVPgGM;(Ct--120VXNaBG0TS*272C!UX$%D4rCG(&jcm%USvsv;CxLff5>MLCE zFOY0-=<4d4!XT0wj{~RdSCV<43w(ZOgXUSuGZc!${~bl`*8)nxKtAw?ln-sUNM^c` zSl~0d~-18!zqg!BpVtq(1jXU9_;Kk$ugiH zP19YJ_Bnj5+!^qlLtNhSn}L6mWJ3qW)ySZ|<*5QJ#>Por5HyzO3T&Mhl>>hJo|qBKoVGr&eqU7{gl)BaRY8)u zz2eI(MQxn{i@4T z;%c-N-Kn!7#crhx4Po}!{7mtOu=3wch_yvYTd?q8=hsk_bqx`}(T}bia&#zNXoy*& zaEo^qX+uGft>bN04ohPHz$p8*nYdYghRPv_eLjZ<{X`Cy_g%tv!C#yTLYzHQcUS_0 z?HANk5yZcX9mKpxXN3$`x{}b3w^&R07uG6wL7Z;^0_@JdmG|artWKW86l<{rz67t3 ziI$d@4)gPl-ea1u5YvF2&t@BDZ;Wl^n525PT}WTK|2-OqujD5&Ip?EGzdkP}|7x$H z2$=~W*xtCdk)Y&XO-MdKaU4rvHX$}a9ptcy>0sLyKh1X(v(=x_5Z8F-%$W&HbekDD z+sU~GD|#sqHwN2Be^V&8Q{INzIE#`!0pnAt)Mb2G*~(7tkuhHz32pf*Gz`SP+&VFD zqA>egTcW9{$(uBtQ3-bL1Z`Epb#KdNkCWFX>Pof``YpvN>vNdF+aoZ0VzMX4J6e>J zu(BRI8njJPdZNWILw?P)*T zLDzawh&@G-nGovf30g}1D(ZVEXJK~cg`y@C5C#U@h_!MVwA;1LpuI`Lmpw^VZ{>)V z949)v*UUltz3&OfpiMwn*fCpmcJ4_`jyFkJKC8dSz2ynE|DP}cL;hgK#KgqJ#Ka6G bh7J1{O-$%8O-XJE00000NkvXXu0mjf@w%jF literal 0 HcmV?d00001 diff --git a/Assets/overlays/flying-flag.png b/Assets/overlays/flying-flag.png new file mode 100644 index 0000000000000000000000000000000000000000..8f6a99c3ab709c8ca00fbf401beb7774e9740838 GIT binary patch literal 1687 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/goblin-camp.png b/Assets/overlays/goblin-camp.png new file mode 100644 index 0000000000000000000000000000000000000000..bf19334aa8ab76c7dade5c8c1a43b74c42f9da28 GIT binary patch literal 3355 zcmV+$4dn8PP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z01Tr^L_t(|UhSI;kXB_G$M?#LfPyPTkP1jB5n&pRKq8r9mNlUyHGz^-I%3wSmCYES z<`~|f5RxR7P%>gD0~(Y{n8+9foG`@^kjn}}un_FJ_glaJ^F8PAUCy`rEz4dS_doOO z`#k^Wc`xTZ=X=k4Ih)mqPIRIZo#;f{qoJW8yS~2uTsPYdIi9vD{Nm?jXJ-$0>ca&t zem|k`lNvJX86S)cB}6Pr3k^ zhFlEY?4J+$u0iU(%vYW6xS*ZcH8nL~rm_D}qXS^S>>;|S&m*Iu^PGwV{$6zA0V@EI z=a25n7-Y*M-!NnnG97suc@f!6**i%0A$NQD$pr;phOF_%U+3J#NUb;;a2Wl13yuIG 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 DmTA9{ literal 0 HcmV?d00001 diff --git a/Assets/overlays/goose.png b/Assets/overlays/goose.png new file mode 100644 index 0000000000000000000000000000000000000000..86089d02435d601f97ff30c08f4b2f8b780cca34 GIT binary patch literal 1719 zcmV;o21xmdP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00uuvL_t(|UhSKEh*VV^$9HDe*)?~m%#?OBv_HxgvkV^#E*nclK~bSwP!wqh(aS#~ zBBCInKSF{aNGMu~o>W*F5k+Na;2I&R7_F(bKGIxvQ(ULfd2D@t=lmLWymuaV=HA^q z(|+K)zjJ=)-1EBUo;mlib(8$hiKwj#Mn^}NVD3coQ6uU{8=}$ZE^O^W$6GU*%vb-o zKw26-r&((cIyVy?(Eet@w-X)IsKlSuLuv~;_L2563%Q`Orh0;G+O&n5b_yoF=_CuNF?&7Mjg@RUxBz<2aG`<`~PDat%%SL03AFl zXIi5j}+^x1E!af6jQ|rcE%z`Ejmrd0U0JB5(3ClHFn8DVOX7^0k7eV2OT347Q()k`6 z^G-Dkz)`h%VIthCLC=JK0GQrG8q5o`po@IdH0p^^JrJQ2ZI~O;0wfPNQmB;<-i$3s zDwSFmi^aBSw0dCrM(Ox+v>9d0%2oy(d%qUxi3z;~X!I?#T^?<1MBT`>J>-$SK%s51 zlr>j_;fKbyqK$Iqijm1=4v=>d!FkxT*6W0{*R=R>LqqRDe`&jmLf%~%^E8+6dh2yU z+9#%hutFP~Y2;hBx!y>p(~n3Q9N(@k2c&H=6@?KRHy`zDTRp?EKWkA^);@LTfIs_q z+zWv(f;8+t%yt&IE3L;n94l{v&0}!-`jc@wkuOF(6W9RIP;The-ma0o$s)o%3(0$lqavZ zB%JT}{&L+_$Th2A7{M{ZKi>~L%Fg& zHm|kjExn1%%nbw$uhDjYO52L$DB$6O$F621zZvMEkTD|n;i8`RZFWqr2V z;9%N+Og(1rfR!63$A^+*A^io@z@SJblgp^&3#~6OsN*zxjG)=n5T1*EwW;oqo3m?_M-713z)Df|o7ofq=UV{*y+p44l-0U@1YARa}>2s^+(fF2^~=}eGc z9)vDI>(EhCSP{rK#AfFitRHulSxUNvq<;A#V->+QjJjjPL7JT9uW8&?&g5=>H4Zg4 zHlDyI*YQ;B3?#Fn9WBP!MZS{m7s$I0Be&JPsH__v-=HyaonDV#M}cjGD0>L?qHdyr zzPl*9a2i(6Pu0?fhK3u6b`oFAS(WSFGaM_sJh_FI_x;~s`;fdD4jkV`SI$%-k(k}o z)Fh9-=FovQd@}Xr<)!TBqr{W=M+griSJ zd$8F(LCr!ZS0Y*DWYZMoXYEOi%m4pP2!XD!=fZ}kmxb~{`h1XU{!Q%d*oD}B><607 zfNzkzHTN$t^6zdXA(w?77AWI31L%#M* N002ovPDHLkV1m8_D+d4o literal 0 HcmV?d00001 diff --git a/Assets/overlays/grim-reaper.png b/Assets/overlays/grim-reaper.png new file mode 100644 index 0000000000000000000000000000000000000000..de63fe4ad681d5f8227687b44314963f449f2177 GIT binary patch literal 1574 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/handcuffed.png b/Assets/overlays/handcuffed.png new file mode 100644 index 0000000000000000000000000000000000000000..dbdab91a0794bbc104a7bffeed9a7a448a07bb98 GIT binary patch literal 2008 zcmV;}2PgQ6P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00&@6L_t(|UhSG&h*eb>$Io1xaqOnz1gwvX)-Fr*_4Vz8P4lE+R8>{&h4z@} zfx&NqLP7E@RBs_=2i2w;t=uqdv5-u)@kn6SM#1KLQdwfY)fgGECcv=JcsU|=ZIuZy z9tV{PFkX(h`xC$>GmTwzoQY)v)uh@?jEp2JAd}1G%5D`f0f}l#Gy%1>wdHsl4BrHR z$^;lMCk)>NaKAkU`QH&E4b`HWOpJv@6Tk=2gI!%+GfXT8%ur3%j)kPRK&HOFKGBTd z4J3U62#F^El+8ZC7vQ};0lWa+^AnKxc1$w?^SJlwtUY3|8s>RYd?cO#9X!zah#!uq z2GwF>Y@}HMLOI+9scJ|y0ckd$p+edkQcXab=kHJm3S!n_P^+Oo!rE1eqdq&=qv|21-0V)8y_G4!s~i_d%xqm;3wxa%;@g! zUR+aCvyxh}hz~&1p~cWr#!~dr$XMPaW`~I$7>qt~gKz}fTKGfeTJ}(_)Vu~d>_#vM z8mqbH1H(D1no@)zZPYL45=9+;*QK=8*G%t_Nzx-g4*U37A)4YlF6% zst`AC-kgY|UnI^ek&h^ODbVR5#n7yiOzbhsp_~r1FG6c*7MvzYCmVFZIRnMY20v~p z_w9jv$mCE^)Ay{9m5LEi>Ggeri4K9sS}eDz4Gj$+v5~AYm4bU=C!rr94dib&5*0lj zJ{w&pd?Q>1YEwFo?Cv$>-LQ4!tCdWy?btS}Jpg>RVSh_)>^-nO_^dbE8Q5H8HvtT6 zC%&W6Uqp8U-VYy(Np(C4X%noGuRy;2us87e)6;~2WR1{uf*fdHhBiQx%%vpoy$ZFN z=zu&II$$~fF|`lr%yv+|rglKq(!FY8N#HvP+Q39zR!#x=I@D+`KJr!o_ue{YX}7Kv zF+?N9}G7|R#tP1_pl7-IB&RINupP)HWiLvSGo`zp`4gj_OFR&5ayW|>8 zPOYrhk@tEYcL3uAoZSWo*An+P5!#y3_n`B#4+i?dS9=-cmM`XUw9i7XLH<*w802HV zXA#|7ChhgmGPMVQtj)Rr=+8r{)nBn}h>MVaHM_=`w-5NhcmmRLn=Bbe?dY4KTM8}) z?E2@(9GV4t3Y*Z&o|gywI-#S`CFn0BwU4r7yUfi2-Ak6n2Wl;)IZ)_7L9pLqMQ^6* zHg)95kj8exB?Ub<)?M)$rRmoA4udmi)^bQ?MYJ!hr@$YwtBRg8bq zLwgFO+*ho-NYEIFajU^{_#1mDaEvwhJ3;JiI&PtPzoknIa@_~%{p7ZnJwB-AxTT8@ zI{d`q6N4Ojf;?|2V}sa6iuZT&q|jI_Wpog<+Tv4zJbm1Y?^xQ%Ana|$TAEZKjeDaE zLfGf~RqyzbijwNgY<`|C+CjADqn~twZwt?(I=f9m5 z13s#0*TCSBuPGOFLvj*u0g8?#YyuMh_(|>KVF%zdDO`WR?4i8~UCDo$;=4w^ib328 z&4iRoIg=v(Sh#wpDIzi0y!0aDt~j}L1$8f$JUEe$`Re;Y6H-H4xe|l;pI!0*gsp(c z@BTqx*)5>&S4`ZYI^eCI7>ZW&btg8;!PQ@&b_&EF3$vE@R+a>;g432x`94Hd@>Hq4 zy?v~FO-#KK1#)y+x&j35vc%~1QJ=J_L9VA*4eo3pE))yXht*J^j+LZy%{&yl1xlXW z#6Xkr*kA&RKELCFT<$DlFajq4=OKCi8eTA-1TPv-4X%FRm;xsNU;q0*Eyy*U3Du)4 z7PxO8B{tQM9)l1#reYJIZ{`jYQ-M6a#g<+;5qmORJw|*Xh(jn7N|jEiT7qpr{5A7 z8Tjvm4dvbu2=!roMF##wFF@FfP~O`Ud9;*&f&MU+4|Hu@m1an1eRmb=Lw%`FQ~6MB zR^#C1?!S*j21#ZybM6QU+61{{GJ*CIsD<0)F#K!iVKWUI)TjEk8gx>$#7wg3_)9gr qBR-AAOchj6K?N05P{9B)ng0MdQx0t1bp(t60000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00}8cL_t(|UhSHDtQ}Pq#_u_|K&67bq*bU=it^9|OG8jGLa2y=5*r~tASARFiKa2c z_k({*N{S}pi~fU!fcQv+NPvJ14+%soiIPT;ltL_s&`_Xw5$L_WuloDe`DS{CnK}2I zd*`&r-1{Z#ti8Xz_S)<0nc1@+(>L8wv)=0%A0Iym^&X{bwc2K6T36`Vx|MEr!BhH0leqm=H!&X9AOr+pR<*tD;+?<@_Rp>u#WWX z2HQEPe-!l}KvtXj{{VqsPS6RKna-e{nIJYlQ{mXy*a+#9O!qd3cQ(OpQ{d>*TzN;`nyKJ4UET)FK|PZ>P>e{!<9jY`l~2XJe@ANi()09w`gfPS!fEOI5F zd>(SPvl=%p#CPe$Y0jKE&tt#C*=VB(*c{Uo=cMN!Ip8oIut?7_odadh+3Xrq8NloD z_zreE!>S2z&m-sBGzZH5YSWuc<$z6F18XzdeFR>y)^j-5$sB0(2x+cpYM+3z8Ug-- zt~T6JsJpPaq`~CyvVQP$c;t#PPe0h~#NW+J5QeTk zoVLN+0=6Ha)6Q@3}<|7t>hT!X)kzf_>||`XcML zfsc!w4DhGsI~i>h;0xGj>8v}XvN=c!9BYyDGFq#%>rH1s`EON@e#BIChPY0FkEiWI zeh)&%%wJ|Y1$00B7MCX%s(Rr3DmStVd7tSN43OV&`4AE#J^Ea6oq|rLYU*Q&Y5C3# zkZ{XgESzb&df@y}8rz{(2=HE1=4g%lVwDNleM;P0g6jy>eXo7|(0R4pFD?Q3BjC5Y z{65p&1MPfCjR`b(h3Np4-u203C?+iAFLSz$&jccdolP(I7zuE!4iPF{itn!nD>YwlQ?vas^C2l4_*%}wAy>FTBK4?#Y zZFR$Mpwj1#{L#oRm+96`AB#>v=MJEB^1AOCGS+AKnU(yBql2Y0d6Ay4`(M0eCT{3c9{*0 z4VSv<-U5N1ifnAeSuOCZnb9wice}aX198q~Hh2j^HeazqU~?NXm!t;M#~W-pu-S-c zM!3(uYbphS9fqt%Vy)07j&*g_zsTH#z;-jTf@Igu3)_Z*(EOi({u9vw(!#^Y22+Kg z{B*lf2gDkp2$X5Ebqn&8sQ~#c$oY1$_d(+)BY$^13P|t#>yZ1NcwNMj*Y=bPBiwD0&Ba#5PZ(E=7M0(Fw4iHH9`dGu!F{HnFjS)+3bJ zbxuH;2FK(PyUz5~fTQLmX>4;9f#Mh+=&WZ<rWusQ_8D=gBT5f(+5!&hIEsxAbR1EafrgWD`(a zn9hJA?L;MWh_9N?f#SF0FL@MhG+m08yD0crQm@zJ{a&lp)&^OQIF|!u`}RT{Zs7NI z{H+fLkp792I)zFOKr+Ba-y9^q-({Txc5fg*clL91Ld&sWq7H~JywE!D-xy>$;#?54 zI+Wa^AN)N^km>m$X}wb8$cuE?lwi<$qJ4mPtnj5bRq5j*wCn&Je9Xzxuf3YE%evLE z^bPvK@3zPpR$qf9r^>m**Jg0B{*8K~k?TwTLm^5#fIw7sywU{M&SB$= z);i`c1c7Nf`y-OMQ67xb&T?#Cb-oDUo4X}xs}+)%Pqgj~G;$ch21uu0bCdy_AJ}%n zqiJk1^LDD$k;Tpyf;tQ2Um$&s=~7^`*0yb*6lXx){i&>3*jc0t-@DDgW|~Z8Q5u>t@zUkS64wp%`?I8o30G_Ox6R1Gr^t!!Np1tt&f^2+p)#h zhwz!K1zLV(vQI&LS~Dbpe$VujfGeH<-EW`UkkYTodIALa8wabYZsD}H6EHJeC4U0` zR+{cz5ae7WrlMTAbhbAc;9@^~ZT6qnUC?_w!bKp^GYR+x{Q*;x20rHD>rSNf^Sl|% fUPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00)0bL_t(|UhSJ(Y!p=(fV(cGRU}10kc%MTix-S?Q!WZ3peQks7!qSN5+6*AFZg75 z;KA^qMiYa^;DZl5NHh`!A&NH&0wIk>0i#e+L@*%)u!vN;-QD8%pZRB)+1V{SGiOSz z`z3$>|NQ67x%}sxxo+!f)Tj}e?(Xgp$TDQ8y8a(9;0KWwq<8_)_p5(6GT0RQk8y?S zs$h^~GnveE#2iQZR+CXzHw`&SdOdNO?YR0O3~s*6ybA+fBYyNabs0!+K_;1l`V)+8 zf-^)12DwZ98SK9tuLJ3Pu~>W!^D1+2e}KW%%fQSC0sAb<-3~h(ZxH;4kb6x9{Q(AZ zSjT1{eUtiEt1AR~EQaFin2n~AK18IGpuix0Q`6-R`NN5ED|zRPrvy1^!VBcL5{x_5 z-6x0~00whdO_wS12mc0S1cQ7MX)!q^kS|w_mO`Phk}~y}!!IHpH2Q^R1t4oKdCg9#Fy!sY<#Lm?c-3&+Vh(S0Y6(OBd#Hh0+&(n0)M?6r z890r~NFFo$9QlDkk)DUNIHiMdY=OKtF^6gKicoG8vdKBpf%E}n1u_SjhAcx^%{_*Pa0)THEvJT$_bx9x^@jZ_m zHKnVgwX?JH7Of%#b;;g;T9fHQW8XS`a*(uU)iHa=ad`m{Tg&8-QR+6}mK7nZW*gc( zV3k6BMe<(7G_#JDV;W2aKJXnw_GmI)=+g(LcM9n|jSrGMv^)@n0-%)L8Un|SMxH^| zAe)g-DE~6rec+NZHzRvW>%lisDn}nzSGv&9DrwLUzWX$9Imt@~fO2DywaDG->JiGx zJBW_bdIbE-#EC9@N$!crH$nmp{i3FyS*mxa?h$T^1|Ux%yZr;g&Qkwi^boPtE#EwUAvOKnBY)`3UON7_@x>NtyT7u$F)0qxBd&2haG02*pj z)6YygBC}c`K&RE0I;@uQv^h>}+TU-S5r`XrQ#2MBB)+ThMZUGQfSG;TE}{;I9feo{ zP|B@>^dCk_VBjVIaEO(6UhS$$5`c2iHdlh)gq3H4j*h(lh1daL@BO5vpV`dF0JT$x zK1}rO|K1G%%k4)sJ?M;FzT^#YZ!u4G@2>y|1wb+13etiA=TWDe)Wx=VPU!U&AWwAV zE_bO009u&sbF?jw!seWVeYUZ&vGh$bi3_6tBt8fPYwP@Oyggx9ixdX($ zpmrpZ24J6R4?5C7=hA!){*`L~N(=R)T9O9fJJqEuP;C`i>L~YxtG|uNcYrQQ1JJ6v zlvDx$&8#qa^p^Jl{#CYDbz~9+fX=irE9Jfg+(st@FF$NRo$llAY}z*OA85aTx;!g@ zPIRNZw?QuWg@u~523MZX)qFs;a4^m-uuIY{AnaBhfSEC!M4v!nchH4^9$}!rYSIe; zbyqqMRYht6fCY3etFyD+aV3XsFb3s)dM7ZI&O=pUB>)UGbPc9sLvg#e#amR{V3F)E zwdG^Xyo<)dA?B2>?NAW9gQDRgMhx z$>;U?PRg*K#n7pCEUW~8PHa^(0Dk#`d!5>!8fO9sz&z?Pmp`S_`KM}Zt$=NGPOirR z=&aQ5p0PhuorFhJ8whUS2mk{;gDU%*0CyWuMn09tz8rF_^feFww$@HHV`FOt$ZV9I zVFtdC&S%m8(BTv6jtq6&MI9qGDQUScIHt+iSPKB1*{o&&Iz5cePS<1-mZ*05Ms*@= z24J7eiY7~OFNaA81VFZwnu)L$0D%B(P%{9XeMrq%u)U^Ihxd71DSPFKiq!xVi^cV7 z1|Tq#k?S>C6_l3;E%!-tscHjxZ3N_~CKF*b0Njh$bT&h9B5ece*}-A*1uBCC z0sxV}0$0Ln0O+vH+WSr_NH&{|8h~}8^ZEQN&M)TOzYiPt6zP!5CUId3~f9PrBD{}NxK`+q;y10c}JO25;qY8x=?Yen;@yO_ZS{wsy_M{4$62tX5qkfj=cPhLrlTG4xN3+>GnnN3FgO;Bzyev6y-)D-cR!d(i=6~8mVjn z4GmW^dt##^CX|&yyM-iQKN=ELO(W6LVJ7rkfx@lk1<1g+7d^& z3OtI)`-i>-C#XT}(VgtoRH2=n(v~)x7;7s)I>pSG_kU?a98Pkh)S<~5HDXg&_b+6C VH%<^W*S7!w002ovPDHLkV1kXQx>x`J literal 0 HcmV?d00001 diff --git a/Assets/overlays/harpy.png b/Assets/overlays/harpy.png new file mode 100644 index 0000000000000000000000000000000000000000..844caf3b3825401823f908dc901bbbc154fdf9be GIT binary patch literal 2716 zcmV;N3S;$&P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z016~YL_t(|UhSI;j1|=x$Ju2U(6V)XVSGPO0mWFYHi}wpOsl9EtF01Ed>fl;h>t|; zyGd1S8m*PqC#b0L5v@%zz8^8DpwcR?tyV>#1qG!RdF--x@7~4V|D129J3Dvg&Yit; z$wvOkKj)n9`_A{BnLBfybBAoiMtr-`U}*@&V)4kv#>QVYG&GE&I0E*NZ(qND{R;B` zh9AIr$o>Y4KiL&O7{W$+BL+3$Kk;BOBu{23o19@t@4 z`XgDr0=0)66J(}~Rsq=Qm(u%~8MtY{$3?KidyNM+i{N2aHD3_#OoFZRq2qzg7x0Hx zttwD`Bz6DdJtYIXr${!ps`UXu4~GBsO^63Jh3@X|$yO~DsIv`x$6O==yIV;bt!jNi z@O|J4-;{V@!#(Ie&8j5=+fneJRy7gW-C)%+BetW$e*+xN_&T0+dqg8)39f{TVH@M> z3L5bP@~>jI327|wq4~lj>OAiyQQ%7>h9DS@uJO&y&3hu&lcRQY zscqc!1x-y&^Q#^I_k*{?&vBjzY&6dPPBc*>u=@(ec8utzn`t7jYlFXp&%?wH5`6)_ z2sJWkQdb@rjA95$)#(fb#JSHxhQP0QAiBiyeW2j_mNJ|lZy_B*uK+g9a0jxx)0TaB zboM8I7?0#m&Y%Xse;3Ji`2NaEJcu`wIHy~2z#xtu`?>Hf*oJS-8W$3Gwe(ei+2Gz( z{xx^-KcoW&7kiSq4uJ3Frp^p}bm99kIEiBX-Ne${wqu$3>3_$OE1-i9XtO#ribZn2n zy=Y5|iSq*iH9}}b_$YV&f86FX4e1m0~fssi;i63m3Vn!D^^a`Jr~wVCfs zz(-_>iqDIoS-3`b!XKO30dXTwO{xV^IpD7YUQRaKrU;eKQp3EvY@q&^<}LuT(Xh)* z0w7xohntxLRxX7Qv5?ljk!AtcR;~=u(fNr?G zCfW;(dt5`)Xv+6{aTNH_jSoQiuciusY$d!C9tXEJ(*T&L&l(3$gId(-$5K5Fv&o|# z2HJ(WnIY*I($KG83D{4DYZR<6kcHOllVIhBF!Y?4h?m;3?nGp}*F zci^_>cP#m$*CYeGl_X=w&h}1)XF%N)jpq>{pKmU8lZL~SVdyELtd3R( zx%oqZV8H_G7uQi#xjDj*1k<{HcPo}fXJ_Xa-*gY`PcfB# zwcAY`0lMX8qvde0{3d^!s~iJNG$hZc%e;U<+BQ!FHrhpYAg}G{U=B|Cc&~{9U9h`E zeu{}Dzr)0_z-%aXZZ1&`s@@V~b+y#8N$9)xKAn|bkL8E7x3_DbJ`NvRs@35GTvVs! zS2F4&-%Af3m6T4}xpl)*Su!bXX6PPNQ8qLyVl-APa`b zULgCDq^j=>v2P_-Xu6FbEzk8KNBuz1$uvYgdj#mTNYSDvSpAXL_j@5A`>m;~0#!8u znnL{GiK0A*q&_!+cl-h$HW@VPF{`2*@UV#;C>LR{icABlsc)DFwN#!5*LrUr+>k$; zX?`HiE`9I3Kto=E=RqxK?t?m<(4N4dszZKjsBew~P=3fcObM#!ckMyIM+}YfbuMoCR0059tm&aW`#bYz*d_nW6Y+e zk103dAbh*MNYWW5u03!bS=J((4|M`_0aOni`IJ^N=stv`*u=egmU3veH&EbD-wrEQ zexm{YH5C0_fzkqdec%|J5^?cUO(oqeB#}eYEWlUqrpv1)$_E6{_V~v>Ry?rLLF;v7 zL;Ls0wuSS&m9x_%W;au31~*pchw5aXHc@^cj*hynCD^A5+6&5Ea4xz_VeDQVI!&X4 z{~%CjE#-^IhWeAVpq`%0-czTWOk5uja4Uk3Bi#*FHMggp&If|C0rKy|V@;hJ)X{fH z4jc6BFbg_5I(Fg$G@1mU{5G6Sw&D%NMz5q>myq_~Tp2u|@e_F!LfBticgtoUb(z8E}PNd_)ZkH0?S*S|zJr>yPpCFJLlE+E~AjYy3lL%soh W(c(jrrhsPv0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z010AAL_t(|UhSJ_tQAER$6rMsh@hZ?0*XYRT{MV=s6?X1s1a0%HTJ{;#u&e86tQ45 zA{zZ*A(GgGu@VwXM2#gzO;l_|u`3`Q|@JGka!s zc4qh9n*Z@1N3HRyqr1C%D(rMmD~-*YH`mnF)ty>fTia=-Z5t$D1{akY_^-CARYjfg zs)Gyq)5Nq`YP_oGwFEGoGbMmYu*}4&qSq3@y}WJD07j&&1(W)j55-Qzd}= zcWi5G>)xj3LT}Ch60jG2KHAholuQ7@CPL>mH8m|UQ(mklPL@Yn?gX&j{0KXn_9lCl zoFI#5LhGU3%v2VLvy@Jy#dxch3$(Qhw63$W^E@+U1C@`3TA|0xR5pn9xm{dI;M;7~ za)THTL+u?M9VeM79jG)ET4o)YVCJ$xtT)`%r2xJ=TD9CD%y^5n8X9Tl(!hDXRcwQ{ zGjrJ>)>DdG3i$nHRmuXP`VecA#e5G|wB{8VaGJ=9eX6NTSWwzbt^`s&3Ft#bHbGoR zJM24?#}W53$%P0d0Eb%Wc2k9w#w!9wVTFmMP{~bD;WgaK^=)smL(c@9Or{PrRj4+@-NKQjp~0U+&pz$Jh_ zDFKdK5(Y|73;Gb(_n>cuGhi1Jd*UoEYPiXXAco>SNr#X0ECE~su>XZmi?bxdB>-QS z0D-#uqdx})i&_$N3&P^g0>QcvBmnd=9s&*bfo?NZfyY7%xu372GofjT{bqb8npy~d z1_&i*0Wk`1fdJS~qRl%@bwJ;Nb~Q*(AWt{5?9-V6ahteC<6A(0i>MR{%5;)*$wHp( zS)F|eoBFwNTB)r!Zb2vdn;G#Mx|eXa)$BDLHdC zZrr%L`CU!h?wCzqc89sgCS}ivM}e~9YbD5Fr50WUPE#k!hvE~=q%6MSDgv_opqZ1< zSH9GnV|pYg|HuUe$V<#z1j=4EH~Gynv+NJchS-3-+_Q#(z2_R`fr2m0Cjd5`3f-dw z`4P|R?Cy;V`~VWrY33xj^#cEyrbmKUFUe0pZZUHth&4%mh&v&#GTTa+yT_5E24*c3 ztO21Z%hY(m!~i(Y!>)T(M?z^vKNv0e5lM9@ zJ4b$PZEc5`DG~TzDSyNP$m`AagxR!6{w$jh^l>VS1wL~IkeUr=WjoMGok{Kv$Vd>e%>cop3XdK0ahNCBm&a*zT6i@V0D;pz?4? z8y4X%+2DP#ZIA)}wAqTXTMFzQE>&G0)E~r1A54)BO~I>d?8iZ^u2Kr%>%KV>>u@s( zZWBb=VN&3o?d|PjWGe}rr@0Vz2tl7>x&mEbwlQW(4eE3=B3hV2Co~@vH$gW*iHl!P z;2*4A$lvs|(dM`4cbi%o)Ys_VX{v(0sGx$Lzh=A9OqoI5cIYkWKIkTBCZsmBLT3hb zH$m>ys#v}aHb6FRxigR>ce*99X3d&`1as37{)3s-(Ce~oEucSVs$X2Jdl725*mX7m zaXYsF{rmTy#ACy4cj2Fi6Bw~}tmHyq{}5VlYE?k|@1S5H3g9+t_4W1YL#t%Cd!m#D zGW!~V9FT7^+ekA7z@~k8BUFz(R);0{lh7jWL2Z{agL>N3ybYgCoO7UIYMZzb23migR)yp4S_N}riQ~u zz_kDlB8KkS?Wm(!sE%$zT!*}Z*ni;r6Z$IjBH*hT`8$5Wn;rbSVcI-xp!@;KrkVXx zY>!LM1%fq0k3p?^%$Q9_;Q;8m05>|l1!lzq)_edSbN;673g~@Ei(kpxJQWD0uSNa_ zC^!-e=tW!TYJ+A+d#!H){kYu9iqHEoNSz&~(NbuWsiDzkG#)jv*T5A2j0^qDR0s5Z z#3_s3>qj8(^a!2PS$Ur$`>#URGYyZ(G6GpZ+#$4~FV^=%i!dGPl?2HA;xus)j024? zCd>PpS_C?(nev6vSJ3y+&(!%1T8kVD>h^*3JwopxMXW=+GS2|o(f7l4MkCeR*(lJ_PDV=S zc>mRx;wmADv!fJK*4=!FnUq@`WgUbt&+K(i}y$Oy) zo<*>q@p2INjWF$plO$yOcw#&?7%BInp-jYGXeAPm>6ayWWVYW z08}CYk+%S|EA8(GV!=Tv(+tg=0M6U_UMz$WInpGc>>1F|(2!|>GADor%6bAAs(A}k z{V7nj1c0({0cKIA8Jal(G>|80JyEsCAhRgb0A;=y8mL49;x4ojw?N6SRE7AbX271vGI)N0w~k*759%VL?kHx%3M=}I*Xw55i?Eyihzdo()3;^^2Z20(bd(pz^X=q zI19}+5ya7p*q5M_QOmk5D*`&vXkUFFh4flG4s)$aB&hqW`4xdO|C8D^P(}X4Q5Dcv zeOo*jnhNRT$k&kj-2puDBPHd*>uzNI&VQlmK&N90y+zulKPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00`zuL_t(|UhSJ%j1*NAhNp*a7UjVW@Ii7ME8X_h}Z zeeXHvF6W+m>-MdxQ%%Qlj3Z}hUD4UuS%6N?<#PQ=I}!a${x7I4C{aIT?tqStj^QL% zLzhAqK<7Y%8EmX?IRflMyaVNK%=Pt5VTcoM({PVNmjJ?fDwZj zY~j_)^>;M43K>b8f3-l3p&0Q`qgad#1U)Z$C^4bs1N81>sC(q z6}raM*@Hec8xKH5Ghjb7U2-c@0(5;SBg1DwFF~I|YfP;{tudK&Dl=AfOkD!?MVaZ) ze)6)R2rZP{iev*BMMtlwQ-SJ(6%S-PO)dRS6MLwRsmtQv!Gl97x8AB~ z70R}_F1w?glksN4X%azIr7J~S0^$qXYapj+W80rIl3 zwoafy4JtbGkD4k5M8>AFO!rwtJ`RAZ+{?YI(_hn zn~~3lT7y#AI6xq;J{CaDruIM=b;3du_Y5?o-9Fs#R+u;jdKkQ0hu;fLYg#*GOYE^UijSf&3*Tx>GGdsssA; z=`+`|AJecNOgN}5lI6&{wHam!2HBTnx!LG|otsHMRvvvgrWi^bfEUlFaCkretfdY# zeha!QjBPl`HrZ%wh;R%OG&ak7q^*EE^g~12Xz(*9IgAG_ZAf7AA0)R2TmX#$xlX6M zaKLpY_DFNURQ*u#Z76!}kB8TjnuZ1T-OsYW*;ogS0ohg1S^0cEwxWfY0~q9RD(E4m zyt6`YUm&eP2aPEK*Z5!}r$WhdiO8+)D3T5sXXz#_9m_Yh zwY80bKh@Y0$YId$#&!pLsJ|;pk_D>jfvp3fGgD}w74b+qAbj-fXJ6pjxy-Vu;BRvr z*O-o-!yui?il(Xv)E%#DG(qD{ohgzI&`S$po24NxwA8@{cyGWR21f6O=8?S>s>%ty z1@8a`rNd4596q-E(4B4B5K9^8YUDa@&W64fae|yJnRF@>6zv++?X`P}r~~w_E<8o) zrG*FL*rR87H#q9dBEJN>NW`VE1ldeisHy2?ODn+{)Q?@Sk_D>jfen8{u|37;Z!6;A z9YCl3Ei1HG8sbDt)%ae@{$lK%mPT=xepm&`HtGiYUIiuh6wxXx;*s0~jyXgxfqyM4 z46roBKbC5x45sWb<+)B@bHX@Y)epL48+8MHSAPy*U~2Kn?TE@c)o>fFd)5*j*q0?_XLr6~$t4 zGXwvP?9Vu7t~uz4K+*wvf+AebZ2BiFg+k#Qc-?EKf&mYLh8UX#s=8M|U-3C024-|c!u=@KlhV1_HYSHQlfk^8sOg2sSMukrQh{5}(Vq&eUX{V?MSR!YXe~X|1s_kI~4x=r$VLaFA`X(O3s$;p1?{ z9R6r|kF*sa=)YXJp|!O&d`ct-=%jcLjkX4oic!-iK4~zU?lBu3SoY)KuU8&@IHs;a z;T#mc8q@0~zZVF|s(Lln6}qZli5{A7tOG?VdNo!SR8Z`n0}V_!u>&GC{+zLm;DF~4 z#a1)?3|BBfbuULl(C|vtCRHR@EEo#0KkdmFm5V|$Q%nE9ySR9(<{_D>yVS$RPM+w7 za&B=qcjQw8DJlY$eSidM*#HT2J)OZG>7zi^m%)c|N<9mZVAoWPuVMf@*i5b@eKF9K zpf~;*Qv1Zl7qDCJ2s>b>V|Upje8s?%3PNJ`Pv6c zhET(FAn!Vm@6}LQ^$qz@S@N;T;3m>vx1K1^b-r0mo28QFX&w71b0{x$csLL zviM+PGL-yaVkOi&A527nEfXq$LqvwLs>(W=l)U@P7UJDeO)gq~Z+ps(lDE80(t> zDxgs>X7p|%{BZJfjojs0Y8%<6B0abhLR_p)< QkpKVy07*qoM6N<$g7+tBN&o-= literal 0 HcmV?d00001 diff --git a/Assets/overlays/hole-ladder.png b/Assets/overlays/hole-ladder.png new file mode 100644 index 0000000000000000000000000000000000000000..01d94a79c287dc3b09b52d0ea649ca920b211097 GIT binary patch literal 2334 zcmV+(3E}pMP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00^c@L_t(|UhSJ}h*eb-$DP+TQ}a<~8X9Psj}JbIEDFmgDzJx@rKChrDM1QRP?S;7 z1F1gP1EL~|K4hg4ra_+qrK0+fDOSF+thDm2S7|!mGSS-F+P|%>Z3t3hSyc)44MtA3WY>_gmX?-hke$RGIATAt z%&Jrk*tiVYZ)VEQA4xw=bdXi)7%1qAf^C7iD3l$vYE=Wa9y0SHkiV56XVtPpqZ%Yp zslW-tt!j^hIcEe`#lg-41m4@W*1{MyH5z~0MoT7fu7y1gc6x1L92+$jOUCdz!1zx% zfU7*-qA^Nb#B>M9dlpTiY8+5oTbpJ}=N*9ezO`r)RpS6ivn6c|=`gkWBQ07CiXnfi zRqJuEWxJUbf&4r{>YkwFrbYwhRyfC!At=r_H8oAn<#Kt;>M80GEp&B3@&wqph1XHJF0o_;I_l9EBkUSt(FoYJjwisSmh2k5QN4`9 zL~zb9tJdw%_i!^K24yc=wN$b!g4$|&SJQkxpZc7wFll{fTDvki0Ec>&)z{Z&-V&py z7CG(s@#EvTLQ|3HCR3HCGS#u_C1Lt|`{u%AazLgv0HX#Vhv_h89Qn^NLmsrGgFL-U zPb4}WnT#kt7C93gsfQD^YbN*&*^YdVY-nz7{+b=kiS~xLje-XmN6d6H$G*_>m%95bGkzfsS zF>TLqnFUb3lJ;{fSsrk}V<^r9b&nt)BTJEM$Qq4gzPG7cL%UIGi#&p?MGi}M7P$YH znyT`_eRzZEPlW0DJ4U{M%p}=h&B}&!BA20mIkHE6`k?$eYgRtcJ0(ybhYp`0&}(V8 zpuUjD)whQ!R<$IVrX>TMfqZPqB>v`J?6z|O^~H?SI*m|1)dSZP4cz)_nx>!$&ajRu;s?)}&+5 zR?l=dc!CyW39`^>E`t1h)~ws0Pkr!6;vNPqTXi1joB;E!SvF`ejeG34Daa%9EdL_q zc{t5A?gp^qbn7z)WfxkVc}Tkx{z0a>#zn+7LR9Qa@C^&i1f_ArLiYQwDvqwSE%5?^ zO+l*SOvZ+{EFPk<5`L#+*ipU4 zV8!Ag%T9*M0}*#`5&neqx1td8RykEw2)3;>Gea~6jm63jAlh<=6i?;(Oquo*mPb8r zQ&oFL$lzkO*%%&G+{SjB;_XBnK!sZsqG&hq6)v*~)`Y5c0E10DxY1ac0J|+d*JT>v zBFLaM-49Yhd+rxdwj?NtLfIIC9YN{@XtfHO`LMHtJo~Su0-ARS!(*v(U>gh#@J580aSXM;Bb)Y^Az6l9!-PqNidOi zeJdf-9dr=|yS<<8XxESF|D+}LCaW>}p}|s36+ztlfswM=R;?Pi!OV)GF<2dqr}S|- zmHHv!S0LiITTuk^$6A$YK-=>evfauxj;%;+Mkj6^si>`@eiM)*u2pj`(`Z#t8h}oH z=+uu8BCnUOx3;$MIa^NXs~-}vnZAyYrM-RRsf69y&aWU}?>0?5CTFn0`!Xoa01EDO zLjmH=$RaBWAbyg*WyoH5ziFfXFn1&CS4hQMik?@d& z_(6!PeNWo+_5>~wN_L%(0RS}zt8%bWJL~&t{^Wwt|QK@&);jsT?1uTB7d502kF&_ zzWs-g-9X;ugy&gS*+B34raN+bH8wU*#wn|1Q#;iA6Ny};E`!1mNO4DEEw9h|0$jYQ zsu=2vey>8-$N*=ILGmMHgjFp+D4&hQw!!4>LY_tR?I3j<-5I14-4`Ouke^+r1(3Ic z3laPMLPelI9ZTIqr-|d#@|# zB4u+xAvi&6z!a{~bPR3(m6#4$hBJuNK545R-5-cfp1(sjAYajJ15)y#N3J literal 0 HcmV?d00001 diff --git a/Assets/overlays/hole.png b/Assets/overlays/hole.png new file mode 100644 index 0000000000000000000000000000000000000000..b32c788d9b2110add94ff2d4eb6c076de1cbe2f4 GIT binary patch literal 1117 zcmV-j1fu(iP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0V80K!uM z00ZSoL_t(|UhSD%OH@%5$7fDSc6kUA^HOACfkrn=G{|1+3)EB3MJRLu{Q&g=`~pGN zWBOE35J5fFOC<&64MM}pycAjwi8_vBzje-XY;b0ro6~VzKlrov*?aB1*V?nsKIiNS z7=~dOhG7_nVHk#C7#obBrg>v=aj_U}CtHj*yM=*37|jNQ!D%$>73GJVPe3FR*-a2f z2(p&TYE*?Pxh|u87uq6riNJ1-WD@;A-_S4`L<6+#LF43eM%EKRz!K;=bQU$@;2tSo zE100~B(E9wmE$LKg^lzgzg9z?U!h@Q`dLlhN&!t^o|R6*Vs` zEcEaz_!9i*kP|Eb!ZzQ zk>x2H*jF@)exfP#2hAYa{RMd%$gj2o?L?)h0_{Zy(LVawM4A@3&`-O|+!}ARD0OJu zhUUFFT^(!(PzSogu^UscquIVDGVMAuCJO7l<$T)QsM_P9{KN(7neGCNtj5>MN`x<;~LQmE07$i0%FK6+gvO{g7P}Yr_)MVX&>u2!$trx{I5~G^L zLY+h9lxOA|P9wP;(%yaj0=`R3@(7=Hg97rCBrBhORFr!ru2DadSKNYtSZYw8h9~ir zYt=GRsP$q{r^N*WVIB9Pi=6;R(*Q3F6IA@t%SKHL2I4-g=@hZX|Dt39+)a@5Gm>xi zf`E{=5zmmu7Jm~IsEj@aNxMj*D`dSQF%V0q#+3XqC}0qM5#rh3#dYq!tn!Tbj@;k{ ziA}4LgJJYlnEXey?lwhyK7l@H7!pTnufj{vpcRF*aTwh}d4K0m7ksQ_<%+Li^?e?- zYIS9tTOB&#Op8>fz6FJqtw zXjF%fLYeGW@>Q7f_*or_GUi3capc%L2I?ccYz&e8goe2s!EWh9=r@uRAvyp5_e4kz zP?k=FN@!C~8`*OXphJ?zI~BqQIW~WUGCCB^dg_^DU3L2!HKmQm>7lQKDUt@-07=~dO jhG7_nVHn27A`tis-*mw)@QdO100000NkvXXu0mjf_o(>l literal 0 HcmV?d00001 diff --git a/Assets/overlays/hydra.png b/Assets/overlays/hydra.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b409bebecc85fb927ab2c35844cd1c6c792d2e GIT binary patch literal 2472 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/lever.png b/Assets/overlays/lever.png new file mode 100644 index 0000000000000000000000000000000000000000..3eeeefe391e8f985d9951ccf18897231cc581521 GIT binary patch literal 2154 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 Hu0mjfv?=;g literal 0 HcmV?d00001 diff --git a/Assets/overlays/locked-chest.png b/Assets/overlays/locked-chest.png new file mode 100644 index 0000000000000000000000000000000000000000..1d83ac838bb8935fe250c76229b6e52cdc61cfc9 GIT binary patch literal 2424 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/manacles.png b/Assets/overlays/manacles.png new file mode 100644 index 0000000000000000000000000000000000000000..8d5901c88d071563b6e741da73ea81dd817b963b GIT binary patch literal 2789 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/mantrap.png b/Assets/overlays/mantrap.png new file mode 100644 index 0000000000000000000000000000000000000000..17ca4ffdf02808b48bd14670d19007ad0418a16a GIT binary patch literal 2044 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00)FgL_t(|UhSHBh*eb_$7i23bICT%BrCN{G%#&*i}DX^5L~jDgqCT+Oe>aEg{M@G+U{R)CAiJwM-OaQnSe19i4I3KHqbHb7$_{_k7!!KDZzFanAXk-}&8h z&b!OG=f0eXh=_=Yh=_=Yh=_=Yh=_=YhzOth`ucM%o7JQ}4jO*c(9qD zTQPZP)B_WfOv*~=|6NRi7+_L>TuVdH@VVUF-03v@owPSrXH^dBAI!_kTWH0&(7q5` zZN+rBjpI~WJ}&g9j6N>G>P>QR?4L*mkiJTsCp|R@2>2_F95ppH<4kr?*B7h65?)*Q z6kC{dX=kD0vS-hpwj5_KHq;~s{l3{^G*GvPB;TrhVx9pw_h%+IT2Zt39kX|X6?5w9 z>Sj=$N;<8epkTVmj;gAvUd6@5yJ%mfGHna6Ij%B29_Lsmlp#)Db#?Vs#NXm-4Ej5f zqke{Fbu*uRtLBHLKYJUr{)>tt^kKwD+?gFVFqz05TP zifX$X`;C0)>_Q8i&iD<(#-d+ilB1H^ z#$@RmOmn-P4=B8IVis`UqOC_G=409QW~M|7&hCAAsC-)8x!h_XsqifCe#J4sYa03V#U}2 zlN@w#poP`|mPn%m@0k>D0_K_ap-IwuVs+95`AU)wq$@oo2ztzZipI7UItZ1cJh#+g zU@uwLhj_~@ZX4{dX|qs>umy(Y26c5U??RbF+Ap3&K&3FhqkNRU?u?e)ezj7jI`lXI1@+@uS2=&J- zpAtN8Lw9{7t;3%nTk0tu9OHiUz#@ur8}vu4*hnd7)+FMD-bZ2`FBv$7ZjJ{rH}+5v zI&wCN?v!_9w`vg5(}e?7kQ5TffBc~ROmZ)#fpx-mVMFnmN9u#0mbHh`<&!oR=WFa8 zVy(muxr#(E85d%cvF{0zF~rezJ&9~!;wfwWu+2HOBAh*&i2F2li5)6L(x(wYdJ=O2 zvsa2;VRF*Yww`ulu@6)xUJsH9nBo?*L>(_ZQ;4f&_)-=`OIb4iVsh(2XSEc*p4pv4 z`VZx#!1r|vp-xVu{Ryke7~&nk=3_%Cw!E*MIyjhaawD;~u?p9l7-+E6U!XRmC0N>b z@J0wxN!%5rqp_1OZ~qVIQ#(2`0s9QoYCJeocH%Pw>uWCA5988hQmp}!euK4M%{vimJT{Pg<`YPuK6K~}(!B)K$}MAvrFZo| zG}xA)>$H!%Xh{ab=#6#(wjI+VDD`gwH0q75Wbp2B#a;JVt7;X9t()YV*ipsjI7i7Z zmToQ?K}fAtRx7rSLHy~Y=U8=otf6MDcrdO3C_)*tIfEVqPC1&y6#CT*u-{ukuX zO$|rAo=ztFJdPRd#WjbR`oz5-JAxg@^ube~+|>u|JL+=MexzP=J9F%e_9C0Zu{UwX zJXTaxq6~6=x{)b2EKh zMfxsJgKZ|qCE)}#M>C1(ORgql2nQO3owijXebBY6L4J#^$G&3Ff08CmN)r$ZPO+{e z{jfe*Z%j9=?sTpjok{s-6$@f%AAdJij_qL5xA7R>QczH!XZ}(7q)WyV5Dz-7*d0l= z8QNKSOmAfR7@|D|{gFY}W&>8optMng_wl&iL0000iq#PS literal 0 HcmV?d00001 diff --git a/Assets/overlays/masked-spider.png b/Assets/overlays/masked-spider.png new file mode 100644 index 0000000000000000000000000000000000000000..56ae720a531ef3b464f64fcc9490fd66495927b4 GIT binary patch literal 3004 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/minions.png b/Assets/overlays/minions.png new file mode 100644 index 0000000000000000000000000000000000000000..299c9288ecd34295b00e3089096be05c4c5142fb GIT binary patch literal 2288 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 g-%U5&k07*qoM6N<$f|QPSmH+?% literal 0 HcmV?d00001 diff --git a/Assets/overlays/mite-alt.png b/Assets/overlays/mite-alt.png new file mode 100644 index 0000000000000000000000000000000000000000..94c6bf2b37e03065d1771dca9423a70ed492b9a0 GIT binary patch literal 2721 zcmV;S3SRYzP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z017EdL_t(|UhSHD%$8*x$9WIZD~DjHAqf&5Lkka!)C84gDTF#1(xz!-+m%zw5eB*L~gB^9*aCfd(3Apn(P&_m>{Hml@Mi%8$57{Xy~x@Yk^4{gwm+YNt5g&1;5o(4}&fg~kRRffL-kEGl{g zxXrI(6dFo5GJE@q-@q1;5N2`~j? zY$4__`XMHu4_K}X$h(_j6uGtL=*y`&(C-L}Pf$w#6Mc7tqh6r%(Qq-`uPY&7ztP#* znYqenlk9uiQr$q#XPkSYr2zFa;T!S^*!!Wz`hJHD4dk3bve$Cyvp~PkVFBvXtgo?D z0Nic(uZG`+KQ(1vEuX^*fPam0Gs#Y~6hOaE`aqz+1}}A3Z6Lus-ostanF9TFmH1XT zG=Tn5`+s981@c(pm*7k9qJh9K-x65xs-xX+6{9{Z1*osE9%IS}S|^<6(CR?L%VB!( z*nLpT(R1KLX$<(!4iBJDaBN2BRr)Ekx8$n?o)j)03)_I33 zC)BqYP5SxSL632v8Pz+P%sX%IM`tEf*~HPS?qnROGOe@-#P zF1Hlu?d`q6`g6n-ecmgDa=_dUR)WGMsmiHsvAaBSTv8mIeob#}V{y zdwct-mZXiLaq8C$obPS9|8K(Td(a_ViMNl|_2%`))K^jJg!k6HT^ z0qj%pze|~(m;%U2&>gM@@{=Y&yVLFf_1mD<3B7duh{Ng*@@uz8ZwB@C1$Q5yey77y zpk*!=^*fOD9a9_xq_;i|u8&Lxb!{?eHq{ls)?oqa^W}GF3bZ|NCDfkX23T}WAfICt zt2TS=N`a;^WZnkc^4FoMt;Uua1NG}2mN~YvP%w?RMi!vN-QC?6Q!aqI0-Zef3mhIm zn*#shCTg?H+O;s&5|mTnOAbjP4QeTUCFLcK9SN7^A|hrBoFZQW>Kcz$dm7UMk1;(7 z*e_C4_0=1o;U&2gkwlnlmrl;D)OE)Dx#fRMJ^hHGo~+H+!1FL;KET%1nWY%YQ(*p= z<$mU!$+UgSlC*~ui>V6{A41A4O`zJQzVQh?T#Q@oQvSIT)keUK6IvB$wAk&{@q?CA z;MW&jY*XXkiTy=568l%uu&2SF$xc9ht(&X;{g$QQ&y~B()c~5-^YKxH9bcK`)~>Yf z3iY+aaqsX5%#NgaK+j*zF1B1bXtdsq^&FJy+#ko&w$f|6wuQv zh<%-9>3W9aAQRA5xwHWjpnjP8Ug-`|yT@U=2+IdtR8TscU*O^rb%3ytY; zIUOapy9U_=wK17&k!^$N^NT%Cx**%yy|5c$};=t7hw!ZkL=e)&1Y_d?> zW~p+}Xa^J~TPh3s(rYvpDcsT*SyrytouT|b+zO{Kxcpl*{ZPR^9!cwwk3)Tk>2|+J zaXjZYQ51iV4*=~ZLt%%d%0VMtv4X8_G$p+qo^B}v4}KR1_#}4bolE_XPzU@Kcv!X| z8=mE`0QE1)N1hefPg3rpdYs)EbaZr_L5#*!aIw&yhc(>+dLPG3oPYu711R?2D77G2 zi+KZOX8(=)-HKt*tFhC~QS6hrir=DqRsMWPgEJkfzM83j7CvGB-F5|##-QmHxE3Zq z#As}p41qmr)WKriLV&s%RC|^x;@uTV2S0Dpv_DeTT_&8!!7VoWXJ=W zCc?kMWdC0~LHaSY>@t=Z?IZ_iv&eD)sbu?RmxDr&u+0SNKQTzW&t_2&a~fPvp0h3W z^DOFT?9tex@r@T{qm6>vf!eG<+Kh$w;{U4ZrNG^yc_+axmw`c!A%l`9U=V0>3UH=N zCKed{A`WV#tExY2Qv*AUZ?`DhvXI6Y-*j0Nk?+f(ts;lZ#ySwRPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z016jLL_t(|UhSKEj2%@S$Gf{Ng_=?+FVlj>mQ>mlQ>|zWN-VW45{;HbQ4j$!2oXc5 z#zai4kN7B9CDA4V5gMUt_=8q!D)@)Ch^Q44c~m7@3hHWPwNICQ@A~1u5~9zC~_~?sF#}v8iP!r*q$LQzaUmL#Z=@)s^! zNt|%w5<9?f;<7ErXm_DK`_M zA+=?5Kz%`EPeJStC|=>P=Ahzo67+^lIndyJ4h^7dk`&-rugyXT=|RpT?qXyWvJCwM zyK^B%gI|DSjrs}b-?1wLzFs8t$7%=_&PNV7M-h)ZJb*qYGKWT2+nfUXg~(Py4n>j2 zz^<9xcI532PeDlXhJlyc9H7n~+jGHx0C|nW%OU<0g7-&Ni&0Wn31I5MHfrDdY!0B$ zL$=FT1!6V7U+n4u^vms28$C7$u>D)UGKhJOLJPKX2)s9{l17ancOe^W5}JG@@W||w zk(kfhq1vbZ5{ssGn zRki|hg_EaSeQLwasn4%OkMG9986Uon>YN;>DROptjB&LC#z#j-udz87LQW<$jN}~O zZF2y9z3lCP+#h!{0rb1^8$;O6< zhcB{O@iVYBdWAL(IW^IlvlRJq2yO%9-s(2O&J?AV z>B;U7CjC+N%2x}vA5+Bp1lrHMIaH_xM>4q};7V1@1D{@X$y^-$G9(Omj58XsQ?H&@ zLT)W|{^R3eB-{}Klm2L$W#+^0p7!(XxELo7Ep|I{G&v zZ{pW2p8KlWl;Z>F2N8Yw31B(_{hr7h{2GY9j-1P@X@$*ggLc*-i;%A& zFWM~oy~s>=Q|ECua?tJo7v*WY^C2eL)QCaPonbMkXkw8(_Z+JMt+?6>?PzUcE$9d6 zOYX!CUzoARpzGXHn<*&>NH#SDx(37KIj;wwUMU+n@zj+*PH6UbJ7wYKD?W`6sR13m zc*cmc{sOGGs}$liHoObbqwp_RZ#m@FJpK-39cnW9DTCP5)EvF|(;0p}0`bH~%(E+? zPhHp+<1T!i;J-ul+X1;BbTb)n>-D`DNqxOS*Jez-1}J|71VK+Y_z9boT{}OOZ8<36DCYWsviaFVmzm(?dJpO;R(Gda%tfTDru3Pf`PJvRNe ztBxK4eV5auY0|&opsvu}r^U~h&9ZCbMs0o@xf0X5$a4(!d2nzrd=u#D>3N7VAC#4W)#M*w}IXy$pu3{7un41TKVlj{9%eMl*xWRx&}Gr z&a^8VzOXY?3%0NyK&idSRUx=4)DI^?#koTRT7^`fs9)&=ZKVsq)!pvHn9Npr5&R{Jz9d(nnY#5;-1I>BFSE{cML|QpjFF-#H+-_CqLuhKp zwS>RAY#Q45n-5EIUy{30eN~^Wwgw)9nMkr%!0|`yDup<$-6uOWUhXuds4tFJzw{%C zWM81Aka!7g#2-X{Vsj~kY6In`s?!XN9r`6oX04G2aSywimdGvpg=#J|@@5)2jEo}5 zXR$owM=HPn>!Gf8o08q!Jlux*a#$ZrY;G?@Lqp4Ga4&zQO*Z91OlnbtuI~y*tY*Nc zZS~Z~D*7-}+T=Ha_2B<1vKLuq)A4}@XVSmx5&c>`gE}3~zz{FAm!JXk8jkNq9zwK{ zc@OeoB#io$zYLWO7y64KX&ty`Ao?j^d!G5JK&RG(-W&AFZv$e#)P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z019_WL_t(|UhSF-kd{>$$C0ZD7>bBs3ZbG2DUq3ERFdY6$;=u?5oZh=9m%vTFEwge zX=RaQ<)ot)qluH1C7RB70VcF2DwOhq3I*XN;V!bU%U@I4G&wfJrbA{bh7QHU3TbzqGUXy&5!N4=R5F ztf4_q<4#Pfc0roqDcuOt`~bHRz5>rmQFaYb;ltpQG@=&w5*pQ)X@4BQw z9oEp$FtNG0`8@m!VLe<5k1-$O96=rr;krL8A&>V&0lgK}vp*HR64t?o;aFrtX~fO= zn{7yEKzyRNF4($t>)Xv2|4Hy!*n;|}xMQNg-Ucc*2wo0nrSK_mO|DtxgS1=d3}?*{ zg8gtWgs&-w*CN|13hs@df+xWGXh}CgKI>d2c>BV)5&kyZ2G_!Kk?oO+{r|y=QOS#S zlgLgO3-5+b-I74J9^M5X=pf!*IQ>%AmN%Z+aevbN5xzgE-h5E_3@Y=lRGI(4OYsg& zYV}j#W9kcm>{YmTie|hAlBx*gy#`&$;}H2YqAbT13-OOjs-6dh?MI>aSjioM{AFgu zOuX6j!~{N-#yp#g5pmr0UDwkIy4D+VnqnZIpR#BJ)NZ_2KzGhZ>+9>^kyJek3Y!UE z%T=*`5Xb5Hp_I%D_oHLZN472(qhru%cc$b;Ks6cNa$Jq3^OCq{K|y0+$*HSJszot7TTv_O|DwygS6WDUWP`e zZ1c-#J}f!?1v<<8l<~bu(%4nVJONHe?(z6}C^WpLM#kL%nQEnJo$Z@M$_^m>FmAU& zK91=1a9GOTQ9T6S2U}CL0735&qwx;MExJjjbkpI>@E`D$$gDfS+&q?yo`L^{Gn7$y zwviz_jS+YuYS&FzMmjqCr|d2NeaM%<^~gW2j8XrDVfc3##~r$T@ZSNQ|Eo4_+LR4e zmq0#4$Y>sJ6Pdf7_J#YypTm{NPE1krGvqSZ<>gQa@_7NCnX(TMcAbxezl23MN!(Au zD!3Bf4x8)*I_iu_TrSAqqi{8utj0Y_86)Eo*qG`VAgr-+Xe0vot>CS&({}#OKt8{R z*&0UFpE~^pS==OX4}{i1EASfhVQb*`L~<|r7iI^D!_Zikaowi%GS0bhvgac3vJQ#r184`+rmB=(9(&>1koXOqB- z#R?eLPh5L)OH`!;5YIhg4&J_zAt3Cl&nvkYod;>^sLz#nv%Me>bcZuYOW|hx?iW!W z{^Q|urbp+ga9AYh2t+)H1dDL%DfG*v&t7ElyVGwl)6RnUe}>ai7Un+)@m08+b1^!^ zV&Z0%$Nw(scXtXJ{wI8}uCDH&6!sm_Q^3>UC-7XTsq8G6M}GT6!X1I4FA?TKd(vHY zLQ)lh!f%dhl>zb+K4^?h*;vuh9$tU1<205sHU&xkY z5m0z$dc@hgPM4xfN*?KB#Ts;Nfc&u(&4Ne3xc!v^x^-|C-u&n~O71x>m$M@ifPV=5 zJ}f##2p7(P*);lf+&{sil@Y~b_-g2&EMj>a9FaQ$kte~|Qz6SVI+DsvT_X3YYY*ss z+|;J`)wV+r?CK?sCNO7J&a4=*H~^o^@u2Aad-Qa6QXF zBj&GA_+XLWU_Js@;=LnW-ArfMr2+h<{;Oi+6u2nHZ;k7&aT4WC6MRyI3Ivc{fh{{0dKKf z!lNS6PC%TZJphrj#piLCZ?-9x1rj>_!@$9P9L9RW^;r2PtfP{?(40>cmxJ;fV99qq z+FFe1?>HzZiF<}ig_lj(D?Gngf0<;%}=jiQQwrq(h zhTr$QdsR>epO`+V9RD~f;Vn%wQ?vJUI7*#B?~F0ui{T`~Zctx=Zcy$Q`KRruJZ@PX zfd6;!*c9v<$a4VeK6XtSC1cIIbb6|En!hGZ24WCSDeAZf_shf1Z4cKX( z(_WVcC;6d-J#`kQa8U;kuBA?M@%GH93kn%aCA6iBc6ia$)D%A^Ku0qBF#&&eJVKwN z;&@Ctuf10gjwM6`ypg$~{sm4^hR*kTzwg_L9=|cV__GeczXWHz@;3z(=nnsfRJaca z*$$8YQaY*4j|sTh@d&i#vp0VH>ii09CuR3}{LU2P+9|UmasuH|&`$AE*8Ls6Tu`X% zaTbmBS{bi9$l`k*e%E!$9~1CTB~8BbJRbcF?&kOejAt_3!KlB5>ukCQj#Q4!r|+=a zaXm3Q_ju8hpc3xz*TC4}p?C8bL0o@KScI!tyOedF|6!r=np;ulHrvQ^na6@Ab$J#{Ur1 zl)eh~?tcNP=oBis7&^tRcsx83Ec!8lQNIpZ{Fp%aEa?5gqcL7%(e)+HC4_wvTfA-C zwvsPTy%tp5j}U%oaUI_RM<}nZt}gsB!3Pg*bS+3bB>y~pB=ilyd&6gt_uSFelc4g0 z7{xELG&~Wi;TQ6a#P!F7Um(+BjE|k_@Lvb*kYB;x`43OIpdlk^Z2mgBiiXCgszM<5 zX!VoTtLz`U*6(bc1&y0XN95lUp1_%mI}DjiB(BxS+Py68HlU%}`Hr?HhDX~=jQR;l z{nh{@t%*CA#`{_n_I?EwR8T<$6;x0`??RtG{{{FM3^dNrALsx8002ovPDHLkV1knB Baa{la literal 0 HcmV?d00001 diff --git a/Assets/overlays/moon-claws.png b/Assets/overlays/moon-claws.png new file mode 100644 index 0000000000000000000000000000000000000000..ac42e643ac278af61b63722075abb3b4662c2af2 GIT binary patch literal 2281 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 QK>z>%07*qoM6N<$f@C^<1poj5 literal 0 HcmV?d00001 diff --git a/Assets/overlays/mummy-head.png b/Assets/overlays/mummy-head.png new file mode 100644 index 0000000000000000000000000000000000000000..402b33fdb2fb15a2dcff5f96f52ab82110294628 GIT binary patch literal 2741 zcmV;m3QF~fP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z017=xL_t(|UhSKCY*bYg#=A@{R5k%OK*YE}M2su$alwk3xJ3Qu9A1*;i+!7TrdNG{KSM{|8(X=&*mF0-U$8(a;)gP)=Q9(F3@ zKZA~rj#2O>*uvm5qP@L+9pz@Lj#b~a5R1j8V*En59A3eg$}Ov;si|oUx+l=pyU}I< z;{~WA!g%iMpYXXnA z;(ZJ3k+COY&>XlrZen;)cP)Idxw(0NYubUV2%GAe%179Ms_lZdcvuh@PL|fUNyuGJFVr3pF8QExWLw^LwF|@F#6;Z8u`b zK9=Q!yuti>=aXtF>q!s_)X`&5kJD@52y4~{x;^1U6LUgNj}>f_S673#c95y0>md0S zeu#b%>33bdIm(QMXL2cTa0>Y;la>zDYa>|#7s5qlWo0X+?-TH=o`yjg!7oz_-+)&l zrVJEaX*3$0NdC?6Ex6TH3<%0=&v=p5H?6U;v9OL3_vk{iBM>lD_z})w^3Fvy$eQwj zu9WTPcu;&$rRbKL-USlS5x zLa(>LHC(3!eQT*#LhT3b#!l*adyU%HUKALiCV&C#25Y&L0UP1w1lH2IoEGK(3G0xz zK^a-J2s;6KtE*s8Ny{}TR38qd{t(h3sPs;t{a_Hk?(U>jEa8D%4a2Onnu19@l1N|;z z0<=#BLLg&kR4+WY(C~g-@6Q-UqaJMoEGl51_JrY3drejZngD)j?Z8V-EP5~p6Zx@z zF)<_jH?S)}(5v{GQdPP0N#9oK`g2$TZU@^w={6IrZm0!^KF;K6y^G)Rg zou1vRpdz?qOr3YAZEk~Sq59Ho>4SmKfStJ3mzgTRpu@@PfK-qZlLR`x)bgWnKAei^ zM}c#N+F%b*m|bnU01N3QmhA)GbIMa((NuvD*eRiHd2!kZhm%fWlljcDd|<@8o_ zs{t;4WqY-a$Vd{VS#p4eGa2Uv9I4 zCEJi2NWBPA6Z{88Me^F{Q=xZ%!jNUNTxP`uJa<_uZvgGw4tpMeVXz8NY$El6{DAWC z`gFLV=)k7gP7?UB?xEYwiH2q~lU)xdxHm#xN`4@}&S{DZiYtb`wNfU4!Rd2U(sLf& zN*aG!*S5q`+~K|kc6IAqhNJV%*0j_6nE;4PJ3X9l&xa zeQHv@xT4YvSam;SKj_ zFW_3i6-AVFDl}d|lf{pgmKKGxH#1=!@-$7YLFn|?O1J^)Luy)(uh@e; zzjGzWVzD#0p6N3C5*RTByB;Uq+f+W#`?nhTIyY3OL7U0}c?SAZP3#t`Lz$o88m~T+ z`8Kj*5GluQ3JQ$43nTQ)OgEJeboY_vqD5TmIP7aK18|-4K?Pm6U!B=+rdc0%Nw&7! z`DD^Lu25eA8x#@NOVI*TIiT0CrbyBqrjp_Ay8?N-pLKpP=^X*x+vs$jzz1>!{R)0@ zog8-urn#Pt-T_@Z41Gu{@4%L%rHxVh!uQ}uUkgZRk_H!teU4jm{*G!{KRyE-)jYzm0aEGSLV1eVpv@hr=d=k_qRIDHgJQ>_aS%LgbFzpAFg25b~6=qkrAYYr`GtmF= z$zWz8ryQ|I_bWWuiluh3Dsp% z)JD=-fUY3FQjbIviwiOyPJ{E{GN{wz-lI$hr1cKr2UNM%GJX@vL00000NkvXXu0mjfk%$|@ literal 0 HcmV?d00001 diff --git a/Assets/overlays/mushroom.png b/Assets/overlays/mushroom.png new file mode 100644 index 0000000000000000000000000000000000000000..9de4cf0b9ddb2d6b448356b5397b37ced42e6dae GIT binary patch literal 1582 zcmV+}2GRM6P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00p*5L_t(|UhSJtXk0}c$CHiQWNm7#Hd3TijjbAm>Orv=jTlixLDaU;L$MUmiw8Ya zp{FR~q3x-N;z>!t2o<5~#XqQs9z3Z1gO^s*Kx!$m-C`5Ft(&*&=R5D0(9OQx&F;QQ zcGvyDFTa`Jn>RDR-KC!*L0eWoqRr@KsI!Cc5X!9j_GD(4YCSJAqgal zOi|`6WloX)9r+FUHIYbMKzk?F0OWExIrc2F85zW}Yh|w%>dA5LQIcOHpOgLp3EaU( zg#Io^b|ZgrC1ZzrPa}Jg4c27ikj-W{)3H<5SFg}cfP9MFZ_O_q>2!J}9r@7uw&>9I zAw+Y_;zPp&K@c3bzAPE^<1+Fl$sX&Pe`s(JNrzo%4Cv1>WTSP_A2jkfa?#ptDAcc+ znVB8d)%c--AtYn%H7xXT4{E`W_XQQC!h4YKc^0oQQ$s@#Mp#JgT*%s?VgRV@2Auzy z3fG#cDWJ~>2*3^`XQoKB94!fz==f-}IWKU0JN@5h*^*QWz%D9!*s@IreSd`!{Jdo& zDR~QUq81rPsH8izG$&ldORQEmb$53kF;fBMM!^1NcV6H_PcoStArQ;VR6t|^DEtT~ zK5E&f2Ve9`{<38Yh`a?T{2gjA%(Vvir0)y;Oz7uAOGwcO;NHI*)l$w2M!_|xqEQfa z3p{7K6X0J!bQH#l8%A^aF0YT7Fr2>OmU&-7I^a~!SkkD7Dhn8Jg5B#$NT{3 zTYRf?k^s!TA{PXJ14oI_m}NC597eq!1i`DJrTM_0cToq?vn#-FO-Dn)7Z3*lc+YIh zNH^4n&?}*De;^Z7aBF4-9cZ_8E+%6^3GMBXw} zNhmXpoI`SEip0ttM$Vfl5{^HkKBBjp$wB^o*-3ViR*>FNz9JOVO!=`Y;a&Pk*+}+d zyDVE29DB{qz0XYLxWnok4ztlv*KVuxPBRt3F$GbZt}6FNXbtV))-~uME};A=ddkh8 z1RXpoGRy~CIAJ?0r>(M)*W9pQ=_n|Boh8$z%W+nJIA^uXmFA>r?JP$^9mnX~8OuIo zS{%fW*-3qp^cKqfYx#vk16_y<6p_@(&_r1T_Cr=)w@{@`(xlaQ!19rB-0cCPUouk^ z!zzPb#Z}JAK=~=;7TGHiIRdVPsOh=s9vd1N)6>&Kw6P7@hkS{+jZqFiNTc0Wc0}c) zpy&)`+;f=p)y`O&6Q>ygq`I4GuZWGiV0+l zv~p!9?;d+oS}Yb zy^*AhMn#Hpd4~5k(q8cv037LIh)>~!8{#!`D}k6>n){&QQ=nD|z(AeOtB&%^))?>> z02nY`5Bfsw6`uhp`RuNOID%Lfp8>eZbUnlo#IpDdz>TJBhB;uJCB5M@0F_>JD#9eH zpW^A)r{3@xfR(1}B9qBnZ%Hrs3_vVbE|p5T_Xc113_x6UyH{sl_zXbxA0MJA`y;1% z@fmI^)SH*(3_(-da%p zz!!|*x+X#vL0?(2IUxWa=svCmoY$^S-K)tZ1qasP$hh;UN;q$qRny$yNM8^HBj~_< zD+}fH4^pl7LoL?y>+x?G=YB-~4&BY?36A~|Y77}gwBN9J|Na6?_E{W9wJD;#I(;bB gUO<~Ri%v(!f4Dmq3QMTy4gdfE07*qoM6N<$g19N_9{>OV literal 0 HcmV?d00001 diff --git a/Assets/overlays/mushrooms.png b/Assets/overlays/mushrooms.png new file mode 100644 index 0000000000000000000000000000000000000000..d01024ee146e3f35750625c1664684ea3a98320b GIT binary patch literal 1762 zcmV<81|9i{P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00wGFL_t(|UhSHFXjNqxz_(pDt;A$GKbF~s{!wOVHf`%eNg|3QqevPl?pbsIP#^Mr& z!QP3qlY|VYKY%P((@PHq*Mf}dcpc&VF!CZr->$f#fI)3S#>_C?!E`sON}HE945W?$ zollO;1GL$XOjkFh3ya;yIwsGMfPJV+bya#WfEy6&OWz3+_#vu7U6vM%z10k(Fi65% z>auho?iombas)n*NF-X+b!out->xp}f3YV%SX*?l3h) z4)^V8Gk5-i-~M+xvIs`LNnsLh)uL~BNx(AIQF4W9->^ym_kWH4G)2t`)xKeS1uRw_87zRqs5W!t zA65xq_OH=ml)T0oa9qp2VU+-~U!%oHp#OtR!gf9M727o+u$`D24E`6?MiP)PHU46i z04}|8Ertq-??Bx}|9z&$e{2`Qe$}DD%zw+QuVL_iYE>XuC4e1Rmli{Tncs<8$KcPI znuzJ`?VUwXf&UYvj~?Vf?Y6ieun#m&-@$hRX+^Hm?urlMoKJwKOvwJA1OEuQUb_h$ zPp_*9bRnvh#c92%$q&YU7PSjM;;Z28E&eKzMtt3dUWP27EI*qE&^wSJW9btlqLEJC zNB@m>1-mg8(hk(y$lX*;Q&$pv-ro!i4-Yrt_dR^}B|CC}bM1&soFfH&uz>$*i2O}n zfvzXh)s*G^zwF!l=(sx;i^=x2opZhD6xh#3HX%>4+OOxl^_75Md5N-(Hdarm>Em~7 znS5mC<7yJntcOV)6M#`YB5!PeMSeosMn*>DwRlWTtf0f$T66{5 zRjlf(^)LSh=Y?$)T~}1>x=kxPu$O&B#%FZYPe)D~tHQxo>Kli&TYwpE z=2CRL3@^fYVJm*#)T&%~dX9i!xn(jQeX~!9qaLQu^QNX?Zd9F~06KbBi>?r?{Jgn+ zE%J|QYZ#>C8z^G?0VTUgKmH=us-8#yj_Vjy&e?b1CDqx;XP-Yybp|BiJ7R1g@!x1w zzN8lO|0ZCK7QJvxbvC|M?FD%ZmK73kibSj>-Y1YVTJ4q0i6N`oap($mvWk9++@npi zf=vzUO0PC`1$)^oTEBs&$>rETE$xg4cZjDGb)~wP04MSuJ}Wdlj?D|m0&QXi_REo< z)lF8gIm%CPy*BfV^uxCM74&Ds+Ko zoPc|GubM;xF}GD#3xsM zc_eR$-C&@Xq1Gbu4^OVxu2?L#pLj!mp*zJCB}ZA=zqk6`D!SAirvLx|07*qoM6N<$ Ef-Gu6`v3p{ literal 0 HcmV?d00001 diff --git a/Assets/overlays/nails.png b/Assets/overlays/nails.png new file mode 100644 index 0000000000000000000000000000000000000000..ac10e9981709764f50deff56733ff743b76a5c21 GIT binary patch literal 1240 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/nested-hexagons.png b/Assets/overlays/nested-hexagons.png new file mode 100644 index 0000000000000000000000000000000000000000..8dacf6556779a97d3d50cefb24fb218a3185248c GIT binary patch literal 1788 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 KMNUMnLSTXh^pd{- literal 0 HcmV?d00001 diff --git a/Assets/overlays/overlay01.png b/Assets/overlays/overlay01.png new file mode 100644 index 0000000000000000000000000000000000000000..275cc1067d95a105bad7226b968aadd2b9932e58 GIT binary patch literal 1999 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 Z`VW9t=(kM9k?jBg002ovPDHLkV1nOMN)`YB literal 0 HcmV?d00001 diff --git a/Assets/overlays/packed-planks.png b/Assets/overlays/packed-planks.png new file mode 100644 index 0000000000000000000000000000000000000000..08de1f343fe5c7a69ee0232c355a8fa8a8a6416b GIT binary patch literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qu69ZBBqE+zMKSL6cOYdu{YLn`9l&bIYpaTIAu zXJd9WFgCu>tW&{Zdf|+)L{@?ZSDfpfmd1${%*PL$xZuH(zUKLqZpU)#bNwaXtL1sF zu3vfgrtYu)znVPG=BlP1mrb@$IJ@rCr}Wo(HpLiA-i`Fn!KkbU8HB@Tyrwzi#?Z_2Y7NigR->7!)nluwyh9ne=X3yW(76 PEHZey`njxgN@xNAy-w$g literal 0 HcmV?d00001 diff --git a/Assets/overlays/pentacle.png b/Assets/overlays/pentacle.png new file mode 100644 index 0000000000000000000000000000000000000000..83d82d39ecc091f3dbf8d686a963bdd69f0a8137 GIT binary patch literal 2498 zcmV;z2|f0SP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00~M-L_t(|UhSHBj9pb7$7iNPZ7E`bMnO@5&;TMek&4y^Eh;WiBw9rx+E7suV=$5; z#Khu~04_Dy5(E+r{?QUZ0=WDk4Y9H$E{Iq#2o{Tk34%ys3$wnN`uYCu_no0ATgJ zdGkK%{7VbY{=BiVv1cX9+x*gjfuF{}1LbXQJDt1*Ry!5>{OpI5-osh%%g%pX0m^s! zdDK3Jhlf{YLm!8Ou+r|f(vhRy+uK|9Hl{ykX}0fY2=SFIv~GZKGNkjm5|Rd>unPEqputGR2ZTo`a*ZyED%?*q%W;HhC&QN7f+2 z?pq)o`2pD_4hzr=gC*u9iPeBXf79Us{=<+BNL3qa9M&1=zt$i&HZ>DD+oGi4~&t`fL4 zk5F3)^#zIN%#1^O^Xb5YS<@LbemzOU!3$#kltoAUPLdR_ylsJE?W%+j9R#(RaG&No zq-iGYbQN^&(C+T;H(RZ<4O`9m5|lX_|39p102_LGde&JDh}l5QMOGDa3^6;cmcZXj zvMSRuusuMT=dJEPFt~MeE`h$nt^~HX+a1(uwZZ|KDGFBrtF+}TRL-*6N7~I2s?zBpJgS+!KU@X2OKs%sPAwpyEChL9BlvO!Fj5~O7J8<-=P8V@3X5Rig9>= ze!g8L@U2uI9Gbwk6*l@iT!mJ6`gvXWUreVig9c} z{dd}xz^rcyUq?o=s0?)V?NX$*TYdfg{jYacgE|FyJX$QW4f|^yrnp1hp*lC%wO1JQ zPhBPkrMm1=y+YQ7*s}0){*lr|wgKrgMF!;8A}`n%pi8bs z@|VBn6$@N!uPD}K0@a0VLi83%puWKE_Zb&ce~v|BACmMzo2L(zJsd3p`CDub(2qkN zu)7lcH#)p&RK~?C!LO5Yyu$c&C8!KpYqZ-bvC2n=P zFI1LM8=$H5+jzJCEwg4|&+kR#`#e23np?AW^qUtDsUpqD^@7h#R{lyhgE_<9emy- zKe2gIn!N?mwlxK_ zK2IAee`g$4!;|+@c9kGDy&lOABBis5?Jgwk?JLh2yUXqb_9u`*tJ1f)NC|xBIIK=# zvt(LOnO;jTX7xr#ZnCQYt_2Jv|N8m`Nu&E&e}{a~qQ686V7rB6G4-X7E!h4`Qu#W? zcT*M>as5c;=IoTA!rNVcG(b{%s9`@Ni^$+gS!id zS3!QxUz$>@FZKnL`Gj4qgL<_a{B+htH1aQ!gY1^Su!tdFTEqzKUvNkXd>1&Z0PW^q z!~Y>kiz@O5VN+iM@=qf#v%9rW@mJkWoh$9?8W|axbQz0&Faz0acSDHVtXLNd&rnI4| z-(UWKXeXx+*^P*oBdaS;w;W8bpKD&h%#T6Mv~)j&0Ka31$pBm40m@ zum5$vO;+FS<~_Ydpr)2I#9exbfz}pMJJ#D>NLxw~_vwr0_dj9()I|PIwP--=Wj@AX?K` zA|G-0BHu+$$JFpk(ym>*v@>;w%8^d_pW-P$187&Dp!&K0Ht8O%` z>Ub7;&U#Z&hn_KCqTC`REzH^iN4?>UuHA4D+B*xJV~#my30+Vmwg3PC M07*qoM6N<$f(hfvApigX literal 0 HcmV?d00001 diff --git a/Assets/overlays/pentagram-rose.png b/Assets/overlays/pentagram-rose.png new file mode 100644 index 0000000000000000000000000000000000000000..6844a756c40971ef862175afea00dd655efaa2d6 GIT binary patch literal 3449 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/perspective-dice-six-faces-four.png b/Assets/overlays/perspective-dice-six-faces-four.png new file mode 100644 index 0000000000000000000000000000000000000000..9e27633e83061aad1489084e244a4ac901f37f2b GIT binary patch literal 2469 zcmV;W30n4vP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00}KgL_t(|UhSG`j1)x}hS>#|Ll8U&t_TFYI0QV18sY(7QH&84QHhagQ1A$%f<}!d z8__5jLZVS2{t)m05rc|?s33wI;>95teh2|{MN|~f#l7%(tG{Wcr>BS6p=Vie-sDZy zcXVCdUG-IUH!7fj0t)y)qsY>FM{R9wcalEJ!Y_-9i#JGr*n^Ir4By?G1Y}_b>|}2B zhGI+e4mx)f97lF7ETZ2x!d{h?l|7LMLA7OFO-)T1`WEC5573$7>gwv->3lhP-R+0W z6auz;%x5##+)VbMy`r&zj`W2q)u|*LZRQZLweVa#@H8wTIor&K4(RlW@O4=0b!8t= zjWV|oxa;?tn-BbJ;4845xiwtS$mZ~IxZB#F7T9N!41`^c%D;s^G++r}`U{RGTVmBU zEYP??aHH4U{DC?)z^kp=gAW?h8!oi=)f=dD9_(h#sDDs-Tlg}pwl>u}sJjwQBpW%g z#ttewg2`$WGxQE?#BS*F^$F_SqXDq|b~u7;V{2x9KqXhe^{N;?4No$YY{$Yo;4f-a zK0w*O!I7}N>O@scz6YEDtKoO(`nd+h39IN$H9{ai+)N>0?uxz2^NbJH!PBjp5U`Cj zSNTpdbv&TJ4pz1Ua&I$*fVl|!cF!|DQ06w0$jA`;S)Ql!ts!Y`rg%W155m8#f;sR= zGx@-z&Oaufe1Nh?TU7y|SN!pw`Rs&|PiQLY6l+s{N2m?WVE7B1PGxIItJuzV!FC;K z1b0^HDU*M0jt0_=o5=D78m|6p)iE$XzyLnJR-CN-;Wc?=@`8uelL-xt0 z&K=z8K$J(Ji{P1N)neSqA z%N-Q55dKVgM@S}Zf}D6Qb`TXlkgy5pu7vAlPX}yzY_B2fM{VTwIw{CXtgPizCQ%tQw&P=n{HVuAb*aDbUzwV+ImMS^PrJ2b9o z&gAt3sXss9qg~z@vi@-w@`Z4}!4^I%>=Iqm3hFgpl=GbhU-<(AZu-3;gymbxIVT4SZ$&MW%r{q`;Gj#PD_}J#}V~zPB;BWB*}4r z-gURElIq0ReHkKchMaS#&9$)&z_%v)K=-KC6A64$N2t%DtZCp|rGAha-zjObhnr?U?Z|G0}mtR-yj}b~KgH ziLzFel$3mJvIE!l!|wzWH6S`_()W@0a;6IB(TTx1PI&-9gJv4crB?O&9sZy$#>r&Stno0f0b~XZ-$`3jDu^ zW8e!W2c7`aY3Y;CTFD6@tL~%B-9a)8EXT-#HfFm_j%^jt+U$ZDQcYr!+uc;)JDSPu zTvEmI$(y3k07L=%Tyyoo{P2*O9Vky7cLz13o#5XvwgK?NO#xXOmyC@T@L6Ywr9)WV|QU z2^Y~Bw+xeBPM<%atmKW^eQ8dD1Iu>Kpu*YSIPcr%3&@%Xbx;}!>{>be&69vyTU)); zSw8^+{yIY2WTFprn@Lg+Lr#Ih98*Oin>)oX97MuNdiv~cYG@P zIz0hV;M#Ys7zfI|+w^NlLYuCfK%u4ZQ>YG2W>)W0RaJF8`K)$@_-!RQUuBWDMBWHv z834-J!-}ATmOfC&Zwj+NBk?21*g&D`bmYlxI?xy$SG!|xQXN|-ewWKQ0O)?lr%qp) z@z-h7V6uVzN35W5ZBZYCF4)KfeEtRQTOs*Npe8H_@@WTvypFRklb-Z+xW`P9z({@B=4#=Ik#(g>`9~uC3IvVqTx)6{<2d@cW6ZAXYiRNDa zpz`zRK-!ZVZ0pU<2RePriyDBTrt*PKlUWGpb<)(=+zu{ik79ybVPNl$Tw765;hzHv zsCD|I$Sp7c$eJ7cvq1q_=Yy%=9?F^YZX=uZMy}pKqcp=m1^v~5{3~Ymflh~>fdPQC zO!R?nvK6CpG#5NW8VIZ!BxqMO9D*rGqFc5-8(uF?B{skt4RpaYG0XYZmjfgh)kLz7?v*c1ck z$LYYFa7csB98ISt!o<&w{tCeWxC0P$I`(=V#7>3Me4&Xw>LGLK@#8^H~Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00#_7L_t(|UhSG|Y*a-Q$Gd%Oi$W_zG%B)eT3}fu5;D~lxVp2fKyq_ylX}Y2>dKkx4l610;g3lFvezenGl{09N=OcJf)_7k*RV(5O5t%AA~Jx3WBHb)9YEqCb2wY zVe(CgQZJJiBsCb$3t>6M#X$naM>XO-c*qzsGN!`2a5>9SlLvRtX~diOc$f9lZw{*_ky2Tn`^NW^E9%a8}5?9evD^R$_?n}YdMGja;SIPb$^9ab*Dx#*iu^*zYX?$eTC6yAg94>HH*Dad_#)CfDii# z2m*YyaGxPJZ*<5-~{lD<}zTZss;ovli%ZL-hr=`upG`*lV^}Pd0Wh3Y}t%mN=%*(aIO3Z0{J35 zTgx#ts7yJSY&}UUVe&tUj{FUAK+1_=B>@aB3zyGH!a~s-8yjT{YyS&P|5(GM|9cWV zPUV2`k^pb#>!HwiSV0nM^YinMP@bq&DFs)*je{MD`}%CO0+b-SbXkAw-}){;Gcm8!!ITp;&*g#cZ?3dtX=s*!J~IT&zy z0sI1|)_}iybuUX``Sj)s_-WIFmbp-l-((-X8)1J18I4A7!?F43;1x`+lRk2$7zb=t z63`R)tc7<{bXS?yfpgiSJ_?)6r~`mD?ZCVqDc=B(X_eIk;Hw$RDO2!IVP3&t7ZLbd z$bOG*sH)WF2I$4~IiYod6Ch)Qci;qdHTYogtC&EaCpXm9Xfqes3*2)+0p=_wd>p&41kf)6ms7O0inRxV8clHPV5^B1P<~CTU0{<# z&!iGSd-;>~b4d48df0+MClTle8n|GoRvDltl>pj)1TWU+BL@V1J^TsEt8g82kt1)} z_BO$U382kE!~$(LGQkAo>&_}BV}AW(7$^bM{RLN3biWsjcrclPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00+`ZL_t(|UhSHHj1xr^$FDt)^4~h^}FsDZdASz%`8$|F9J?^f(JN&$z*Ge471U7~sEBHA}x|8F#2W<`n0#y``p;FWjJ%;TT(xlM#N0OP0v(Z@2F--bq zg8Blvf)86k^ZTT(6T~e*{VdZWHT1Uy|K8d>|1fxGv-9r(y6>4qC z>>>l{K<|EJhdT5H^f80PQs{iJ^WcioKdj!{M;RT&AYXp_4atki#Tn)NE~x*e0Q4 zQlBmKBflK7SzfID%hi_jeuAoB(c@(86D{S3&>^kQelz5g{#-hXLZ{otv5XE5}~jMH6*l@H)DY;R$6>=W3wt6S#KiDLm`sG)u)seOkQi9|+WOLB+G`N(Lh`JNV>h0itjz zZYJraO{J~eFj+rw#=|?biJ(`>+BZ6s)d_djBznHtc z$=EXbsij>`7hoJo8&WyRZ9oZsuQA8np;4B{X7iA}Kd@MTQjUAvMfo1&df1{)*oRy< zTk~dlpiS-;;B4^wnZ&*`u{nae?H`Eq~^s6qe1U2;q#vG*CqF^u>B3W-rP6C0zwVD-N-zDHzFDa9m zLw+^tz&Nt7htw`_j3!7v6MS0$0+K_@Vl775sc9nYTUgp9eL=${XE5=FS``0fEbu8U zE}|}XZ<853=~sYy`Hn6^mueFmY~$6<0d>Eto9q`y)$9Pj{YakiS&)}E#~q{{#UbRA zJuk@pSAcQW@M+9JC)5;+eP56%e7e0*Y@AQZr_ba{8GAW(S-sxNdI1P#zh>hgz~Lm* zP01hV^E1ZVp!o^R-SJ{2UHrHLW^rD(Z&xFc$S{KYhTtlZeKzm|CO=oRk{_tqtngzK ztRWyp)OC4=DYD{twWv+*iokqxqP|nwsqJvH-Q3CWK&Ck_5@f z-$W{lor+DGx{`7MnA|ERR;@)>2<{BN>&X6LEWQ(BuNlf150{mdS%;ux5c6JQdRL3C zcv*l(l2LS+aK)(~NS(j$;Sy6_Qc~jOQx~?O5iCH1DZ1ln6J(MhG?a;sMu*jG!60&D zB2RKAliD{ZxrDKYc;OFTi z7zKZM=a6u0%5rP|9LoMxm{;oR>aJ$M)hMGEr8G-x0r2^WHr6YzC^9z4e~-FqSNSI# z4i6-NuQevm&?c<~I2+pUX6!q)i*pO{$UnTsqu)$;smXK!Xcs~g$$Hwq@(MwHrfuPG#waz0BFAIQ={4wHQ zb!(k40eQPKjmaFhW~C%s0P0Sl>0}-M7-_XInNCb<2@2~Z?dJ$Afb|y`Z1O^MDY`_f z&Oex3ZzL}|?RWj;2a8Q_atahEP@q78yiip1FV}trs=Mu!uK)l507*qoM6N<$f+#co A*Z=?k literal 0 HcmV?d00001 diff --git a/Assets/overlays/perspective-dice-six-faces-six.png b/Assets/overlays/perspective-dice-six-faces-six.png new file mode 100644 index 0000000000000000000000000000000000000000..1651df221f26554c5e799f2fb721587f5b81a5f4 GIT binary patch literal 2448 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/perspective-dice-six-faces-two.png b/Assets/overlays/perspective-dice-six-faces-two.png new file mode 100644 index 0000000000000000000000000000000000000000..43dbb83fbe75f58c66e1d60f666d1dfaa64c0ba8 GIT binary patch literal 1896 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/pirate-flag.png b/Assets/overlays/pirate-flag.png new file mode 100644 index 0000000000000000000000000000000000000000..6a84c2bc14e7e159812abc6398bf702679dbf582 GIT binary patch literal 2452 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 D5fK=> literal 0 HcmV?d00001 diff --git a/Assets/overlays/plain-square.png b/Assets/overlays/plain-square.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ab2c71b1734c10b8d35ce47899b9b8b9aeedd0 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qu69ZBBqF04QDUmgc?c6+)whE&A8ogJ8U*g)jK zqczJT7ViGPmQ8oJ>*QUI&GQr|Jy5i-KXpIO>D+b%$Uu!FS`SI!d opVe%hH_PzY{r}f*7Hrnhzw04U)}(Yk66g&EPgg&ebxsLQ04{iP;Q#;t literal 0 HcmV?d00001 diff --git a/Assets/overlays/pointy-hat.png b/Assets/overlays/pointy-hat.png new file mode 100644 index 0000000000000000000000000000000000000000..155e9f27a42dbce1d7ff7c6f5627f8e18d58b417 GIT binary patch literal 1955 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 IM6N<$f*g)n2mk;8 literal 0 HcmV?d00001 diff --git a/Assets/overlays/powder.png b/Assets/overlays/powder.png new file mode 100644 index 0000000000000000000000000000000000000000..90cc4cb7dcc005df8f4b39f199cfe4b99fd17cd0 GIT binary patch literal 1886 zcmV-k2ch_hP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00!nsL_t(|UhSHDh*eb-#=YY>lT$LIqN$W&nUZOisT5iw29^=@GBrceNHMkkNGYg@ zCV9 z;TY>8dqEN-;UUW_CD5)0&a$qu4+K9Q{%iT1H|XPKM2>Zv`B1Rj&x#4$N#H_&zSbiy zvLP}T1X)0^8=R;wFzELiM3D`Zc_2XT@4MY_+Xh@&rHDQ@WafaxuZ9QQFxwW4^EW0@oV7#($I6S~YNFNAf9IUXo+7*m@5ME)Sv_Ba9cG&7|t~Fr%1F-#1 zjSPAxthPAP3gXxcdst{G;k*tP3^oz5F%$~ryPEWZIEErVV=huYC!{<93^Eq6DN~Yf z0`ZI`wpB1>s-%$81n|obWq{2L*40!Q1>%}Qe9u@lDI`5xRaI4e3JMB-WRUdTb&~)S z(14hflasU6)g(qz6F{e3;0}_%#Z(y$Vm*!+&LkXmHSv+u5}?E4Y)M`q)?SEr-CAOt z^9o?yk3)P-r`hv&)W8onm8;+*tHwms1dy=q?u8_*%P5ylN-1CC7_$t-eu&ry!)jAS z!S}23Piq;XoCZgk2tCDFk*&!K#NMBrW~xjsm%ylpt=<(t!UJefX4MV@@;XRfRd5&+ zP=jhU<+)J1Me_t;>J$s;H>w zUsP0d+EhNo+uQR@W;IB@mLKy`C9kWR@*v&p&FmoF643rXpW=9AHCMwf%2SY8aT+8^ z#k`K<5-$Dy)Q3>sg03m~J>)eJ+excCjYh!t;a0d5ho~p7tfiIcGakhMkcI4kxEGtr z13pvD>?Ge6mYdB1^{>qA0o{BvXEca&Exey%uEl*VjC?&;LcRG35|w=Dd#X!)gPA>` z4%OG!KY;Bm_<`%$40I=IY+~Jym z{s(h&fJ)oTU^pBufImS!s$K&xHMb~W8v>Wp{$u2GNavj&!FLAy9v*@F8RvEU<-|BkA2KIU8>H~UBK+9bx z?gYdGZC-?@VFQVkB7Eze`c&)Q2lSttOEfTQM|c}*#*V`^v?(;R57^#tyKDx!eTb)# zx0;*$v_$TLH(_%=iKDC~vl4y^UqGMIYwzmn>OmSW67;j#%nqm*o5=^=Bg`dv&`xW; zAF{itq{~C6%W@m#oyb?9x9+WtK5Xzn{a2`0YSZfK>TW|7^JNBl=Qxhvb#NY>3BA54 z=ab0KPN#tSS;TBJJ7AJD@h!J^eTg>LT#^F~rohA2fw&85drJuRT|IeGj68xL8_n8UBQ!sMd?ZPBZKu(6*s-u9uX{UM#>c`TtIC;>4enp)Jd_cF{TpXav z4Tr-6(R&j^Strat+!pbH&zJJ2sIh8XZERqVyWI-dN5h%8-i`EbmaPIE?RAH52D-=1 ztiUHzcfR@*_~rDnaO)6b-`n9P>JLLN5OiMh5m;qr5BPP1@4+*2K!)Ku*wb7zR*3q| zP|I$(sm}@86{^pcpbzhdYBMlS)JKpEyvWQ^z^t!Edm%6AC$aSD`#6jG5k$;;Llfd& zPN{%FH2VuEY99{6FF1p*g^jYe7l=Xm=K!5-N0t5))L#Iyv Y0XvMeYicnWL;wH)07*qoM6N<$f`yfWG5`Po literal 0 HcmV?d00001 diff --git a/Assets/overlays/power-ring.png b/Assets/overlays/power-ring.png new file mode 100644 index 0000000000000000000000000000000000000000..716273ee840ebb6cbbc40324e8a07ebfbb6f92e1 GIT binary patch literal 2650 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 U;oF1^j{pDw07*qoM6N<$f>KwdVgLXD literal 0 HcmV?d00001 diff --git a/Assets/overlays/rabbit.png b/Assets/overlays/rabbit.png new file mode 100644 index 0000000000000000000000000000000000000000..a58fca3805add079ecbb977df8eb00caf91802d7 GIT binary patch literal 2148 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/raise-zombie.png b/Assets/overlays/raise-zombie.png new file mode 100644 index 0000000000000000000000000000000000000000..8b036f6a9c5ffd892e0b31c64697d6c0a728b833 GIT binary patch literal 1656 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/rattlesnake.png b/Assets/overlays/rattlesnake.png new file mode 100644 index 0000000000000000000000000000000000000000..efe1066b7ad0a0f5bd35d947388d689bc9db342d GIT binary patch literal 2357 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 b=+*0g_KrgdmfDzL00000NkvXXu0mjfT#jwc literal 0 HcmV?d00001 diff --git a/Assets/overlays/robe.png b/Assets/overlays/robe.png new file mode 100644 index 0000000000000000000000000000000000000000..2eb231ad6bf0e77d251a1843f3f19190b695a26b GIT binary patch literal 2078 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/saber-tooth.png b/Assets/overlays/saber-tooth.png new file mode 100644 index 0000000000000000000000000000000000000000..113a3cf971cb2aa2bd2ac0ea3d12a163c4e32638 GIT binary patch literal 2946 zcmV-|3w`v7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z01FC9L_t(|UhSK0j9*0+huiIzU1%wyq7bTp2!d1)5C{QLj8Q9UjG{)=7(M`sBw!?d zF#4r6{oogZh@c2TVvAO3EQFRSMXa<^&Zv$k5pMI^De@4u6EK8Pn5u0SuZ1|G75G$jUzV#zBC$*H?Ak_ zcF`;kS;&IZ1NiboOO6Q2nL_xYB|X^=Fxd*uJx$nW$po_gjkuA})&UO^{^+79IIL^6 z(Aw!VDdg=XJY&gLuuIw&bpQrOB04S};3dMPIN0_Yox^b3Ml>37Azc38z`%eyp~Mbs zo=4v4k}2eO?cTlnt4!TuJpt!q_ZEv+L><8E;$te%l0|6T<=AbsWES#&YI19(Xh0e3 z$y?Xk+pCeZ!PHIaYi}``rMtUZ&#WsfSp*xk?ISMbh#Jcs`+!A@(1WwFn~T%krb-}h z6*hlS9Q)@gWlA{oOVi+4{h_RfDYH1tS@(Bib0;>xG*ufPG+EKS+vk|fLIvCD#cx_N zyRs74%(bZErDf=!OsbPg55jdORrjwgn$XkJGhoqcuzS(sC89R^4&cH=5btuSJUIG& zdb%2xG)%9REX?b>Eh<)AYBJ={T7)xaiZUg2s_{?lL<6HbL>`^ib&=+4lK231!=v@ zs|R90)L4OCWJCH9f*KvN%w)(~lOaFD=eG5SZ)?~AZ#0=>5%X({#Y0w_^x(8UKO=Ca zImiEI(t}N;qnzZqkSiOWGU>rry`q2bQYnnCH(7MB11P+0`Foei2(C#Q0#BOsVE2GU zYgU*HiF9@nG7 zWnuWMAU)thhxB!qfSn$m^(a_FI;jht=4?Hm7n82v?M-|g)V&G2HI|H+G-;AnmruJ? z4A=Q*OV|OW4~~aTCQ!M0c(F@W{L5sHdTo$(Sm0RQ0pU8L$$FFGe)FM3$#>t@umkjg zlOsFF0v4DQ$&O3Fd>W`bpA7#R8nceMtC7&w0pV!OPR)Rl?|zzw9guY%r;?{^gL`RM zy)4!SNEVw$`tl3!V3U7R-(t;mOXtwnp+<}L3c}9MvC3o<--%%dWQQ*m6}OZH&gzr* zewQkL`Wka^y86H=pu9OQnuigh{XOwJ%4%Krlb`jS&u8D(umh3>g@!DJls;8MX6p~O z+5~CiH*FodYuB!|TeohVXUP(E9ltQy#z>-7ZLL5HT;+>EWevdDMe(Mys)3$z# zx5M2!fuN%;*`+P|BXF>S_|c{=g3UFAK0>-1+W;Fass;#GnW_jj$Cw-94W^F3W+y?% zagH-pMD`&^Pid(*kGnRR3lDbMh;WWZKQ!dPxpOG1hgIB}rfTCXY_(z0Hm@tNyU?Q9 z=LWtXij7u`b7@m{uOiz4#taJ8Zf$O}G`#B{HCco*s)n-$Z+lwT)Hd%kSp@&Wx~G~9 zISLzng3olxlwt?aW7>b4O##Uer)S@4Q868x;?HEd3y9-gs`F@p`mUZxxy6Stc^V~Q z2Sh)58uI<;w59Y}+&Tipces0g2epO*{d^<;%{bHco8l?h)b+d{+qPG$hUyyWBz0B|mYY zTV>fEbkVQRs3!1aU+HpVcw>CZ%*LMn{{Azp-UOVE_62d+?=OU4=cfVj(%FP)*B3h- zv(G}_=p2t93e=}V2&JR!I-KC&$)x*SP7L}PW+I#H(RcLq7P#s>ob(o#6N7#iVn~~$ zqXv~e>8ej5?pe(wnUQ1oA|691XeA z)CuIBPB_bw3FK8jU?8UxbRaSdopXcihQn~z0iyW398c--_;ouz>x{6@`F4yZgQ0gF4z$7@TyN0?4QpY^1hR_P)?o7kb7xqL=!Xm{*Ejex z^nPyBWXz%cTK(xCAzD9p+8D_*p!!-wbUK(gX3+67N7DFFfxFPnNLXBr#{%RpAtZ+! znLi`d`Bu^a~K9^-mq60}kmZ>z8TBBIIhqV#3$Z7k7XC!MJh%1z$1vSag-ZdH?_b07*qoM6N<$f*Mt>Hvj+t literal 0 HcmV?d00001 diff --git a/Assets/overlays/sad-crab.png b/Assets/overlays/sad-crab.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5ee4386551fcb8d382209917cd07cbfc6938bb GIT binary patch literal 2530 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/scorpion-tail.png b/Assets/overlays/scorpion-tail.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8c692e9a85bd1997f6b229b49431cb1aee0b9a GIT binary patch literal 1628 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/sea-dragon.png b/Assets/overlays/sea-dragon.png new file mode 100644 index 0000000000000000000000000000000000000000..f14869181515786b76e94d7cc6fade363ccdccd9 GIT binary patch literal 2220 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/slipknot.png b/Assets/overlays/slipknot.png new file mode 100644 index 0000000000000000000000000000000000000000..5690d38f9090b945d8e7e0714af8873fb7511d56 GIT binary patch literal 1230 zcmV;<1Tp)GP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0LgYBt;e z00dS^L_t(|UhSI8ixgKBho^g5dyJw4Oi1Dr2aU=|W-yp+62XN#apPLXjjnW|;6EUV z3$ux{_75{6RQqv=W0k%-s12wzC;*?PLklS3(@i_d; zxNBZ#h(vk^_?G3tB9s}k9x2Kc3XyDrEW$C=SIFB9Z=Awbqu&XOu$4REp_-wvQm4Qu zY8%=X<8#DY7;CdI_Q+(Tx&tDCJ7C$TfcY#eEKJxKnL;H!1*AiR1xQZ;RC)@a(o^6q z6qc-0z+Or2f-jJ@GIhlsnJ7X!)rY7*ku!2JpAAS(%}5FL5um6H zh5p8Kd_*P>>`zf&W4B#@q);gA;G^+PF74N0J0fo}?k;-O=;-JSk3pU5;e#U1Qfw30 zO2{{IabWw_`sC)QR4V7>GF(v16jD?j4hlLgmo}_VZVroKvE(uwkoOo#|L>R3#7}bR z3gfQI*P&Qra*01Ae9=#R5p4HS8|2az^O0{8Y@Qe85^qS}j?2evEfUN$yH!yOh|-SLD34=Yy(win1pa#=Pu#>Og)!{(4n{2;l1 zl&6E8{k*z+hIr={#$j`)J6@33lyY=ndxH8vEoioZSi(EeH717ooi*2Ctq zIn^BxNa&{W^PpWu#?{?77Qd?2ZgZ(FgQ zkW0_lScP$Dj=tYshYHDcx(f>4oLU_1wB&%ePc0@0}4A_koY*S_N;2@8OG0A z422s`C?JnqKnkjBNz7Mc@(MHjP|RlJ64L1_E)VNNen7TpSm;Fl{{ZT={{~E=Cn@w3 svt_f{Cw#iIkG!+!s@YOfqF`j?4c?{``#b;e)Bpeg07*qoM6N<$f`L?1UH||9 literal 0 HcmV?d00001 diff --git a/Assets/overlays/snail.png b/Assets/overlays/snail.png new file mode 100644 index 0000000000000000000000000000000000000000..58b3a19496cbe0579bd3a448a695900adf0dce58 GIT binary patch literal 2309 zcmV+g3HtVlP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00@mqL_t(|UhSH9j8#Pxhj(FDbVU}VDWXQK5d<5Sh+VM(YQ$KgMoH9QMGb0*f0(GT z#fUK`8cP&3qDX{@pwXblhDeMJh**g&qOgm*2>Z7A{pOzgeC3vT`*wrq`;xO~=FFTk z<=s1X?%b`aP@zJF3Kc3;sPG@4qoZS3dwcsM=()(LX8wQB+1Xjmpg%`DNVg$}TX8JC zOmEdN(7}v(UUhZ#0cNTq-5c9!mi_O-AnS5}`CPD1Rvq*ZjpA=cLx^BFVcLD5bs&xN|0sPZ7r2m;M!)olyH zmJa^%eHuO7!j=Sn!-7aI)&w)>(bm>>vsKAL-Ak;vbnvesz-`E;AYAzns|mT%n(zkK z>6`h%$$z%>j*D?FsVBU`OXk;4lNl?>^nZ(=M(nZj>MoWtR zrbEIX?HkjjK}V~3gnWVaf{w03E+Of2Tb+sg7>^59bw08XiBRu6bISw!5UV0i zGPC>f0+aLA*0^+VeBNRtLcQM+w+SIzgWOL3FIQLq_7)~Xm$iG=W9mdiM7 z`9v;!A(ZRUw-4eLrx5ZwJdyuYGsQw3-PgTcgFt>%Q1TDhGRQ{DhQz)I#a#hD`*4x_ z3cAX49Ao*VSEJtzvRTHN{?v3VTulR6pL9iq==3QM>eM22mUS=z`&zPyxCuzSA9FZ> z*>;O1jm~wJcs7_0?@b4O?h;1l-cGU9)YRmz11FkJBleb#oB(DlTv-#*Y@^&x3!jG( zo%t1keG}@XAXhciw1cwkO&7h=MnSzpEh&nwfGFr^?2{mJ0&w`wl0Mwl(9qDI%X=e! zxrmNtAz2dH|;5f|4xZ)4@$d8pO(7Y=1MI2<_^SG?KVm;4{;y(4pb= z_4O|>=_P?rGw#fKO`eAlW-<}y~%en@U@7$5}KQvccyGM_REydg+*S=2^pb)Pj<~#>N4py-t~_r~^y??ucueVj{rXKI9ebG;u%5adN}%)h{|SVT;3ASHpdGp0vfT=Um%57h ze=*5A0iG^{CtsTuUJEDfthHnju@fM0)Eisj&aG^SdoTCzD@qgp4)S?>gCwZ`hH1V0 z?4@)X)cwJdrGv9Rfie4)&uiOT!(yg$dc8;JW5jDLblGnJ zlPIxQ``GO-)1k_U(H*cKt7p&hfQP){D~`WI3{k815~RIy&i{M)E%Vi#~)# zL4Ex*#GXjk7r}C2vW9XW-idZs4e8~XOy(#n_5$A{k$2=@3ivFt5ZwnsM{!x-WSuHH zIH6trx7J?B6b8Eh?Y__!g8f6}dSndQyhVz<{_p27WICcV#V&zw_!mmx2* zw*Z0mM=j@<_x>-fEd_(sS>Q5cG5viJX>bKyAa??ExZr!hu%*yF{s))2``4HX6)IGy fP@zH@R8{>A4Jp*?=OQ`-00000NkvXXu0mjf6W4U$ literal 0 HcmV?d00001 diff --git a/Assets/overlays/snake.png b/Assets/overlays/snake.png new file mode 100644 index 0000000000000000000000000000000000000000..c91921ed468ed60fe00879a5e1e4a3750dbb81aa GIT binary patch literal 2296 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/spider-alt.png b/Assets/overlays/spider-alt.png new file mode 100644 index 0000000000000000000000000000000000000000..3403fe28962f1dd3c18dc1ffdb5b7ef28b6a7754 GIT binary patch literal 3019 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 N002ovPDHLkV1g6s%Ub{d literal 0 HcmV?d00001 diff --git a/Assets/overlays/spider-web.png b/Assets/overlays/spider-web.png new file mode 100644 index 0000000000000000000000000000000000000000..abce31002d72c88abea9239e5f698ce10c8a2030 GIT binary patch literal 3983 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/splurt.png b/Assets/overlays/splurt.png new file mode 100644 index 0000000000000000000000000000000000000000..f99b9059126e2376a7bd31852cd235562b8f00e9 GIT binary patch literal 2500 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 Hu0mjfosqGj literal 0 HcmV?d00001 diff --git a/Assets/overlays/stairs1.png b/Assets/overlays/stairs1.png new file mode 100644 index 0000000000000000000000000000000000000000..6d624b870baa809edc73d7beb59b5f156d3ae8e8 GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4H2F$jv*CsZ*Lj;9X60)ePAK%Bb$(v;Oyj4 zlK%1->kjti57|1VdY2@!ceZL@XzbKev3YE+ki+g8df?oDyO-Bjr!M#UcPsXmn+q85 z6rH*GV%IyNLMb=H=XZ2p^&bA|$o%d%;|%-fm-KZvYwS4Ry8oij+=81m4;9}ZdMs%kKMb&(unj_TR~z_aW1E8CNlX;>rKoUpfBF zJjj-?dR^f9nNh`&SL<#wrr+4azVcIXqUYTbmKkX)8GSZiVOSQK#c)~2v>|hv)BzK3 z-h^38*$mDGG0(6(Uwc14=;`xAlXmf%Ey%qs`pO_!TW|HOK89kh>lRw4LlWO9=}cUb z_vC%`{ocLXt|)&v*YhLYA?I*Lx$8eiCjOlcvc*3xi^U(%uaW&|eZaE(Xd=t|-ABIq o%bYuZLwUje6CDs>>HC>e{a4vkj?3$^fdS9p>FVdQ&MBb@01hI-p#T5? literal 0 HcmV?d00001 diff --git a/Assets/overlays/stairs2.png b/Assets/overlays/stairs2.png new file mode 100644 index 0000000000000000000000000000000000000000..d375a5437db215d39a415f9f145e779a8d875432 GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1engO{g^V@O5Z+u4SG%!VQ^*Ox8q3_2j1G2wyH zOJ%(Sa|LW;8lnSSz1)4fG<;W?K7M2J=9u6mw#>&f)oXoq>Rm5>E*CdHCXvbXImuJ= zY@oMZ|HdxEx(~&*TXKIhFuHE|f9%>~pCqOa*6Rbl$MA6|)-2o>^G}KUz&-Wp%pdl? zpV7cN{qht3z(=V)N4Az-1bvj*oJ(7PPlTV~hgJw6YLFz_^WjbO9rW|FOu_=NfSd2U2 zR1zamlKd?KWtvNUS6 u!~5?{|6AvuiLpvv-!T8IWO7U9EcxaOt)AtVPpJTdn!(f6&t;ucLK6VYfv>y( literal 0 HcmV?d00001 diff --git a/Assets/overlays/stairs3.png b/Assets/overlays/stairs3.png new file mode 100644 index 0000000000000000000000000000000000000000..0c570b62ffd6414e4dbce6adb28eb1b9dfb03ecc GIT binary patch literal 1669 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 RQw9J4002ovPDHLkV1g?5Xi5M8 literal 0 HcmV?d00001 diff --git a/Assets/overlays/sun-priest.png b/Assets/overlays/sun-priest.png new file mode 100644 index 0000000000000000000000000000000000000000..c8db324761f57fa5d2de3daffb3950452ec80330 GIT binary patch literal 2480 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/swordman.png b/Assets/overlays/swordman.png new file mode 100644 index 0000000000000000000000000000000000000000..d80d086dfb3775b20196ef15d23d4d02bbeddda8 GIT binary patch literal 2026 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00(kOL_t(|UhSKEh*VV^$DLUpX)0+V=A)!EO*HNOE-}I=Gl-~2d*FXY86t^2rHDWx zB9cnUz()v?k_j1-Jq>zE4~ojngdRquZc4kkGqc<0ckb8AT<^@>b7yv)+1d~MIFH}s z{LbAw=iYnn-CjNP(8K?ljLQEM?d|O+Qk;y8M1~=w!hU3LIEIy#0R6R8#u z8~mVCbTW)FFrUxQXliPjPV-!3awd}*;*>>T_XRnerDoT`(I11nisTv8LA?!m4e7K5 zh;P<@jseFY~G(#uQ|mLZ$-0I~1n#A%2DdJ_?4a z40g-p<_&HZ|32h!5G6hMu2i_rhu||cju+U^m1`oH_bC(#YXi^fVay#083kRbQcM&LYmZhY8}VsZGYuUoE5dE; z9~7&DR!tmM=_oz`2kaoIX{Y8xi1$?i-#rwYf>tViR+$K6*p(`$X0k4wIb163S62Z2B>_I+9zUJP4zf>Xge@u}@`kIaFOaVSG zD!s~JI12eke&#qss#M^50=^58uYyRmL#+80oANxQP2FB#e~U}Z2aLnThWgv;t_n`$ zdlaf>$mKwDbF;gfqq!vLO$I;v3AuH|3w*}nP<(_hl`1vFxmPi&0)P8?d`fjmOG}IG z^*LzU9>E4@lmK??qLhl%t<<|BJtWjz1Mml^6g{xYj6CrEwd0NHl+pE4^6`lZMfYWmWQPh=18n8SphCW*s{ZAhG|ZadZ8 zqcZ)r0+*dUx^`kbDxcm+vr~A2`+D=O8{{wzDZcrb$b{CASa@Ge{Q*n%Xz2d|i7Z02 zH%sjeK3B@UzL3ax#N8KA=2}}@-5EjMe*fWFzybP_!uA&XIL9Kev+cH2;PWj-UxlbI zOfFpANi2NTMBN^GUP3NbS4q%cC-+p~w^$+S3yFja8FgD5#z^G_ZW9CVbTG~#r1~40 z&V;kzeUhOl*cBpN7=6HRP%x$R;QO+|)E9D@MlzGtObrJv)pPt27}IWZt9~kN7?{Uj z!Ia{lvyUq(9iY#UwC^k$3nq9lm`h2f=kxj7v57p?6oYD>LUm7=Ku&XsV3R(w+e5YN z#wt2{z>006b_+;;a4?NH=yuA?)|o78#p{744z}*@vfDxKWiNwFYL(0!blIlr?m!!b z{=bo$FN?=~F(LP|mrW+LO;txGld;!Wx8h^pFGN5$fa39>)s0}1i`<{^DCoCG?2>zb z^e>fJ1o~~W^h}v`4@h{O@{d6OdoqcE+BRc$1eQ_ge?w;70}}pTxksRXflNw*ekxM( z{(%0fUfdjWNOU+7yS~$9r+?yy64;d7Ugv6IJ54oz>DJ}sa=9CWl%p`QtumPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M@0Xn2lB-L z00-ttL_t(|UhSJ{j1)x_fcN6kpo=Gm2Z9n5qM)LpTx#?W@gO0Rl>|+U1dWM+1VhxA z5Pl#Ak9Y-%f7d13Ayp4Q@jMU~917mK-F-%2&fsCbGs-|#AAVDtF?@?2W zfbqViLpM-=LQRb*Q|-kN)j0;KZYc~_oug^pkaq%@wAEV7(T}zYEuYaa&aSAAPR*t1 z@%TfMj+snm7E7m^vVr;xHJ`CC-V2Z#887-cvJ#m@)o-=uhrm)2d>{!0%Fn4O5ZqfM ztJG==o}E-LRe z2>Yv!r}3Sx&2}MiX9l%hIzb;s^-+@xKE07Y#U}@Kp-No>Aw*8QIZpIRXj_b&t8Ol| zjaL`(nTv{dzK4Mhu0sxJXFFv@J(jJ^c(M9*P`wx-lKev-VwTlW&T?;Ijw0+9V4A zzhOvPLp{O%m%5j*0$p5($ZE=i#ZiuE-NcDkGPcEB1f>B zM^(yOQR|V7$R<|E9~Bi9+p+IKGU5{iIVzA&_{;50Cax#-Ug*BGbzw}4%gf8nsYO{H ze%8@0b^~qIjPGXJvf5M_B$Tg|2Flw|=cvg*+c-p4$%WcfH0Yx<{rA+Wfm3V%?dDuS z9Yy-7$(Kl1O_ILDjE zav0f1o2(XD=CYc8Lu%-A7dkJ*%tMAzd=TFyPOCqWCV=GSOu|%>Kg;0cp6`OK5*a{I z?#Xh&>w}NgM^p0eK~*E)kz0P@S%a2IGcdN^sQ!#^rqdFPmHQ?GYlR$VFhzL+%m;mL z=3r%Y#m3s##-tBkDfk1lH34$VYII5@#0k~0u`&UC`W%1um{ybIkm}gjJOvJDF)^6* zeOio-wF!XTsuP1r-=W3W*qi|O(KJEi8KEF-o&sC6m?ZLmR1h{-z$Vp6vO#rhtW5wH zq@T5z2t4&2WYulcYHVzt0vnlxg73>=p}+5ug1_n6oPZQ+ol{GMRjLcZ<~2ZAsX7V1 zR$UNQCxBJ(r51|{r`lfnTC3H9u)P9SGq``XTuc@+0am_y*j@qhqsAhqR#fJxE*RS@ zK=@d7QQ-Esi-}&Y)q=4y0Su}gB0ojRDv*s7JB^_TkbgFk*6QhpgDuNsG7Fdh`JvQI zDCNnNtwY{=#JmKhIwYM=KPu(Z3IlrG8D2J9Utd2|+hik!`>Na)5_lF+fcKOhJ7Y$}zyN$po5 z)>Z+z=9-Rya-(;KthSxBCAU9-&fFa$O`(0Ex{05=aj6ibFGSu>NzU#_vx%iGnH?f@ z)C(~?GxC9bp!ia(r0l*-jSD%Zn9hN+Y=ZKHm9PrcR$c8w=baI=OUw^^)}hSLx&=sBE+K1lv-?cZWFkPRLdb@ddyA zh`f@I4uP{Yk1zPGKtgX(C8Q7j&F&_&y@zslq4K5Rql>3qCJuNO%a6+fGVzc!K?JB-CakFGwL5*ec{2 zZHf%B!;wahn+a literal 0 HcmV?d00001 diff --git a/Assets/overlays/teapot.png b/Assets/overlays/teapot.png new file mode 100644 index 0000000000000000000000000000000000000000..c6bbdab4691116d483a9aa2e6d4244935b4d245f GIT binary patch literal 1984 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/token.png b/Assets/overlays/token.png new file mode 100644 index 0000000000000000000000000000000000000000..7c29d7eeb40e007210d64091a1cac9514674336e GIT binary patch literal 1166 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 Hu0mjfx(jF< literal 0 HcmV?d00001 diff --git a/Assets/overlays/wavy-chains.png b/Assets/overlays/wavy-chains.png new file mode 100644 index 0000000000000000000000000000000000000000..b0463b3e92bbf787919c2996ee7212005d4a14c6 GIT binary patch literal 3771 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/web-spit.png b/Assets/overlays/web-spit.png new file mode 100644 index 0000000000000000000000000000000000000000..a7513810dcd7f97e778a8cb0b6a7adef25abb758 GIT binary patch literal 2967 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 literal 0 HcmV?d00001 diff --git a/Assets/overlays/wolf-howl.png b/Assets/overlays/wolf-howl.png new file mode 100644 index 0000000000000000000000000000000000000000..c3811e357471b19b8588dec3c0418facb8d27cad GIT binary patch literal 1732 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 QkN^Mx07*qoM6N<$f^HRo@Bjb+ literal 0 HcmV?d00001 diff --git a/Assets/overlays/wooden-crate.png b/Assets/overlays/wooden-crate.png new file mode 100644 index 0000000000000000000000000000000000000000..cb838f82c0acf04bdd8eae9f5f3f9559ba7035a1 GIT binary patch literal 1412 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 YKb;k2gOUYNod5s;07*qoM6N<$g1gN$x&QzG literal 0 HcmV?d00001 diff --git a/Assets/overlays/zigzag-hieroglyph.png b/Assets/overlays/zigzag-hieroglyph.png new file mode 100644 index 0000000000000000000000000000000000000000..c0981a7ac3e1a82af5d967880d7becf8cfcb269e GIT binary patch literal 1924 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 \ No newline at end of file diff --git a/Assets/walls.svg b/Assets/walls.svg new file mode 100644 index 0000000..99a44bd --- /dev/null +++ b/Assets/walls.svg @@ -0,0 +1,331 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BaseCompileImage/Dockerfile b/BaseCompileImage/Dockerfile new file mode 100644 index 0000000..b48f7c8 --- /dev/null +++ b/BaseCompileImage/Dockerfile @@ -0,0 +1,45 @@ +FROM ubuntu:focal +RUN export DEBIAN_FRONTEND=noninteractive \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + wget \ + ca-certificates \ + gnupg \ + software-properties-common \ + p7zip-full \ + xvfb \ + curl \ + # Install Microsoft package feed + && wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \ + && dpkg -i packages-microsoft-prod.deb \ + && rm packages-microsoft-prod.deb + + # Install .NET +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + apt-transport-https \ + dotnet-sdk-5.0 \ + dotnet-sdk-3.1 \ + libpng16-16 \ + libnvtt-dev + +RUN dpkg --add-architecture i386 +# && apt-get install --no-install-recommends -y gnupg software-properties-common p7zip-full xvfb curl + +RUN wget -qO- https://dl.winehq.org/wine-builds/winehq.key | apt-key add - \ + && apt-add-repository 'deb http://dl.winehq.org/wine-builds/ubuntu/ focal main' \ + && wget -qO- https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/Release.key | apt-key add - \ + && sh -c 'echo "deb https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/ ./" > /etc/apt/sources.list.d/obs.list' + +RUN apt-get update \ + && apt-get install --install-recommends -y winehq-stable + +RUN wget -qO- https://raw.githubusercontent.com/MonoGame/MonoGame/develop/Tools/MonoGame.Effect.Compiler/mgfxc_wine_setup.sh | xvfb-run sh + +RUN rm -rf /var/lib/apt/lists/* + +ENV MGFXC_WINE_PATH=/root/.winemonogame/ + +RUN apt-get remove -y xvfb p7zip-full gnupg curl \ + && apt-get autoremove -y \ + && apt-get autoclean -y diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9b7ce01 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build +WORKDIR /src + +# copy csproj and restore as distinct layers +COPY Sledgemapper.Api/*.csproj ./Sledgemapper.Api/ +COPY Sledgemapper.Shared/*.csproj ./Sledgemapper.Shared/ + +WORKDIR /src/Sledgemapper.Api +RUN dotnet restore + +WORKDIR /src/Sledgemapper.Shared +RUN dotnet restore + +WORKDIR /src/Sledgemapper +# RUN dotnet restore + +# copy everything else and build app +WORKDIR /src +COPY Sledgemapper.Api/. ./Sledgemapper.Api/ +COPY Sledgemapper.Shared/. ./Sledgemapper.Shared/ + +WORKDIR /src/Sledgemapper.Api +RUN dotnet publish -c release -o /app --no-restore + +# final stage/image +FROM mcr.microsoft.com/dotnet/aspnet:5.0 +WORKDIR /app +COPY --from=build /app ./ +ENTRYPOINT ["dotnet", "Sledgemapper.Api.dll"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..a4a586e --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# Map + +to start the container run: + +``` +docker run --name= -p:5000:80 -v /home/michele/sledgemapper/:/app/db -d privateregistry.michelescandura.com/michele/sledgemapper: +``` + +Curl + +Register user +``` + curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/users/register -d '{\"FirstName\":\"Michele\",\"LastName\":\"Scandura\", \"Username\":\"michele.scandura@outlook.com\", \"Password\":\"password1\", \"Initials\":\"MS\"}' +``` + +Login +``` + curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/users/authenticate -d '{\"Username\":\"michele.scandura@outlook.com\", \"Password\":\"password1\"}' +``` + +New Campaign +``` +curl -i -X POST -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6IjEiLCJuYmYiOjE2MTM3MjgzMjksImV4cCI6MTYxNDMzMzEyOCwiaWF0IjoxNjEzNzI4MzI5fQ.VEsDbYUTnnvpgWnB5buE88JyGx_cg3TJb5ybC3eLvmc" http://localhost:5000/campaign/highfell -d '""' +``` + +Get Campaigns +``` +curl -i -X GET -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6IjEiLCJuYmYiOjE2MTM3MjgzMjksImV4cCI6MTYxNDMzMzEyOCwiaWF0IjoxNjEzNzI4MzI5fQ.VEsDbYUTnnvpgWnB5buE88JyGx_cg3TJb5ybC3eLvmc" http://localhost:5000/campaign -d '""' +``` + + +``` +curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/AuthManagement/register -d '{\"FirstName\":\"Michele\",\"LastName\":\"Scandura\", \"UserName\":\"michele\", \"Password\":\"Password1!\", \"Initials\":\"MS\", \"Email\":\"michele.scandura@outlook.com\"}' +``` + +``` +curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/AuthManagement/login -d '{ \"Password\":\"Password1!\", \"Email\":\"michele.scandura@outlook.com\"}' +``` \ No newline at end of file diff --git a/Sledgemapper.Api/Commands/BaseCommand.cs b/Sledgemapper.Api/Commands/BaseCommand.cs new file mode 100644 index 0000000..08d526b --- /dev/null +++ b/Sledgemapper.Api/Commands/BaseCommand.cs @@ -0,0 +1,37 @@ +using MediatR; +using System; + +namespace Sledgemapper.Api.Commands +{ + public abstract class BaseCommand : IRequest + { + public double Timestamp { get; private set; } + public string SessionName { get; private set; } + public Guid SessionId { get; private set; } + public Guid Campaign { get; private set; } + public string UserId { get; private set; } + + public BaseCommand(string sessionName, string userId) + { + Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + SessionName = sessionName; + UserId = userId; + } + + public BaseCommand(string campaign, string sessionName, string userId) + { + Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + SessionName = sessionName; + Campaign = new Guid(campaign); + UserId = userId; + } + + public BaseCommand(Guid campaign, Guid sessionId, string userId) + { + Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + SessionId = sessionId; + Campaign = campaign; + UserId = userId; + } + } +} diff --git a/Sledgemapper.Api/Commands/DeleteNoteCommand.cs b/Sledgemapper.Api/Commands/DeleteNoteCommand.cs new file mode 100644 index 0000000..c60bfb0 --- /dev/null +++ b/Sledgemapper.Api/Commands/DeleteNoteCommand.cs @@ -0,0 +1,15 @@ +using System; +using Sledgemapper.Shared.Entities; + +namespace Sledgemapper.Api.Commands +{ + public class DeleteNoteCommand : BaseCommand + { + public Note Note { get; private set; } + + public DeleteNoteCommand(Guid campaign, Guid mapName, Note note, string userId) : base(campaign, mapName, userId) + { + Note = note; + } + } +} diff --git a/Sledgemapper.Api/Commands/DeleteOverlayCommand.cs b/Sledgemapper.Api/Commands/DeleteOverlayCommand.cs new file mode 100644 index 0000000..abd504d --- /dev/null +++ b/Sledgemapper.Api/Commands/DeleteOverlayCommand.cs @@ -0,0 +1,15 @@ +using System; +using Sledgemapper.Shared.Entities; + +namespace Sledgemapper.Api.Commands +{ + public class DeleteOverlayCommand : BaseCommand + { + public Overlay Overlay { get; private set; } + + public DeleteOverlayCommand(Guid campaign, Guid mapName, Overlay overlay, string userId) : base(campaign, mapName, userId) + { + Overlay = overlay; + } + } +} diff --git a/Sledgemapper.Api/Commands/DeleteTileCommand.cs b/Sledgemapper.Api/Commands/DeleteTileCommand.cs new file mode 100644 index 0000000..e55f1dc --- /dev/null +++ b/Sledgemapper.Api/Commands/DeleteTileCommand.cs @@ -0,0 +1,14 @@ +using Sledgemapper.Shared.Entities; + +namespace Sledgemapper.Api.Commands +{ + public class DeleteTileCommand : BaseCommand + { + public Tile Tile { get; private set; } + + public DeleteTileCommand(string sessionName, Tile tile, string userId) : base(sessionName, userId) + { + Tile = tile; + } + } +} diff --git a/Sledgemapper.Api/Commands/DeleteWallCommand.cs b/Sledgemapper.Api/Commands/DeleteWallCommand.cs new file mode 100644 index 0000000..4b38b77 --- /dev/null +++ b/Sledgemapper.Api/Commands/DeleteWallCommand.cs @@ -0,0 +1,15 @@ +using System; +using Sledgemapper.Shared.Entities; + +namespace Sledgemapper.Api.Commands +{ + public class DeleteWallCommand : BaseCommand + { + public Wall Wall { get; private set; } + + public DeleteWallCommand(Guid campaign, Guid mapName, Wall wall, string userId) : base(campaign, mapName, userId) + { + Wall = wall; + } + } +} diff --git a/Sledgemapper.Api/Commands/GetCampaignMapsCommand.cs b/Sledgemapper.Api/Commands/GetCampaignMapsCommand.cs new file mode 100644 index 0000000..ac420d1 --- /dev/null +++ b/Sledgemapper.Api/Commands/GetCampaignMapsCommand.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using MediatR; +using Sledgemapper.Shared.Entities; + +namespace Sledgemapper.Api.Commands +{ + public class GetCampaignMapsCommand : IRequest> + { + public double Timestamp { get; private set; } + public Guid CampaignId { get; private set; } + public string UserId { get; private set; } + + public GetCampaignMapsCommand(Guid campaignId, string userId) + { + Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + CampaignId = campaignId; + UserId = userId; + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Commands/GetCampaignPlayersCommand.cs b/Sledgemapper.Api/Commands/GetCampaignPlayersCommand.cs new file mode 100644 index 0000000..01fa504 --- /dev/null +++ b/Sledgemapper.Api/Commands/GetCampaignPlayersCommand.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using MediatR; +using Sledgemapper.Shared.Entities; + +namespace Sledgemapper.Api.Commands +{ + public class GetCampaignPlayersCommand : IRequest> + { + public double Timestamp { get; private set; } + public string CampaignName { get; private set; } + public string UserId { get; private set; } + + public GetCampaignPlayersCommand(string campaingName, string userId) + { + Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + CampaignName = campaingName; + UserId = userId; + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Commands/GetCampaignsCommand.cs b/Sledgemapper.Api/Commands/GetCampaignsCommand.cs new file mode 100644 index 0000000..520717d --- /dev/null +++ b/Sledgemapper.Api/Commands/GetCampaignsCommand.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using MediatR; +using Sledgemapper.Shared.Entities; + +namespace Sledgemapper.Api.Commands +{ + public class GetCampaignsCommand : IRequest> + { + public string UserId { get; private set; } + public GetCampaignsCommand(string userId) + { + UserId = userId; + } + } + +} \ No newline at end of file diff --git a/Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs b/Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs new file mode 100644 index 0000000..228d855 --- /dev/null +++ b/Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs @@ -0,0 +1,18 @@ +using MediatR; +using Sledgemapper.Shared.Entities; +using System; + +namespace Sledgemapper.Api.Commands +{ + public class GetMapSnapshotCommand : IRequest + { + public Guid MapId { get; private set; } + public Guid CampaignId { get; private set; + } + public GetMapSnapshotCommand(Guid campaignId, Guid mapId) + { + MapId = mapId; + CampaignId = campaignId; + } + } +} diff --git a/Sledgemapper.Api/Commands/InvitePlayerToCampaignCommand.cs b/Sledgemapper.Api/Commands/InvitePlayerToCampaignCommand.cs new file mode 100644 index 0000000..8ecc338 --- /dev/null +++ b/Sledgemapper.Api/Commands/InvitePlayerToCampaignCommand.cs @@ -0,0 +1,21 @@ +using System; +using MediatR; + +namespace Sledgemapper.Api.Commands +{ + public class InvitePlayerToCampaignCommand : IRequest + { + public double Timestamp { get; private set; } + public string CampaignName { get; private set; } + public string Email { get; private set; } + public string UserId { get; private set; } + public InvitePlayerToCampaignCommand(string campaingName, string email, string userId) + { + Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + CampaignName = campaingName; + UserId = userId; + Email = email; + } + } + +} \ No newline at end of file diff --git a/Sledgemapper.Api/Commands/NewCampaignCommand.cs b/Sledgemapper.Api/Commands/NewCampaignCommand.cs new file mode 100644 index 0000000..26399bf --- /dev/null +++ b/Sledgemapper.Api/Commands/NewCampaignCommand.cs @@ -0,0 +1,19 @@ +using System; +using MediatR; + +namespace Sledgemapper.Api.Commands +{ + public class NewCampaignCommand : IRequest + { + public double Timestamp { get; private set; } + public string CampaignName { get; private set; } + public string UserId { get; private set; } + public NewCampaignCommand(string campaingName, string userId) + { + Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + CampaignName = campaingName; + UserId = userId; + } + } + +} \ No newline at end of file diff --git a/Sledgemapper.Api/Commands/NewLineCommand.cs b/Sledgemapper.Api/Commands/NewLineCommand.cs new file mode 100644 index 0000000..ce98c1a --- /dev/null +++ b/Sledgemapper.Api/Commands/NewLineCommand.cs @@ -0,0 +1,15 @@ +using Sledgemapper.Shared.Entities; +using System; + +namespace Sledgemapper.Api.Commands +{ + public class NewLineCommand : BaseCommand + { + public Line Line { get; private set; } + + public NewLineCommand(Guid campaign, Guid mapName, Line line, string userId) : base(campaign, mapName, userId) + { + Line = line; + } + } +} diff --git a/Sledgemapper.Api/Commands/NewNoteCommand.cs b/Sledgemapper.Api/Commands/NewNoteCommand.cs new file mode 100644 index 0000000..97a9b31 --- /dev/null +++ b/Sledgemapper.Api/Commands/NewNoteCommand.cs @@ -0,0 +1,15 @@ +using Sledgemapper.Shared.Entities; +using System; + +namespace Sledgemapper.Api.Commands +{ + public class NewNoteCommand : BaseCommand + { + public Note Note { get; private set; } + + public NewNoteCommand(Guid campaignId, Guid mapId, Note note, string userId) : base(campaignId, mapId, userId) + { + Note = note; + } + } +} diff --git a/Sledgemapper.Api/Commands/NewOverlayCommand.cs b/Sledgemapper.Api/Commands/NewOverlayCommand.cs new file mode 100644 index 0000000..8d2d659 --- /dev/null +++ b/Sledgemapper.Api/Commands/NewOverlayCommand.cs @@ -0,0 +1,15 @@ +using Sledgemapper.Shared.Entities; +using System; + +namespace Sledgemapper.Api.Commands +{ + public class NewOverlayCommand : BaseCommand + { + public Overlay Overlay { get; private set; } + + public NewOverlayCommand(Guid campaignId, Guid mapId, Overlay overlay, string userId) : base(campaignId, mapId, userId) + { + Overlay = overlay; + } + } +} diff --git a/Sledgemapper.Api/Commands/NewRoomCommand.cs b/Sledgemapper.Api/Commands/NewRoomCommand.cs new file mode 100644 index 0000000..a44c836 --- /dev/null +++ b/Sledgemapper.Api/Commands/NewRoomCommand.cs @@ -0,0 +1,15 @@ +using Sledgemapper.Shared.Entities; +using System; + +namespace Sledgemapper.Api.Commands +{ + public class NewRoomCommand : BaseCommand + { + public Room Room { get; private set; } + + public NewRoomCommand(Guid campaignId, Guid mapId, Room room, string userId) : base(campaignId, mapId, userId) + { + Room = room; + } + } +} diff --git a/Sledgemapper.Api/Commands/NewSessionCommand.cs b/Sledgemapper.Api/Commands/NewSessionCommand.cs new file mode 100644 index 0000000..ab42380 --- /dev/null +++ b/Sledgemapper.Api/Commands/NewSessionCommand.cs @@ -0,0 +1,12 @@ +using System; + +namespace Sledgemapper.Api.Commands +{ + public class NewSessionCommand : BaseCommand + { + public NewSessionCommand(string campaign, string sessionName, string userId) : base(campaign, sessionName, userId) + { + } + } + +} \ No newline at end of file diff --git a/Sledgemapper.Api/Commands/NewSnapshotCommand.cs b/Sledgemapper.Api/Commands/NewSnapshotCommand.cs new file mode 100644 index 0000000..057ec88 --- /dev/null +++ b/Sledgemapper.Api/Commands/NewSnapshotCommand.cs @@ -0,0 +1,13 @@ +using Sledgemapper.Shared.Entities; + +namespace Sledgemapper.Api.Commands +{ + public class NewSnapshotCommand : BaseCommand + { + public Session Session { get; private set; } + public NewSnapshotCommand(string sessionName, Session session, string userId) : base(sessionName, userId) + { + Session = session; + } + } +} diff --git a/Sledgemapper.Api/Commands/NewTileCommand.cs b/Sledgemapper.Api/Commands/NewTileCommand.cs new file mode 100644 index 0000000..522adf6 --- /dev/null +++ b/Sledgemapper.Api/Commands/NewTileCommand.cs @@ -0,0 +1,13 @@ +using Sledgemapper.Shared.Entities; + +namespace Sledgemapper.Api.Commands +{ + public class NewTileCommand : BaseCommand + { + public Tile Tile { get; private set; } + public NewTileCommand(string sessionName, Tile tile, string userId) : base(sessionName, userId) + { + Tile = tile; + } + } +} diff --git a/Sledgemapper.Api/Commands/NewWallCommand.cs b/Sledgemapper.Api/Commands/NewWallCommand.cs new file mode 100644 index 0000000..f9682fb --- /dev/null +++ b/Sledgemapper.Api/Commands/NewWallCommand.cs @@ -0,0 +1,15 @@ +using Sledgemapper.Shared.Entities; +using System; + +namespace Sledgemapper.Api.Commands +{ + public class NewWallCommand : BaseCommand + { + public Wall Wall { get; private set; } + + public NewWallCommand(Guid campaignId, Guid mapId, Wall wall, string userId) : base(campaignId, mapId, userId) + { + Wall = wall; + } + } +} diff --git a/Sledgemapper.Api/Commands/PingCommand.cs b/Sledgemapper.Api/Commands/PingCommand.cs new file mode 100644 index 0000000..ef4db06 --- /dev/null +++ b/Sledgemapper.Api/Commands/PingCommand.cs @@ -0,0 +1,13 @@ +// using Sledgemapper.Shared.Entities; + +// namespace Sledgemapper.Api.Commands +// { +// public class PingCommand : BaseCommand +// { +// public Ping Location { get; private set; } +// public PingCommand(string sessionName, Ping location, int userId) : base(sessionName, userId) +// { +// Location = location; +// } +// } +// } diff --git a/Sledgemapper.Api/Controllers/AuthManagementController.cs b/Sledgemapper.Api/Controllers/AuthManagementController.cs new file mode 100644 index 0000000..33b088c --- /dev/null +++ b/Sledgemapper.Api/Controllers/AuthManagementController.cs @@ -0,0 +1,185 @@ +using AutoMapper; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Microsoft.IdentityModel.Tokens; +using System; +using System.Collections.Generic; +using System.IdentityModel.Tokens.Jwt; +using System.Linq; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; +using Sledgemapper.Api.Core.Entities; +using Sledgemapper.Api.Models; + +namespace Sledgemapper.Api.Controllers +{ + [Route("[controller]")] // api/authmanagement + [ApiController] + public class AuthManagementController : ControllerBase + { + private readonly UserManager _userManager; + private readonly JwtConfig _jwtConfig; + private readonly IMapper _mapper; + + public AuthManagementController(UserManager userManager, + IOptionsMonitor optionsMonitor, + IMapper mapper) + { + _userManager = userManager; + _jwtConfig = optionsMonitor.CurrentValue; + _mapper = mapper; + } + + [HttpPost] + [Route("Register")] + public async Task Register([FromBody] RegisterModel user) + { + // Check if the incoming request is valid + if (ModelState.IsValid) + { + // check i the user with the same email exist + var existingUser = await _userManager.FindByEmailAsync(user.Email); + + if (existingUser != null) + { + return BadRequest(new RegistrationResponse() + { + Result = false, + Errors = new List(){ + "Email already exist" + } + }); + } + + var newUser = _mapper.Map(user); + // var newUser = new User() { Email = user.Email, UserName = user.UserName }; + var isCreated = await _userManager.CreateAsync(newUser, user.Password); + if (isCreated.Succeeded) + { + var jwtToken = GenerateJwtToken(newUser); + + return Ok(new RegistrationResponse() + { + Result = true, + Token = jwtToken + }); + } + + return new JsonResult(new RegistrationResponse() + { + Result = false, + Errors = isCreated.Errors.Select(x => x.Description).ToList() + } + ) + { StatusCode = 500 }; + } + + return BadRequest(new RegistrationResponse() + { + Result = false, + Errors = new List(){ + "Invalid payload" + } + }); + } + + [HttpPost] + [Route("Login")] + public async Task Login([FromBody] UserLoginRequest user) + { + if (ModelState.IsValid) + { + // check if the user with the same email exist + var existingUser = await _userManager.FindByEmailAsync(user.Email); + + if (existingUser == null) + { + // We dont want to give to much information on why the request has failed for security reasons + return BadRequest(new RegistrationResponse() + { + Result = false, + Errors = new List(){ + "Invalid authentication request" + } + }); + } + + // Now we need to check if the user has inputed the right password + var isCorrect = await _userManager.CheckPasswordAsync(existingUser, user.Password); + + if (isCorrect) + { + var jwtToken = GenerateJwtToken(existingUser); + + return Ok(new LoginResponse() + { + Result = true, + Token = jwtToken, + Username = existingUser.Email, + Initials = existingUser.Initials, + Id = existingUser.Id + }); + } + else + { + // We dont want to give to much information on why the request has failed for security reasons + return BadRequest(new RegistrationResponse() + { + Result = false, + Errors = new List(){ + "Invalid authentication request" + } + }); + } + } + + return BadRequest(new RegistrationResponse() + { + Result = false, + Errors = new List(){ + "Invalid payload" + } + }); + } + + private string GenerateJwtToken(User user) + { + // Now its ime to define the jwt token which will be responsible of creating our tokens + var jwtTokenHandler = new JwtSecurityTokenHandler(); + + // We get our secret from the appsettings + var key = Encoding.ASCII.GetBytes(_jwtConfig.Secret); + + // we define our token descriptor + // We need to utilise claims which are properties in our token which gives information about the token + // which belong to the specific user who it belongs to + // so it could contain their id, name, email the good part is that these information + // are generated by our server and identity framework which is valid and trusted + var tokenDescriptor = new SecurityTokenDescriptor + { + + Subject = new ClaimsIdentity(new[] + { + new Claim("Id", user.Id), + new Claim(JwtRegisteredClaimNames.Sub, user.Email), + new Claim(JwtRegisteredClaimNames.Email, user.Email), + // the JTI is used for our refresh token which we will be convering in the next video + new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) + }), + // the life span of the token needs to be shorter and utilise refresh token to keep the user signedin + // but since this is a demo app we can extend it to fit our current need + Expires = DateTime.UtcNow.AddHours(6), + // here we are adding the encryption alogorithim information which will be used to decrypt our token + SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha512Signature) + }; + + var token = jwtTokenHandler.CreateToken(tokenDescriptor); + + var jwtToken = jwtTokenHandler.WriteToken(token); + + return jwtToken; + } + } +} diff --git a/Sledgemapper.Api/Controllers/CampaignController.cs b/Sledgemapper.Api/Controllers/CampaignController.cs new file mode 100644 index 0000000..6c0313f --- /dev/null +++ b/Sledgemapper.Api/Controllers/CampaignController.cs @@ -0,0 +1,76 @@ +using MediatR; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Sledgemapper.Api.Commands; +using Sledgemapper.Shared.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Controllers +{ + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] + [Route("[controller]")] + public class CampaignController : ControllerBase + { + private readonly IMediator _mediator; + private string UserId => HttpContext.User.Claims.FirstOrDefault(m => m.Type == "Id").Value; + + public CampaignController(IMediator mediator) => _mediator = mediator; + + [HttpPost] + [Route("{campaignName}")] + public async Task> Post(string campaignName) + { + var result = await _mediator.Send(new NewCampaignCommand(campaignName, UserId)); + if (!result) + { + return BadRequest(); + } + return result; + } + + //[HttpPost] + //[Route("{campaignName}")] + //public async Task Get(string campaignName) + //{ + // var result = await _mediator.Send(new GetCampaignCommand(campaignName, UserId.ToString())); + // return result; + //} + + [HttpGet] + public async Task> Get() + { + var result = await _mediator.Send(new GetCampaignsCommand(UserId)); + return result; + } + + [HttpPost] + [Route("{campaignName}/players/{email}")] + public async Task Invite(string campaignName, string email) + { + var result = await _mediator.Send(new InvitePlayerToCampaignCommand(campaignName, email, UserId)); + return result; + } + + [HttpGet] + [Route("{campaignName}/players")] + public async Task> GetPlayers(string campaignName) + { + var result = await _mediator.Send(new GetCampaignPlayersCommand(campaignName, UserId)); + return result; + } + + + [HttpGet] + [Route("{campaignName}/maps")] + public async Task> GetMaps(Guid campaignName) + { + var result = await _mediator.Send(new GetCampaignMapsCommand(campaignName, UserId)); + return result; + } + + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Controllers/MapController.cs b/Sledgemapper.Api/Controllers/MapController.cs new file mode 100644 index 0000000..683f84a --- /dev/null +++ b/Sledgemapper.Api/Controllers/MapController.cs @@ -0,0 +1,93 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using MediatR; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Sledgemapper.Api.Commands; +using Sledgemapper.Shared.Entities; + +namespace Sledgemapper.Api.Controllers +{ + [Authorize] + [Route("[controller]/{campaign}/{mapName}")] + public class MapController : ControllerBase + { + private readonly IMediator _mediator; + + public MapController(IMediator mediator) + { + _mediator = mediator; + } + + private string UserId => HttpContext.User.Claims.FirstOrDefault(m => m.Type == "Id").Value; + + [HttpDelete("overlay")] + public async Task Delete(Guid campaign, Guid mapName, [FromBody] Overlay overlay) + { + await _mediator.Send(new DeleteOverlayCommand(campaign, mapName, overlay, UserId)); + } + + [HttpDelete("wall")] + public async Task Delete(Guid campaign, Guid mapName, [FromBody] Wall wall) + { + await _mediator.Send(new DeleteWallCommand(campaign, mapName, wall, UserId)); + } + + [HttpDelete("note")] + public async Task Delete(Guid campaign, Guid mapName, [FromBody] Note note) + { + await _mediator.Send(new DeleteNoteCommand(campaign, mapName, note, UserId)); + } + + [HttpGet] + public async Task Get(Guid campaign, Guid mapName) + { + var result = await _mediator.Send(new GetMapSnapshotCommand(campaign, mapName)); + return result; + } + + [HttpPost] + public async Task Post(string campaign, string mapName) + { + var result = await _mediator.Send(new NewSessionCommand(campaign, mapName, UserId)); + return result; + } + + [HttpPost("snapshot")] + public async Task Post(string campaign, string mapName, [FromBody] Session session) + { + await _mediator.Send(new NewSnapshotCommand(mapName, session, UserId)); + } + + [HttpPost("overlay")] + public async Task Post(Guid campaign, Guid mapName, [FromBody] Overlay overlay) + { + await _mediator.Send(new NewOverlayCommand(campaign, mapName, overlay, UserId)); + } + + [HttpPost("wall")] + public async Task Post(Guid campaign, Guid mapName, [FromBody] Wall wall) + { + await _mediator.Send(new NewWallCommand(campaign, mapName, wall, UserId)); + } + + [HttpPost("note")] + public async Task Post(Guid campaign, Guid mapName, [FromBody] Note note) + { + await _mediator.Send(new NewNoteCommand(campaign, mapName, note, UserId)); + } + + [HttpPost("room")] + public async Task Post(Guid campaign, Guid mapName, [FromBody] Room room) + { + await _mediator.Send(new NewRoomCommand(campaign, mapName, room, UserId)); + } + + [HttpPost("line")] + public async Task Post(Guid campaign, Guid mapName, [FromBody] Line line) + { + await _mediator.Send(new NewLineCommand(campaign, mapName, line, UserId)); + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Core/Entities/BaseEntity.cs b/Sledgemapper.Api/Core/Entities/BaseEntity.cs new file mode 100644 index 0000000..5196c35 --- /dev/null +++ b/Sledgemapper.Api/Core/Entities/BaseEntity.cs @@ -0,0 +1,7 @@ +using System.ComponentModel.DataAnnotations; + +public abstract class BaseEntity +{ + [Key] + public int Id { get; set; } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Core/Entities/Campaign.cs b/Sledgemapper.Api/Core/Entities/Campaign.cs new file mode 100644 index 0000000..04a18de --- /dev/null +++ b/Sledgemapper.Api/Core/Entities/Campaign.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.EntityFrameworkCore; +using Sledgemapper.Api.Models; + +namespace Sledgemapper.Api.Core.Entities +{ + [Index(nameof(CampaignName), nameof(OwnerId), IsUnique = true)] + public class Campaign + { + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid CampaignId { get; set; } + + public string CampaignName { get; set; } + + public string OwnerId { get; set; } + + public User Owner { get; set; } + + public ICollection InvitedUsers { get; set; } + + public ICollection Maps { get; set; } + } +} diff --git a/Sledgemapper.Api/Core/Entities/Map.cs b/Sledgemapper.Api/Core/Entities/Map.cs new file mode 100644 index 0000000..b46a373 --- /dev/null +++ b/Sledgemapper.Api/Core/Entities/Map.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; + +namespace Sledgemapper.Api.Core.Entities +{ + public class Map + { + [Key] + public int MapId { get; set; } + + [Required] + public string MapName { get; set; } + + [Required] + public int CampaignId { get; set; } + + } +} diff --git a/Sledgemapper.Api/Core/Entities/MapLog.cs b/Sledgemapper.Api/Core/Entities/MapLog.cs new file mode 100644 index 0000000..4d004f6 --- /dev/null +++ b/Sledgemapper.Api/Core/Entities/MapLog.cs @@ -0,0 +1,33 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Sledgemapper.Api.Core.Entities +{ + + public class MapLog + { + [Key] + public int MapLogId { get; set; } + + [Required] + public string UserId { get; set; } + + [Required] + public Guid SessionId { get; set; } + + [Required] + [MaxLength(1)] + public string Operation { get; set; } + + [Required] + [MaxLength(256)] + public string Type { get; set; } + + [Required] + [MaxLength(256)] + public string Object { get; set; } + + [Required] + public double Timestamp { get; set; } + } +} diff --git a/Sledgemapper.Api/Core/Entities/Session.cs b/Sledgemapper.Api/Core/Entities/Session.cs new file mode 100644 index 0000000..52029db --- /dev/null +++ b/Sledgemapper.Api/Core/Entities/Session.cs @@ -0,0 +1,24 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Sledgemapper.Api.Core.Entities +{ + [Index(nameof(CampaignId), nameof(SessionName), IsUnique = true)] + public class Session + { + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + [Key] + public Guid SessionId { get; set; } + + [Required] + public Guid CampaignId { get; set; } + + [Required] + public string SessionName { get; set; } + + [Required] + public string OwnerUserId { get; set; } + } +} diff --git a/Sledgemapper.Api/Core/Entities/SessionUser.cs b/Sledgemapper.Api/Core/Entities/SessionUser.cs new file mode 100644 index 0000000..b2136c0 --- /dev/null +++ b/Sledgemapper.Api/Core/Entities/SessionUser.cs @@ -0,0 +1,17 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Sledgemapper.Api.Core.Entities +{ + public class SessionUser + { + [Key] + public int SessionUserId { get; set; } + + [Required] + public Guid SessionId { get; set; } + + [Required] + public Guid UserId { get; set; } + } +} diff --git a/Sledgemapper.Api/Core/Entities/Snapshot.cs b/Sledgemapper.Api/Core/Entities/Snapshot.cs new file mode 100644 index 0000000..2a577e2 --- /dev/null +++ b/Sledgemapper.Api/Core/Entities/Snapshot.cs @@ -0,0 +1,21 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Sledgemapper.Api.Core.Entities +{ + + public class Snapshot + { + [Key] + public int SnapshotId { get; set; } + + [Required] + public Guid SessionId { get; set; } + + [Required] + public string Object { get; set; } + + [Required] + public double Timestamp { get; set; } + } +} diff --git a/Sledgemapper.Api/Core/Entities/User.cs b/Sledgemapper.Api/Core/Entities/User.cs new file mode 100644 index 0000000..bc29784 --- /dev/null +++ b/Sledgemapper.Api/Core/Entities/User.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Identity; + +namespace Sledgemapper.Api.Core.Entities +{ + public class User : IdentityUser + { + // public int Id { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + // public string Email { get; set; } + // public string Username { get; set; } + public string Initials { get; set; } + // public byte[] PasswordHash { get; set; } + public byte[] PasswordSalt { get; set; } + public ICollection Campaigns { get; set; } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Core/Entities/UserConnection.cs b/Sledgemapper.Api/Core/Entities/UserConnection.cs new file mode 100644 index 0000000..17e34a3 --- /dev/null +++ b/Sledgemapper.Api/Core/Entities/UserConnection.cs @@ -0,0 +1,16 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Sledgemapper.Api.Core.Entities +{ + public class UserConnection + { + [Key] + public int UserConnectionId { get; set; } + [Required] + public Guid UserId { get; set; } + + [Required] + public string ConnectionId { get; set; } + } +} diff --git a/Sledgemapper.Api/Handlers/BaseCommandHandler.cs b/Sledgemapper.Api/Handlers/BaseCommandHandler.cs new file mode 100644 index 0000000..f9a8dea --- /dev/null +++ b/Sledgemapper.Api/Handlers/BaseCommandHandler.cs @@ -0,0 +1,76 @@ +using MediatR; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Infrastructure.Data; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System; +using Microsoft.EntityFrameworkCore; +using Sledgemapper.Api.Models; +using Sledgemapper.Api.Core.Entities; + +namespace Sledgemapper.Api.Handlers +{ + public abstract class BaseCommandHandler : IRequestHandler where TRequest : BaseCommand + { + protected SledgemapperDbContext DbContext { get; } + + protected IMediator Mediator { get; } + + + public abstract Task Handle(TRequest request, CancellationToken cancellationToken); + + protected BaseCommandHandler(IMediator mediator, SledgemapperDbContext dbContext) + { + DbContext = dbContext; + Mediator = mediator; + } + + protected async Task CheckAuthorization(TRequest command) + { + var user = await DbContext.Users.FindAsync(command.UserId); + DbContext.Attach(user); + + + var campaign = await GetCampaignForUser(command); + + var maps = campaign.Maps.Any(s => s.SessionId == command.SessionId); + + if (!maps) + { + throw new Exception("Unauthorized"); + } + } + + protected async Task GetCampaignForUser(TRequest command) + { + var user = await DbContext.Users.FindAsync(command.UserId); + DbContext.Attach(user); + var campaign = await DbContext + .Campaigns + .Where(campaign => campaign.CampaignId == command.Campaign) + .Include(c => c.InvitedUsers) + .Include(c => c.Maps) + .Include(c => c.Owner) + .Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user)).FirstAsync(); + return campaign; + } + + protected async Task SaveLog(TRequest command, string operation, string type, string data, CancellationToken cancellationToken) + { + var session = DbContext.Sessions.First(m => m.SessionId == command.SessionId); + DbContext.MapLogs.Add(new MapLog + { + Operation = operation, + SessionId = session.SessionId, + Type = type, + Timestamp = command.Timestamp, + Object = data, + UserId = command.UserId, + }); + await DbContext.SaveChangesAsync(cancellationToken); + return session; + } + + } +} diff --git a/Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs new file mode 100644 index 0000000..e2d55c3 --- /dev/null +++ b/Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs @@ -0,0 +1,26 @@ +using MediatR; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Notifications; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + public class DeleteNoteCommandHandler : BaseCommandHandler + { + public DeleteNoteCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext) + { + } + + public override async Task Handle(DeleteNoteCommand command, CancellationToken cancellationToken) + { + await CheckAuthorization(command); + var jsonString = JsonSerializer.Serialize(command.Note); + var session = await SaveLog(command, "D", "N", jsonString, cancellationToken); + await Mediator.Publish(new DeleteNoteNotification(session, command.Note, command.UserId), cancellationToken); + return true; + } + } +} diff --git a/Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs new file mode 100644 index 0000000..a6b2956 --- /dev/null +++ b/Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs @@ -0,0 +1,26 @@ +using MediatR; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Api.Notifications; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + public class DeleteOverlayCommandHandler : BaseCommandHandler + { + public DeleteOverlayCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext) + { + } + + public override async Task Handle(DeleteOverlayCommand command, CancellationToken cancellationToken) + { + await CheckAuthorization(command); + var jsonString = JsonSerializer.Serialize(command.Overlay); + var session = await SaveLog(command, "D", "O", jsonString, cancellationToken); + await Mediator.Publish(new DeleteOverlayNotification(session, command.Overlay, command.UserId), cancellationToken); + return true; + } + } +} diff --git a/Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs new file mode 100644 index 0000000..5c1cd1d --- /dev/null +++ b/Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs @@ -0,0 +1,26 @@ +using MediatR; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Notifications; +using Sledgemapper.Api.Infrastructure.Data; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + public class DeleteTileCommandHandler : BaseCommandHandler + { + public DeleteTileCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext) + { + } + + public override async Task Handle(DeleteTileCommand command, CancellationToken cancellationToken) + { + await CheckAuthorization(command); + var jsonString = JsonSerializer.Serialize(command.Tile); + var session = await SaveLog(command, "D", "T", jsonString, cancellationToken); + await Mediator.Publish(new DeleteTileNotification(session, command.Tile, command.UserId), cancellationToken); + return true; + } + } +} diff --git a/Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs new file mode 100644 index 0000000..aeb0f30 --- /dev/null +++ b/Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs @@ -0,0 +1,26 @@ +using MediatR; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Notifications; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + public class DeleteWallCommandHandler : BaseCommandHandler + { + public DeleteWallCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext) + { + } + + public override async Task Handle(DeleteWallCommand command, CancellationToken cancellationToken) + { + await CheckAuthorization(command); + var jsonString = JsonSerializer.Serialize(command.Wall); + var session = await SaveLog(command, "D", "W", jsonString, cancellationToken); + await Mediator.Publish(new DeleteWallNotification(session, command.Wall, command.UserId), cancellationToken); + return true; + } + } +} diff --git a/Sledgemapper.Api/Handlers/GetCampaignMapsCommandHandler.cs b/Sledgemapper.Api/Handlers/GetCampaignMapsCommandHandler.cs new file mode 100644 index 0000000..289b8e1 --- /dev/null +++ b/Sledgemapper.Api/Handlers/GetCampaignMapsCommandHandler.cs @@ -0,0 +1,56 @@ +using MediatR; +using Microsoft.EntityFrameworkCore; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Shared.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + public class GetCampaignMapsCommandHandler : IRequestHandler> + { + private readonly IMediator _mediator; + private readonly SledgemapperDbContext _dbcontext; + + public GetCampaignMapsCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) + { + _mediator = mediator; + _dbcontext = dbcontext; + } + + public async Task> Handle(GetCampaignMapsCommand command, CancellationToken cancellationToken) + { + try + { + var user = await _dbcontext.Users.FindAsync(command.UserId); + _dbcontext.Attach(user); + + + + var campaign = await _dbcontext + .Campaigns + .Where(campaign => campaign.CampaignId == command.CampaignId) + .Include(c => c.InvitedUsers) + .Include(c => c.Maps) + .Include(c => c.Owner) + .Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user)).FirstAsync(); + + + + + //var campaign = await _dbcontext.Campaigns.Where(campaign => campaign.CampaignId == command.CampaignId && campaign.OwnerId == command.UserId).Include(campaign => campaign.Maps).FirstAsync(); + + var maps = campaign.Maps.Select(session => new Session { SessionName = session.SessionName, SessionId = session.SessionId }).ToList(); + return maps; + } + catch (Exception ex) + { + } + return null; + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Handlers/GetCampaignPlayersCommandHandler.cs b/Sledgemapper.Api/Handlers/GetCampaignPlayersCommandHandler.cs new file mode 100644 index 0000000..7b606c5 --- /dev/null +++ b/Sledgemapper.Api/Handlers/GetCampaignPlayersCommandHandler.cs @@ -0,0 +1,43 @@ +using MediatR; +using Microsoft.EntityFrameworkCore; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Shared.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + public class GetCampaignPlayersCommandHandler : IRequestHandler> + { + private readonly IMediator _mediator; + private readonly SledgemapperDbContext _dbcontext; + + public GetCampaignPlayersCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) + { + _mediator = mediator; + _dbcontext = dbcontext; + } + + public async Task> Handle(GetCampaignPlayersCommand command, CancellationToken cancellationToken) + { + try + { + var user = await _dbcontext.Users.FindAsync(command.UserId); + _dbcontext.Attach(user); + + var campaign = await _dbcontext.Campaigns.Where(campaign => campaign.CampaignName == command.CampaignName && campaign.OwnerId == command.UserId).Include(campaign => campaign.InvitedUsers).FirstAsync(); + + var players = campaign.InvitedUsers.Select(user => new Player { Initials = user.Initials, UserName = user.UserName }).ToList(); + return players; + } + catch (Exception ex) + { + } + return null; + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Handlers/GetCampaignsCommandHandler.cs b/Sledgemapper.Api/Handlers/GetCampaignsCommandHandler.cs new file mode 100644 index 0000000..12b226f --- /dev/null +++ b/Sledgemapper.Api/Handlers/GetCampaignsCommandHandler.cs @@ -0,0 +1,43 @@ +using MediatR; +using Microsoft.EntityFrameworkCore; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Shared.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + public class GetCampaignsCommandHandler : IRequestHandler> + { + private readonly IMediator _mediator; + private readonly SledgemapperDbContext _dbcontext; + + public GetCampaignsCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) + { + _mediator = mediator; + _dbcontext = dbcontext; + } + + public async Task> Handle(GetCampaignsCommand command, CancellationToken cancellationToken) + { + try + { + var user = await _dbcontext.Users.FindAsync(command.UserId); + _dbcontext.Attach(user); + var campaigns = _dbcontext.Campaigns.Include(c => c.InvitedUsers).Include(c => c.Maps).Include(c => c.Owner).Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user)); + + return campaigns. + Select(c => new Campaign { Id = c.CampaignId, Name = c.CampaignName, Maps = c.Maps.Select(m => new Map { SessionName = m.SessionName }).ToList() }) + .ToList(); + } + catch (Exception ex) + { + } + return new List(); + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs b/Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs new file mode 100644 index 0000000..e304fa0 --- /dev/null +++ b/Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs @@ -0,0 +1,115 @@ +using MediatR; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Shared.Entities; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using System.Linq; +using Sledgemapper.Api.Models; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Core.Entities; +using Session = Sledgemapper.Shared.Entities.Session; + +namespace Sledgemapper.Api.Handlers +{ + public class GetMapSnapshotCommandHandler : IRequestHandler + { + private readonly SledgemapperDbContext _dbcontext; + + public GetMapSnapshotCommandHandler(SledgemapperDbContext dbcontext) { _dbcontext = dbcontext; } + + public async Task Handle(GetMapSnapshotCommand notification, CancellationToken cancellationToken) + { + Snapshot snapshot; + double timestamp; + Session mapSession; + var session = _dbcontext.Sessions.First(m => m.SessionId == notification.MapId); + snapshot = _dbcontext.Snapshots.OrderByDescending(s => s.Timestamp).FirstOrDefault(m => m.SessionId == session.SessionId); + if (snapshot is null) + { + + timestamp = 0; + mapSession = new Session(); + } + else + { + mapSession = JsonSerializer.Deserialize(snapshot.Object); + timestamp = snapshot.Timestamp; + } + + var mapUpdates = _dbcontext.MapLogs.Where(m => m.SessionId == session.SessionId && m.Timestamp > timestamp).OrderBy(m => m.Timestamp).ToList(); + foreach (var mapUpdate in mapUpdates) + { + if (mapUpdate.Operation == "N") + { + switch (mapUpdate.Type) + { + case "T": + var tile = JsonSerializer.Deserialize(mapUpdate.Object); + mapSession.NewTile(tile, tile.ID); + break; + case "W": + var wall = JsonSerializer.Deserialize(mapUpdate.Object); + mapSession.NewWall(wall, wall.ID); + break; + case "O": + var overlay = JsonSerializer.Deserialize(mapUpdate.Object); + mapSession.NewOverlay(overlay, overlay.ID); + break; + case "N": + var note = JsonSerializer.Deserialize(mapUpdate.Object); + mapSession.NewNote(note); + break; + case "L": + var line = JsonSerializer.Deserialize(mapUpdate.Object); + mapSession.NewLine(line); + break; + case "R": + var room = JsonSerializer.Deserialize(mapUpdate.Object); + mapSession.NewRoom(room); + break; + + + + + } + + } + else if (mapUpdate.Operation == "D") + { + switch (mapUpdate.Type) + { + case "T": + var tile = JsonSerializer.Deserialize(mapUpdate.Object); + mapSession.DeleteTile(tile); + break; + case "W": + var wall = JsonSerializer.Deserialize(mapUpdate.Object); + mapSession.DeleteWall(wall); + break; + case "O": + var overlay = JsonSerializer.Deserialize(mapUpdate.Object); + mapSession.DeleteOverlay(overlay); + break; + case "N": + var note = JsonSerializer.Deserialize(mapUpdate.Object); + mapSession.DeleteNote(note); + break; + } + } + } + if (mapUpdates.Any()) + { + var newSnapshot = new Snapshot + { + SessionId = session.SessionId, + Timestamp = mapUpdates.Max(mapSession => mapSession.Timestamp), + Object = JsonSerializer.Serialize(mapSession) + }; + await _dbcontext.Snapshots.AddAsync(newSnapshot, cancellationToken); + await _dbcontext.SaveChangesAsync(cancellationToken); + } + return mapSession; + } + } +} diff --git a/Sledgemapper.Api/Handlers/InvitePlayerToCampaignCommandHandler.cs b/Sledgemapper.Api/Handlers/InvitePlayerToCampaignCommandHandler.cs new file mode 100644 index 0000000..c6c6a28 --- /dev/null +++ b/Sledgemapper.Api/Handlers/InvitePlayerToCampaignCommandHandler.cs @@ -0,0 +1,44 @@ +using MediatR; +using Microsoft.EntityFrameworkCore; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Infrastructure.Data; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + public class InvitePlayerToCampaignCommandHandler : IRequestHandler + { + private readonly IMediator _mediator; + private readonly SledgemapperDbContext _dbcontext; + + public InvitePlayerToCampaignCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) + { + _mediator = mediator; + _dbcontext = dbcontext; + } + + public async Task Handle(InvitePlayerToCampaignCommand command, CancellationToken cancellationToken) + { + try + { + var user = await _dbcontext.Users.FindAsync(command.UserId); + + var campaign = await _dbcontext.Campaigns.Where(campaign=>campaign.CampaignName==command.CampaignName && campaign.OwnerId==command.UserId).Include(campaign=>campaign.InvitedUsers).FirstAsync(); + var invitedUser = await _dbcontext.Users.FirstOrDefaultAsync(user=>user.Email==command.Email); + _dbcontext.Attach(invitedUser); + _dbcontext.Attach(campaign); + campaign.InvitedUsers.Add(invitedUser); + _dbcontext.Campaigns.Update(campaign); + await _dbcontext.SaveChangesAsync(); + return true; + } + catch (Exception ex) + { + } + return false; + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Handlers/NewCampaignCommandHandler.cs b/Sledgemapper.Api/Handlers/NewCampaignCommandHandler.cs new file mode 100644 index 0000000..0c61334 --- /dev/null +++ b/Sledgemapper.Api/Handlers/NewCampaignCommandHandler.cs @@ -0,0 +1,48 @@ +using MediatR; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Infrastructure.Data; +using System; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Core.Entities; + +namespace Sledgemapper.Api.Handlers +{ + public class NewCampaignCommandHandler : IRequestHandler + { + private readonly IMediator _mediator; + private readonly SledgemapperDbContext _dbcontext; + + public NewCampaignCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) + { + _mediator = mediator; + _dbcontext = dbcontext; + } + + public async Task Handle(NewCampaignCommand notification, CancellationToken cancellationToken) + { + try + { + var user = await _dbcontext.Users.FindAsync(notification.UserId, cancellationToken); + _dbcontext.Attach(user); + var campaign = new Core.Entities.Campaign + { + CampaignName = notification.CampaignName, + OwnerId = user.Id, + InvitedUsers = new System.Collections.Generic.List { user } + }; + + _dbcontext.Campaigns.Add(campaign); + + await _dbcontext.SaveChangesAsync(cancellationToken); + return true; + } + catch (Exception ex) + { + + + } + return false; + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Handlers/NewLineCommandHandler.cs b/Sledgemapper.Api/Handlers/NewLineCommandHandler.cs new file mode 100644 index 0000000..c499145 --- /dev/null +++ b/Sledgemapper.Api/Handlers/NewLineCommandHandler.cs @@ -0,0 +1,26 @@ +using MediatR; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Api.Commands; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Notifications; + +namespace Sledgemapper.Api.Handlers +{ + public class NewLineCommandHandler : BaseCommandHandler + { + public NewLineCommandHandler(IMediator mediator, SledgemapperDbContext dbContext) : base(mediator, dbContext) + { + } + + public override async Task Handle(NewLineCommand command, CancellationToken cancellationToken) + { + await CheckAuthorization(command); + var jsonString = JsonSerializer.Serialize(command.Line); + var session = await SaveLog(command, "N", "L", jsonString, cancellationToken); + await Mediator.Publish(new NewLineNotification(session, command.Line, command.UserId), cancellationToken); + return true; + } + } +} diff --git a/Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs b/Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs new file mode 100644 index 0000000..6390422 --- /dev/null +++ b/Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs @@ -0,0 +1,26 @@ +using MediatR; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Notifications; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + public class NewNoteCommandHandler : BaseCommandHandler + { + public NewNoteCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext) + { + } + + public override async Task Handle(NewNoteCommand command, CancellationToken cancellationToken) + { + await CheckAuthorization(command); + var jsonString = JsonSerializer.Serialize(command.Note); + var session = await SaveLog(command, "N", "W", jsonString, cancellationToken); + await Mediator.Publish(new NewNoteNotification(session, command.Note, command.UserId), cancellationToken); + return true; + } + } +} diff --git a/Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs b/Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs new file mode 100644 index 0000000..68a6793 --- /dev/null +++ b/Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs @@ -0,0 +1,27 @@ +using MediatR; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Api.Notifications; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + + public class NewOverlayCommandHandler : BaseCommandHandler + { + public NewOverlayCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext) + { + } + + public override async Task Handle(NewOverlayCommand command, CancellationToken cancellationToken) + { + await CheckAuthorization(command); + var jsonString = JsonSerializer.Serialize(command.Overlay); + var session = await SaveLog(command, "N", "O", jsonString, cancellationToken); + await Mediator.Publish(new NewOverlayNotification(session, command.Overlay, command.UserId), cancellationToken); + return true; + } + } +} diff --git a/Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs b/Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs new file mode 100644 index 0000000..f5093ba --- /dev/null +++ b/Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs @@ -0,0 +1,25 @@ +using MediatR; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Api.Commands; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Notifications; + +namespace Sledgemapper.Api.Handlers +{ + public class NewRoomCommandHandler : BaseCommandHandler + { + public NewRoomCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext) + { } + + public override async Task Handle(NewRoomCommand command, CancellationToken cancellationToken) + { + await CheckAuthorization(command); + var jsonString = JsonSerializer.Serialize(command.Room); + var session = await SaveLog(command, "N", "R", jsonString, cancellationToken); + await Mediator.Publish(new NewRoomNotification(session, command.Room, command.UserId), cancellationToken); + return true; + } + } +} diff --git a/Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs b/Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs new file mode 100644 index 0000000..941fbb6 --- /dev/null +++ b/Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs @@ -0,0 +1,40 @@ +using MediatR; +using Sledgemapper.Api.Infrastructure.Data; + +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using System.Linq; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Core.Entities; + +namespace Sledgemapper.Api.Handlers +{ + public class NewSnapshotCommandHandler : IRequestHandler + { + private readonly SledgemapperDbContext _dbcontext; + private readonly IMediator _mediator; + + public NewSnapshotCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; } + + public async Task Handle(NewSnapshotCommand notification, CancellationToken cancellationToken) + { + + var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName); + + var newSnapshot = new Snapshot + { + SessionId = session.SessionId, + Timestamp = notification.Timestamp, + Object = JsonSerializer.Serialize(notification.Session) + + }; + await _dbcontext.Snapshots.AddAsync(newSnapshot, cancellationToken); + await _dbcontext.SaveChangesAsync(cancellationToken); + + return true; + } + + + } +} diff --git a/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs b/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs new file mode 100644 index 0000000..5db3d32 --- /dev/null +++ b/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs @@ -0,0 +1,26 @@ +using MediatR; +using Sledgemapper.Api.Infrastructure.Data; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Notifications; +using Sledgemapper.Api.Commands; + +namespace Sledgemapper.Api.Handlers +{ + public class NewTileCommandHandler : BaseCommandHandler + { + public NewTileCommandHandler(IMediator mediator, SledgemapperDbContext dbContext) : base(mediator, dbContext) + { + } + + public override async Task Handle(NewTileCommand command, CancellationToken cancellationToken) + { + await CheckAuthorization(command); + var jsonString = JsonSerializer.Serialize(command.Tile); + var session = await SaveLog(command, "N", "T", jsonString, cancellationToken); + await Mediator.Publish(new NewTileNotification(session, command.Tile, command.UserId), cancellationToken); + return true; + } + } +} diff --git a/Sledgemapper.Api/Handlers/NewWallCommandHandler.cs b/Sledgemapper.Api/Handlers/NewWallCommandHandler.cs new file mode 100644 index 0000000..c2c480d --- /dev/null +++ b/Sledgemapper.Api/Handlers/NewWallCommandHandler.cs @@ -0,0 +1,26 @@ +using MediatR; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Notifications; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + public class NewWallCommandHandler : BaseCommandHandler + { + public NewWallCommandHandler(IMediator mediator, SledgemapperDbContext dbContext) : base(mediator, dbContext) + { + } + + public override async Task Handle(NewWallCommand command, CancellationToken cancellationToken) + { + await CheckAuthorization(command); + var jsonString = JsonSerializer.Serialize(command.Wall); + var session = await SaveLog(command, "N", "W", jsonString, cancellationToken); + await Mediator.Publish(new NewWallNotification(session, command.Wall, command.UserId), cancellationToken); + return true; + } + } +} diff --git a/Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs new file mode 100644 index 0000000..1c66299 --- /dev/null +++ b/Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs @@ -0,0 +1,22 @@ +using MediatR; +using Microsoft.AspNetCore.SignalR; +using Sledgemapper.Shared.Clients; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Hubs; +using Sledgemapper.Api.Notifications; + +namespace Sledgemapper.Api.Handlers +{ + public class SendDeleteNoteMessage : INotificationHandler + { + private readonly IHubContext _hub; + + public SendDeleteNoteMessage(IHubContext hub) => _hub = hub; + + public async Task Handle(DeleteNoteNotification notification, CancellationToken cancellationToken) + { + await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteNote(notification.Note); + } + } +} diff --git a/Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs new file mode 100644 index 0000000..35b07aa --- /dev/null +++ b/Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs @@ -0,0 +1,22 @@ +using MediatR; +using Microsoft.AspNetCore.SignalR; +using Sledgemapper.Api.Hubs; +using Sledgemapper.Api.Notifications; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Shared.Clients; + +namespace Sledgemapper.Api.Handlers +{ + public class SendDeleteOverlayMessage : INotificationHandler + { + private readonly IHubContext _hub; + + public SendDeleteOverlayMessage(IHubContext hub) => _hub = hub; + + public async Task Handle(DeleteOverlayNotification notification, CancellationToken cancellationToken) + { + await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteOverlay(notification.Overlay); + } + } +} diff --git a/Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs new file mode 100644 index 0000000..78f07ee --- /dev/null +++ b/Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs @@ -0,0 +1,22 @@ +using MediatR; +using Microsoft.AspNetCore.SignalR; +using Sledgemapper.Api.Hubs; +using Sledgemapper.Api.Notifications; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Shared.Clients; + +namespace Sledgemapper.Api.Handlers +{ + public class SendDeleteTileMessage : INotificationHandler + { + private readonly IHubContext _hub; + + public SendDeleteTileMessage(IHubContext hub) => _hub = hub; + + public async Task Handle(DeleteTileNotification notification, CancellationToken cancellationToken) + { + await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteTile(notification.Tile); + } + } +} diff --git a/Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs new file mode 100644 index 0000000..99f4e2a --- /dev/null +++ b/Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs @@ -0,0 +1,22 @@ +using MediatR; +using Microsoft.AspNetCore.SignalR; +using Sledgemapper.Api.Notifications; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Hubs; +using Sledgemapper.Shared.Clients; + +namespace Sledgemapper.Api.Handlers +{ + public class SendDeleteWallMessage : INotificationHandler + { + private readonly IHubContext _hub; + + public SendDeleteWallMessage(IHubContext hub) => _hub = hub; + + public async Task Handle(DeleteWallNotification notification, CancellationToken cancellationToken) + { + await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteWall(notification.Wall); + } + } +} diff --git a/Sledgemapper.Api/Handlers/SendNewLineMessage.cs b/Sledgemapper.Api/Handlers/SendNewLineMessage.cs new file mode 100644 index 0000000..1447351 --- /dev/null +++ b/Sledgemapper.Api/Handlers/SendNewLineMessage.cs @@ -0,0 +1,22 @@ +using MediatR; +using Microsoft.AspNetCore.SignalR; +using Sledgemapper.Api.Notifications; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Hubs; +using Sledgemapper.Shared.Clients; + +namespace Sledgemapper.Api.Handlers +{ + public class SendNewLineMessage : INotificationHandler + { + private readonly IHubContext _hub; + + public SendNewLineMessage(IHubContext hub) => _hub = hub; + + public async Task Handle(NewLineNotification notification, CancellationToken cancellationToken) + { + await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewLine(notification.Line); + } + } +} diff --git a/Sledgemapper.Api/Handlers/SendNewNoteMessage.cs b/Sledgemapper.Api/Handlers/SendNewNoteMessage.cs new file mode 100644 index 0000000..88eafe6 --- /dev/null +++ b/Sledgemapper.Api/Handlers/SendNewNoteMessage.cs @@ -0,0 +1,22 @@ +using MediatR; +using Microsoft.AspNetCore.SignalR; +using Sledgemapper.Api.Notifications; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Hubs; +using Sledgemapper.Shared.Clients; + +namespace Sledgemapper.Api.Handlers +{ + public class SendNewNoteMessage : INotificationHandler + { + private readonly IHubContext _hub; + + public SendNewNoteMessage(IHubContext hub) => _hub = hub; + + public async Task Handle(NewNoteNotification notification, CancellationToken cancellationToken) + { + await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewNote(notification.Note); + } + } +} diff --git a/Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs b/Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs new file mode 100644 index 0000000..782742e --- /dev/null +++ b/Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs @@ -0,0 +1,22 @@ +using MediatR; +using Microsoft.AspNetCore.SignalR; +using Sledgemapper.Api.Hubs; +using Sledgemapper.Api.Notifications; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Shared.Clients; + +namespace Sledgemapper.Api.Handlers +{ + public class SendNewOverlayMessage : INotificationHandler + { + private readonly IHubContext _hub; + + public SendNewOverlayMessage(IHubContext hub) => _hub = hub; + + public async Task Handle(NewOverlayNotification notification, CancellationToken cancellationToken) + { + await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewOverlay(notification.Overlay); + } + } +} diff --git a/Sledgemapper.Api/Handlers/SendNewRoomMessage.cs b/Sledgemapper.Api/Handlers/SendNewRoomMessage.cs new file mode 100644 index 0000000..e8dcd7e --- /dev/null +++ b/Sledgemapper.Api/Handlers/SendNewRoomMessage.cs @@ -0,0 +1,22 @@ +using MediatR; +using Microsoft.AspNetCore.SignalR; +using Sledgemapper.Api.Notifications; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Hubs; +using Sledgemapper.Shared.Clients; + +namespace Sledgemapper.Api.Handlers +{ + public class SendNewRoomMessage : INotificationHandler + { + private readonly IHubContext _hub; + + public SendNewRoomMessage(IHubContext hub) => _hub = hub; + + public async Task Handle(NewRoomNotification notification, CancellationToken cancellationToken) + { + await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewRoom(notification.Room); + } + } +} diff --git a/Sledgemapper.Api/Handlers/SendNewTileMessage.cs b/Sledgemapper.Api/Handlers/SendNewTileMessage.cs new file mode 100644 index 0000000..268bc99 --- /dev/null +++ b/Sledgemapper.Api/Handlers/SendNewTileMessage.cs @@ -0,0 +1,23 @@ +using MediatR; +using Microsoft.AspNetCore.SignalR; +using Sledgemapper.Api.Notifications; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Hubs; +using Sledgemapper.Shared.Clients; + +namespace Sledgemapper.Api.Handlers +{ + public class SendNewTileMessage : INotificationHandler + { + private readonly IHubContext _hub; + + public SendNewTileMessage(IHubContext hub) => _hub = hub; + + public async Task Handle(NewTileNotification notification, CancellationToken cancellationToken) + { + + await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewTile(notification.Tile); + } + } +} diff --git a/Sledgemapper.Api/Handlers/SendNewWallMessage.cs b/Sledgemapper.Api/Handlers/SendNewWallMessage.cs new file mode 100644 index 0000000..0ed117a --- /dev/null +++ b/Sledgemapper.Api/Handlers/SendNewWallMessage.cs @@ -0,0 +1,22 @@ +using MediatR; +using Microsoft.AspNetCore.SignalR; +using Sledgemapper.Api.Notifications; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Hubs; +using Sledgemapper.Shared.Clients; + +namespace Sledgemapper.Api.Handlers +{ + public class SendNewWallMessage : INotificationHandler + { + private readonly IHubContext _hub; + + public SendNewWallMessage(IHubContext hub) => _hub = hub; + + public async Task Handle(NewWallNotification notification, CancellationToken cancellationToken) + { + await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewWall(notification.Wall); + } + } +} diff --git a/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs b/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs new file mode 100644 index 0000000..a9d687e --- /dev/null +++ b/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs @@ -0,0 +1,37 @@ +using MediatR; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Infrastructure.Data; +using Sledgemapper.Api.Models; +using System; +using System.Threading; +using System.Threading.Tasks; +using Sledgemapper.Api.Core.Entities; + +namespace Sledgemapper.Api.Handlers +{ + public class StartNewSessionHandler : BaseCommandHandler + { + + + public StartNewSessionHandler(IMediator mediator, SledgemapperDbContext dbcontext):base(mediator, dbcontext) + { + + } + + public override async Task Handle(NewSessionCommand command, CancellationToken cancellationToken) + { + var campaign = await GetCampaignForUser(command); + + var session = new Session + { + SessionName = command.SessionName, + OwnerUserId = command.UserId, + CampaignId = campaign.CampaignId + + }; + DbContext.Sessions.Add(session); + await DbContext.SaveChangesAsync(cancellationToken); + return session.SessionId; + } + } +} diff --git a/Sledgemapper.Api/Helpers/AppException.cs b/Sledgemapper.Api/Helpers/AppException.cs new file mode 100644 index 0000000..957826f --- /dev/null +++ b/Sledgemapper.Api/Helpers/AppException.cs @@ -0,0 +1,19 @@ +using System; +using System.Globalization; + +namespace Sledgemapper.Api.Helpers +{ + // Custom exception class for throwing application specific exceptions (e.g. for validation) + // that can be caught and handled within the application + public class AppException : Exception + { + public AppException() : base() { } + + public AppException(string message) : base(message) { } + + public AppException(string message, params object[] args) + : base(string.Format(CultureInfo.CurrentCulture, message, args)) + { + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Helpers/AutoMapperProfile.cs b/Sledgemapper.Api/Helpers/AutoMapperProfile.cs new file mode 100644 index 0000000..1fc8edb --- /dev/null +++ b/Sledgemapper.Api/Helpers/AutoMapperProfile.cs @@ -0,0 +1,14 @@ +using AutoMapper; +using Sledgemapper.Api.Core.Entities; +using Sledgemapper.Api.Models; + +namespace Sledgemapper.Api.Helpers +{ + public class AutoMapperProfile : Profile + { + public AutoMapperProfile() + { + CreateMap(); + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Hubs/SledgemapperHub.cs b/Sledgemapper.Api/Hubs/SledgemapperHub.cs new file mode 100644 index 0000000..847e221 --- /dev/null +++ b/Sledgemapper.Api/Hubs/SledgemapperHub.cs @@ -0,0 +1,180 @@ +using Microsoft.AspNetCore.SignalR; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Collections.Concurrent; +using Sledgemapper.Shared.Entities; +using System; +using Sledgemapper.Api.Infrastructure.Data; +using Microsoft.AspNetCore.Authorization; +using Sledgemapper.Api.Core.Entities; +using Sledgemapper.Api.Models; +using Sledgemapper.Shared.Clients; + +namespace Sledgemapper.Api.Hubs +{ + [Authorize] + public class SledgemapperHub : Hub + { + private static readonly ConcurrentDictionary UserColors = new(); + private readonly SledgemapperDbContext _dbContext; + + public SledgemapperHub(SledgemapperDbContext dbContext/*, DataContext datacontext*/) + { + _dbContext = dbContext; + } + + // other colors + // #cca300, #20f200, #004011, #00e6d6, #005c73, #0057d9, #d900ca, #660029, #d9003a + // private static Dictionary _sessions = new Dictionary(); + public List Colors = new() + { + "#e6194B", + "#f58231", + "#3cb44b", + "#000075", + "#911eb4", + "#800000", + "#808000", + "#469990" + }; + + public async Task NewTile(string sessionName, Tile tile) + { + await Clients.Group(sessionName).NewTile(tile); + } + + public async Task NewRoom(string sessionName, Room room) + { + await Clients.Group(sessionName).NewRoom(room); + } + + public async Task NewLine(string sessionName, Line line) + { + await Clients.Group(sessionName).NewLine(line); + } + + public async Task NewWall(string sessionName, Wall tile) + { + await Clients.Group(sessionName).NewWall(tile); + } + + public async Task NewOverlay(Guid mapId, Overlay tile) + { + await Clients.Group(mapId.ToString()).NewOverlay(tile); + } + + public async Task NewNote(string sessionName, Note note) + { + await Clients.Group(sessionName).NewNote(note); + } + + public async Task DeleteTile(string sessionName, Tile tile) + { + await Clients.Group(sessionName).DeleteTile(tile); + } + + public async Task DeleteWall(string sessionName, Wall tile) + { + await Clients.Group(sessionName).DeleteWall(tile); + } + + public async Task DeleteOverlay(string sessionName, Overlay tile) + { + await Clients.Group(sessionName).DeleteOverlay(tile); + } + + public async Task Ping(string sessionName, Tile location) + { + var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value); + + var user = _dbContext.Users.First(u => u.Id == userId.ToString()); + + var player = new Player { UserId = userId, Initials = user.Initials, Position = new Tile { X = 0, Y = 0 }, Color = UserColors[userId] }; + await Clients.Group(sessionName).Ping(new Ping { X = location.X, Y = location.Y, Player = player }); + } + + public async Task JoinSession(Guid mapId) + { + var session = _dbContext.Sessions.FirstOrDefault(s => s.SessionId == mapId); + + var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value); + + if (session != null) + { + var userSession = new SessionUser { SessionId = session.SessionId, UserId = userId }; + _dbContext.SessionUsers.Add(userSession); + await _dbContext.SaveChangesAsync(); + await Groups.AddToGroupAsync(Context.ConnectionId, session.SessionId.ToString()); + var user = _dbContext.Users.First(u => u.Id == userId.ToString()); + + var player = new Player { UserId = userId, Initials = user.Initials, Position = new Tile { X = 0, Y = 0 }, Color = UserColors[userId] }; + + await Clients.Group(session.SessionId.ToString()).NewPlayer(player); + await Clients.Group(session.SessionId.ToString()).RefreshPlayers(); + + + + return true; + } + else + { + return false; + } + } + + //public async Task UpdatePosition(string sessionName, int sessionId, Tile tile) + //{ + // //var userId = int.Parse(Context.User.Identity.Name); + // //var SessionUsers = _dbContext.SessionUsers.Where(m => m.SessionId == sessionId).OrderBy(m => m.UserId).ToList(); + // //var user = _dbContext.Users.First(u => u.Id == Context.User.Identity.Name); + // //var player = new Player { UserId = userId, Initials = user.Initials, Position = tile, Color = UserColors[userId] }; + // //await Clients.Group(sessionName).PlayerUpdate(player); + //} + + public async Task UpdatePosition(string sessionName, Guid sessionId, Tile tile) + { + var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value); + var sessionUsers = _dbContext.SessionUsers.Where(m => m.SessionId == sessionId).OrderBy(m => m.UserId).ToList(); + var user = _dbContext.Users.First(u => u.Id == userId.ToString()); + var player = new Player { UserId = userId, Initials = user.Initials, Position = tile, Color = UserColors[userId] }; + await Clients.Group(sessionId.ToString()).PlayerUpdate(player); + } + + public override async Task OnConnectedAsync() + { + var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value); + var userConnection = new UserConnection { ConnectionId = Context.ConnectionId, UserId = userId }; + _dbContext.UserConnections.Add(userConnection); + await _dbContext.SaveChangesAsync(); + var availableColor = Colors.First(m => !UserColors.Values.Contains(m)); + UserColors.AddOrUpdate(userId, availableColor, (key, oldValue) => availableColor); + await base.OnConnectedAsync(); + } + + public override async Task OnDisconnectedAsync(Exception exception) + { + var userConnection = _dbContext.UserConnections.FirstOrDefault(m => m.ConnectionId == Context.ConnectionId); + if (userConnection != null) + { + var userId = userConnection.UserId; + + _dbContext.UserConnections.Remove(userConnection); + + var userSessions = _dbContext.SessionUsers.Where(m => m.UserId == userId).ToList(); + { + foreach (var userSession in userSessions) + { + var session = _dbContext.Sessions.FirstOrDefault(m => m.SessionId == userSession.SessionId); + + await Clients.Group(session.SessionName).RemovePlayer(new Player { UserId = userId }); //send remove player + _dbContext.SessionUsers.Remove(userSession); + } + } + await _dbContext.SaveChangesAsync(); + + await base.OnDisconnectedAsync(exception); + } + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Infrastructure/Data/SledgemapperDbContext.cs b/Sledgemapper.Api/Infrastructure/Data/SledgemapperDbContext.cs new file mode 100644 index 0000000..265d446 --- /dev/null +++ b/Sledgemapper.Api/Infrastructure/Data/SledgemapperDbContext.cs @@ -0,0 +1,94 @@ +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Sledgemapper.Api.Core.Entities; + +namespace Sledgemapper.Api.Infrastructure.Data +{ + // public static class DbInitializer + // { + // public static void Initialize(SledgemapperDbContext context) + // { + // context.Database.EnsureCreated(); + // } + // } + + public class SledgemapperDbContext : IdentityDbContext + { + public DbSet Campaigns { get; set; } + public DbSet MapLogs { get; set; } + public DbSet Maps { get; set; } + public DbSet Sessions { get; set; } + public DbSet SessionUsers { get; set; } + public DbSet Snapshots { get; set; } + public DbSet Users { get; set; } + public DbSet UserConnections { get; set; } + + public SledgemapperDbContext(DbContextOptions options) : base(options) + { + + } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + // optionsBuilder. + // options.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName); + // optionsBuilder.UseSqlite("Filename=SledgemapperDatabase.db", options => + // { + // options.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName); + // }); + + optionsBuilder.UseSqlite("Filename=Sledgemapper.db").UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); + + base.OnConfiguring(optionsBuilder); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity().HasOne(e=>e.Owner); + +modelBuilder.Entity().HasMany(e=>e.InvitedUsers).WithMany(e=>e.Campaigns); + + modelBuilder.Entity() //Use your application user class here + .ToTable( "Users" ); //Set the table name here + + // // Map table names + // modelBuilder.Entity().ToTable("MapLog", "dbo"); + // modelBuilder.Entity(entity => + // { + // entity.HasKey(e => e.MapLogId); + // }); + + // modelBuilder.Entity().ToTable("Session", "dbo"); + // modelBuilder.Entity(entity => + // { + // entity.HasKey(e => e.SessionId); + // entity.HasIndex(e => e.SessionName).IsUnique(); + // }); + + + // modelBuilder.Entity().ToTable("UserConnection", "dbo"); + // modelBuilder.Entity(entity => + // { + // entity.HasKey(e => e.UserConnectionId); + // entity.HasIndex(e => e.UserId); + + // }); + + // modelBuilder.Entity().ToTable("SessionUser", "dbo"); + // modelBuilder.Entity(entity => + // { + // entity.HasKey(e => e.SessionUserId); + // entity.HasIndex(e => e.SessionId); + + // }); + + // modelBuilder.Entity().ToTable("Snapshot", "dbo"); + // modelBuilder.Entity(entity => + // { + // entity.HasKey(e => e.SnapshotId); + // }); + + base.OnModelCreating(modelBuilder); + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/JwtConfig.cs b/Sledgemapper.Api/JwtConfig.cs new file mode 100644 index 0000000..7c5c5c4 --- /dev/null +++ b/Sledgemapper.Api/JwtConfig.cs @@ -0,0 +1,7 @@ +namespace Sledgemapper.Api +{ + public class JwtConfig + { + public string Secret { get; set; } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/LICENSE b/Sledgemapper.Api/LICENSE new file mode 100644 index 0000000..26242bb --- /dev/null +++ b/Sledgemapper.Api/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2019 Jason Watmore + +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/Sledgemapper.Api/Migrations/20210219223114_InitialCreate.Designer.cs b/Sledgemapper.Api/Migrations/20210219223114_InitialCreate.Designer.cs new file mode 100644 index 0000000..fc87031 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210219223114_InitialCreate.Designer.cs @@ -0,0 +1,258 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210219223114_InitialCreate")] + partial class InitialCreate + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.3"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("INTEGER"); + + b.Property("InvitedUsersId") + .HasColumnType("INTEGER"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("INTEGER"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.HasIndex("CampaignId"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("OwnerUserId") + .HasColumnType("INTEGER"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("BLOB"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.Property("Username") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210219223114_InitialCreate.cs b/Sledgemapper.Api/Migrations/20210219223114_InitialCreate.cs new file mode 100644 index 0000000..81e0648 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210219223114_InitialCreate.cs @@ -0,0 +1,218 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class InitialCreate : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "MapLogs", + columns: table => new + { + MapLogId = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + UserId = table.Column(type: "INTEGER", nullable: false), + SessionId = table.Column(type: "INTEGER", nullable: false), + Operation = table.Column(type: "TEXT", maxLength: 1, nullable: false), + Type = table.Column(type: "TEXT", maxLength: 256, nullable: false), + Object = table.Column(type: "TEXT", maxLength: 256, nullable: false), + Timestamp = table.Column(type: "REAL", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_MapLogs", x => x.MapLogId); + }); + + migrationBuilder.CreateTable( + name: "Sessions", + columns: table => new + { + SessionId = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + SessionName = table.Column(type: "TEXT", nullable: false), + OwnerUserId = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Sessions", x => x.SessionId); + }); + + migrationBuilder.CreateTable( + name: "SessionUsers", + columns: table => new + { + SessionUserId = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + SessionId = table.Column(type: "INTEGER", nullable: false), + UserId = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SessionUsers", x => x.SessionUserId); + }); + + migrationBuilder.CreateTable( + name: "Snapshots", + columns: table => new + { + SnapshotId = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + SessionId = table.Column(type: "INTEGER", nullable: false), + Object = table.Column(type: "TEXT", nullable: false), + Timestamp = table.Column(type: "REAL", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Snapshots", x => x.SnapshotId); + }); + + migrationBuilder.CreateTable( + name: "UserConnections", + columns: table => new + { + UserConnectionId = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + UserId = table.Column(type: "INTEGER", nullable: false), + ConnectionId = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserConnections", x => x.UserConnectionId); + }); + + migrationBuilder.CreateTable( + name: "Users", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + FirstName = table.Column(type: "TEXT", nullable: true), + LastName = table.Column(type: "TEXT", nullable: true), + Username = table.Column(type: "TEXT", nullable: true), + Initials = table.Column(type: "TEXT", nullable: true), + PasswordHash = table.Column(type: "BLOB", nullable: true), + PasswordSalt = table.Column(type: "BLOB", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Users", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Campaigns", + columns: table => new + { + CampaignId = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + CampaignName = table.Column(type: "TEXT", nullable: true), + OwnerId = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Campaigns", x => x.CampaignId); + table.ForeignKey( + name: "FK_Campaigns_Users_OwnerId", + column: x => x.OwnerId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "CampaignUser", + columns: table => new + { + CampaignsCampaignId = table.Column(type: "INTEGER", nullable: false), + InvitedUsersId = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CampaignUser", x => new { x.CampaignsCampaignId, x.InvitedUsersId }); + table.ForeignKey( + name: "FK_CampaignUser_Campaigns_CampaignsCampaignId", + column: x => x.CampaignsCampaignId, + principalTable: "Campaigns", + principalColumn: "CampaignId", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CampaignUser_Users_InvitedUsersId", + column: x => x.InvitedUsersId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Maps", + columns: table => new + { + MapId = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + MapName = table.Column(type: "TEXT", nullable: false), + CampaignId = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Maps", x => x.MapId); + table.ForeignKey( + name: "FK_Maps_Campaigns_CampaignId", + column: x => x.CampaignId, + principalTable: "Campaigns", + principalColumn: "CampaignId", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Campaigns_CampaignName_OwnerId", + table: "Campaigns", + columns: new[] { "CampaignName", "OwnerId" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Campaigns_OwnerId", + table: "Campaigns", + column: "OwnerId"); + + migrationBuilder.CreateIndex( + name: "IX_CampaignUser_InvitedUsersId", + table: "CampaignUser", + column: "InvitedUsersId"); + + migrationBuilder.CreateIndex( + name: "IX_Maps_CampaignId", + table: "Maps", + column: "CampaignId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CampaignUser"); + + migrationBuilder.DropTable( + name: "MapLogs"); + + migrationBuilder.DropTable( + name: "Maps"); + + migrationBuilder.DropTable( + name: "Sessions"); + + migrationBuilder.DropTable( + name: "SessionUsers"); + + migrationBuilder.DropTable( + name: "Snapshots"); + + migrationBuilder.DropTable( + name: "UserConnections"); + + migrationBuilder.DropTable( + name: "Campaigns"); + + migrationBuilder.DropTable( + name: "Users"); + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210219223251_Adding authentication to our Api.Designer.cs b/Sledgemapper.Api/Migrations/20210219223251_Adding authentication to our Api.Designer.cs new file mode 100644 index 0000000..faeeb8c --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210219223251_Adding authentication to our Api.Designer.cs @@ -0,0 +1,258 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210219223251_Adding authentication to our Api")] + partial class AddingauthenticationtoourApi + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.3"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("INTEGER"); + + b.Property("InvitedUsersId") + .HasColumnType("INTEGER"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("INTEGER"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.HasIndex("CampaignId"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("OwnerUserId") + .HasColumnType("INTEGER"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("BLOB"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.Property("Username") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210219223251_Adding authentication to our Api.cs b/Sledgemapper.Api/Migrations/20210219223251_Adding authentication to our Api.cs new file mode 100644 index 0000000..79e5c82 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210219223251_Adding authentication to our Api.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class AddingauthenticationtoourApi : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210219230948_rename table.Designer.cs b/Sledgemapper.Api/Migrations/20210219230948_rename table.Designer.cs new file mode 100644 index 0000000..d16b294 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210219230948_rename table.Designer.cs @@ -0,0 +1,505 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210219230948_rename table")] + partial class renametable + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.3"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("INTEGER"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.HasIndex("CampaignId"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("OwnerUserId") + .HasColumnType("INTEGER"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.Property("Username") + .HasColumnType("TEXT"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210219230948_rename table.cs b/Sledgemapper.Api/Migrations/20210219230948_rename table.cs new file mode 100644 index 0000000..ac5f815 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210219230948_rename table.cs @@ -0,0 +1,315 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class renametable : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Campaigns_Users_OwnerId", + table: "Campaigns"); + + migrationBuilder.DropColumn( + name: "PasswordHash", + table: "Users"); + + migrationBuilder.AlterColumn( + name: "Id", + table: "Users", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER") + .OldAnnotation("Sqlite:Autoincrement", true); + + migrationBuilder.AlterColumn( + name: "InvitedUsersId", + table: "CampaignUser", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + + migrationBuilder.AlterColumn( + name: "OwnerId", + table: "Campaigns", + type: "TEXT", + nullable: true, + oldClrType: typeof(int), + oldType: "INTEGER"); + + migrationBuilder.CreateTable( + name: "AspNetRoles", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + Name = table.Column(type: "TEXT", maxLength: 256, nullable: true), + NormalizedName = table.Column(type: "TEXT", maxLength: 256, nullable: true), + ConcurrencyStamp = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetUsers", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + UserName = table.Column(type: "TEXT", maxLength: 256, nullable: true), + NormalizedUserName = table.Column(type: "TEXT", maxLength: 256, nullable: true), + Email = table.Column(type: "TEXT", maxLength: 256, nullable: true), + NormalizedEmail = table.Column(type: "TEXT", maxLength: 256, nullable: true), + EmailConfirmed = table.Column(type: "INTEGER", nullable: false), + PasswordHash = table.Column(type: "TEXT", nullable: true), + SecurityStamp = table.Column(type: "TEXT", nullable: true), + ConcurrencyStamp = table.Column(type: "TEXT", nullable: true), + PhoneNumber = table.Column(type: "TEXT", nullable: true), + PhoneNumberConfirmed = table.Column(type: "INTEGER", nullable: false), + TwoFactorEnabled = table.Column(type: "INTEGER", nullable: false), + LockoutEnd = table.Column(type: "TEXT", nullable: true), + LockoutEnabled = table.Column(type: "INTEGER", nullable: false), + AccessFailedCount = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetRoleClaims", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + RoleId = table.Column(type: "TEXT", nullable: false), + ClaimType = table.Column(type: "TEXT", nullable: true), + ClaimValue = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserClaims", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + UserId = table.Column(type: "TEXT", nullable: false), + ClaimType = table.Column(type: "TEXT", nullable: true), + ClaimValue = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetUserClaims_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserLogins", + columns: table => new + { + LoginProvider = table.Column(type: "TEXT", maxLength: 128, nullable: false), + ProviderKey = table.Column(type: "TEXT", maxLength: 128, nullable: false), + ProviderDisplayName = table.Column(type: "TEXT", nullable: true), + UserId = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); + table.ForeignKey( + name: "FK_AspNetUserLogins_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserRoles", + columns: table => new + { + UserId = table.Column(type: "TEXT", nullable: false), + RoleId = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserTokens", + columns: table => new + { + UserId = table.Column(type: "TEXT", nullable: false), + LoginProvider = table.Column(type: "TEXT", maxLength: 128, nullable: false), + Name = table.Column(type: "TEXT", maxLength: 128, nullable: false), + Value = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AspNetUserTokens_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_AspNetRoleClaims_RoleId", + table: "AspNetRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "RoleNameIndex", + table: "AspNetRoles", + column: "NormalizedName", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserClaims_UserId", + table: "AspNetUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserLogins_UserId", + table: "AspNetUserLogins", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserRoles_RoleId", + table: "AspNetUserRoles", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "EmailIndex", + table: "AspNetUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "UserNameIndex", + table: "AspNetUsers", + column: "NormalizedUserName", + unique: true); + + migrationBuilder.AddForeignKey( + name: "FK_Campaigns_Users_OwnerId", + table: "Campaigns", + column: "OwnerId", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Users_AspNetUsers_Id", + table: "Users", + column: "Id", + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Campaigns_Users_OwnerId", + table: "Campaigns"); + + migrationBuilder.DropForeignKey( + name: "FK_Users_AspNetUsers_Id", + table: "Users"); + + migrationBuilder.DropTable( + name: "AspNetRoleClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserLogins"); + + migrationBuilder.DropTable( + name: "AspNetUserRoles"); + + migrationBuilder.DropTable( + name: "AspNetUserTokens"); + + migrationBuilder.DropTable( + name: "AspNetRoles"); + + migrationBuilder.DropTable( + name: "AspNetUsers"); + + migrationBuilder.AlterColumn( + name: "Id", + table: "Users", + type: "INTEGER", + nullable: false, + oldClrType: typeof(string), + oldType: "TEXT") + .Annotation("Sqlite:Autoincrement", true); + + migrationBuilder.AddColumn( + name: "PasswordHash", + table: "Users", + type: "BLOB", + nullable: true); + + migrationBuilder.AlterColumn( + name: "InvitedUsersId", + table: "CampaignUser", + type: "INTEGER", + nullable: false, + oldClrType: typeof(string), + oldType: "TEXT"); + + migrationBuilder.AlterColumn( + name: "OwnerId", + table: "Campaigns", + type: "INTEGER", + nullable: false, + defaultValue: 0, + oldClrType: typeof(string), + oldType: "TEXT", + oldNullable: true); + + migrationBuilder.AddForeignKey( + name: "FK_Campaigns_Users_OwnerId", + table: "Campaigns", + column: "OwnerId", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210528182730_ChangeCompanyId.Designer.cs b/Sledgemapper.Api/Migrations/20210528182730_ChangeCompanyId.Designer.cs new file mode 100644 index 0000000..abbac2c --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210528182730_ChangeCompanyId.Designer.cs @@ -0,0 +1,503 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210528182730_ChangeCompanyId")] + partial class ChangeCompanyId + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.6"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("TEXT"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("CampaignId1") + .HasColumnType("TEXT"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.HasIndex("CampaignId1"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("OwnerUserId") + .HasColumnType("INTEGER"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId1"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210528182730_ChangeCompanyId.cs b/Sledgemapper.Api/Migrations/20210528182730_ChangeCompanyId.cs new file mode 100644 index 0000000..b56d87e --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210528182730_ChangeCompanyId.cs @@ -0,0 +1,110 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class ChangeCompanyId : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Maps_Campaigns_CampaignId", + table: "Maps"); + + migrationBuilder.DropIndex( + name: "IX_Maps_CampaignId", + table: "Maps"); + + migrationBuilder.DropColumn( + name: "Username", + table: "Users"); + + migrationBuilder.AddColumn( + name: "CampaignId1", + table: "Maps", + type: "TEXT", + nullable: true); + + migrationBuilder.AlterColumn( + name: "CampaignsCampaignId", + table: "CampaignUser", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + + migrationBuilder.AlterColumn( + name: "CampaignId", + table: "Campaigns", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER") + .OldAnnotation("Sqlite:Autoincrement", true); + + migrationBuilder.CreateIndex( + name: "IX_Maps_CampaignId1", + table: "Maps", + column: "CampaignId1"); + + migrationBuilder.AddForeignKey( + name: "FK_Maps_Campaigns_CampaignId1", + table: "Maps", + column: "CampaignId1", + principalTable: "Campaigns", + principalColumn: "CampaignId", + onDelete: ReferentialAction.Restrict); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Maps_Campaigns_CampaignId1", + table: "Maps"); + + migrationBuilder.DropIndex( + name: "IX_Maps_CampaignId1", + table: "Maps"); + + migrationBuilder.DropColumn( + name: "CampaignId1", + table: "Maps"); + + migrationBuilder.AddColumn( + name: "Username", + table: "Users", + type: "TEXT", + nullable: true); + + migrationBuilder.AlterColumn( + name: "CampaignsCampaignId", + table: "CampaignUser", + type: "INTEGER", + nullable: false, + oldClrType: typeof(Guid), + oldType: "TEXT"); + + migrationBuilder.AlterColumn( + name: "CampaignId", + table: "Campaigns", + type: "INTEGER", + nullable: false, + oldClrType: typeof(Guid), + oldType: "TEXT") + .Annotation("Sqlite:Autoincrement", true); + + migrationBuilder.CreateIndex( + name: "IX_Maps_CampaignId", + table: "Maps", + column: "CampaignId"); + + migrationBuilder.AddForeignKey( + name: "FK_Maps_Campaigns_CampaignId", + table: "Maps", + column: "CampaignId", + principalTable: "Campaigns", + principalColumn: "CampaignId", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210830220131_AddCampaignToMap.Designer.cs b/Sledgemapper.Api/Migrations/20210830220131_AddCampaignToMap.Designer.cs new file mode 100644 index 0000000..e1365d5 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210830220131_AddCampaignToMap.Designer.cs @@ -0,0 +1,506 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210830220131_AddCampaignToMap")] + partial class AddCampaignToMap + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.6"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("TEXT"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("CampaignId1") + .HasColumnType("TEXT"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.HasIndex("CampaignId1"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("OwnerUserId") + .HasColumnType("INTEGER"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId1"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210830220131_AddCampaignToMap.cs b/Sledgemapper.Api/Migrations/20210830220131_AddCampaignToMap.cs new file mode 100644 index 0000000..2bd6cf7 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210830220131_AddCampaignToMap.cs @@ -0,0 +1,24 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class AddCampaignToMap : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "CampaignId", + table: "Sessions", + type: "INTEGER", + nullable: false, + defaultValue: 0); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "CampaignId", + table: "Sessions"); + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210830220730_AddCampaignToMapGuid.Designer.cs b/Sledgemapper.Api/Migrations/20210830220730_AddCampaignToMapGuid.Designer.cs new file mode 100644 index 0000000..ebd924b --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210830220730_AddCampaignToMapGuid.Designer.cs @@ -0,0 +1,506 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210830220730_AddCampaignToMapGuid")] + partial class AddCampaignToMapGuid + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.6"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("TEXT"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("CampaignId1") + .HasColumnType("TEXT"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.HasIndex("CampaignId1"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("TEXT"); + + b.Property("OwnerUserId") + .HasColumnType("INTEGER"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId1"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210830220730_AddCampaignToMapGuid.cs b/Sledgemapper.Api/Migrations/20210830220730_AddCampaignToMapGuid.cs new file mode 100644 index 0000000..761e2b9 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210830220730_AddCampaignToMapGuid.cs @@ -0,0 +1,30 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class AddCampaignToMapGuid : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "CampaignId", + table: "Sessions", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "CampaignId", + table: "Sessions", + type: "INTEGER", + nullable: false, + oldClrType: typeof(Guid), + oldType: "TEXT"); + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210830222316_StringUserId.Designer.cs b/Sledgemapper.Api/Migrations/20210830222316_StringUserId.Designer.cs new file mode 100644 index 0000000..5376de8 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210830222316_StringUserId.Designer.cs @@ -0,0 +1,508 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210830222316_StringUserId")] + partial class StringUserId + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.6"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("TEXT"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("CampaignId1") + .HasColumnType("TEXT"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.HasIndex("CampaignId1"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("TEXT"); + + b.Property("OwnerUserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId1"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210830222316_StringUserId.cs b/Sledgemapper.Api/Migrations/20210830222316_StringUserId.cs new file mode 100644 index 0000000..d3bb947 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210830222316_StringUserId.cs @@ -0,0 +1,45 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class StringUserId : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "OwnerUserId", + table: "Sessions", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + + migrationBuilder.AlterColumn( + name: "UserId", + table: "MapLogs", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "OwnerUserId", + table: "Sessions", + type: "INTEGER", + nullable: false, + oldClrType: typeof(string), + oldType: "TEXT"); + + migrationBuilder.AlterColumn( + name: "UserId", + table: "MapLogs", + type: "INTEGER", + nullable: false, + oldClrType: typeof(string), + oldType: "TEXT"); + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210901220553_renameMapToSession.Designer.cs b/Sledgemapper.Api/Migrations/20210901220553_renameMapToSession.Designer.cs new file mode 100644 index 0000000..1546417 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210901220553_renameMapToSession.Designer.cs @@ -0,0 +1,507 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210901220553_renameMapToSession")] + partial class renameMapToSession + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.6"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("TEXT"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("TEXT"); + + b.Property("OwnerUserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.HasIndex("CampaignId"); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210901220553_renameMapToSession.cs b/Sledgemapper.Api/Migrations/20210901220553_renameMapToSession.cs new file mode 100644 index 0000000..d40e21f --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210901220553_renameMapToSession.cs @@ -0,0 +1,66 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class renameMapToSession : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Maps_Campaigns_CampaignId1", + table: "Maps"); + + migrationBuilder.DropIndex( + name: "IX_Maps_CampaignId1", + table: "Maps"); + + migrationBuilder.DropColumn( + name: "CampaignId1", + table: "Maps"); + + migrationBuilder.CreateIndex( + name: "IX_Sessions_CampaignId", + table: "Sessions", + column: "CampaignId"); + + migrationBuilder.AddForeignKey( + name: "FK_Sessions_Campaigns_CampaignId", + table: "Sessions", + column: "CampaignId", + principalTable: "Campaigns", + principalColumn: "CampaignId", + onDelete: ReferentialAction.Cascade); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Sessions_Campaigns_CampaignId", + table: "Sessions"); + + migrationBuilder.DropIndex( + name: "IX_Sessions_CampaignId", + table: "Sessions"); + + migrationBuilder.AddColumn( + name: "CampaignId1", + table: "Maps", + type: "TEXT", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_Maps_CampaignId1", + table: "Maps", + column: "CampaignId1"); + + migrationBuilder.AddForeignKey( + name: "FK_Maps_Campaigns_CampaignId1", + table: "Maps", + column: "CampaignId1", + principalTable: "Campaigns", + principalColumn: "CampaignId", + onDelete: ReferentialAction.Restrict); + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210901223606_uniquesessionindex.Designer.cs b/Sledgemapper.Api/Migrations/20210901223606_uniquesessionindex.Designer.cs new file mode 100644 index 0000000..6eed562 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210901223606_uniquesessionindex.Designer.cs @@ -0,0 +1,508 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210901223606_uniquesessionindex")] + partial class uniquesessionindex + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.6"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("TEXT"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("TEXT"); + + b.Property("OwnerUserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.HasIndex("CampaignId", "SessionId") + .IsUnique(); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210901223606_uniquesessionindex.cs b/Sledgemapper.Api/Migrations/20210901223606_uniquesessionindex.cs new file mode 100644 index 0000000..e56f5ae --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210901223606_uniquesessionindex.cs @@ -0,0 +1,32 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class uniquesessionindex : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_Sessions_CampaignId", + table: "Sessions"); + + migrationBuilder.CreateIndex( + name: "IX_Sessions_CampaignId_SessionId", + table: "Sessions", + columns: new[] { "CampaignId", "SessionId" }, + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_Sessions_CampaignId_SessionId", + table: "Sessions"); + + migrationBuilder.CreateIndex( + name: "IX_Sessions_CampaignId", + table: "Sessions", + column: "CampaignId"); + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210901224103_uniquesessionnameindex.Designer.cs b/Sledgemapper.Api/Migrations/20210901224103_uniquesessionnameindex.Designer.cs new file mode 100644 index 0000000..0d469c7 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210901224103_uniquesessionnameindex.Designer.cs @@ -0,0 +1,508 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210901224103_uniquesessionnameindex")] + partial class uniquesessionnameindex + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.6"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("TEXT"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("TEXT"); + + b.Property("OwnerUserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.HasIndex("CampaignId", "SessionName") + .IsUnique(); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("INTEGER"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210901224103_uniquesessionnameindex.cs b/Sledgemapper.Api/Migrations/20210901224103_uniquesessionnameindex.cs new file mode 100644 index 0000000..3dc4508 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210901224103_uniquesessionnameindex.cs @@ -0,0 +1,33 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class uniquesessionnameindex : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_Sessions_CampaignId_SessionId", + table: "Sessions"); + + migrationBuilder.CreateIndex( + name: "IX_Sessions_CampaignId_SessionName", + table: "Sessions", + columns: new[] { "CampaignId", "SessionName" }, + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_Sessions_CampaignId_SessionName", + table: "Sessions"); + + migrationBuilder.CreateIndex( + name: "IX_Sessions_CampaignId_SessionId", + table: "Sessions", + columns: new[] { "CampaignId", "SessionId" }, + unique: true); + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210916154553_SessionIdToGuid.Designer.cs b/Sledgemapper.Api/Migrations/20210916154553_SessionIdToGuid.Designer.cs new file mode 100644 index 0000000..1b1ec88 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210916154553_SessionIdToGuid.Designer.cs @@ -0,0 +1,508 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210916154553_SessionIdToGuid")] + partial class SessionIdToGuid + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.6"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("TEXT"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignId") + .HasColumnType("TEXT"); + + b.Property("OwnerUserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.HasIndex("CampaignId", "SessionName") + .IsUnique(); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210916154553_SessionIdToGuid.cs b/Sledgemapper.Api/Migrations/20210916154553_SessionIdToGuid.cs new file mode 100644 index 0000000..7d7fcca --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210916154553_SessionIdToGuid.cs @@ -0,0 +1,80 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class SessionIdToGuid : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "SessionId", + table: "Snapshots", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + + migrationBuilder.AlterColumn( + name: "SessionId", + table: "SessionUsers", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + + migrationBuilder.AlterColumn( + name: "SessionId", + table: "Sessions", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER") + .OldAnnotation("Sqlite:Autoincrement", true); + + migrationBuilder.AlterColumn( + name: "SessionId", + table: "MapLogs", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "SessionId", + table: "Snapshots", + type: "INTEGER", + nullable: false, + oldClrType: typeof(Guid), + oldType: "TEXT"); + + migrationBuilder.AlterColumn( + name: "SessionId", + table: "SessionUsers", + type: "INTEGER", + nullable: false, + oldClrType: typeof(Guid), + oldType: "TEXT"); + + migrationBuilder.AlterColumn( + name: "SessionId", + table: "Sessions", + type: "INTEGER", + nullable: false, + oldClrType: typeof(Guid), + oldType: "TEXT") + .Annotation("Sqlite:Autoincrement", true); + + migrationBuilder.AlterColumn( + name: "SessionId", + table: "MapLogs", + type: "INTEGER", + nullable: false, + oldClrType: typeof(Guid), + oldType: "TEXT"); + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210917091001_SessionIdToGuidAuto.Designer.cs b/Sledgemapper.Api/Migrations/20210917091001_SessionIdToGuidAuto.Designer.cs new file mode 100644 index 0000000..78a2012 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210917091001_SessionIdToGuidAuto.Designer.cs @@ -0,0 +1,508 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210917091001_SessionIdToGuidAuto")] + partial class SessionIdToGuidAuto + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.6"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("TEXT"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignId") + .HasColumnType("TEXT"); + + b.Property("OwnerUserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.HasIndex("CampaignId", "SessionName") + .IsUnique(); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210917091001_SessionIdToGuidAuto.cs b/Sledgemapper.Api/Migrations/20210917091001_SessionIdToGuidAuto.cs new file mode 100644 index 0000000..25382c0 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210917091001_SessionIdToGuidAuto.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class SessionIdToGuidAuto : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210917112525_UserIdGuid.Designer.cs b/Sledgemapper.Api/Migrations/20210917112525_UserIdGuid.Designer.cs new file mode 100644 index 0000000..6f3ecc9 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210917112525_UserIdGuid.Designer.cs @@ -0,0 +1,508 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + [Migration("20210917112525_UserIdGuid")] + partial class UserIdGuid + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.6"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("TEXT"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignId") + .HasColumnType("TEXT"); + + b.Property("OwnerUserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.HasIndex("CampaignId", "SessionName") + .IsUnique(); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("TEXT"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("TEXT"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Migrations/20210917112525_UserIdGuid.cs b/Sledgemapper.Api/Migrations/20210917112525_UserIdGuid.cs new file mode 100644 index 0000000..4a28622 --- /dev/null +++ b/Sledgemapper.Api/Migrations/20210917112525_UserIdGuid.cs @@ -0,0 +1,46 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Sledgemapper.Api.Migrations +{ + public partial class UserIdGuid : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "UserId", + table: "UserConnections", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + + migrationBuilder.AlterColumn( + name: "UserId", + table: "SessionUsers", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "UserId", + table: "UserConnections", + type: "INTEGER", + nullable: false, + oldClrType: typeof(Guid), + oldType: "TEXT"); + + migrationBuilder.AlterColumn( + name: "UserId", + table: "SessionUsers", + type: "INTEGER", + nullable: false, + oldClrType: typeof(Guid), + oldType: "TEXT"); + } + } +} diff --git a/Sledgemapper.Api/Migrations/SledgemapperDbContextModelSnapshot.cs b/Sledgemapper.Api/Migrations/SledgemapperDbContextModelSnapshot.cs new file mode 100644 index 0000000..a477060 --- /dev/null +++ b/Sledgemapper.Api/Migrations/SledgemapperDbContextModelSnapshot.cs @@ -0,0 +1,506 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api.Migrations +{ + [DbContext(typeof(SledgemapperDbContext))] + partial class SledgemapperDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.6"); + + modelBuilder.Entity("CampaignUser", b => + { + b.Property("CampaignsCampaignId") + .HasColumnType("TEXT"); + + b.Property("InvitedUsersId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignsCampaignId", "InvitedUsersId"); + + b.HasIndex("InvitedUsersId"); + + b.ToTable("CampaignUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Property("CampaignId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignName") + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("TEXT"); + + b.HasKey("CampaignId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("CampaignName", "OwnerId") + .IsUnique(); + + b.ToTable("Campaigns"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Map", b => + { + b.Property("MapId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CampaignId") + .HasColumnType("INTEGER"); + + b.Property("MapName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapId"); + + b.ToTable("Maps"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.MapLog", b => + { + b.Property("MapLogId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Operation") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("MapLogId"); + + b.ToTable("MapLogs"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.Property("SessionId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CampaignId") + .HasColumnType("TEXT"); + + b.Property("OwnerUserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("SessionId"); + + b.HasIndex("CampaignId", "SessionName") + .IsUnique(); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.SessionUser", b => + { + b.Property("SessionUserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("TEXT"); + + b.HasKey("SessionUserId"); + + b.ToTable("SessionUsers"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Snapshot", b => + { + b.Property("SnapshotId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Object") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SessionId") + .HasColumnType("TEXT"); + + b.Property("Timestamp") + .HasColumnType("REAL"); + + b.HasKey("SnapshotId"); + + b.ToTable("Snapshots"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.UserConnection", b => + { + b.Property("UserConnectionId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConnectionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("TEXT"); + + b.HasKey("UserConnectionId"); + + b.ToTable("UserConnections"); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("FirstName") + .HasColumnType("TEXT"); + + b.Property("Initials") + .HasColumnType("TEXT"); + + b.Property("LastName") + .HasColumnType("TEXT"); + + b.Property("PasswordSalt") + .HasColumnType("BLOB"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CampaignUser", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany() + .HasForeignKey("CampaignsCampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Sledgemapper.Entities.User", null) + .WithMany() + .HasForeignKey("InvitedUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.HasOne("Sledgemapper.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Sledgemapper.Api.Models.Session", b => + { + b.HasOne("Sledgemapper.Api.Core.Entities.Campaign", null) + .WithMany("Maps") + .HasForeignKey("CampaignId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Entities.User", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithOne() + .HasForeignKey("Sledgemapper.Entities.User", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Sledgemapper.Api.Core.Entities.Campaign", b => + { + b.Navigation("Maps"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sledgemapper.Api/Models/AuthResult.cs b/Sledgemapper.Api/Models/AuthResult.cs new file mode 100644 index 0000000..cf42c6a --- /dev/null +++ b/Sledgemapper.Api/Models/AuthResult.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace Sledgemapper.Api.Models +{ + public class AuthResult + { + public string Token { get; set; } + public bool Result { get; set; } + public List Errors { get; set; } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Models/AuthenticateModel.cs b/Sledgemapper.Api/Models/AuthenticateModel.cs new file mode 100644 index 0000000..48e743f --- /dev/null +++ b/Sledgemapper.Api/Models/AuthenticateModel.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; + +namespace Sledgemapper.Api.Models +{ + public class AuthenticateModel + { + [Required] + public string Username { get; set; } + + [Required] + public string Password { get; set; } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Models/LoginResponse.cs b/Sledgemapper.Api/Models/LoginResponse.cs new file mode 100644 index 0000000..03d7fd5 --- /dev/null +++ b/Sledgemapper.Api/Models/LoginResponse.cs @@ -0,0 +1,9 @@ +namespace Sledgemapper.Api.Models +{ + public class LoginResponse : AuthResult + { + public string Username { get; set; } + public string Initials { get; set; } + public string Id { get; internal set; } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Models/RegisterModel.cs b/Sledgemapper.Api/Models/RegisterModel.cs new file mode 100644 index 0000000..646a3f3 --- /dev/null +++ b/Sledgemapper.Api/Models/RegisterModel.cs @@ -0,0 +1,24 @@ +using System.ComponentModel.DataAnnotations; + +namespace Sledgemapper.Api.Models +{ + public class RegisterModel + { + [Required] + public string FirstName { get; set; } + [Required] + public string UserName { get; set; } + + [Required] + public string LastName { get; set; } + + [Required] + public string Email { get; set; } + + [Required] + public string Password { get; set; } + + [Required] + public string Initials { get; set; } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Models/RegistrationResponse.cs b/Sledgemapper.Api/Models/RegistrationResponse.cs new file mode 100644 index 0000000..6f9a61f --- /dev/null +++ b/Sledgemapper.Api/Models/RegistrationResponse.cs @@ -0,0 +1,7 @@ +namespace Sledgemapper.Api.Models +{ + public class RegistrationResponse : AuthResult + { + + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Models/UserLoginRequest.cs b/Sledgemapper.Api/Models/UserLoginRequest.cs new file mode 100644 index 0000000..3a2a152 --- /dev/null +++ b/Sledgemapper.Api/Models/UserLoginRequest.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Sledgemapper.Api.Models +{ + public class UserLoginRequest + { + [Required] + public string Email { get; set; } + [Required] + public string Password { get; set; } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Notifications/BaseNotification.cs b/Sledgemapper.Api/Notifications/BaseNotification.cs new file mode 100644 index 0000000..7786bdf --- /dev/null +++ b/Sledgemapper.Api/Notifications/BaseNotification.cs @@ -0,0 +1,21 @@ +using MediatR; +using System; +using Sledgemapper.Api.Core.Entities; + +namespace Sledgemapper.Api.Notifications +{ + public abstract class BaseNotification : INotification + { + public double Timestamp { get; private set; } + public string UserId { get; private set; } + public int SessionId { get; set; } + public Session Session { get; set; } + + public BaseNotification(Session session, string userId) + { + Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + Session = session; ; + UserId = userId; + } + } +} diff --git a/Sledgemapper.Api/Notifications/DeleteNoteNotification.cs b/Sledgemapper.Api/Notifications/DeleteNoteNotification.cs new file mode 100644 index 0000000..3b5fb5f --- /dev/null +++ b/Sledgemapper.Api/Notifications/DeleteNoteNotification.cs @@ -0,0 +1,15 @@ +using Sledgemapper.Shared.Entities; +using Session = Sledgemapper.Api.Core.Entities.Session; + +namespace Sledgemapper.Api.Notifications +{ + public class DeleteNoteNotification : BaseNotification + { + public Note Note { get; private set; } + + public DeleteNoteNotification(Session session, Note note, string userId) : base(session, userId) + { + Note = note; + } + } +} diff --git a/Sledgemapper.Api/Notifications/DeleteOverlayNotification.cs b/Sledgemapper.Api/Notifications/DeleteOverlayNotification.cs new file mode 100644 index 0000000..d246d94 --- /dev/null +++ b/Sledgemapper.Api/Notifications/DeleteOverlayNotification.cs @@ -0,0 +1,16 @@ +using Sledgemapper.Shared.Entities; +using Session = Sledgemapper.Api.Core.Entities.Session; + + +namespace Sledgemapper.Api.Notifications +{ + public class DeleteOverlayNotification : BaseNotification + { + public Overlay Overlay { get; private set; } + + public DeleteOverlayNotification(Session session, Overlay overlay, string userId) : base(session, userId) + { + Overlay = overlay; + } + } +} diff --git a/Sledgemapper.Api/Notifications/DeleteTileNotification.cs b/Sledgemapper.Api/Notifications/DeleteTileNotification.cs new file mode 100644 index 0000000..7533f9c --- /dev/null +++ b/Sledgemapper.Api/Notifications/DeleteTileNotification.cs @@ -0,0 +1,16 @@ +using Sledgemapper.Shared.Entities; +using Session = Sledgemapper.Api.Core.Entities.Session; + + +namespace Sledgemapper.Api.Notifications +{ + public class DeleteTileNotification : BaseNotification + { + public Tile Tile { get; private set; } + + public DeleteTileNotification(Session session, Tile tile, string userId) : base(session, userId) + { + Tile = tile; + } + } +} diff --git a/Sledgemapper.Api/Notifications/DeleteWallNotification.cs b/Sledgemapper.Api/Notifications/DeleteWallNotification.cs new file mode 100644 index 0000000..ff87cef --- /dev/null +++ b/Sledgemapper.Api/Notifications/DeleteWallNotification.cs @@ -0,0 +1,15 @@ +using Sledgemapper.Shared.Entities; +using Session = Sledgemapper.Api.Core.Entities.Session; + +namespace Sledgemapper.Api.Notifications +{ + public class DeleteWallNotification : BaseNotification + { + public Wall Wall { get; private set; } + + public DeleteWallNotification(Session session, Wall wall, string userId) : base(session, userId) + { + Wall = wall; + } + } +} diff --git a/Sledgemapper.Api/Notifications/NewLineNotification.cs b/Sledgemapper.Api/Notifications/NewLineNotification.cs new file mode 100644 index 0000000..881d866 --- /dev/null +++ b/Sledgemapper.Api/Notifications/NewLineNotification.cs @@ -0,0 +1,16 @@ +using Sledgemapper.Shared.Entities; +using Session = Sledgemapper.Api.Core.Entities.Session; + + +namespace Sledgemapper.Api.Notifications +{ + public class NewLineNotification : BaseNotification + { + public Line Line { get; private set; } + + public NewLineNotification(Session session, Line line, string userId) : base(session, userId) + { + Line = line; + } + } +} diff --git a/Sledgemapper.Api/Notifications/NewNoteNotification.cs b/Sledgemapper.Api/Notifications/NewNoteNotification.cs new file mode 100644 index 0000000..301d2f4 --- /dev/null +++ b/Sledgemapper.Api/Notifications/NewNoteNotification.cs @@ -0,0 +1,15 @@ +using Sledgemapper.Shared.Entities; +using Session = Sledgemapper.Api.Core.Entities.Session; + +namespace Sledgemapper.Api.Notifications +{ + public class NewNoteNotification : BaseNotification + { + public Note Note { get; private set; } + + public NewNoteNotification(Session session, Note note, string userId) : base(session, userId) + { + Note = note; + } + } +} diff --git a/Sledgemapper.Api/Notifications/NewOverlayNotification.cs b/Sledgemapper.Api/Notifications/NewOverlayNotification.cs new file mode 100644 index 0000000..34faef4 --- /dev/null +++ b/Sledgemapper.Api/Notifications/NewOverlayNotification.cs @@ -0,0 +1,15 @@ +using Sledgemapper.Shared.Entities; +using Session = Sledgemapper.Api.Core.Entities.Session; + +namespace Sledgemapper.Api.Notifications +{ + public class NewOverlayNotification : BaseNotification + { + public Overlay Overlay { get; private set; } + + public NewOverlayNotification(Session session, Overlay overlay, string userId) : base(session, userId) + { + Overlay = overlay; + } + } +} diff --git a/Sledgemapper.Api/Notifications/NewRoomNotification.cs b/Sledgemapper.Api/Notifications/NewRoomNotification.cs new file mode 100644 index 0000000..36fb484 --- /dev/null +++ b/Sledgemapper.Api/Notifications/NewRoomNotification.cs @@ -0,0 +1,15 @@ +using Sledgemapper.Shared.Entities; +using Session = Sledgemapper.Api.Core.Entities.Session; + +namespace Sledgemapper.Api.Notifications +{ + public class NewRoomNotification : BaseNotification + { + public Room Room { get; private set; } + + public NewRoomNotification(Session session, Room room, string userId) : base(session, userId) + { + Room = room; + } + } +} diff --git a/Sledgemapper.Api/Notifications/NewSessionNotification.cs b/Sledgemapper.Api/Notifications/NewSessionNotification.cs new file mode 100644 index 0000000..864c923 --- /dev/null +++ b/Sledgemapper.Api/Notifications/NewSessionNotification.cs @@ -0,0 +1,10 @@ +using Sledgemapper.Api.Core.Entities; + +namespace Sledgemapper.Api.Notifications +{ + public class NewSessionNotification : BaseNotification + { + public NewSessionNotification(string sessionName, string userId) : base(new Session { SessionName = sessionName }, userId) + { } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Notifications/NewTileNotification.cs b/Sledgemapper.Api/Notifications/NewTileNotification.cs new file mode 100644 index 0000000..909d677 --- /dev/null +++ b/Sledgemapper.Api/Notifications/NewTileNotification.cs @@ -0,0 +1,16 @@ +using Sledgemapper.Shared.Entities; +using Session = Sledgemapper.Api.Core.Entities.Session; + + +namespace Sledgemapper.Api.Notifications +{ + public class NewTileNotification : BaseNotification + { + public Tile Tile { get; private set; } + + public NewTileNotification(Session session, Tile tile, string userId) : base(session, userId) + { + Tile = tile; + } + } +} diff --git a/Sledgemapper.Api/Notifications/NewWallNotification.cs b/Sledgemapper.Api/Notifications/NewWallNotification.cs new file mode 100644 index 0000000..be092cb --- /dev/null +++ b/Sledgemapper.Api/Notifications/NewWallNotification.cs @@ -0,0 +1,15 @@ +using Sledgemapper.Shared.Entities; +using Session = Sledgemapper.Api.Core.Entities.Session; + +namespace Sledgemapper.Api.Notifications +{ + public class NewWallNotification : BaseNotification + { + public Wall Wall { get; private set; } + + public NewWallNotification(Session session, Wall wall, string userId) : base(session, userId) + { + Wall = wall; + } + } +} diff --git a/Sledgemapper.Api/Notifications/PingNotification.cs b/Sledgemapper.Api/Notifications/PingNotification.cs new file mode 100644 index 0000000..e14c965 --- /dev/null +++ b/Sledgemapper.Api/Notifications/PingNotification.cs @@ -0,0 +1,14 @@ +// using Sledgemapper.Shared.Entities; + +// namespace Sledgemapper.Api.Notifications +// { +// public class PingNotification : BaseNotification +// { +// public Ping Location { get; private set; } + +// public PingNotification(Models.Session session, Ping location, int userId) : base(session, userId) +// { +// Location = location; +// } +// } +// } diff --git a/Sledgemapper.Api/Program.cs b/Sledgemapper.Api/Program.cs new file mode 100644 index 0000000..774d2dc --- /dev/null +++ b/Sledgemapper.Api/Program.cs @@ -0,0 +1,51 @@ +using System; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Sledgemapper.Api.Infrastructure.Data; + +namespace Sledgemapper.Api +{ + public class Program + { + public static void Main(string[] args) + { + var host= CreateHostBuilder(args).Build(); + CreateDbIfNotExists(host); + host.Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + + // public static IHostBuilder CreateHostBuilder(string[] args) => + // Host.CreateDefaultBuilder(args) + // .ConfigureWebHostDefaults(webBuilder => + // { + // webBuilder.UseStartup(); + // }); + + private static void CreateDbIfNotExists(IHost host) + { + using (var scope = host.Services.CreateScope()) + { + var services = scope.ServiceProvider; + try + { + var context = services.GetRequiredService(); + // DbInitializer.Initialize(context); + } + catch (Exception ex) + { + var logger = services.GetRequiredService>(); + logger.LogError(ex, "An error occurred creating the DB."); + } + } + } + } +} diff --git a/Sledgemapper.Api/Properties/launchSettings.json b/Sledgemapper.Api/Properties/launchSettings.json new file mode 100644 index 0000000..58adf73 --- /dev/null +++ b/Sledgemapper.Api/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "Development": { + "commandName": "Project", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/README.md b/Sledgemapper.Api/README.md new file mode 100644 index 0000000..4b140af --- /dev/null +++ b/Sledgemapper.Api/README.md @@ -0,0 +1,5 @@ +# aspnet-core-3-registration-login-api + +ASP.NET Core 3.1 - Simple API for User Management, Authentication and Registration + +For documentation and instructions check out https://jasonwatmore.com/post/2019/10/14/aspnet-core-3-simple-api-for-authentication-registration-and-user-management \ No newline at end of file diff --git a/Sledgemapper.Api/Sledgemapper.Api.csproj b/Sledgemapper.Api/Sledgemapper.Api.csproj new file mode 100644 index 0000000..30d003d --- /dev/null +++ b/Sledgemapper.Api/Sledgemapper.Api.csproj @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + net5.0 + + + diff --git a/Sledgemapper.Api/Startup.cs b/Sledgemapper.Api/Startup.cs new file mode 100644 index 0000000..84bf827 --- /dev/null +++ b/Sledgemapper.Api/Startup.cs @@ -0,0 +1,143 @@ +using System; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Sledgemapper.Api.Infrastructure.Data; +using Microsoft.EntityFrameworkCore; +using MediatR; +using Microsoft.IdentityModel.Tokens; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using System.Text; +using Sledgemapper.Api.Hubs; +using Microsoft.OpenApi.Models; +using Newtonsoft.Json; +using Sledgemapper.Api.Core.Entities; + +namespace Sledgemapper.Api +{ + public class Startup + { + private readonly IWebHostEnvironment _env; + public IConfiguration Configuration { get; } + public Startup(IWebHostEnvironment env, IConfiguration configuration) + { + Configuration = configuration; + _env = env; + + } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddCors(); + services.AddControllers().AddNewtonsoftJson(o => + { + o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; + }); ; + + + + services.AddSignalR(); + services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); + services.AddMediatR(typeof(Startup)); + services.AddDbContext(options => { options.UseSqlite("Data Source=db/sledgemapper.db"); options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); }); + + services.Configure(Configuration.GetSection("JwtConfig")); + + // configure DI for application services + + // within this section we are configuring the authentication and setting the default scheme + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + }) + .AddJwtBearer(jwt => + { + var key = Encoding.ASCII.GetBytes(Configuration["JwtConfig:Secret"]); + + jwt.SaveToken = true; + jwt.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuerSigningKey = true, // this will validate the 3rd part of the jwt token using the secret that we added in the appsettings and verify we have generated the jwt token + IssuerSigningKey = new SymmetricSecurityKey(key), // Add the secret key to our Jwt encryption + ValidateIssuer = false, + ValidateAudience = false, + RequireExpirationTime = false, + ValidateLifetime = true + }; + }); + + services.AddDefaultIdentity(options => options.SignIn.RequireConfirmedAccount = false) + .AddEntityFrameworkStores(); + + services.AddSwaggerGen(c => + { + c.SwaggerDoc("v1", new OpenApiInfo + { + Title = "My API", + Version = "v1" + }); + c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme + { + In = ParameterLocation.Header, + Description = "Please insert JWT with Bearer into field", + Name = "Authorization", + Type = SecuritySchemeType.ApiKey + }); + c.AddSecurityRequirement(new OpenApiSecurityRequirement { + { new OpenApiSecurityScheme + { + Reference = new OpenApiReference + { + Type = ReferenceType.SecurityScheme, + Id = "Bearer" + } + }, + Array.Empty() + } + }); + }); + + + + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, SledgemapperDbContext dataContext) + { + // Enable middleware to serve generated Swagger as a JSON endpoint. + app.UseSwagger(); + + // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), + // specifying the Swagger JSON endpoint. + app.UseSwaggerUI(c => + { + c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); + }); + + dataContext.Database.Migrate(); + + app.UseRouting(); + + app.UseCors(x => x + .AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader()); + app.UseAuthentication(); + app.UseAuthorization(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + + app.UseEndpoints(endpoints => + { + endpoints.MapHub("/sledgemapperhub"); + }); + } + } +} diff --git a/Sledgemapper.Api/appsettings.Development.json b/Sledgemapper.Api/appsettings.Development.json new file mode 100644 index 0000000..996eb73 --- /dev/null +++ b/Sledgemapper.Api/appsettings.Development.json @@ -0,0 +1,12 @@ +{ + "ConnectionStrings": { + "WebApiDatabase": "Data Source=db/LocalDatabase.db" + }, + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/Sledgemapper.Api/appsettings.Production.json b/Sledgemapper.Api/appsettings.Production.json new file mode 100644 index 0000000..996eb73 --- /dev/null +++ b/Sledgemapper.Api/appsettings.Production.json @@ -0,0 +1,12 @@ +{ + "ConnectionStrings": { + "WebApiDatabase": "Data Source=db/LocalDatabase.db" + }, + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/Sledgemapper.Api/appsettings.json b/Sledgemapper.Api/appsettings.json new file mode 100644 index 0000000..3471d80 --- /dev/null +++ b/Sledgemapper.Api/appsettings.json @@ -0,0 +1,16 @@ +{ + "JwtConfig": { + "Secret": "ALy9zGFVZBza9cju458dVC2rBdwPqfb7" + }, + "ConnectionStrings": { + "WebApiDatabase": "ENTER PRODUCTION SQL SERVER CONNECTION STRING HERE" + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} \ No newline at end of file diff --git a/Sledgemapper.Api/libman.json b/Sledgemapper.Api/libman.json new file mode 100644 index 0000000..a1d57d0 --- /dev/null +++ b/Sledgemapper.Api/libman.json @@ -0,0 +1,14 @@ +{ + "version": "1.0", + "defaultProvider": "unpkg", + "libraries": [ + { + "library": "@microsoft/signalr@latest", + "destination": "wwwroot/js/signalr", + "files": [ + "dist/browser/signalr.js", + "dist/browser/signalr.min.js" + ] + } + ] +} \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/css/site.css b/Sledgemapper.Api/wwwroot/css/site.css new file mode 100644 index 0000000..e679a8e --- /dev/null +++ b/Sledgemapper.Api/wwwroot/css/site.css @@ -0,0 +1,71 @@ +/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification +for details on configuring this project to bundle and minify static web assets. */ + +a.navbar-brand { + white-space: normal; + text-align: center; + word-break: break-all; +} + +/* Provide sufficient contrast against white background */ +a { + color: #0366d6; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.nav-pills .nav-link.active, .nav-pills .show > .nav-link { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +/* Sticky footer styles +-------------------------------------------------- */ +html { + font-size: 14px; +} +@media (min-width: 768px) { + html { + font-size: 16px; + } +} + +.border-top { + border-top: 1px solid #e5e5e5; +} +.border-bottom { + border-bottom: 1px solid #e5e5e5; +} + +.box-shadow { + box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); +} + +button.accept-policy { + font-size: 1rem; + line-height: inherit; +} + +/* Sticky footer styles +-------------------------------------------------- */ +html { + position: relative; + min-height: 100%; +} + +body { + /* Margin bottom by footer height */ + margin-bottom: 60px; +} +.footer { + position: absolute; + bottom: 0; + width: 100%; + white-space: nowrap; + line-height: 60px; /* Vertically center the text there */ +} diff --git a/Sledgemapper.Api/wwwroot/favicon.ico b/Sledgemapper.Api/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..63e859b476eff5055e0e557aaa151ca8223fbeef GIT binary patch literal 5430 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/g, ">"); + var encodedMsg = user + " says " + msg; + var li = document.createElement("li"); + li.textContent = encodedMsg; + document.getElementById("messagesList").appendChild(li); +}); + +connection.start().then(function () { + document.getElementById("sendButton").disabled = false; +}).catch(function (err) { + return console.error(err.toString()); +}); + +document.getElementById("sendButton").addEventListener("click", function (event) { + var user = document.getElementById("userInput").value; + var message = document.getElementById("messageInput").value; + connection.invoke("SendMessage", user, message).catch(function (err) { + return console.error(err.toString()); + }); + event.preventDefault(); +}); \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/js/signalr/dist/browser/signalr.js b/Sledgemapper.Api/wwwroot/js/signalr/dist/browser/signalr.js new file mode 100644 index 0000000..6eaef1e --- /dev/null +++ b/Sledgemapper.Api/wwwroot/js/signalr/dist/browser/signalr.js @@ -0,0 +1,4917 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["signalR"] = factory(); + else + root["signalR"] = factory(); +})(window, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var es6_promise_dist_es6_promise_auto_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); +/* harmony import */ var es6_promise_dist_es6_promise_auto_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(es6_promise_dist_es6_promise_auto_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VERSION", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["VERSION"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AbortError", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["AbortError"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpError", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["HttpError"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpClient", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["HttpClient"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpResponse", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["HttpResponse"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DefaultHttpClient", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["DefaultHttpClient"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HubConnection", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["HubConnection"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HubConnectionState", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["HubConnectionState"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HubConnectionBuilder", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["HubConnectionBuilder"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MessageType", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["MessageType"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["LogLevel"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpTransportType", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["HttpTransportType"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TransferFormat", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["TransferFormat"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NullLogger", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["NullLogger"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "JsonHubProtocol", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["JsonHubProtocol"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return _index__WEBPACK_IMPORTED_MODULE_1__["Subject"]; }); + +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// This is where we add any polyfills we'll need for the browser. It is the entry module for browser-specific builds. + +// Copy from Array.prototype into Uint8Array to polyfill on IE. It's OK because the implementations of indexOf and slice use properties +// that exist on Uint8Array with the same name, and JavaScript is magic. +// We make them 'writable' because the Buffer polyfill messes with it as well. +if (!Uint8Array.prototype.indexOf) { + Object.defineProperty(Uint8Array.prototype, "indexOf", { + value: Array.prototype.indexOf, + writable: true, + }); +} +if (!Uint8Array.prototype.slice) { + Object.defineProperty(Uint8Array.prototype, "slice", { + // wrap the slice in Uint8Array so it looks like a Uint8Array.slice call + // tslint:disable-next-line:object-literal-shorthand + value: function (start, end) { return new Uint8Array(Array.prototype.slice.call(this, start, end)); }, + writable: true, + }); +} +if (!Uint8Array.prototype.forEach) { + Object.defineProperty(Uint8Array.prototype, "forEach", { + value: Array.prototype.forEach, + writable: true, + }); +} + + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(global) {var require;/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.2+97478eb6 + */ + +(function (global, factory) { + true ? module.exports = factory() : + undefined; +}(this, (function () { 'use strict'; + +function objectOrFunction(x) { + var type = typeof x; + return x !== null && (type === 'object' || type === 'function'); +} + +function isFunction(x) { + return typeof x === 'function'; +} + + + +var _isArray = void 0; +if (Array.isArray) { + _isArray = Array.isArray; +} else { + _isArray = function (x) { + return Object.prototype.toString.call(x) === '[object Array]'; + }; +} + +var isArray = _isArray; + +var len = 0; +var vertxNext = void 0; +var customSchedulerFn = void 0; + +var asap = function asap(callback, arg) { + queue[len] = callback; + queue[len + 1] = arg; + len += 2; + if (len === 2) { + // If len is 2, that means that we need to schedule an async flush. + // If additional callbacks are queued before the queue is flushed, they + // will be processed by this flush that we are scheduling. + if (customSchedulerFn) { + customSchedulerFn(flush); + } else { + scheduleFlush(); + } + } +}; + +function setScheduler(scheduleFn) { + customSchedulerFn = scheduleFn; +} + +function setAsap(asapFn) { + asap = asapFn; +} + +var browserWindow = typeof window !== 'undefined' ? window : undefined; +var browserGlobal = browserWindow || {}; +var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; +var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'; + +// test for web worker but not in IE10 +var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; + +// node +function useNextTick() { + // node version 0.10.x displays a deprecation warning when nextTick is used recursively + // see https://github.com/cujojs/when/issues/410 for details + return function () { + return process.nextTick(flush); + }; +} + +// vertx +function useVertxTimer() { + if (typeof vertxNext !== 'undefined') { + return function () { + vertxNext(flush); + }; + } + + return useSetTimeout(); +} + +function useMutationObserver() { + var iterations = 0; + var observer = new BrowserMutationObserver(flush); + var node = document.createTextNode(''); + observer.observe(node, { characterData: true }); + + return function () { + node.data = iterations = ++iterations % 2; + }; +} + +// web worker +function useMessageChannel() { + var channel = new MessageChannel(); + channel.port1.onmessage = flush; + return function () { + return channel.port2.postMessage(0); + }; +} + +function useSetTimeout() { + // Store setTimeout reference so es6-promise will be unaffected by + // other code modifying setTimeout (like sinon.useFakeTimers()) + var globalSetTimeout = setTimeout; + return function () { + return globalSetTimeout(flush, 1); + }; +} + +var queue = new Array(1000); +function flush() { + for (var i = 0; i < len; i += 2) { + var callback = queue[i]; + var arg = queue[i + 1]; + + callback(arg); + + queue[i] = undefined; + queue[i + 1] = undefined; + } + + len = 0; +} + +function attemptVertx() { + try { + var r = require; + var vertx = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'vertx'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); + vertxNext = vertx.runOnLoop || vertx.runOnContext; + return useVertxTimer(); + } catch (e) { + return useSetTimeout(); + } +} + +var scheduleFlush = void 0; +// Decide what async method to use to triggering processing of queued callbacks: +if (isNode) { + scheduleFlush = useNextTick(); +} else if (BrowserMutationObserver) { + scheduleFlush = useMutationObserver(); +} else if (isWorker) { + scheduleFlush = useMessageChannel(); +} else if (browserWindow === undefined && "function" === 'function') { + scheduleFlush = attemptVertx(); +} else { + scheduleFlush = useSetTimeout(); +} + +function then(onFulfillment, onRejection) { + var parent = this; + + var child = new this.constructor(noop); + + if (child[PROMISE_ID] === undefined) { + makePromise(child); + } + + var _state = parent._state; + + + if (_state) { + var callback = arguments[_state - 1]; + asap(function () { + return invokeCallback(_state, child, callback, parent._result); + }); + } else { + subscribe(parent, child, onFulfillment, onRejection); + } + + return child; +} + +/** + `Promise.resolve` returns a promise that will become resolved with the + passed `value`. It is shorthand for the following: + + ```javascript + let promise = new Promise(function(resolve, reject){ + resolve(1); + }); + + promise.then(function(value){ + // value === 1 + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = Promise.resolve(1); + + promise.then(function(value){ + // value === 1 + }); + ``` + + @method resolve + @static + @param {Any} value value that the returned promise will be resolved with + Useful for tooling. + @return {Promise} a promise that will become fulfilled with the given + `value` +*/ +function resolve$1(object) { + /*jshint validthis:true */ + var Constructor = this; + + if (object && typeof object === 'object' && object.constructor === Constructor) { + return object; + } + + var promise = new Constructor(noop); + resolve(promise, object); + return promise; +} + +var PROMISE_ID = Math.random().toString(36).substring(16); + +function noop() {} + +var PENDING = void 0; +var FULFILLED = 1; +var REJECTED = 2; + +var GET_THEN_ERROR = new ErrorObject(); + +function selfFulfillment() { + return new TypeError("You cannot resolve a promise with itself"); +} + +function cannotReturnOwn() { + return new TypeError('A promises callback cannot return that same promise.'); +} + +function getThen(promise) { + try { + return promise.then; + } catch (error) { + GET_THEN_ERROR.error = error; + return GET_THEN_ERROR; + } +} + +function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) { + try { + then$$1.call(value, fulfillmentHandler, rejectionHandler); + } catch (e) { + return e; + } +} + +function handleForeignThenable(promise, thenable, then$$1) { + asap(function (promise) { + var sealed = false; + var error = tryThen(then$$1, thenable, function (value) { + if (sealed) { + return; + } + sealed = true; + if (thenable !== value) { + resolve(promise, value); + } else { + fulfill(promise, value); + } + }, function (reason) { + if (sealed) { + return; + } + sealed = true; + + reject(promise, reason); + }, 'Settle: ' + (promise._label || ' unknown promise')); + + if (!sealed && error) { + sealed = true; + reject(promise, error); + } + }, promise); +} + +function handleOwnThenable(promise, thenable) { + if (thenable._state === FULFILLED) { + fulfill(promise, thenable._result); + } else if (thenable._state === REJECTED) { + reject(promise, thenable._result); + } else { + subscribe(thenable, undefined, function (value) { + return resolve(promise, value); + }, function (reason) { + return reject(promise, reason); + }); + } +} + +function handleMaybeThenable(promise, maybeThenable, then$$1) { + if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) { + handleOwnThenable(promise, maybeThenable); + } else { + if (then$$1 === GET_THEN_ERROR) { + reject(promise, GET_THEN_ERROR.error); + GET_THEN_ERROR.error = null; + } else if (then$$1 === undefined) { + fulfill(promise, maybeThenable); + } else if (isFunction(then$$1)) { + handleForeignThenable(promise, maybeThenable, then$$1); + } else { + fulfill(promise, maybeThenable); + } + } +} + +function resolve(promise, value) { + if (promise === value) { + reject(promise, selfFulfillment()); + } else if (objectOrFunction(value)) { + handleMaybeThenable(promise, value, getThen(value)); + } else { + fulfill(promise, value); + } +} + +function publishRejection(promise) { + if (promise._onerror) { + promise._onerror(promise._result); + } + + publish(promise); +} + +function fulfill(promise, value) { + if (promise._state !== PENDING) { + return; + } + + promise._result = value; + promise._state = FULFILLED; + + if (promise._subscribers.length !== 0) { + asap(publish, promise); + } +} + +function reject(promise, reason) { + if (promise._state !== PENDING) { + return; + } + promise._state = REJECTED; + promise._result = reason; + + asap(publishRejection, promise); +} + +function subscribe(parent, child, onFulfillment, onRejection) { + var _subscribers = parent._subscribers; + var length = _subscribers.length; + + + parent._onerror = null; + + _subscribers[length] = child; + _subscribers[length + FULFILLED] = onFulfillment; + _subscribers[length + REJECTED] = onRejection; + + if (length === 0 && parent._state) { + asap(publish, parent); + } +} + +function publish(promise) { + var subscribers = promise._subscribers; + var settled = promise._state; + + if (subscribers.length === 0) { + return; + } + + var child = void 0, + callback = void 0, + detail = promise._result; + + for (var i = 0; i < subscribers.length; i += 3) { + child = subscribers[i]; + callback = subscribers[i + settled]; + + if (child) { + invokeCallback(settled, child, callback, detail); + } else { + callback(detail); + } + } + + promise._subscribers.length = 0; +} + +function ErrorObject() { + this.error = null; +} + +var TRY_CATCH_ERROR = new ErrorObject(); + +function tryCatch(callback, detail) { + try { + return callback(detail); + } catch (e) { + TRY_CATCH_ERROR.error = e; + return TRY_CATCH_ERROR; + } +} + +function invokeCallback(settled, promise, callback, detail) { + var hasCallback = isFunction(callback), + value = void 0, + error = void 0, + succeeded = void 0, + failed = void 0; + + if (hasCallback) { + value = tryCatch(callback, detail); + + if (value === TRY_CATCH_ERROR) { + failed = true; + error = value.error; + value.error = null; + } else { + succeeded = true; + } + + if (promise === value) { + reject(promise, cannotReturnOwn()); + return; + } + } else { + value = detail; + succeeded = true; + } + + if (promise._state !== PENDING) { + // noop + } else if (hasCallback && succeeded) { + resolve(promise, value); + } else if (failed) { + reject(promise, error); + } else if (settled === FULFILLED) { + fulfill(promise, value); + } else if (settled === REJECTED) { + reject(promise, value); + } +} + +function initializePromise(promise, resolver) { + try { + resolver(function resolvePromise(value) { + resolve(promise, value); + }, function rejectPromise(reason) { + reject(promise, reason); + }); + } catch (e) { + reject(promise, e); + } +} + +var id = 0; +function nextId() { + return id++; +} + +function makePromise(promise) { + promise[PROMISE_ID] = id++; + promise._state = undefined; + promise._result = undefined; + promise._subscribers = []; +} + +function validationError() { + return new Error('Array Methods must be provided an Array'); +} + +function validationError() { + return new Error('Array Methods must be provided an Array'); +} + +var Enumerator = function () { + function Enumerator(Constructor, input) { + this._instanceConstructor = Constructor; + this.promise = new Constructor(noop); + + if (!this.promise[PROMISE_ID]) { + makePromise(this.promise); + } + + if (isArray(input)) { + this.length = input.length; + this._remaining = input.length; + + this._result = new Array(this.length); + + if (this.length === 0) { + fulfill(this.promise, this._result); + } else { + this.length = this.length || 0; + this._enumerate(input); + if (this._remaining === 0) { + fulfill(this.promise, this._result); + } + } + } else { + reject(this.promise, validationError()); + } + } + + Enumerator.prototype._enumerate = function _enumerate(input) { + for (var i = 0; this._state === PENDING && i < input.length; i++) { + this._eachEntry(input[i], i); + } + }; + + Enumerator.prototype._eachEntry = function _eachEntry(entry, i) { + var c = this._instanceConstructor; + var resolve$$1 = c.resolve; + + + if (resolve$$1 === resolve$1) { + var _then = getThen(entry); + + if (_then === then && entry._state !== PENDING) { + this._settledAt(entry._state, i, entry._result); + } else if (typeof _then !== 'function') { + this._remaining--; + this._result[i] = entry; + } else if (c === Promise$2) { + var promise = new c(noop); + handleMaybeThenable(promise, entry, _then); + this._willSettleAt(promise, i); + } else { + this._willSettleAt(new c(function (resolve$$1) { + return resolve$$1(entry); + }), i); + } + } else { + this._willSettleAt(resolve$$1(entry), i); + } + }; + + Enumerator.prototype._settledAt = function _settledAt(state, i, value) { + var promise = this.promise; + + + if (promise._state === PENDING) { + this._remaining--; + + if (state === REJECTED) { + reject(promise, value); + } else { + this._result[i] = value; + } + } + + if (this._remaining === 0) { + fulfill(promise, this._result); + } + }; + + Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) { + var enumerator = this; + + subscribe(promise, undefined, function (value) { + return enumerator._settledAt(FULFILLED, i, value); + }, function (reason) { + return enumerator._settledAt(REJECTED, i, reason); + }); + }; + + return Enumerator; +}(); + +/** + `Promise.all` accepts an array of promises, and returns a new promise which + is fulfilled with an array of fulfillment values for the passed promises, or + rejected with the reason of the first passed promise to be rejected. It casts all + elements of the passed iterable to promises as it runs this algorithm. + + Example: + + ```javascript + let promise1 = resolve(1); + let promise2 = resolve(2); + let promise3 = resolve(3); + let promises = [ promise1, promise2, promise3 ]; + + Promise.all(promises).then(function(array){ + // The array here would be [ 1, 2, 3 ]; + }); + ``` + + If any of the `promises` given to `all` are rejected, the first promise + that is rejected will be given as an argument to the returned promises's + rejection handler. For example: + + Example: + + ```javascript + let promise1 = resolve(1); + let promise2 = reject(new Error("2")); + let promise3 = reject(new Error("3")); + let promises = [ promise1, promise2, promise3 ]; + + Promise.all(promises).then(function(array){ + // Code here never runs because there are rejected promises! + }, function(error) { + // error.message === "2" + }); + ``` + + @method all + @static + @param {Array} entries array of promises + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Promise} promise that is fulfilled when all `promises` have been + fulfilled, or rejected if any of them become rejected. + @static +*/ +function all(entries) { + return new Enumerator(this, entries).promise; +} + +/** + `Promise.race` returns a new promise which is settled in the same way as the + first passed promise to settle. + + Example: + + ```javascript + let promise1 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 2'); + }, 100); + }); + + Promise.race([promise1, promise2]).then(function(result){ + // result === 'promise 2' because it was resolved before promise1 + // was resolved. + }); + ``` + + `Promise.race` is deterministic in that only the state of the first + settled promise matters. For example, even if other promises given to the + `promises` array argument are resolved, but the first settled promise has + become rejected before the other promises became fulfilled, the returned + promise will become rejected: + + ```javascript + let promise1 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new Promise(function(resolve, reject){ + setTimeout(function(){ + reject(new Error('promise 2')); + }, 100); + }); + + Promise.race([promise1, promise2]).then(function(result){ + // Code here never runs + }, function(reason){ + // reason.message === 'promise 2' because promise 2 became rejected before + // promise 1 became fulfilled + }); + ``` + + An example real-world use case is implementing timeouts: + + ```javascript + Promise.race([ajax('foo.json'), timeout(5000)]) + ``` + + @method race + @static + @param {Array} promises array of promises to observe + Useful for tooling. + @return {Promise} a promise which settles in the same way as the first passed + promise to settle. +*/ +function race(entries) { + /*jshint validthis:true */ + var Constructor = this; + + if (!isArray(entries)) { + return new Constructor(function (_, reject) { + return reject(new TypeError('You must pass an array to race.')); + }); + } else { + return new Constructor(function (resolve, reject) { + var length = entries.length; + for (var i = 0; i < length; i++) { + Constructor.resolve(entries[i]).then(resolve, reject); + } + }); + } +} + +/** + `Promise.reject` returns a promise rejected with the passed `reason`. + It is shorthand for the following: + + ```javascript + let promise = new Promise(function(resolve, reject){ + reject(new Error('WHOOPS')); + }); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = Promise.reject(new Error('WHOOPS')); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + @method reject + @static + @param {Any} reason value that the returned promise will be rejected with. + Useful for tooling. + @return {Promise} a promise rejected with the given `reason`. +*/ +function reject$1(reason) { + /*jshint validthis:true */ + var Constructor = this; + var promise = new Constructor(noop); + reject(promise, reason); + return promise; +} + +function needsResolver() { + throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); +} + +function needsNew() { + throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); +} + +/** + Promise objects represent the eventual result of an asynchronous operation. The + primary way of interacting with a promise is through its `then` method, which + registers callbacks to receive either a promise's eventual value or the reason + why the promise cannot be fulfilled. + + Terminology + ----------- + + - `promise` is an object or function with a `then` method whose behavior conforms to this specification. + - `thenable` is an object or function that defines a `then` method. + - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). + - `exception` is a value that is thrown using the throw statement. + - `reason` is a value that indicates why a promise was rejected. + - `settled` the final resting state of a promise, fulfilled or rejected. + + A promise can be in one of three states: pending, fulfilled, or rejected. + + Promises that are fulfilled have a fulfillment value and are in the fulfilled + state. Promises that are rejected have a rejection reason and are in the + rejected state. A fulfillment value is never a thenable. + + Promises can also be said to *resolve* a value. If this value is also a + promise, then the original promise's settled state will match the value's + settled state. So a promise that *resolves* a promise that rejects will + itself reject, and a promise that *resolves* a promise that fulfills will + itself fulfill. + + + Basic Usage: + ------------ + + ```js + let promise = new Promise(function(resolve, reject) { + // on success + resolve(value); + + // on failure + reject(reason); + }); + + promise.then(function(value) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Advanced Usage: + --------------- + + Promises shine when abstracting away asynchronous interactions such as + `XMLHttpRequest`s. + + ```js + function getJSON(url) { + return new Promise(function(resolve, reject){ + let xhr = new XMLHttpRequest(); + + xhr.open('GET', url); + xhr.onreadystatechange = handler; + xhr.responseType = 'json'; + xhr.setRequestHeader('Accept', 'application/json'); + xhr.send(); + + function handler() { + if (this.readyState === this.DONE) { + if (this.status === 200) { + resolve(this.response); + } else { + reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); + } + } + }; + }); + } + + getJSON('/posts.json').then(function(json) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Unlike callbacks, promises are great composable primitives. + + ```js + Promise.all([ + getJSON('/posts'), + getJSON('/comments') + ]).then(function(values){ + values[0] // => postsJSON + values[1] // => commentsJSON + + return values; + }); + ``` + + @class Promise + @param {Function} resolver + Useful for tooling. + @constructor +*/ + +var Promise$2 = function () { + function Promise(resolver) { + this[PROMISE_ID] = nextId(); + this._result = this._state = undefined; + this._subscribers = []; + + if (noop !== resolver) { + typeof resolver !== 'function' && needsResolver(); + this instanceof Promise ? initializePromise(this, resolver) : needsNew(); + } + } + + /** + The primary way of interacting with a promise is through its `then` method, + which registers callbacks to receive either a promise's eventual value or the + reason why the promise cannot be fulfilled. + ```js + findUser().then(function(user){ + // user is available + }, function(reason){ + // user is unavailable, and you are given the reason why + }); + ``` + Chaining + -------- + The return value of `then` is itself a promise. This second, 'downstream' + promise is resolved with the return value of the first promise's fulfillment + or rejection handler, or rejected if the handler throws an exception. + ```js + findUser().then(function (user) { + return user.name; + }, function (reason) { + return 'default name'; + }).then(function (userName) { + // If `findUser` fulfilled, `userName` will be the user's name, otherwise it + // will be `'default name'` + }); + findUser().then(function (user) { + throw new Error('Found user, but still unhappy'); + }, function (reason) { + throw new Error('`findUser` rejected and we're unhappy'); + }).then(function (value) { + // never reached + }, function (reason) { + // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. + // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. + }); + ``` + If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. + ```js + findUser().then(function (user) { + throw new PedagogicalException('Upstream error'); + }).then(function (value) { + // never reached + }).then(function (value) { + // never reached + }, function (reason) { + // The `PedgagocialException` is propagated all the way down to here + }); + ``` + Assimilation + ------------ + Sometimes the value you want to propagate to a downstream promise can only be + retrieved asynchronously. This can be achieved by returning a promise in the + fulfillment or rejection handler. The downstream promise will then be pending + until the returned promise is settled. This is called *assimilation*. + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // The user's comments are now available + }); + ``` + If the assimliated promise rejects, then the downstream promise will also reject. + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // If `findCommentsByAuthor` fulfills, we'll have the value here + }, function (reason) { + // If `findCommentsByAuthor` rejects, we'll have the reason here + }); + ``` + Simple Example + -------------- + Synchronous Example + ```javascript + let result; + try { + result = findResult(); + // success + } catch(reason) { + // failure + } + ``` + Errback Example + ```js + findResult(function(result, err){ + if (err) { + // failure + } else { + // success + } + }); + ``` + Promise Example; + ```javascript + findResult().then(function(result){ + // success + }, function(reason){ + // failure + }); + ``` + Advanced Example + -------------- + Synchronous Example + ```javascript + let author, books; + try { + author = findAuthor(); + books = findBooksByAuthor(author); + // success + } catch(reason) { + // failure + } + ``` + Errback Example + ```js + function foundBooks(books) { + } + function failure(reason) { + } + findAuthor(function(author, err){ + if (err) { + failure(err); + // failure + } else { + try { + findBoooksByAuthor(author, function(books, err) { + if (err) { + failure(err); + } else { + try { + foundBooks(books); + } catch(reason) { + failure(reason); + } + } + }); + } catch(error) { + failure(err); + } + // success + } + }); + ``` + Promise Example; + ```javascript + findAuthor(). + then(findBooksByAuthor). + then(function(books){ + // found books + }).catch(function(reason){ + // something went wrong + }); + ``` + @method then + @param {Function} onFulfilled + @param {Function} onRejected + Useful for tooling. + @return {Promise} + */ + + /** + `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same + as the catch block of a try/catch statement. + ```js + function findAuthor(){ + throw new Error('couldn't find that author'); + } + // synchronous + try { + findAuthor(); + } catch(reason) { + // something went wrong + } + // async with promises + findAuthor().catch(function(reason){ + // something went wrong + }); + ``` + @method catch + @param {Function} onRejection + Useful for tooling. + @return {Promise} + */ + + + Promise.prototype.catch = function _catch(onRejection) { + return this.then(null, onRejection); + }; + + /** + `finally` will be invoked regardless of the promise's fate just as native + try/catch/finally behaves + + Synchronous example: + + ```js + findAuthor() { + if (Math.random() > 0.5) { + throw new Error(); + } + return new Author(); + } + + try { + return findAuthor(); // succeed or fail + } catch(error) { + return findOtherAuther(); + } finally { + // always runs + // doesn't affect the return value + } + ``` + + Asynchronous example: + + ```js + findAuthor().catch(function(reason){ + return findOtherAuther(); + }).finally(function(){ + // author was either found, or not + }); + ``` + + @method finally + @param {Function} callback + @return {Promise} + */ + + + Promise.prototype.finally = function _finally(callback) { + var promise = this; + var constructor = promise.constructor; + + return promise.then(function (value) { + return constructor.resolve(callback()).then(function () { + return value; + }); + }, function (reason) { + return constructor.resolve(callback()).then(function () { + throw reason; + }); + }); + }; + + return Promise; +}(); + +Promise$2.prototype.then = then; +Promise$2.all = all; +Promise$2.race = race; +Promise$2.resolve = resolve$1; +Promise$2.reject = reject$1; +Promise$2._setScheduler = setScheduler; +Promise$2._setAsap = setAsap; +Promise$2._asap = asap; + +/*global self*/ +function polyfill() { + var local = void 0; + + if (typeof global !== 'undefined') { + local = global; + } else if (typeof self !== 'undefined') { + local = self; + } else { + try { + local = Function('return this')(); + } catch (e) { + throw new Error('polyfill failed because global object is unavailable in this environment'); + } + } + + var P = local.Promise; + + if (P) { + var promiseToString = null; + try { + promiseToString = Object.prototype.toString.call(P.resolve()); + } catch (e) { + // silently ignored + } + + if (promiseToString === '[object Promise]' && !P.cast) { + return; + } + } + + local.Promise = Promise$2; +} + +// Strange compat.. +Promise$2.polyfill = polyfill; +Promise$2.Promise = Promise$2; + +Promise$2.polyfill(); + +return Promise$2; + +}))); + + + +//# sourceMappingURL=es6-promise.auto.map + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2))) + +/***/ }), +/* 2 */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), +/* 3 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VERSION", function() { return VERSION; }); +/* harmony import */ var _Errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AbortError", function() { return _Errors__WEBPACK_IMPORTED_MODULE_0__["AbortError"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpError", function() { return _Errors__WEBPACK_IMPORTED_MODULE_0__["HttpError"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return _Errors__WEBPACK_IMPORTED_MODULE_0__["TimeoutError"]; }); + +/* harmony import */ var _HttpClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpClient", function() { return _HttpClient__WEBPACK_IMPORTED_MODULE_1__["HttpClient"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpResponse", function() { return _HttpClient__WEBPACK_IMPORTED_MODULE_1__["HttpResponse"]; }); + +/* harmony import */ var _DefaultHttpClient__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DefaultHttpClient", function() { return _DefaultHttpClient__WEBPACK_IMPORTED_MODULE_2__["DefaultHttpClient"]; }); + +/* harmony import */ var _HubConnection__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HubConnection", function() { return _HubConnection__WEBPACK_IMPORTED_MODULE_3__["HubConnection"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HubConnectionState", function() { return _HubConnection__WEBPACK_IMPORTED_MODULE_3__["HubConnectionState"]; }); + +/* harmony import */ var _HubConnectionBuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(17); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HubConnectionBuilder", function() { return _HubConnectionBuilder__WEBPACK_IMPORTED_MODULE_4__["HubConnectionBuilder"]; }); + +/* harmony import */ var _IHubProtocol__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(15); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MessageType", function() { return _IHubProtocol__WEBPACK_IMPORTED_MODULE_5__["MessageType"]; }); + +/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(9); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return _ILogger__WEBPACK_IMPORTED_MODULE_6__["LogLevel"]; }); + +/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(20); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpTransportType", function() { return _ITransport__WEBPACK_IMPORTED_MODULE_7__["HttpTransportType"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TransferFormat", function() { return _ITransport__WEBPACK_IMPORTED_MODULE_7__["TransferFormat"]; }); + +/* harmony import */ var _Loggers__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(14); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NullLogger", function() { return _Loggers__WEBPACK_IMPORTED_MODULE_8__["NullLogger"]; }); + +/* harmony import */ var _JsonHubProtocol__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(25); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "JsonHubProtocol", function() { return _JsonHubProtocol__WEBPACK_IMPORTED_MODULE_9__["JsonHubProtocol"]; }); + +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(16); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return _Subject__WEBPACK_IMPORTED_MODULE_10__["Subject"]; }); + +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Version token that will be replaced by the prepack command +/** The version of the SignalR client. */ +var VERSION = "3.1.9"; + + + + + + + + + + + + + +/***/ }), +/* 4 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HttpError", function() { return HttpError; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return TimeoutError; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AbortError", function() { return AbortError; }); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +/** Error thrown when an HTTP request fails. */ +var HttpError = /** @class */ (function (_super) { + __extends(HttpError, _super); + /** Constructs a new instance of {@link @microsoft/signalr.HttpError}. + * + * @param {string} errorMessage A descriptive error message. + * @param {number} statusCode The HTTP status code represented by this error. + */ + function HttpError(errorMessage, statusCode) { + var _newTarget = this.constructor; + var _this = this; + var trueProto = _newTarget.prototype; + _this = _super.call(this, errorMessage) || this; + _this.statusCode = statusCode; + // Workaround issue in Typescript compiler + // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200 + _this.__proto__ = trueProto; + return _this; + } + return HttpError; +}(Error)); + +/** Error thrown when a timeout elapses. */ +var TimeoutError = /** @class */ (function (_super) { + __extends(TimeoutError, _super); + /** Constructs a new instance of {@link @microsoft/signalr.TimeoutError}. + * + * @param {string} errorMessage A descriptive error message. + */ + function TimeoutError(errorMessage) { + var _newTarget = this.constructor; + if (errorMessage === void 0) { errorMessage = "A timeout occurred."; } + var _this = this; + var trueProto = _newTarget.prototype; + _this = _super.call(this, errorMessage) || this; + // Workaround issue in Typescript compiler + // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200 + _this.__proto__ = trueProto; + return _this; + } + return TimeoutError; +}(Error)); + +/** Error thrown when an action is aborted. */ +var AbortError = /** @class */ (function (_super) { + __extends(AbortError, _super); + /** Constructs a new instance of {@link AbortError}. + * + * @param {string} errorMessage A descriptive error message. + */ + function AbortError(errorMessage) { + var _newTarget = this.constructor; + if (errorMessage === void 0) { errorMessage = "An abort occurred."; } + var _this = this; + var trueProto = _newTarget.prototype; + _this = _super.call(this, errorMessage) || this; + // Workaround issue in Typescript compiler + // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200 + _this.__proto__ = trueProto; + return _this; + } + return AbortError; +}(Error)); + + + +/***/ }), +/* 5 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HttpResponse", function() { return HttpResponse; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HttpClient", function() { return HttpClient; }); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __assign = (undefined && undefined.__assign) || Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; +}; +/** Represents an HTTP response. */ +var HttpResponse = /** @class */ (function () { + function HttpResponse(statusCode, statusText, content) { + this.statusCode = statusCode; + this.statusText = statusText; + this.content = content; + } + return HttpResponse; +}()); + +/** Abstraction over an HTTP client. + * + * This class provides an abstraction over an HTTP client so that a different implementation can be provided on different platforms. + */ +var HttpClient = /** @class */ (function () { + function HttpClient() { + } + HttpClient.prototype.get = function (url, options) { + return this.send(__assign({}, options, { method: "GET", url: url })); + }; + HttpClient.prototype.post = function (url, options) { + return this.send(__assign({}, options, { method: "POST", url: url })); + }; + HttpClient.prototype.delete = function (url, options) { + return this.send(__assign({}, options, { method: "DELETE", url: url })); + }; + /** Gets all cookies that apply to the specified URL. + * + * @param url The URL that the cookies are valid for. + * @returns {string} A string containing all the key-value cookie pairs for the specified URL. + */ + // @ts-ignore + HttpClient.prototype.getCookieString = function (url) { + return ""; + }; + return HttpClient; +}()); + + + +/***/ }), +/* 6 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DefaultHttpClient", function() { return DefaultHttpClient; }); +/* harmony import */ var _Errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _HttpClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5); +/* harmony import */ var _NodeHttpClient__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7); +/* harmony import */ var _XhrHttpClient__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); + + + + +/** Default implementation of {@link @microsoft/signalr.HttpClient}. */ +var DefaultHttpClient = /** @class */ (function (_super) { + __extends(DefaultHttpClient, _super); + /** Creates a new instance of the {@link @microsoft/signalr.DefaultHttpClient}, using the provided {@link @microsoft/signalr.ILogger} to log messages. */ + function DefaultHttpClient(logger) { + var _this = _super.call(this) || this; + if (typeof XMLHttpRequest !== "undefined") { + _this.httpClient = new _XhrHttpClient__WEBPACK_IMPORTED_MODULE_3__["XhrHttpClient"](logger); + } + else { + _this.httpClient = new _NodeHttpClient__WEBPACK_IMPORTED_MODULE_2__["NodeHttpClient"](logger); + } + return _this; + } + /** @inheritDoc */ + DefaultHttpClient.prototype.send = function (request) { + // Check that abort was not signaled before calling send + if (request.abortSignal && request.abortSignal.aborted) { + return Promise.reject(new _Errors__WEBPACK_IMPORTED_MODULE_0__["AbortError"]()); + } + if (!request.method) { + return Promise.reject(new Error("No method defined.")); + } + if (!request.url) { + return Promise.reject(new Error("No url defined.")); + } + return this.httpClient.send(request); + }; + DefaultHttpClient.prototype.getCookieString = function (url) { + return this.httpClient.getCookieString(url); + }; + return DefaultHttpClient; +}(_HttpClient__WEBPACK_IMPORTED_MODULE_1__["HttpClient"])); + + + +/***/ }), +/* 7 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NodeHttpClient", function() { return NodeHttpClient; }); +/* harmony import */ var _HttpClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +// This is an empty implementation of the NodeHttpClient that will be included in browser builds so the output file will be smaller + +/** @private */ +var NodeHttpClient = /** @class */ (function (_super) { + __extends(NodeHttpClient, _super); + // @ts-ignore: Need ILogger to compile, but unused variables generate errors + function NodeHttpClient(logger) { + return _super.call(this) || this; + } + NodeHttpClient.prototype.send = function () { + return Promise.reject(new Error("If using Node either provide an XmlHttpRequest polyfill or consume the cjs or esm script instead of the browser/signalr.js one.")); + }; + return NodeHttpClient; +}(_HttpClient__WEBPACK_IMPORTED_MODULE_0__["HttpClient"])); + + + +/***/ }), +/* 8 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "XhrHttpClient", function() { return XhrHttpClient; }); +/* harmony import */ var _Errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _HttpClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5); +/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); + + + +var XhrHttpClient = /** @class */ (function (_super) { + __extends(XhrHttpClient, _super); + function XhrHttpClient(logger) { + var _this = _super.call(this) || this; + _this.logger = logger; + return _this; + } + /** @inheritDoc */ + XhrHttpClient.prototype.send = function (request) { + var _this = this; + // Check that abort was not signaled before calling send + if (request.abortSignal && request.abortSignal.aborted) { + return Promise.reject(new _Errors__WEBPACK_IMPORTED_MODULE_0__["AbortError"]()); + } + if (!request.method) { + return Promise.reject(new Error("No method defined.")); + } + if (!request.url) { + return Promise.reject(new Error("No url defined.")); + } + return new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open(request.method, request.url, true); + xhr.withCredentials = true; + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + // Explicitly setting the Content-Type header for React Native on Android platform. + xhr.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); + var headers = request.headers; + if (headers) { + Object.keys(headers) + .forEach(function (header) { + xhr.setRequestHeader(header, headers[header]); + }); + } + if (request.responseType) { + xhr.responseType = request.responseType; + } + if (request.abortSignal) { + request.abortSignal.onabort = function () { + xhr.abort(); + reject(new _Errors__WEBPACK_IMPORTED_MODULE_0__["AbortError"]()); + }; + } + if (request.timeout) { + xhr.timeout = request.timeout; + } + xhr.onload = function () { + if (request.abortSignal) { + request.abortSignal.onabort = null; + } + if (xhr.status >= 200 && xhr.status < 300) { + resolve(new _HttpClient__WEBPACK_IMPORTED_MODULE_1__["HttpResponse"](xhr.status, xhr.statusText, xhr.response || xhr.responseText)); + } + else { + reject(new _Errors__WEBPACK_IMPORTED_MODULE_0__["HttpError"](xhr.statusText, xhr.status)); + } + }; + xhr.onerror = function () { + _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Warning, "Error from HTTP request. " + xhr.status + ": " + xhr.statusText + "."); + reject(new _Errors__WEBPACK_IMPORTED_MODULE_0__["HttpError"](xhr.statusText, xhr.status)); + }; + xhr.ontimeout = function () { + _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Warning, "Timeout from HTTP request."); + reject(new _Errors__WEBPACK_IMPORTED_MODULE_0__["TimeoutError"]()); + }; + xhr.send(request.content || ""); + }); + }; + return XhrHttpClient; +}(_HttpClient__WEBPACK_IMPORTED_MODULE_1__["HttpClient"])); + + + +/***/ }), +/* 9 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return LogLevel; }); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// These values are designed to match the ASP.NET Log Levels since that's the pattern we're emulating here. +/** Indicates the severity of a log message. + * + * Log Levels are ordered in increasing severity. So `Debug` is more severe than `Trace`, etc. + */ +var LogLevel; +(function (LogLevel) { + /** Log level for very low severity diagnostic messages. */ + LogLevel[LogLevel["Trace"] = 0] = "Trace"; + /** Log level for low severity diagnostic messages. */ + LogLevel[LogLevel["Debug"] = 1] = "Debug"; + /** Log level for informational diagnostic messages. */ + LogLevel[LogLevel["Information"] = 2] = "Information"; + /** Log level for diagnostic messages that indicate a non-fatal problem. */ + LogLevel[LogLevel["Warning"] = 3] = "Warning"; + /** Log level for diagnostic messages that indicate a failure in the current operation. */ + LogLevel[LogLevel["Error"] = 4] = "Error"; + /** Log level for diagnostic messages that indicate a failure that will terminate the entire application. */ + LogLevel[LogLevel["Critical"] = 5] = "Critical"; + /** The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted. */ + LogLevel[LogLevel["None"] = 6] = "None"; +})(LogLevel || (LogLevel = {})); + + +/***/ }), +/* 10 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HubConnectionState", function() { return HubConnectionState; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HubConnection", function() { return HubConnection; }); +/* harmony import */ var _HandshakeProtocol__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(11); +/* harmony import */ var _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15); +/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(16); +/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(13); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (undefined && undefined.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; + + + + + +var DEFAULT_TIMEOUT_IN_MS = 30 * 1000; +var DEFAULT_PING_INTERVAL_IN_MS = 15 * 1000; +/** Describes the current state of the {@link HubConnection} to the server. */ +var HubConnectionState; +(function (HubConnectionState) { + /** The hub connection is disconnected. */ + HubConnectionState["Disconnected"] = "Disconnected"; + /** The hub connection is connecting. */ + HubConnectionState["Connecting"] = "Connecting"; + /** The hub connection is connected. */ + HubConnectionState["Connected"] = "Connected"; + /** The hub connection is disconnecting. */ + HubConnectionState["Disconnecting"] = "Disconnecting"; + /** The hub connection is reconnecting. */ + HubConnectionState["Reconnecting"] = "Reconnecting"; +})(HubConnectionState || (HubConnectionState = {})); +/** Represents a connection to a SignalR Hub. */ +var HubConnection = /** @class */ (function () { + function HubConnection(connection, logger, protocol, reconnectPolicy) { + var _this = this; + _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isRequired(connection, "connection"); + _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isRequired(logger, "logger"); + _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isRequired(protocol, "protocol"); + this.serverTimeoutInMilliseconds = DEFAULT_TIMEOUT_IN_MS; + this.keepAliveIntervalInMilliseconds = DEFAULT_PING_INTERVAL_IN_MS; + this.logger = logger; + this.protocol = protocol; + this.connection = connection; + this.reconnectPolicy = reconnectPolicy; + this.handshakeProtocol = new _HandshakeProtocol__WEBPACK_IMPORTED_MODULE_0__["HandshakeProtocol"](); + this.connection.onreceive = function (data) { return _this.processIncomingData(data); }; + this.connection.onclose = function (error) { return _this.connectionClosed(error); }; + this.callbacks = {}; + this.methods = {}; + this.closedCallbacks = []; + this.reconnectingCallbacks = []; + this.reconnectedCallbacks = []; + this.invocationId = 0; + this.receivedHandshakeResponse = false; + this.connectionState = HubConnectionState.Disconnected; + this.connectionStarted = false; + this.cachedPingMessage = this.protocol.writeMessage({ type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Ping }); + } + /** @internal */ + // Using a public static factory method means we can have a private constructor and an _internal_ + // create method that can be used by HubConnectionBuilder. An "internal" constructor would just + // be stripped away and the '.d.ts' file would have no constructor, which is interpreted as a + // public parameter-less constructor. + HubConnection.create = function (connection, logger, protocol, reconnectPolicy) { + return new HubConnection(connection, logger, protocol, reconnectPolicy); + }; + Object.defineProperty(HubConnection.prototype, "state", { + /** Indicates the state of the {@link HubConnection} to the server. */ + get: function () { + return this.connectionState; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HubConnection.prototype, "connectionId", { + /** Represents the connection id of the {@link HubConnection} on the server. The connection id will be null when the connection is either + * in the disconnected state or if the negotiation step was skipped. + */ + get: function () { + return this.connection ? (this.connection.connectionId || null) : null; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HubConnection.prototype, "baseUrl", { + /** Indicates the url of the {@link HubConnection} to the server. */ + get: function () { + return this.connection.baseUrl || ""; + }, + /** + * Sets a new url for the HubConnection. Note that the url can only be changed when the connection is in either the Disconnected or + * Reconnecting states. + * @param {string} url The url to connect to. + */ + set: function (url) { + if (this.connectionState !== HubConnectionState.Disconnected && this.connectionState !== HubConnectionState.Reconnecting) { + throw new Error("The HubConnection must be in the Disconnected or Reconnecting state to change the url."); + } + if (!url) { + throw new Error("The HubConnection url must be a valid url."); + } + this.connection.baseUrl = url; + }, + enumerable: true, + configurable: true + }); + /** Starts the connection. + * + * @returns {Promise} A Promise that resolves when the connection has been successfully established, or rejects with an error. + */ + HubConnection.prototype.start = function () { + this.startPromise = this.startWithStateTransitions(); + return this.startPromise; + }; + HubConnection.prototype.startWithStateTransitions = function () { + return __awaiter(this, void 0, void 0, function () { + var e_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (this.connectionState !== HubConnectionState.Disconnected) { + return [2 /*return*/, Promise.reject(new Error("Cannot start a HubConnection that is not in the 'Disconnected' state."))]; + } + this.connectionState = HubConnectionState.Connecting; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Starting HubConnection."); + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, this.startInternal()]; + case 2: + _a.sent(); + this.connectionState = HubConnectionState.Connected; + this.connectionStarted = true; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "HubConnection connected successfully."); + return [3 /*break*/, 4]; + case 3: + e_1 = _a.sent(); + this.connectionState = HubConnectionState.Disconnected; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "HubConnection failed to start successfully because of error '" + e_1 + "'."); + return [2 /*return*/, Promise.reject(e_1)]; + case 4: return [2 /*return*/]; + } + }); + }); + }; + HubConnection.prototype.startInternal = function () { + return __awaiter(this, void 0, void 0, function () { + var handshakePromise, handshakeRequest, e_2; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.stopDuringStartError = undefined; + this.receivedHandshakeResponse = false; + handshakePromise = new Promise(function (resolve, reject) { + _this.handshakeResolver = resolve; + _this.handshakeRejecter = reject; + }); + return [4 /*yield*/, this.connection.start(this.protocol.transferFormat)]; + case 1: + _a.sent(); + _a.label = 2; + case 2: + _a.trys.push([2, 5, , 7]); + handshakeRequest = { + protocol: this.protocol.name, + version: this.protocol.version, + }; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Sending handshake request."); + return [4 /*yield*/, this.sendMessage(this.handshakeProtocol.writeHandshakeRequest(handshakeRequest))]; + case 3: + _a.sent(); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "Using HubProtocol '" + this.protocol.name + "'."); + // defensively cleanup timeout in case we receive a message from the server before we finish start + this.cleanupTimeout(); + this.resetTimeoutPeriod(); + this.resetKeepAliveInterval(); + return [4 /*yield*/, handshakePromise]; + case 4: + _a.sent(); + // It's important to check the stopDuringStartError instead of just relying on the handshakePromise + // being rejected on close, because this continuation can run after both the handshake completed successfully + // and the connection was closed. + if (this.stopDuringStartError) { + // It's important to throw instead of returning a rejected promise, because we don't want to allow any state + // transitions to occur between now and the calling code observing the exceptions. Returning a rejected promise + // will cause the calling continuation to get scheduled to run later. + throw this.stopDuringStartError; + } + return [3 /*break*/, 7]; + case 5: + e_2 = _a.sent(); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Hub handshake failed with error '" + e_2 + "' during start(). Stopping HubConnection."); + this.cleanupTimeout(); + this.cleanupPingTimer(); + // HttpConnection.stop() should not complete until after the onclose callback is invoked. + // This will transition the HubConnection to the disconnected state before HttpConnection.stop() completes. + return [4 /*yield*/, this.connection.stop(e_2)]; + case 6: + // HttpConnection.stop() should not complete until after the onclose callback is invoked. + // This will transition the HubConnection to the disconnected state before HttpConnection.stop() completes. + _a.sent(); + throw e_2; + case 7: return [2 /*return*/]; + } + }); + }); + }; + /** Stops the connection. + * + * @returns {Promise} A Promise that resolves when the connection has been successfully terminated, or rejects with an error. + */ + HubConnection.prototype.stop = function () { + return __awaiter(this, void 0, void 0, function () { + var startPromise, e_3; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + startPromise = this.startPromise; + this.stopPromise = this.stopInternal(); + return [4 /*yield*/, this.stopPromise]; + case 1: + _a.sent(); + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 5]); + // Awaiting undefined continues immediately + return [4 /*yield*/, startPromise]; + case 3: + // Awaiting undefined continues immediately + _a.sent(); + return [3 /*break*/, 5]; + case 4: + e_3 = _a.sent(); + return [3 /*break*/, 5]; + case 5: return [2 /*return*/]; + } + }); + }); + }; + HubConnection.prototype.stopInternal = function (error) { + if (this.connectionState === HubConnectionState.Disconnected) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Call to HubConnection.stop(" + error + ") ignored because it is already in the disconnected state."); + return Promise.resolve(); + } + if (this.connectionState === HubConnectionState.Disconnecting) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Call to HttpConnection.stop(" + error + ") ignored because the connection is already in the disconnecting state."); + return this.stopPromise; + } + this.connectionState = HubConnectionState.Disconnecting; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Stopping HubConnection."); + if (this.reconnectDelayHandle) { + // We're in a reconnect delay which means the underlying connection is currently already stopped. + // Just clear the handle to stop the reconnect loop (which no one is waiting on thankfully) and + // fire the onclose callbacks. + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Connection stopped during reconnect delay. Done reconnecting."); + clearTimeout(this.reconnectDelayHandle); + this.reconnectDelayHandle = undefined; + this.completeClose(); + return Promise.resolve(); + } + this.cleanupTimeout(); + this.cleanupPingTimer(); + this.stopDuringStartError = error || new Error("The connection was stopped before the hub handshake could complete."); + // HttpConnection.stop() should not complete until after either HttpConnection.start() fails + // or the onclose callback is invoked. The onclose callback will transition the HubConnection + // to the disconnected state if need be before HttpConnection.stop() completes. + return this.connection.stop(error); + }; + /** Invokes a streaming hub method on the server using the specified name and arguments. + * + * @typeparam T The type of the items returned by the server. + * @param {string} methodName The name of the server method to invoke. + * @param {any[]} args The arguments used to invoke the server method. + * @returns {IStreamResult} An object that yields results from the server as they are received. + */ + HubConnection.prototype.stream = function (methodName) { + var _this = this; + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var _a = this.replaceStreamingParams(args), streams = _a[0], streamIds = _a[1]; + var invocationDescriptor = this.createStreamInvocation(methodName, args, streamIds); + var promiseQueue; + var subject = new _Subject__WEBPACK_IMPORTED_MODULE_3__["Subject"](); + subject.cancelCallback = function () { + var cancelInvocation = _this.createCancelInvocation(invocationDescriptor.invocationId); + delete _this.callbacks[invocationDescriptor.invocationId]; + return promiseQueue.then(function () { + return _this.sendWithProtocol(cancelInvocation); + }); + }; + this.callbacks[invocationDescriptor.invocationId] = function (invocationEvent, error) { + if (error) { + subject.error(error); + return; + } + else if (invocationEvent) { + // invocationEvent will not be null when an error is not passed to the callback + if (invocationEvent.type === _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Completion) { + if (invocationEvent.error) { + subject.error(new Error(invocationEvent.error)); + } + else { + subject.complete(); + } + } + else { + subject.next((invocationEvent.item)); + } + } + }; + promiseQueue = this.sendWithProtocol(invocationDescriptor) + .catch(function (e) { + subject.error(e); + delete _this.callbacks[invocationDescriptor.invocationId]; + }); + this.launchStreams(streams, promiseQueue); + return subject; + }; + HubConnection.prototype.sendMessage = function (message) { + this.resetKeepAliveInterval(); + return this.connection.send(message); + }; + /** + * Sends a js object to the server. + * @param message The js object to serialize and send. + */ + HubConnection.prototype.sendWithProtocol = function (message) { + return this.sendMessage(this.protocol.writeMessage(message)); + }; + /** Invokes a hub method on the server using the specified name and arguments. Does not wait for a response from the receiver. + * + * The Promise returned by this method resolves when the client has sent the invocation to the server. The server may still + * be processing the invocation. + * + * @param {string} methodName The name of the server method to invoke. + * @param {any[]} args The arguments used to invoke the server method. + * @returns {Promise} A Promise that resolves when the invocation has been successfully sent, or rejects with an error. + */ + HubConnection.prototype.send = function (methodName) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var _a = this.replaceStreamingParams(args), streams = _a[0], streamIds = _a[1]; + var sendPromise = this.sendWithProtocol(this.createInvocation(methodName, args, true, streamIds)); + this.launchStreams(streams, sendPromise); + return sendPromise; + }; + /** Invokes a hub method on the server using the specified name and arguments. + * + * The Promise returned by this method resolves when the server indicates it has finished invoking the method. When the promise + * resolves, the server has finished invoking the method. If the server method returns a result, it is produced as the result of + * resolving the Promise. + * + * @typeparam T The expected return type. + * @param {string} methodName The name of the server method to invoke. + * @param {any[]} args The arguments used to invoke the server method. + * @returns {Promise} A Promise that resolves with the result of the server method (if any), or rejects with an error. + */ + HubConnection.prototype.invoke = function (methodName) { + var _this = this; + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var _a = this.replaceStreamingParams(args), streams = _a[0], streamIds = _a[1]; + var invocationDescriptor = this.createInvocation(methodName, args, false, streamIds); + var p = new Promise(function (resolve, reject) { + // invocationId will always have a value for a non-blocking invocation + _this.callbacks[invocationDescriptor.invocationId] = function (invocationEvent, error) { + if (error) { + reject(error); + return; + } + else if (invocationEvent) { + // invocationEvent will not be null when an error is not passed to the callback + if (invocationEvent.type === _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Completion) { + if (invocationEvent.error) { + reject(new Error(invocationEvent.error)); + } + else { + resolve(invocationEvent.result); + } + } + else { + reject(new Error("Unexpected message type: " + invocationEvent.type)); + } + } + }; + var promiseQueue = _this.sendWithProtocol(invocationDescriptor) + .catch(function (e) { + reject(e); + // invocationId will always have a value for a non-blocking invocation + delete _this.callbacks[invocationDescriptor.invocationId]; + }); + _this.launchStreams(streams, promiseQueue); + }); + return p; + }; + /** Registers a handler that will be invoked when the hub method with the specified method name is invoked. + * + * @param {string} methodName The name of the hub method to define. + * @param {Function} newMethod The handler that will be raised when the hub method is invoked. + */ + HubConnection.prototype.on = function (methodName, newMethod) { + if (!methodName || !newMethod) { + return; + } + methodName = methodName.toLowerCase(); + if (!this.methods[methodName]) { + this.methods[methodName] = []; + } + // Preventing adding the same handler multiple times. + if (this.methods[methodName].indexOf(newMethod) !== -1) { + return; + } + this.methods[methodName].push(newMethod); + }; + HubConnection.prototype.off = function (methodName, method) { + if (!methodName) { + return; + } + methodName = methodName.toLowerCase(); + var handlers = this.methods[methodName]; + if (!handlers) { + return; + } + if (method) { + var removeIdx = handlers.indexOf(method); + if (removeIdx !== -1) { + handlers.splice(removeIdx, 1); + if (handlers.length === 0) { + delete this.methods[methodName]; + } + } + } + else { + delete this.methods[methodName]; + } + }; + /** Registers a handler that will be invoked when the connection is closed. + * + * @param {Function} callback The handler that will be invoked when the connection is closed. Optionally receives a single argument containing the error that caused the connection to close (if any). + */ + HubConnection.prototype.onclose = function (callback) { + if (callback) { + this.closedCallbacks.push(callback); + } + }; + /** Registers a handler that will be invoked when the connection starts reconnecting. + * + * @param {Function} callback The handler that will be invoked when the connection starts reconnecting. Optionally receives a single argument containing the error that caused the connection to start reconnecting (if any). + */ + HubConnection.prototype.onreconnecting = function (callback) { + if (callback) { + this.reconnectingCallbacks.push(callback); + } + }; + /** Registers a handler that will be invoked when the connection successfully reconnects. + * + * @param {Function} callback The handler that will be invoked when the connection successfully reconnects. + */ + HubConnection.prototype.onreconnected = function (callback) { + if (callback) { + this.reconnectedCallbacks.push(callback); + } + }; + HubConnection.prototype.processIncomingData = function (data) { + this.cleanupTimeout(); + if (!this.receivedHandshakeResponse) { + data = this.processHandshakeResponse(data); + this.receivedHandshakeResponse = true; + } + // Data may have all been read when processing handshake response + if (data) { + // Parse the messages + var messages = this.protocol.parseMessages(data, this.logger); + for (var _i = 0, messages_1 = messages; _i < messages_1.length; _i++) { + var message = messages_1[_i]; + switch (message.type) { + case _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Invocation: + this.invokeClientMethod(message); + break; + case _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].StreamItem: + case _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Completion: + var callback = this.callbacks[message.invocationId]; + if (callback) { + if (message.type === _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Completion) { + delete this.callbacks[message.invocationId]; + } + callback(message); + } + break; + case _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Ping: + // Don't care about pings + break; + case _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Close: + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "Close message received from server."); + var error = message.error ? new Error("Server returned an error on close: " + message.error) : undefined; + if (message.allowReconnect === true) { + // It feels wrong not to await connection.stop() here, but processIncomingData is called as part of an onreceive callback which is not async, + // this is already the behavior for serverTimeout(), and HttpConnection.Stop() should catch and log all possible exceptions. + // tslint:disable-next-line:no-floating-promises + this.connection.stop(error); + } + else { + // We cannot await stopInternal() here, but subsequent calls to stop() will await this if stopInternal() is still ongoing. + this.stopPromise = this.stopInternal(error); + } + break; + default: + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Warning, "Invalid message type: " + message.type + "."); + break; + } + } + } + this.resetTimeoutPeriod(); + }; + HubConnection.prototype.processHandshakeResponse = function (data) { + var _a; + var responseMessage; + var remainingData; + try { + _a = this.handshakeProtocol.parseHandshakeResponse(data), remainingData = _a[0], responseMessage = _a[1]; + } + catch (e) { + var message = "Error parsing handshake response: " + e; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, message); + var error = new Error(message); + this.handshakeRejecter(error); + throw error; + } + if (responseMessage.error) { + var message = "Server returned handshake error: " + responseMessage.error; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, message); + var error = new Error(message); + this.handshakeRejecter(error); + throw error; + } + else { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Server handshake complete."); + } + this.handshakeResolver(); + return remainingData; + }; + HubConnection.prototype.resetKeepAliveInterval = function () { + var _this = this; + this.cleanupPingTimer(); + this.pingServerHandle = setTimeout(function () { return __awaiter(_this, void 0, void 0, function () { + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!(this.connectionState === HubConnectionState.Connected)) return [3 /*break*/, 4]; + _b.label = 1; + case 1: + _b.trys.push([1, 3, , 4]); + return [4 /*yield*/, this.sendMessage(this.cachedPingMessage)]; + case 2: + _b.sent(); + return [3 /*break*/, 4]; + case 3: + _a = _b.sent(); + // We don't care about the error. It should be seen elsewhere in the client. + // The connection is probably in a bad or closed state now, cleanup the timer so it stops triggering + this.cleanupPingTimer(); + return [3 /*break*/, 4]; + case 4: return [2 /*return*/]; + } + }); + }); }, this.keepAliveIntervalInMilliseconds); + }; + HubConnection.prototype.resetTimeoutPeriod = function () { + var _this = this; + if (!this.connection.features || !this.connection.features.inherentKeepAlive) { + // Set the timeout timer + this.timeoutHandle = setTimeout(function () { return _this.serverTimeout(); }, this.serverTimeoutInMilliseconds); + } + }; + HubConnection.prototype.serverTimeout = function () { + // The server hasn't talked to us in a while. It doesn't like us anymore ... :( + // Terminate the connection, but we don't need to wait on the promise. This could trigger reconnecting. + // tslint:disable-next-line:no-floating-promises + this.connection.stop(new Error("Server timeout elapsed without receiving a message from the server.")); + }; + HubConnection.prototype.invokeClientMethod = function (invocationMessage) { + var _this = this; + var methods = this.methods[invocationMessage.target.toLowerCase()]; + if (methods) { + try { + methods.forEach(function (m) { return m.apply(_this, invocationMessage.arguments); }); + } + catch (e) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, "A callback for the method " + invocationMessage.target.toLowerCase() + " threw error '" + e + "'."); + } + if (invocationMessage.invocationId) { + // This is not supported in v1. So we return an error to avoid blocking the server waiting for the response. + var message = "Server requested a response, which is not supported in this version of the client."; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, message); + // We don't want to wait on the stop itself. + this.stopPromise = this.stopInternal(new Error(message)); + } + } + else { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Warning, "No client method with the name '" + invocationMessage.target + "' found."); + } + }; + HubConnection.prototype.connectionClosed = function (error) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "HubConnection.connectionClosed(" + error + ") called while in state " + this.connectionState + "."); + // Triggering this.handshakeRejecter is insufficient because it could already be resolved without the continuation having run yet. + this.stopDuringStartError = this.stopDuringStartError || error || new Error("The underlying connection was closed before the hub handshake could complete."); + // If the handshake is in progress, start will be waiting for the handshake promise, so we complete it. + // If it has already completed, this should just noop. + if (this.handshakeResolver) { + this.handshakeResolver(); + } + this.cancelCallbacksWithError(error || new Error("Invocation canceled due to the underlying connection being closed.")); + this.cleanupTimeout(); + this.cleanupPingTimer(); + if (this.connectionState === HubConnectionState.Disconnecting) { + this.completeClose(error); + } + else if (this.connectionState === HubConnectionState.Connected && this.reconnectPolicy) { + // tslint:disable-next-line:no-floating-promises + this.reconnect(error); + } + else if (this.connectionState === HubConnectionState.Connected) { + this.completeClose(error); + } + // If none of the above if conditions were true were called the HubConnection must be in either: + // 1. The Connecting state in which case the handshakeResolver will complete it and stopDuringStartError will fail it. + // 2. The Reconnecting state in which case the handshakeResolver will complete it and stopDuringStartError will fail the current reconnect attempt + // and potentially continue the reconnect() loop. + // 3. The Disconnected state in which case we're already done. + }; + HubConnection.prototype.completeClose = function (error) { + var _this = this; + if (this.connectionStarted) { + this.connectionState = HubConnectionState.Disconnected; + this.connectionStarted = false; + try { + this.closedCallbacks.forEach(function (c) { return c.apply(_this, [error]); }); + } + catch (e) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, "An onclose callback called with error '" + error + "' threw error '" + e + "'."); + } + } + }; + HubConnection.prototype.reconnect = function (error) { + return __awaiter(this, void 0, void 0, function () { + var reconnectStartTime, previousReconnectAttempts, retryError, nextRetryDelay, e_4; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + reconnectStartTime = Date.now(); + previousReconnectAttempts = 0; + retryError = error !== undefined ? error : new Error("Attempting to reconnect due to a unknown error."); + nextRetryDelay = this.getNextRetryDelay(previousReconnectAttempts++, 0, retryError); + if (nextRetryDelay === null) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Connection not reconnecting because the IRetryPolicy returned null on the first reconnect attempt."); + this.completeClose(error); + return [2 /*return*/]; + } + this.connectionState = HubConnectionState.Reconnecting; + if (error) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "Connection reconnecting because of error '" + error + "'."); + } + else { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "Connection reconnecting."); + } + if (this.onreconnecting) { + try { + this.reconnectingCallbacks.forEach(function (c) { return c.apply(_this, [error]); }); + } + catch (e) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, "An onreconnecting callback called with error '" + error + "' threw error '" + e + "'."); + } + // Exit early if an onreconnecting callback called connection.stop(). + if (this.connectionState !== HubConnectionState.Reconnecting) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Connection left the reconnecting state in onreconnecting callback. Done reconnecting."); + return [2 /*return*/]; + } + } + _a.label = 1; + case 1: + if (!(nextRetryDelay !== null)) return [3 /*break*/, 7]; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "Reconnect attempt number " + previousReconnectAttempts + " will start in " + nextRetryDelay + " ms."); + return [4 /*yield*/, new Promise(function (resolve) { + _this.reconnectDelayHandle = setTimeout(resolve, nextRetryDelay); + })]; + case 2: + _a.sent(); + this.reconnectDelayHandle = undefined; + if (this.connectionState !== HubConnectionState.Reconnecting) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Connection left the reconnecting state during reconnect delay. Done reconnecting."); + return [2 /*return*/]; + } + _a.label = 3; + case 3: + _a.trys.push([3, 5, , 6]); + return [4 /*yield*/, this.startInternal()]; + case 4: + _a.sent(); + this.connectionState = HubConnectionState.Connected; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "HubConnection reconnected successfully."); + if (this.onreconnected) { + try { + this.reconnectedCallbacks.forEach(function (c) { return c.apply(_this, [_this.connection.connectionId]); }); + } + catch (e) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, "An onreconnected callback called with connectionId '" + this.connection.connectionId + "; threw error '" + e + "'."); + } + } + return [2 /*return*/]; + case 5: + e_4 = _a.sent(); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "Reconnect attempt failed because of error '" + e_4 + "'."); + if (this.connectionState !== HubConnectionState.Reconnecting) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Connection left the reconnecting state during reconnect attempt. Done reconnecting."); + return [2 /*return*/]; + } + retryError = e_4 instanceof Error ? e_4 : new Error(e_4.toString()); + nextRetryDelay = this.getNextRetryDelay(previousReconnectAttempts++, Date.now() - reconnectStartTime, retryError); + return [3 /*break*/, 6]; + case 6: return [3 /*break*/, 1]; + case 7: + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "Reconnect retries have been exhausted after " + (Date.now() - reconnectStartTime) + " ms and " + previousReconnectAttempts + " failed attempts. Connection disconnecting."); + this.completeClose(); + return [2 /*return*/]; + } + }); + }); + }; + HubConnection.prototype.getNextRetryDelay = function (previousRetryCount, elapsedMilliseconds, retryReason) { + try { + return this.reconnectPolicy.nextRetryDelayInMilliseconds({ + elapsedMilliseconds: elapsedMilliseconds, + previousRetryCount: previousRetryCount, + retryReason: retryReason, + }); + } + catch (e) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, "IRetryPolicy.nextRetryDelayInMilliseconds(" + previousRetryCount + ", " + elapsedMilliseconds + ") threw error '" + e + "'."); + return null; + } + }; + HubConnection.prototype.cancelCallbacksWithError = function (error) { + var callbacks = this.callbacks; + this.callbacks = {}; + Object.keys(callbacks) + .forEach(function (key) { + var callback = callbacks[key]; + callback(null, error); + }); + }; + HubConnection.prototype.cleanupPingTimer = function () { + if (this.pingServerHandle) { + clearTimeout(this.pingServerHandle); + } + }; + HubConnection.prototype.cleanupTimeout = function () { + if (this.timeoutHandle) { + clearTimeout(this.timeoutHandle); + } + }; + HubConnection.prototype.createInvocation = function (methodName, args, nonblocking, streamIds) { + if (nonblocking) { + return { + arguments: args, + streamIds: streamIds, + target: methodName, + type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Invocation, + }; + } + else { + var invocationId = this.invocationId; + this.invocationId++; + return { + arguments: args, + invocationId: invocationId.toString(), + streamIds: streamIds, + target: methodName, + type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Invocation, + }; + } + }; + HubConnection.prototype.launchStreams = function (streams, promiseQueue) { + var _this = this; + if (streams.length === 0) { + return; + } + // Synchronize stream data so they arrive in-order on the server + if (!promiseQueue) { + promiseQueue = Promise.resolve(); + } + var _loop_1 = function (streamId) { + streams[streamId].subscribe({ + complete: function () { + promiseQueue = promiseQueue.then(function () { return _this.sendWithProtocol(_this.createCompletionMessage(streamId)); }); + }, + error: function (err) { + var message; + if (err instanceof Error) { + message = err.message; + } + else if (err && err.toString) { + message = err.toString(); + } + else { + message = "Unknown error"; + } + promiseQueue = promiseQueue.then(function () { return _this.sendWithProtocol(_this.createCompletionMessage(streamId, message)); }); + }, + next: function (item) { + promiseQueue = promiseQueue.then(function () { return _this.sendWithProtocol(_this.createStreamItemMessage(streamId, item)); }); + }, + }); + }; + // We want to iterate over the keys, since the keys are the stream ids + // tslint:disable-next-line:forin + for (var streamId in streams) { + _loop_1(streamId); + } + }; + HubConnection.prototype.replaceStreamingParams = function (args) { + var streams = []; + var streamIds = []; + for (var i = 0; i < args.length; i++) { + var argument = args[i]; + if (this.isObservable(argument)) { + var streamId = this.invocationId; + this.invocationId++; + // Store the stream for later use + streams[streamId] = argument; + streamIds.push(streamId.toString()); + // remove stream from args + args.splice(i, 1); + } + } + return [streams, streamIds]; + }; + HubConnection.prototype.isObservable = function (arg) { + // This allows other stream implementations to just work (like rxjs) + return arg && arg.subscribe && typeof arg.subscribe === "function"; + }; + HubConnection.prototype.createStreamInvocation = function (methodName, args, streamIds) { + var invocationId = this.invocationId; + this.invocationId++; + return { + arguments: args, + invocationId: invocationId.toString(), + streamIds: streamIds, + target: methodName, + type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].StreamInvocation, + }; + }; + HubConnection.prototype.createCancelInvocation = function (id) { + return { + invocationId: id, + type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].CancelInvocation, + }; + }; + HubConnection.prototype.createStreamItemMessage = function (id, item) { + return { + invocationId: id, + item: item, + type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].StreamItem, + }; + }; + HubConnection.prototype.createCompletionMessage = function (id, error, result) { + if (error) { + return { + error: error, + invocationId: id, + type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Completion, + }; + } + return { + invocationId: id, + result: result, + type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__["MessageType"].Completion, + }; + }; + return HubConnection; +}()); + + + +/***/ }), +/* 11 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HandshakeProtocol", function() { return HandshakeProtocol; }); +/* harmony import */ var _TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(13); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + + +/** @private */ +var HandshakeProtocol = /** @class */ (function () { + function HandshakeProtocol() { + } + // Handshake request is always JSON + HandshakeProtocol.prototype.writeHandshakeRequest = function (handshakeRequest) { + return _TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__["TextMessageFormat"].write(JSON.stringify(handshakeRequest)); + }; + HandshakeProtocol.prototype.parseHandshakeResponse = function (data) { + var responseMessage; + var messageData; + var remainingData; + if (Object(_Utils__WEBPACK_IMPORTED_MODULE_1__["isArrayBuffer"])(data) || (typeof Buffer !== "undefined" && data instanceof Buffer)) { + // Format is binary but still need to read JSON text from handshake response + var binaryData = new Uint8Array(data); + var separatorIndex = binaryData.indexOf(_TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__["TextMessageFormat"].RecordSeparatorCode); + if (separatorIndex === -1) { + throw new Error("Message is incomplete."); + } + // content before separator is handshake response + // optional content after is additional messages + var responseLength = separatorIndex + 1; + messageData = String.fromCharCode.apply(null, binaryData.slice(0, responseLength)); + remainingData = (binaryData.byteLength > responseLength) ? binaryData.slice(responseLength).buffer : null; + } + else { + var textData = data; + var separatorIndex = textData.indexOf(_TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__["TextMessageFormat"].RecordSeparator); + if (separatorIndex === -1) { + throw new Error("Message is incomplete."); + } + // content before separator is handshake response + // optional content after is additional messages + var responseLength = separatorIndex + 1; + messageData = textData.substring(0, responseLength); + remainingData = (textData.length > responseLength) ? textData.substring(responseLength) : null; + } + // At this point we should have just the single handshake message + var messages = _TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__["TextMessageFormat"].parse(messageData); + var response = JSON.parse(messages[0]); + if (response.type) { + throw new Error("Expected a handshake response from the server."); + } + responseMessage = response; + // multiple messages could have arrived with handshake + // return additional data to be parsed as usual, or null if all parsed + return [remainingData, responseMessage]; + }; + return HandshakeProtocol; +}()); + + + +/***/ }), +/* 12 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextMessageFormat", function() { return TextMessageFormat; }); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Not exported from index +/** @private */ +var TextMessageFormat = /** @class */ (function () { + function TextMessageFormat() { + } + TextMessageFormat.write = function (output) { + return "" + output + TextMessageFormat.RecordSeparator; + }; + TextMessageFormat.parse = function (input) { + if (input[input.length - 1] !== TextMessageFormat.RecordSeparator) { + throw new Error("Message is incomplete."); + } + var messages = input.split(TextMessageFormat.RecordSeparator); + messages.pop(); + return messages; + }; + TextMessageFormat.RecordSeparatorCode = 0x1e; + TextMessageFormat.RecordSeparator = String.fromCharCode(TextMessageFormat.RecordSeparatorCode); + return TextMessageFormat; +}()); + + + +/***/ }), +/* 13 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Arg", function() { return Arg; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Platform", function() { return Platform; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDataDetail", function() { return getDataDetail; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatArrayBuffer", function() { return formatArrayBuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArrayBuffer", function() { return isArrayBuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sendMessage", function() { return sendMessage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createLogger", function() { return createLogger; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscription", function() { return SubjectSubscription; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConsoleLogger", function() { return ConsoleLogger; }); +/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9); +/* harmony import */ var _Loggers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(14); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (undefined && undefined.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; + + +/** @private */ +var Arg = /** @class */ (function () { + function Arg() { + } + Arg.isRequired = function (val, name) { + if (val === null || val === undefined) { + throw new Error("The '" + name + "' argument is required."); + } + }; + Arg.isIn = function (val, values, name) { + // TypeScript enums have keys for **both** the name and the value of each enum member on the type itself. + if (!(val in values)) { + throw new Error("Unknown " + name + " value: " + val + "."); + } + }; + return Arg; +}()); + +/** @private */ +var Platform = /** @class */ (function () { + function Platform() { + } + Object.defineProperty(Platform, "isBrowser", { + get: function () { + return typeof window === "object"; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Platform, "isWebWorker", { + get: function () { + return typeof self === "object" && "importScripts" in self; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Platform, "isNode", { + get: function () { + return !this.isBrowser && !this.isWebWorker; + }, + enumerable: true, + configurable: true + }); + return Platform; +}()); + +/** @private */ +function getDataDetail(data, includeContent) { + var detail = ""; + if (isArrayBuffer(data)) { + detail = "Binary data of length " + data.byteLength; + if (includeContent) { + detail += ". Content: '" + formatArrayBuffer(data) + "'"; + } + } + else if (typeof data === "string") { + detail = "String data of length " + data.length; + if (includeContent) { + detail += ". Content: '" + data + "'"; + } + } + return detail; +} +/** @private */ +function formatArrayBuffer(data) { + var view = new Uint8Array(data); + // Uint8Array.map only supports returning another Uint8Array? + var str = ""; + view.forEach(function (num) { + var pad = num < 16 ? "0" : ""; + str += "0x" + pad + num.toString(16) + " "; + }); + // Trim of trailing space. + return str.substr(0, str.length - 1); +} +// Also in signalr-protocol-msgpack/Utils.ts +/** @private */ +function isArrayBuffer(val) { + return val && typeof ArrayBuffer !== "undefined" && + (val instanceof ArrayBuffer || + // Sometimes we get an ArrayBuffer that doesn't satisfy instanceof + (val.constructor && val.constructor.name === "ArrayBuffer")); +} +/** @private */ +function sendMessage(logger, transportName, httpClient, url, accessTokenFactory, content, logMessageContent) { + return __awaiter(this, void 0, void 0, function () { + var _a, headers, token, responseType, response; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!accessTokenFactory) return [3 /*break*/, 2]; + return [4 /*yield*/, accessTokenFactory()]; + case 1: + token = _b.sent(); + if (token) { + headers = (_a = {}, + _a["Authorization"] = "Bearer " + token, + _a); + } + _b.label = 2; + case 2: + logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Trace, "(" + transportName + " transport) sending data. " + getDataDetail(content, logMessageContent) + "."); + responseType = isArrayBuffer(content) ? "arraybuffer" : "text"; + return [4 /*yield*/, httpClient.post(url, { + content: content, + headers: headers, + responseType: responseType, + })]; + case 3: + response = _b.sent(); + logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Trace, "(" + transportName + " transport) request complete. Response status: " + response.statusCode + "."); + return [2 /*return*/]; + } + }); + }); +} +/** @private */ +function createLogger(logger) { + if (logger === undefined) { + return new ConsoleLogger(_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Information); + } + if (logger === null) { + return _Loggers__WEBPACK_IMPORTED_MODULE_1__["NullLogger"].instance; + } + if (logger.log) { + return logger; + } + return new ConsoleLogger(logger); +} +/** @private */ +var SubjectSubscription = /** @class */ (function () { + function SubjectSubscription(subject, observer) { + this.subject = subject; + this.observer = observer; + } + SubjectSubscription.prototype.dispose = function () { + var index = this.subject.observers.indexOf(this.observer); + if (index > -1) { + this.subject.observers.splice(index, 1); + } + if (this.subject.observers.length === 0 && this.subject.cancelCallback) { + this.subject.cancelCallback().catch(function (_) { }); + } + }; + return SubjectSubscription; +}()); + +/** @private */ +var ConsoleLogger = /** @class */ (function () { + function ConsoleLogger(minimumLogLevel) { + this.minimumLogLevel = minimumLogLevel; + this.outputConsole = console; + } + ConsoleLogger.prototype.log = function (logLevel, message) { + if (logLevel >= this.minimumLogLevel) { + switch (logLevel) { + case _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Critical: + case _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Error: + this.outputConsole.error("[" + new Date().toISOString() + "] " + _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"][logLevel] + ": " + message); + break; + case _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Warning: + this.outputConsole.warn("[" + new Date().toISOString() + "] " + _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"][logLevel] + ": " + message); + break; + case _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Information: + this.outputConsole.info("[" + new Date().toISOString() + "] " + _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"][logLevel] + ": " + message); + break; + default: + // console.debug only goes to attached debuggers in Node, so we use console.log for Trace and Debug + this.outputConsole.log("[" + new Date().toISOString() + "] " + _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"][logLevel] + ": " + message); + break; + } + } + }; + return ConsoleLogger; +}()); + + + +/***/ }), +/* 14 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NullLogger", function() { return NullLogger; }); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +/** A logger that does nothing when log messages are sent to it. */ +var NullLogger = /** @class */ (function () { + function NullLogger() { + } + /** @inheritDoc */ + // tslint:disable-next-line + NullLogger.prototype.log = function (_logLevel, _message) { + }; + /** The singleton instance of the {@link @microsoft/signalr.NullLogger}. */ + NullLogger.instance = new NullLogger(); + return NullLogger; +}()); + + + +/***/ }), +/* 15 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MessageType", function() { return MessageType; }); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +/** Defines the type of a Hub Message. */ +var MessageType; +(function (MessageType) { + /** Indicates the message is an Invocation message and implements the {@link @microsoft/signalr.InvocationMessage} interface. */ + MessageType[MessageType["Invocation"] = 1] = "Invocation"; + /** Indicates the message is a StreamItem message and implements the {@link @microsoft/signalr.StreamItemMessage} interface. */ + MessageType[MessageType["StreamItem"] = 2] = "StreamItem"; + /** Indicates the message is a Completion message and implements the {@link @microsoft/signalr.CompletionMessage} interface. */ + MessageType[MessageType["Completion"] = 3] = "Completion"; + /** Indicates the message is a Stream Invocation message and implements the {@link @microsoft/signalr.StreamInvocationMessage} interface. */ + MessageType[MessageType["StreamInvocation"] = 4] = "StreamInvocation"; + /** Indicates the message is a Cancel Invocation message and implements the {@link @microsoft/signalr.CancelInvocationMessage} interface. */ + MessageType[MessageType["CancelInvocation"] = 5] = "CancelInvocation"; + /** Indicates the message is a Ping message and implements the {@link @microsoft/signalr.PingMessage} interface. */ + MessageType[MessageType["Ping"] = 6] = "Ping"; + /** Indicates the message is a Close message and implements the {@link @microsoft/signalr.CloseMessage} interface. */ + MessageType[MessageType["Close"] = 7] = "Close"; +})(MessageType || (MessageType = {})); + + +/***/ }), +/* 16 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return Subject; }); +/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(13); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +/** Stream implementation to stream items to the server. */ +var Subject = /** @class */ (function () { + function Subject() { + this.observers = []; + } + Subject.prototype.next = function (item) { + for (var _i = 0, _a = this.observers; _i < _a.length; _i++) { + var observer = _a[_i]; + observer.next(item); + } + }; + Subject.prototype.error = function (err) { + for (var _i = 0, _a = this.observers; _i < _a.length; _i++) { + var observer = _a[_i]; + if (observer.error) { + observer.error(err); + } + } + }; + Subject.prototype.complete = function () { + for (var _i = 0, _a = this.observers; _i < _a.length; _i++) { + var observer = _a[_i]; + if (observer.complete) { + observer.complete(); + } + } + }; + Subject.prototype.subscribe = function (observer) { + this.observers.push(observer); + return new _Utils__WEBPACK_IMPORTED_MODULE_0__["SubjectSubscription"](this, observer); + }; + return Subject; +}()); + + + +/***/ }), +/* 17 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HubConnectionBuilder", function() { return HubConnectionBuilder; }); +/* harmony import */ var _DefaultReconnectPolicy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(18); +/* harmony import */ var _HttpConnection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(19); +/* harmony import */ var _HubConnection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10); +/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9); +/* harmony import */ var _JsonHubProtocol__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(25); +/* harmony import */ var _Loggers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(14); +/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(13); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __assign = (undefined && undefined.__assign) || Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; +}; + + + + + + + +// tslint:disable:object-literal-sort-keys +var LogLevelNameMapping = { + trace: _ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, + debug: _ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Debug, + info: _ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Information, + information: _ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Information, + warn: _ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Warning, + warning: _ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Warning, + error: _ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Error, + critical: _ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Critical, + none: _ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].None, +}; +function parseLogLevel(name) { + // Case-insensitive matching via lower-casing + // Yes, I know case-folding is a complicated problem in Unicode, but we only support + // the ASCII strings defined in LogLevelNameMapping anyway, so it's fine -anurse. + var mapping = LogLevelNameMapping[name.toLowerCase()]; + if (typeof mapping !== "undefined") { + return mapping; + } + else { + throw new Error("Unknown log level: " + name); + } +} +/** A builder for configuring {@link @microsoft/signalr.HubConnection} instances. */ +var HubConnectionBuilder = /** @class */ (function () { + function HubConnectionBuilder() { + } + HubConnectionBuilder.prototype.configureLogging = function (logging) { + _Utils__WEBPACK_IMPORTED_MODULE_6__["Arg"].isRequired(logging, "logging"); + if (isLogger(logging)) { + this.logger = logging; + } + else if (typeof logging === "string") { + var logLevel = parseLogLevel(logging); + this.logger = new _Utils__WEBPACK_IMPORTED_MODULE_6__["ConsoleLogger"](logLevel); + } + else { + this.logger = new _Utils__WEBPACK_IMPORTED_MODULE_6__["ConsoleLogger"](logging); + } + return this; + }; + HubConnectionBuilder.prototype.withUrl = function (url, transportTypeOrOptions) { + _Utils__WEBPACK_IMPORTED_MODULE_6__["Arg"].isRequired(url, "url"); + this.url = url; + // Flow-typing knows where it's at. Since HttpTransportType is a number and IHttpConnectionOptions is guaranteed + // to be an object, we know (as does TypeScript) this comparison is all we need to figure out which overload was called. + if (typeof transportTypeOrOptions === "object") { + this.httpConnectionOptions = __assign({}, this.httpConnectionOptions, transportTypeOrOptions); + } + else { + this.httpConnectionOptions = __assign({}, this.httpConnectionOptions, { transport: transportTypeOrOptions }); + } + return this; + }; + /** Configures the {@link @microsoft/signalr.HubConnection} to use the specified Hub Protocol. + * + * @param {IHubProtocol} protocol The {@link @microsoft/signalr.IHubProtocol} implementation to use. + */ + HubConnectionBuilder.prototype.withHubProtocol = function (protocol) { + _Utils__WEBPACK_IMPORTED_MODULE_6__["Arg"].isRequired(protocol, "protocol"); + this.protocol = protocol; + return this; + }; + HubConnectionBuilder.prototype.withAutomaticReconnect = function (retryDelaysOrReconnectPolicy) { + if (this.reconnectPolicy) { + throw new Error("A reconnectPolicy has already been set."); + } + if (!retryDelaysOrReconnectPolicy) { + this.reconnectPolicy = new _DefaultReconnectPolicy__WEBPACK_IMPORTED_MODULE_0__["DefaultReconnectPolicy"](); + } + else if (Array.isArray(retryDelaysOrReconnectPolicy)) { + this.reconnectPolicy = new _DefaultReconnectPolicy__WEBPACK_IMPORTED_MODULE_0__["DefaultReconnectPolicy"](retryDelaysOrReconnectPolicy); + } + else { + this.reconnectPolicy = retryDelaysOrReconnectPolicy; + } + return this; + }; + /** Creates a {@link @microsoft/signalr.HubConnection} from the configuration options specified in this builder. + * + * @returns {HubConnection} The configured {@link @microsoft/signalr.HubConnection}. + */ + HubConnectionBuilder.prototype.build = function () { + // If httpConnectionOptions has a logger, use it. Otherwise, override it with the one + // provided to configureLogger + var httpConnectionOptions = this.httpConnectionOptions || {}; + // If it's 'null', the user **explicitly** asked for null, don't mess with it. + if (httpConnectionOptions.logger === undefined) { + // If our logger is undefined or null, that's OK, the HttpConnection constructor will handle it. + httpConnectionOptions.logger = this.logger; + } + // Now create the connection + if (!this.url) { + throw new Error("The 'HubConnectionBuilder.withUrl' method must be called before building the connection."); + } + var connection = new _HttpConnection__WEBPACK_IMPORTED_MODULE_1__["HttpConnection"](this.url, httpConnectionOptions); + return _HubConnection__WEBPACK_IMPORTED_MODULE_2__["HubConnection"].create(connection, this.logger || _Loggers__WEBPACK_IMPORTED_MODULE_5__["NullLogger"].instance, this.protocol || new _JsonHubProtocol__WEBPACK_IMPORTED_MODULE_4__["JsonHubProtocol"](), this.reconnectPolicy); + }; + return HubConnectionBuilder; +}()); + +function isLogger(logger) { + return logger.log !== undefined; +} + + +/***/ }), +/* 18 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DefaultReconnectPolicy", function() { return DefaultReconnectPolicy; }); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// 0, 2, 10, 30 second delays before reconnect attempts. +var DEFAULT_RETRY_DELAYS_IN_MILLISECONDS = [0, 2000, 10000, 30000, null]; +/** @private */ +var DefaultReconnectPolicy = /** @class */ (function () { + function DefaultReconnectPolicy(retryDelays) { + this.retryDelays = retryDelays !== undefined ? retryDelays.concat([null]) : DEFAULT_RETRY_DELAYS_IN_MILLISECONDS; + } + DefaultReconnectPolicy.prototype.nextRetryDelayInMilliseconds = function (retryContext) { + return this.retryDelays[retryContext.previousRetryCount]; + }; + return DefaultReconnectPolicy; +}()); + + + +/***/ }), +/* 19 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HttpConnection", function() { return HttpConnection; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TransportSendQueue", function() { return TransportSendQueue; }); +/* harmony import */ var _DefaultHttpClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9); +/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(20); +/* harmony import */ var _LongPollingTransport__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(21); +/* harmony import */ var _ServerSentEventsTransport__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(23); +/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(13); +/* harmony import */ var _WebSocketTransport__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(24); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (undefined && undefined.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; + + + + + + + +var MAX_REDIRECTS = 100; +var WebSocketModule = null; +var EventSourceModule = null; +if (_Utils__WEBPACK_IMPORTED_MODULE_5__["Platform"].isNode && "function" !== "undefined") { + // In order to ignore the dynamic require in webpack builds we need to do this magic + // @ts-ignore: TS doesn't know about these names + var requireFunc = true ? require : undefined; + WebSocketModule = requireFunc("ws"); + EventSourceModule = requireFunc("eventsource"); +} +/** @private */ +var HttpConnection = /** @class */ (function () { + function HttpConnection(url, options) { + if (options === void 0) { options = {}; } + this.features = {}; + this.negotiateVersion = 1; + _Utils__WEBPACK_IMPORTED_MODULE_5__["Arg"].isRequired(url, "url"); + this.logger = Object(_Utils__WEBPACK_IMPORTED_MODULE_5__["createLogger"])(options.logger); + this.baseUrl = this.resolveUrl(url); + options = options || {}; + options.logMessageContent = options.logMessageContent || false; + if (!_Utils__WEBPACK_IMPORTED_MODULE_5__["Platform"].isNode && typeof WebSocket !== "undefined" && !options.WebSocket) { + options.WebSocket = WebSocket; + } + else if (_Utils__WEBPACK_IMPORTED_MODULE_5__["Platform"].isNode && !options.WebSocket) { + if (WebSocketModule) { + options.WebSocket = WebSocketModule; + } + } + if (!_Utils__WEBPACK_IMPORTED_MODULE_5__["Platform"].isNode && typeof EventSource !== "undefined" && !options.EventSource) { + options.EventSource = EventSource; + } + else if (_Utils__WEBPACK_IMPORTED_MODULE_5__["Platform"].isNode && !options.EventSource) { + if (typeof EventSourceModule !== "undefined") { + options.EventSource = EventSourceModule; + } + } + this.httpClient = options.httpClient || new _DefaultHttpClient__WEBPACK_IMPORTED_MODULE_0__["DefaultHttpClient"](this.logger); + this.connectionState = "Disconnected" /* Disconnected */; + this.connectionStarted = false; + this.options = options; + this.onreceive = null; + this.onclose = null; + } + HttpConnection.prototype.start = function (transferFormat) { + return __awaiter(this, void 0, void 0, function () { + var message, message; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + transferFormat = transferFormat || _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"].Binary; + _Utils__WEBPACK_IMPORTED_MODULE_5__["Arg"].isIn(transferFormat, _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"], "transferFormat"); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "Starting connection with transfer format '" + _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"][transferFormat] + "'."); + if (this.connectionState !== "Disconnected" /* Disconnected */) { + return [2 /*return*/, Promise.reject(new Error("Cannot start an HttpConnection that is not in the 'Disconnected' state."))]; + } + this.connectionState = "Connecting " /* Connecting */; + this.startInternalPromise = this.startInternal(transferFormat); + return [4 /*yield*/, this.startInternalPromise]; + case 1: + _a.sent(); + if (!(this.connectionState === "Disconnecting" /* Disconnecting */)) return [3 /*break*/, 3]; + message = "Failed to start the HttpConnection before stop() was called."; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error, message); + // We cannot await stopPromise inside startInternal since stopInternal awaits the startInternalPromise. + return [4 /*yield*/, this.stopPromise]; + case 2: + // We cannot await stopPromise inside startInternal since stopInternal awaits the startInternalPromise. + _a.sent(); + return [2 /*return*/, Promise.reject(new Error(message))]; + case 3: + if (this.connectionState !== "Connected" /* Connected */) { + message = "HttpConnection.startInternal completed gracefully but didn't enter the connection into the connected state!"; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error, message); + return [2 /*return*/, Promise.reject(new Error(message))]; + } + _a.label = 4; + case 4: + this.connectionStarted = true; + return [2 /*return*/]; + } + }); + }); + }; + HttpConnection.prototype.send = function (data) { + if (this.connectionState !== "Connected" /* Connected */) { + return Promise.reject(new Error("Cannot send data if the connection is not in the 'Connected' State.")); + } + if (!this.sendQueue) { + this.sendQueue = new TransportSendQueue(this.transport); + } + // Transport will not be null if state is connected + return this.sendQueue.send(data); + }; + HttpConnection.prototype.stop = function (error) { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (this.connectionState === "Disconnected" /* Disconnected */) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "Call to HttpConnection.stop(" + error + ") ignored because the connection is already in the disconnected state."); + return [2 /*return*/, Promise.resolve()]; + } + if (this.connectionState === "Disconnecting" /* Disconnecting */) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "Call to HttpConnection.stop(" + error + ") ignored because the connection is already in the disconnecting state."); + return [2 /*return*/, this.stopPromise]; + } + this.connectionState = "Disconnecting" /* Disconnecting */; + this.stopPromise = new Promise(function (resolve) { + // Don't complete stop() until stopConnection() completes. + _this.stopPromiseResolver = resolve; + }); + // stopInternal should never throw so just observe it. + return [4 /*yield*/, this.stopInternal(error)]; + case 1: + // stopInternal should never throw so just observe it. + _a.sent(); + return [4 /*yield*/, this.stopPromise]; + case 2: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; + HttpConnection.prototype.stopInternal = function (error) { + return __awaiter(this, void 0, void 0, function () { + var e_1, e_2; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + // Set error as soon as possible otherwise there is a race between + // the transport closing and providing an error and the error from a close message + // We would prefer the close message error. + this.stopError = error; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, this.startInternalPromise]; + case 2: + _a.sent(); + return [3 /*break*/, 4]; + case 3: + e_1 = _a.sent(); + return [3 /*break*/, 4]; + case 4: + if (!this.transport) return [3 /*break*/, 9]; + _a.label = 5; + case 5: + _a.trys.push([5, 7, , 8]); + return [4 /*yield*/, this.transport.stop()]; + case 6: + _a.sent(); + return [3 /*break*/, 8]; + case 7: + e_2 = _a.sent(); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error, "HttpConnection.transport.stop() threw error '" + e_2 + "'."); + this.stopConnection(); + return [3 /*break*/, 8]; + case 8: + this.transport = undefined; + return [3 /*break*/, 10]; + case 9: + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "HttpConnection.transport is undefined in HttpConnection.stop() because start() failed."); + this.stopConnection(); + _a.label = 10; + case 10: return [2 /*return*/]; + } + }); + }); + }; + HttpConnection.prototype.startInternal = function (transferFormat) { + return __awaiter(this, void 0, void 0, function () { + var url, negotiateResponse, redirects, _loop_1, this_1, e_3; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + url = this.baseUrl; + this.accessTokenFactory = this.options.accessTokenFactory; + _a.label = 1; + case 1: + _a.trys.push([1, 12, , 13]); + if (!this.options.skipNegotiation) return [3 /*break*/, 5]; + if (!(this.options.transport === _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].WebSockets)) return [3 /*break*/, 3]; + // No need to add a connection ID in this case + this.transport = this.constructTransport(_ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].WebSockets); + // We should just call connect directly in this case. + // No fallback or negotiate in this case. + return [4 /*yield*/, this.startTransport(url, transferFormat)]; + case 2: + // We should just call connect directly in this case. + // No fallback or negotiate in this case. + _a.sent(); + return [3 /*break*/, 4]; + case 3: throw new Error("Negotiation can only be skipped when using the WebSocket transport directly."); + case 4: return [3 /*break*/, 11]; + case 5: + negotiateResponse = null; + redirects = 0; + _loop_1 = function () { + var accessToken_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this_1.getNegotiationResponse(url)]; + case 1: + negotiateResponse = _a.sent(); + // the user tries to stop the connection when it is being started + if (this_1.connectionState === "Disconnecting" /* Disconnecting */ || this_1.connectionState === "Disconnected" /* Disconnected */) { + throw new Error("The connection was stopped during negotiation."); + } + if (negotiateResponse.error) { + throw new Error(negotiateResponse.error); + } + if (negotiateResponse.ProtocolVersion) { + throw new Error("Detected a connection attempt to an ASP.NET SignalR Server. This client only supports connecting to an ASP.NET Core SignalR Server. See https://aka.ms/signalr-core-differences for details."); + } + if (negotiateResponse.url) { + url = negotiateResponse.url; + } + if (negotiateResponse.accessToken) { + accessToken_1 = negotiateResponse.accessToken; + this_1.accessTokenFactory = function () { return accessToken_1; }; + } + redirects++; + return [2 /*return*/]; + } + }); + }; + this_1 = this; + _a.label = 6; + case 6: return [5 /*yield**/, _loop_1()]; + case 7: + _a.sent(); + _a.label = 8; + case 8: + if (negotiateResponse.url && redirects < MAX_REDIRECTS) return [3 /*break*/, 6]; + _a.label = 9; + case 9: + if (redirects === MAX_REDIRECTS && negotiateResponse.url) { + throw new Error("Negotiate redirection limit exceeded."); + } + return [4 /*yield*/, this.createTransport(url, this.options.transport, negotiateResponse, transferFormat)]; + case 10: + _a.sent(); + _a.label = 11; + case 11: + if (this.transport instanceof _LongPollingTransport__WEBPACK_IMPORTED_MODULE_3__["LongPollingTransport"]) { + this.features.inherentKeepAlive = true; + } + if (this.connectionState === "Connecting " /* Connecting */) { + // Ensure the connection transitions to the connected state prior to completing this.startInternalPromise. + // start() will handle the case when stop was called and startInternal exits still in the disconnecting state. + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "The HttpConnection connected successfully."); + this.connectionState = "Connected" /* Connected */; + } + return [3 /*break*/, 13]; + case 12: + e_3 = _a.sent(); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error, "Failed to start the connection: " + e_3); + this.connectionState = "Disconnected" /* Disconnected */; + this.transport = undefined; + return [2 /*return*/, Promise.reject(e_3)]; + case 13: return [2 /*return*/]; + } + }); + }); + }; + HttpConnection.prototype.getNegotiationResponse = function (url) { + return __awaiter(this, void 0, void 0, function () { + var _a, headers, token, negotiateUrl, response, negotiateResponse, e_4; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!this.accessTokenFactory) return [3 /*break*/, 2]; + return [4 /*yield*/, this.accessTokenFactory()]; + case 1: + token = _b.sent(); + if (token) { + headers = (_a = {}, + _a["Authorization"] = "Bearer " + token, + _a); + } + _b.label = 2; + case 2: + negotiateUrl = this.resolveNegotiateUrl(url); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "Sending negotiation request: " + negotiateUrl + "."); + _b.label = 3; + case 3: + _b.trys.push([3, 5, , 6]); + return [4 /*yield*/, this.httpClient.post(negotiateUrl, { + content: "", + headers: headers, + })]; + case 4: + response = _b.sent(); + if (response.statusCode !== 200) { + return [2 /*return*/, Promise.reject(new Error("Unexpected status code returned from negotiate " + response.statusCode))]; + } + negotiateResponse = JSON.parse(response.content); + if (!negotiateResponse.negotiateVersion || negotiateResponse.negotiateVersion < 1) { + // Negotiate version 0 doesn't use connectionToken + // So we set it equal to connectionId so all our logic can use connectionToken without being aware of the negotiate version + negotiateResponse.connectionToken = negotiateResponse.connectionId; + } + return [2 /*return*/, negotiateResponse]; + case 5: + e_4 = _b.sent(); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error, "Failed to complete negotiation with the server: " + e_4); + return [2 /*return*/, Promise.reject(e_4)]; + case 6: return [2 /*return*/]; + } + }); + }); + }; + HttpConnection.prototype.createConnectUrl = function (url, connectionToken) { + if (!connectionToken) { + return url; + } + return url + (url.indexOf("?") === -1 ? "?" : "&") + ("id=" + connectionToken); + }; + HttpConnection.prototype.createTransport = function (url, requestedTransport, negotiateResponse, requestedTransferFormat) { + return __awaiter(this, void 0, void 0, function () { + var connectUrl, transportExceptions, transports, negotiate, _i, transports_1, endpoint, transportOrError, ex_1, ex_2, message; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + connectUrl = this.createConnectUrl(url, negotiateResponse.connectionToken); + if (!this.isITransport(requestedTransport)) return [3 /*break*/, 2]; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "Connection was provided an instance of ITransport, using that directly."); + this.transport = requestedTransport; + return [4 /*yield*/, this.startTransport(connectUrl, requestedTransferFormat)]; + case 1: + _a.sent(); + this.connectionId = negotiateResponse.connectionId; + return [2 /*return*/]; + case 2: + transportExceptions = []; + transports = negotiateResponse.availableTransports || []; + negotiate = negotiateResponse; + _i = 0, transports_1 = transports; + _a.label = 3; + case 3: + if (!(_i < transports_1.length)) return [3 /*break*/, 13]; + endpoint = transports_1[_i]; + transportOrError = this.resolveTransportOrError(endpoint, requestedTransport, requestedTransferFormat); + if (!(transportOrError instanceof Error)) return [3 /*break*/, 4]; + // Store the error and continue, we don't want to cause a re-negotiate in these cases + transportExceptions.push(endpoint.transport + " failed: " + transportOrError); + return [3 /*break*/, 12]; + case 4: + if (!this.isITransport(transportOrError)) return [3 /*break*/, 12]; + this.transport = transportOrError; + if (!!negotiate) return [3 /*break*/, 9]; + _a.label = 5; + case 5: + _a.trys.push([5, 7, , 8]); + return [4 /*yield*/, this.getNegotiationResponse(url)]; + case 6: + negotiate = _a.sent(); + return [3 /*break*/, 8]; + case 7: + ex_1 = _a.sent(); + return [2 /*return*/, Promise.reject(ex_1)]; + case 8: + connectUrl = this.createConnectUrl(url, negotiate.connectionToken); + _a.label = 9; + case 9: + _a.trys.push([9, 11, , 12]); + return [4 /*yield*/, this.startTransport(connectUrl, requestedTransferFormat)]; + case 10: + _a.sent(); + this.connectionId = negotiate.connectionId; + return [2 /*return*/]; + case 11: + ex_2 = _a.sent(); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error, "Failed to start the transport '" + endpoint.transport + "': " + ex_2); + negotiate = undefined; + transportExceptions.push(endpoint.transport + " failed: " + ex_2); + if (this.connectionState !== "Connecting " /* Connecting */) { + message = "Failed to select transport before stop() was called."; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, message); + return [2 /*return*/, Promise.reject(new Error(message))]; + } + return [3 /*break*/, 12]; + case 12: + _i++; + return [3 /*break*/, 3]; + case 13: + if (transportExceptions.length > 0) { + return [2 /*return*/, Promise.reject(new Error("Unable to connect to the server with any of the available transports. " + transportExceptions.join(" ")))]; + } + return [2 /*return*/, Promise.reject(new Error("None of the transports supported by the client are supported by the server."))]; + } + }); + }); + }; + HttpConnection.prototype.constructTransport = function (transport) { + switch (transport) { + case _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].WebSockets: + if (!this.options.WebSocket) { + throw new Error("'WebSocket' is not supported in your environment."); + } + return new _WebSocketTransport__WEBPACK_IMPORTED_MODULE_6__["WebSocketTransport"](this.httpClient, this.accessTokenFactory, this.logger, this.options.logMessageContent || false, this.options.WebSocket); + case _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].ServerSentEvents: + if (!this.options.EventSource) { + throw new Error("'EventSource' is not supported in your environment."); + } + return new _ServerSentEventsTransport__WEBPACK_IMPORTED_MODULE_4__["ServerSentEventsTransport"](this.httpClient, this.accessTokenFactory, this.logger, this.options.logMessageContent || false, this.options.EventSource); + case _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].LongPolling: + return new _LongPollingTransport__WEBPACK_IMPORTED_MODULE_3__["LongPollingTransport"](this.httpClient, this.accessTokenFactory, this.logger, this.options.logMessageContent || false); + default: + throw new Error("Unknown transport: " + transport + "."); + } + }; + HttpConnection.prototype.startTransport = function (url, transferFormat) { + var _this = this; + this.transport.onreceive = this.onreceive; + this.transport.onclose = function (e) { return _this.stopConnection(e); }; + return this.transport.connect(url, transferFormat); + }; + HttpConnection.prototype.resolveTransportOrError = function (endpoint, requestedTransport, requestedTransferFormat) { + var transport = _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][endpoint.transport]; + if (transport === null || transport === undefined) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "Skipping transport '" + endpoint.transport + "' because it is not supported by this client."); + return new Error("Skipping transport '" + endpoint.transport + "' because it is not supported by this client."); + } + else { + if (transportMatches(requestedTransport, transport)) { + var transferFormats = endpoint.transferFormats.map(function (s) { return _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"][s]; }); + if (transferFormats.indexOf(requestedTransferFormat) >= 0) { + if ((transport === _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].WebSockets && !this.options.WebSocket) || + (transport === _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].ServerSentEvents && !this.options.EventSource)) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "Skipping transport '" + _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport] + "' because it is not supported in your environment.'"); + return new Error("'" + _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport] + "' is not supported in your environment."); + } + else { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "Selecting transport '" + _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport] + "'."); + try { + return this.constructTransport(transport); + } + catch (ex) { + return ex; + } + } + } + else { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "Skipping transport '" + _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport] + "' because it does not support the requested transfer format '" + _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"][requestedTransferFormat] + "'."); + return new Error("'" + _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport] + "' does not support " + _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"][requestedTransferFormat] + "."); + } + } + else { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "Skipping transport '" + _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport] + "' because it was disabled by the client."); + return new Error("'" + _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport] + "' is disabled by the client."); + } + } + }; + HttpConnection.prototype.isITransport = function (transport) { + return transport && typeof (transport) === "object" && "connect" in transport; + }; + HttpConnection.prototype.stopConnection = function (error) { + var _this = this; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "HttpConnection.stopConnection(" + error + ") called while in state " + this.connectionState + "."); + this.transport = undefined; + // If we have a stopError, it takes precedence over the error from the transport + error = this.stopError || error; + this.stopError = undefined; + if (this.connectionState === "Disconnected" /* Disconnected */) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug, "Call to HttpConnection.stopConnection(" + error + ") was ignored because the connection is already in the disconnected state."); + return; + } + if (this.connectionState === "Connecting " /* Connecting */) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Warning, "Call to HttpConnection.stopConnection(" + error + ") was ignored because the connection hasn't yet left the in the connecting state."); + return; + } + if (this.connectionState === "Disconnecting" /* Disconnecting */) { + // A call to stop() induced this call to stopConnection and needs to be completed. + // Any stop() awaiters will be scheduled to continue after the onclose callback fires. + this.stopPromiseResolver(); + } + if (error) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error, "Connection disconnected with error '" + error + "'."); + } + else { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Information, "Connection disconnected."); + } + if (this.sendQueue) { + this.sendQueue.stop().catch(function (e) { + _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error, "TransportSendQueue.stop() threw error '" + e + "'."); + }); + this.sendQueue = undefined; + } + this.connectionId = undefined; + this.connectionState = "Disconnected" /* Disconnected */; + if (this.connectionStarted) { + this.connectionStarted = false; + try { + if (this.onclose) { + this.onclose(error); + } + } + catch (e) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error, "HttpConnection.onclose(" + error + ") threw error '" + e + "'."); + } + } + }; + HttpConnection.prototype.resolveUrl = function (url) { + // startsWith is not supported in IE + if (url.lastIndexOf("https://", 0) === 0 || url.lastIndexOf("http://", 0) === 0) { + return url; + } + if (!_Utils__WEBPACK_IMPORTED_MODULE_5__["Platform"].isBrowser || !window.document) { + throw new Error("Cannot resolve '" + url + "'."); + } + // Setting the url to the href propery of an anchor tag handles normalization + // for us. There are 3 main cases. + // 1. Relative path normalization e.g "b" -> "http://localhost:5000/a/b" + // 2. Absolute path normalization e.g "/a/b" -> "http://localhost:5000/a/b" + // 3. Networkpath reference normalization e.g "//localhost:5000/a/b" -> "http://localhost:5000/a/b" + var aTag = window.document.createElement("a"); + aTag.href = url; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Information, "Normalizing '" + url + "' to '" + aTag.href + "'."); + return aTag.href; + }; + HttpConnection.prototype.resolveNegotiateUrl = function (url) { + var index = url.indexOf("?"); + var negotiateUrl = url.substring(0, index === -1 ? url.length : index); + if (negotiateUrl[negotiateUrl.length - 1] !== "/") { + negotiateUrl += "/"; + } + negotiateUrl += "negotiate"; + negotiateUrl += index === -1 ? "" : url.substring(index); + if (negotiateUrl.indexOf("negotiateVersion") === -1) { + negotiateUrl += index === -1 ? "?" : "&"; + negotiateUrl += "negotiateVersion=" + this.negotiateVersion; + } + return negotiateUrl; + }; + return HttpConnection; +}()); + +function transportMatches(requestedTransport, actualTransport) { + return !requestedTransport || ((actualTransport & requestedTransport) !== 0); +} +/** @private */ +var TransportSendQueue = /** @class */ (function () { + function TransportSendQueue(transport) { + this.transport = transport; + this.buffer = []; + this.executing = true; + this.sendBufferedData = new PromiseSource(); + this.transportResult = new PromiseSource(); + this.sendLoopPromise = this.sendLoop(); + } + TransportSendQueue.prototype.send = function (data) { + this.bufferData(data); + if (!this.transportResult) { + this.transportResult = new PromiseSource(); + } + return this.transportResult.promise; + }; + TransportSendQueue.prototype.stop = function () { + this.executing = false; + this.sendBufferedData.resolve(); + return this.sendLoopPromise; + }; + TransportSendQueue.prototype.bufferData = function (data) { + if (this.buffer.length && typeof (this.buffer[0]) !== typeof (data)) { + throw new Error("Expected data to be of type " + typeof (this.buffer) + " but was of type " + typeof (data)); + } + this.buffer.push(data); + this.sendBufferedData.resolve(); + }; + TransportSendQueue.prototype.sendLoop = function () { + return __awaiter(this, void 0, void 0, function () { + var transportResult, data, error_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (false) {} + return [4 /*yield*/, this.sendBufferedData.promise]; + case 1: + _a.sent(); + if (!this.executing) { + if (this.transportResult) { + this.transportResult.reject("Connection stopped."); + } + return [3 /*break*/, 6]; + } + this.sendBufferedData = new PromiseSource(); + transportResult = this.transportResult; + this.transportResult = undefined; + data = typeof (this.buffer[0]) === "string" ? + this.buffer.join("") : + TransportSendQueue.concatBuffers(this.buffer); + this.buffer.length = 0; + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 5]); + return [4 /*yield*/, this.transport.send(data)]; + case 3: + _a.sent(); + transportResult.resolve(); + return [3 /*break*/, 5]; + case 4: + error_1 = _a.sent(); + transportResult.reject(error_1); + return [3 /*break*/, 5]; + case 5: return [3 /*break*/, 0]; + case 6: return [2 /*return*/]; + } + }); + }); + }; + TransportSendQueue.concatBuffers = function (arrayBuffers) { + var totalLength = arrayBuffers.map(function (b) { return b.byteLength; }).reduce(function (a, b) { return a + b; }); + var result = new Uint8Array(totalLength); + var offset = 0; + for (var _i = 0, arrayBuffers_1 = arrayBuffers; _i < arrayBuffers_1.length; _i++) { + var item = arrayBuffers_1[_i]; + result.set(new Uint8Array(item), offset); + offset += item.byteLength; + } + return result; + }; + return TransportSendQueue; +}()); + +var PromiseSource = /** @class */ (function () { + function PromiseSource() { + var _this = this; + this.promise = new Promise(function (resolve, reject) { + var _a; + return _a = [resolve, reject], _this.resolver = _a[0], _this.rejecter = _a[1], _a; + }); + } + PromiseSource.prototype.resolve = function () { + this.resolver(); + }; + PromiseSource.prototype.reject = function (reason) { + this.rejecter(reason); + }; + return PromiseSource; +}()); + + +/***/ }), +/* 20 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HttpTransportType", function() { return HttpTransportType; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TransferFormat", function() { return TransferFormat; }); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// This will be treated as a bit flag in the future, so we keep it using power-of-two values. +/** Specifies a specific HTTP transport type. */ +var HttpTransportType; +(function (HttpTransportType) { + /** Specifies no transport preference. */ + HttpTransportType[HttpTransportType["None"] = 0] = "None"; + /** Specifies the WebSockets transport. */ + HttpTransportType[HttpTransportType["WebSockets"] = 1] = "WebSockets"; + /** Specifies the Server-Sent Events transport. */ + HttpTransportType[HttpTransportType["ServerSentEvents"] = 2] = "ServerSentEvents"; + /** Specifies the Long Polling transport. */ + HttpTransportType[HttpTransportType["LongPolling"] = 4] = "LongPolling"; +})(HttpTransportType || (HttpTransportType = {})); +/** Specifies the transfer format for a connection. */ +var TransferFormat; +(function (TransferFormat) { + /** Specifies that only text data will be transmitted over the connection. */ + TransferFormat[TransferFormat["Text"] = 1] = "Text"; + /** Specifies that binary data will be transmitted over the connection. */ + TransferFormat[TransferFormat["Binary"] = 2] = "Binary"; +})(TransferFormat || (TransferFormat = {})); + + +/***/ }), +/* 21 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LongPollingTransport", function() { return LongPollingTransport; }); +/* harmony import */ var _AbortController__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(22); +/* harmony import */ var _Errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); +/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9); +/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(20); +/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(13); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (undefined && undefined.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; + + + + + +// Not exported from 'index', this type is internal. +/** @private */ +var LongPollingTransport = /** @class */ (function () { + function LongPollingTransport(httpClient, accessTokenFactory, logger, logMessageContent) { + this.httpClient = httpClient; + this.accessTokenFactory = accessTokenFactory; + this.logger = logger; + this.pollAbort = new _AbortController__WEBPACK_IMPORTED_MODULE_0__["AbortController"](); + this.logMessageContent = logMessageContent; + this.running = false; + this.onreceive = null; + this.onclose = null; + } + Object.defineProperty(LongPollingTransport.prototype, "pollAborted", { + // This is an internal type, not exported from 'index' so this is really just internal. + get: function () { + return this.pollAbort.aborted; + }, + enumerable: true, + configurable: true + }); + LongPollingTransport.prototype.connect = function (url, transferFormat) { + return __awaiter(this, void 0, void 0, function () { + var pollOptions, token, pollUrl, response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isRequired(url, "url"); + _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isRequired(transferFormat, "transferFormat"); + _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isIn(transferFormat, _ITransport__WEBPACK_IMPORTED_MODULE_3__["TransferFormat"], "transferFormat"); + this.url = url; + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) Connecting."); + // Allow binary format on Node and Browsers that support binary content (indicated by the presence of responseType property) + if (transferFormat === _ITransport__WEBPACK_IMPORTED_MODULE_3__["TransferFormat"].Binary && + (typeof XMLHttpRequest !== "undefined" && typeof new XMLHttpRequest().responseType !== "string")) { + throw new Error("Binary protocols over XmlHttpRequest not implementing advanced features are not supported."); + } + pollOptions = { + abortSignal: this.pollAbort.signal, + headers: {}, + timeout: 100000, + }; + if (transferFormat === _ITransport__WEBPACK_IMPORTED_MODULE_3__["TransferFormat"].Binary) { + pollOptions.responseType = "arraybuffer"; + } + return [4 /*yield*/, this.getAccessToken()]; + case 1: + token = _a.sent(); + this.updateHeaderToken(pollOptions, token); + pollUrl = url + "&_=" + Date.now(); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) polling: " + pollUrl + "."); + return [4 /*yield*/, this.httpClient.get(pollUrl, pollOptions)]; + case 2: + response = _a.sent(); + if (response.statusCode !== 200) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, "(LongPolling transport) Unexpected response code: " + response.statusCode + "."); + // Mark running as false so that the poll immediately ends and runs the close logic + this.closeError = new _Errors__WEBPACK_IMPORTED_MODULE_1__["HttpError"](response.statusText || "", response.statusCode); + this.running = false; + } + else { + this.running = true; + } + this.receiving = this.poll(this.url, pollOptions); + return [2 /*return*/]; + } + }); + }); + }; + LongPollingTransport.prototype.getAccessToken = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!this.accessTokenFactory) return [3 /*break*/, 2]; + return [4 /*yield*/, this.accessTokenFactory()]; + case 1: return [2 /*return*/, _a.sent()]; + case 2: return [2 /*return*/, null]; + } + }); + }); + }; + LongPollingTransport.prototype.updateHeaderToken = function (request, token) { + if (!request.headers) { + request.headers = {}; + } + if (token) { + // tslint:disable-next-line:no-string-literal + request.headers["Authorization"] = "Bearer " + token; + return; + } + // tslint:disable-next-line:no-string-literal + if (request.headers["Authorization"]) { + // tslint:disable-next-line:no-string-literal + delete request.headers["Authorization"]; + } + }; + LongPollingTransport.prototype.poll = function (url, pollOptions) { + return __awaiter(this, void 0, void 0, function () { + var token, pollUrl, response, e_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _a.trys.push([0, , 8, 9]); + _a.label = 1; + case 1: + if (!this.running) return [3 /*break*/, 7]; + return [4 /*yield*/, this.getAccessToken()]; + case 2: + token = _a.sent(); + this.updateHeaderToken(pollOptions, token); + _a.label = 3; + case 3: + _a.trys.push([3, 5, , 6]); + pollUrl = url + "&_=" + Date.now(); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) polling: " + pollUrl + "."); + return [4 /*yield*/, this.httpClient.get(pollUrl, pollOptions)]; + case 4: + response = _a.sent(); + if (response.statusCode === 204) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "(LongPolling transport) Poll terminated by server."); + this.running = false; + } + else if (response.statusCode !== 200) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, "(LongPolling transport) Unexpected response code: " + response.statusCode + "."); + // Unexpected status code + this.closeError = new _Errors__WEBPACK_IMPORTED_MODULE_1__["HttpError"](response.statusText || "", response.statusCode); + this.running = false; + } + else { + // Process the response + if (response.content) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) data received. " + Object(_Utils__WEBPACK_IMPORTED_MODULE_4__["getDataDetail"])(response.content, this.logMessageContent) + "."); + if (this.onreceive) { + this.onreceive(response.content); + } + } + else { + // This is another way timeout manifest. + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) Poll timed out, reissuing."); + } + } + return [3 /*break*/, 6]; + case 5: + e_1 = _a.sent(); + if (!this.running) { + // Log but disregard errors that occur after stopping + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) Poll errored after shutdown: " + e_1.message); + } + else { + if (e_1 instanceof _Errors__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]) { + // Ignore timeouts and reissue the poll. + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) Poll timed out, reissuing."); + } + else { + // Close the connection with the error as the result. + this.closeError = e_1; + this.running = false; + } + } + return [3 /*break*/, 6]; + case 6: return [3 /*break*/, 1]; + case 7: return [3 /*break*/, 9]; + case 8: + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) Polling complete."); + // We will reach here with pollAborted==false when the server returned a response causing the transport to stop. + // If pollAborted==true then client initiated the stop and the stop method will raise the close event after DELETE is sent. + if (!this.pollAborted) { + this.raiseOnClose(); + } + return [7 /*endfinally*/]; + case 9: return [2 /*return*/]; + } + }); + }); + }; + LongPollingTransport.prototype.send = function (data) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + if (!this.running) { + return [2 /*return*/, Promise.reject(new Error("Cannot send until the transport is connected"))]; + } + return [2 /*return*/, Object(_Utils__WEBPACK_IMPORTED_MODULE_4__["sendMessage"])(this.logger, "LongPolling", this.httpClient, this.url, this.accessTokenFactory, data, this.logMessageContent)]; + }); + }); + }; + LongPollingTransport.prototype.stop = function () { + return __awaiter(this, void 0, void 0, function () { + var deleteOptions, token; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) Stopping polling."); + // Tell receiving loop to stop, abort any current request, and then wait for it to finish + this.running = false; + this.pollAbort.abort(); + _a.label = 1; + case 1: + _a.trys.push([1, , 5, 6]); + return [4 /*yield*/, this.receiving]; + case 2: + _a.sent(); + // Send DELETE to clean up long polling on the server + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) sending DELETE request to " + this.url + "."); + deleteOptions = { + headers: {}, + }; + return [4 /*yield*/, this.getAccessToken()]; + case 3: + token = _a.sent(); + this.updateHeaderToken(deleteOptions, token); + return [4 /*yield*/, this.httpClient.delete(this.url, deleteOptions)]; + case 4: + _a.sent(); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) DELETE request sent."); + return [3 /*break*/, 6]; + case 5: + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, "(LongPolling transport) Stop finished."); + // Raise close event here instead of in polling + // It needs to happen after the DELETE request is sent + this.raiseOnClose(); + return [7 /*endfinally*/]; + case 6: return [2 /*return*/]; + } + }); + }); + }; + LongPollingTransport.prototype.raiseOnClose = function () { + if (this.onclose) { + var logMessage = "(LongPolling transport) Firing onclose event."; + if (this.closeError) { + logMessage += " Error: " + this.closeError; + } + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Trace, logMessage); + this.onclose(this.closeError); + } + }; + return LongPollingTransport; +}()); + + + +/***/ }), +/* 22 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AbortController", function() { return AbortController; }); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Rough polyfill of https://developer.mozilla.org/en-US/docs/Web/API/AbortController +// We don't actually ever use the API being polyfilled, we always use the polyfill because +// it's a very new API right now. +// Not exported from index. +/** @private */ +var AbortController = /** @class */ (function () { + function AbortController() { + this.isAborted = false; + this.onabort = null; + } + AbortController.prototype.abort = function () { + if (!this.isAborted) { + this.isAborted = true; + if (this.onabort) { + this.onabort(); + } + } + }; + Object.defineProperty(AbortController.prototype, "signal", { + get: function () { + return this; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AbortController.prototype, "aborted", { + get: function () { + return this.isAborted; + }, + enumerable: true, + configurable: true + }); + return AbortController; +}()); + + + +/***/ }), +/* 23 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ServerSentEventsTransport", function() { return ServerSentEventsTransport; }); +/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9); +/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20); +/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(13); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (undefined && undefined.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; + + + +/** @private */ +var ServerSentEventsTransport = /** @class */ (function () { + function ServerSentEventsTransport(httpClient, accessTokenFactory, logger, logMessageContent, eventSourceConstructor) { + this.httpClient = httpClient; + this.accessTokenFactory = accessTokenFactory; + this.logger = logger; + this.logMessageContent = logMessageContent; + this.eventSourceConstructor = eventSourceConstructor; + this.onreceive = null; + this.onclose = null; + } + ServerSentEventsTransport.prototype.connect = function (url, transferFormat) { + return __awaiter(this, void 0, void 0, function () { + var token; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _Utils__WEBPACK_IMPORTED_MODULE_2__["Arg"].isRequired(url, "url"); + _Utils__WEBPACK_IMPORTED_MODULE_2__["Arg"].isRequired(transferFormat, "transferFormat"); + _Utils__WEBPACK_IMPORTED_MODULE_2__["Arg"].isIn(transferFormat, _ITransport__WEBPACK_IMPORTED_MODULE_1__["TransferFormat"], "transferFormat"); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Trace, "(SSE transport) Connecting."); + // set url before accessTokenFactory because this.url is only for send and we set the auth header instead of the query string for send + this.url = url; + if (!this.accessTokenFactory) return [3 /*break*/, 2]; + return [4 /*yield*/, this.accessTokenFactory()]; + case 1: + token = _a.sent(); + if (token) { + url += (url.indexOf("?") < 0 ? "?" : "&") + ("access_token=" + encodeURIComponent(token)); + } + _a.label = 2; + case 2: return [2 /*return*/, new Promise(function (resolve, reject) { + var opened = false; + if (transferFormat !== _ITransport__WEBPACK_IMPORTED_MODULE_1__["TransferFormat"].Text) { + reject(new Error("The Server-Sent Events transport only supports the 'Text' transfer format")); + return; + } + var eventSource; + if (_Utils__WEBPACK_IMPORTED_MODULE_2__["Platform"].isBrowser || _Utils__WEBPACK_IMPORTED_MODULE_2__["Platform"].isWebWorker) { + eventSource = new _this.eventSourceConstructor(url, { withCredentials: true }); + } + else { + // Non-browser passes cookies via the dictionary + var cookies = _this.httpClient.getCookieString(url); + eventSource = new _this.eventSourceConstructor(url, { withCredentials: true, headers: { Cookie: cookies } }); + } + try { + eventSource.onmessage = function (e) { + if (_this.onreceive) { + try { + _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Trace, "(SSE transport) data received. " + Object(_Utils__WEBPACK_IMPORTED_MODULE_2__["getDataDetail"])(e.data, _this.logMessageContent) + "."); + _this.onreceive(e.data); + } + catch (error) { + _this.close(error); + return; + } + } + }; + eventSource.onerror = function (e) { + var error = new Error(e.data || "Error occurred"); + if (opened) { + _this.close(error); + } + else { + reject(error); + } + }; + eventSource.onopen = function () { + _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Information, "SSE connected to " + _this.url); + _this.eventSource = eventSource; + opened = true; + resolve(); + }; + } + catch (e) { + reject(e); + return; + } + })]; + } + }); + }); + }; + ServerSentEventsTransport.prototype.send = function (data) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + if (!this.eventSource) { + return [2 /*return*/, Promise.reject(new Error("Cannot send until the transport is connected"))]; + } + return [2 /*return*/, Object(_Utils__WEBPACK_IMPORTED_MODULE_2__["sendMessage"])(this.logger, "SSE", this.httpClient, this.url, this.accessTokenFactory, data, this.logMessageContent)]; + }); + }); + }; + ServerSentEventsTransport.prototype.stop = function () { + this.close(); + return Promise.resolve(); + }; + ServerSentEventsTransport.prototype.close = function (e) { + if (this.eventSource) { + this.eventSource.close(); + this.eventSource = undefined; + if (this.onclose) { + this.onclose(e); + } + } + }; + return ServerSentEventsTransport; +}()); + + + +/***/ }), +/* 24 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WebSocketTransport", function() { return WebSocketTransport; }); +/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9); +/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20); +/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(13); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (undefined && undefined.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; + + + +/** @private */ +var WebSocketTransport = /** @class */ (function () { + function WebSocketTransport(httpClient, accessTokenFactory, logger, logMessageContent, webSocketConstructor) { + this.logger = logger; + this.accessTokenFactory = accessTokenFactory; + this.logMessageContent = logMessageContent; + this.webSocketConstructor = webSocketConstructor; + this.httpClient = httpClient; + this.onreceive = null; + this.onclose = null; + } + WebSocketTransport.prototype.connect = function (url, transferFormat) { + return __awaiter(this, void 0, void 0, function () { + var token; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _Utils__WEBPACK_IMPORTED_MODULE_2__["Arg"].isRequired(url, "url"); + _Utils__WEBPACK_IMPORTED_MODULE_2__["Arg"].isRequired(transferFormat, "transferFormat"); + _Utils__WEBPACK_IMPORTED_MODULE_2__["Arg"].isIn(transferFormat, _ITransport__WEBPACK_IMPORTED_MODULE_1__["TransferFormat"], "transferFormat"); + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Trace, "(WebSockets transport) Connecting."); + if (!this.accessTokenFactory) return [3 /*break*/, 2]; + return [4 /*yield*/, this.accessTokenFactory()]; + case 1: + token = _a.sent(); + if (token) { + url += (url.indexOf("?") < 0 ? "?" : "&") + ("access_token=" + encodeURIComponent(token)); + } + _a.label = 2; + case 2: return [2 /*return*/, new Promise(function (resolve, reject) { + url = url.replace(/^http/, "ws"); + var webSocket; + var cookies = _this.httpClient.getCookieString(url); + var opened = false; + if (_Utils__WEBPACK_IMPORTED_MODULE_2__["Platform"].isNode && cookies) { + // Only pass cookies when in non-browser environments + webSocket = new _this.webSocketConstructor(url, undefined, { + headers: { + Cookie: "" + cookies, + }, + }); + } + if (!webSocket) { + // Chrome is not happy with passing 'undefined' as protocol + webSocket = new _this.webSocketConstructor(url); + } + if (transferFormat === _ITransport__WEBPACK_IMPORTED_MODULE_1__["TransferFormat"].Binary) { + webSocket.binaryType = "arraybuffer"; + } + // tslint:disable-next-line:variable-name + webSocket.onopen = function (_event) { + _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Information, "WebSocket connected to " + url + "."); + _this.webSocket = webSocket; + opened = true; + resolve(); + }; + webSocket.onerror = function (event) { + var error = null; + // ErrorEvent is a browser only type we need to check if the type exists before using it + if (typeof ErrorEvent !== "undefined" && event instanceof ErrorEvent) { + error = event.error; + } + else { + error = new Error("There was an error with the transport."); + } + reject(error); + }; + webSocket.onmessage = function (message) { + _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Trace, "(WebSockets transport) data received. " + Object(_Utils__WEBPACK_IMPORTED_MODULE_2__["getDataDetail"])(message.data, _this.logMessageContent) + "."); + if (_this.onreceive) { + _this.onreceive(message.data); + } + }; + webSocket.onclose = function (event) { + // Don't call close handler if connection was never established + // We'll reject the connect call instead + if (opened) { + _this.close(event); + } + else { + var error = null; + // ErrorEvent is a browser only type we need to check if the type exists before using it + if (typeof ErrorEvent !== "undefined" && event instanceof ErrorEvent) { + error = event.error; + } + else { + error = new Error("There was an error with the transport."); + } + reject(error); + } + }; + })]; + } + }); + }); + }; + WebSocketTransport.prototype.send = function (data) { + if (this.webSocket && this.webSocket.readyState === this.webSocketConstructor.OPEN) { + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Trace, "(WebSockets transport) sending data. " + Object(_Utils__WEBPACK_IMPORTED_MODULE_2__["getDataDetail"])(data, this.logMessageContent) + "."); + this.webSocket.send(data); + return Promise.resolve(); + } + return Promise.reject("WebSocket is not in the OPEN state"); + }; + WebSocketTransport.prototype.stop = function () { + if (this.webSocket) { + // Manually invoke onclose callback inline so we know the HttpConnection was closed properly before returning + // This also solves an issue where websocket.onclose could take 18+ seconds to trigger during network disconnects + this.close(undefined); + } + return Promise.resolve(); + }; + WebSocketTransport.prototype.close = function (event) { + // webSocket will be null if the transport did not start successfully + if (this.webSocket) { + // Clear websocket handlers because we are considering the socket closed now + this.webSocket.onclose = function () { }; + this.webSocket.onmessage = function () { }; + this.webSocket.onerror = function () { }; + this.webSocket.close(); + this.webSocket = undefined; + } + this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Trace, "(WebSockets transport) socket closed."); + if (this.onclose) { + if (event && (event.wasClean === false || event.code !== 1000)) { + this.onclose(new Error("WebSocket closed with status code: " + event.code + " (" + event.reason + ").")); + } + else { + this.onclose(); + } + } + }; + return WebSocketTransport; +}()); + + + +/***/ }), +/* 25 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "JsonHubProtocol", function() { return JsonHubProtocol; }); +/* harmony import */ var _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15); +/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9); +/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(20); +/* harmony import */ var _Loggers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(14); +/* harmony import */ var _TextMessageFormat__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(12); +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + + + + + +var JSON_HUB_PROTOCOL_NAME = "json"; +/** Implements the JSON Hub Protocol. */ +var JsonHubProtocol = /** @class */ (function () { + function JsonHubProtocol() { + /** @inheritDoc */ + this.name = JSON_HUB_PROTOCOL_NAME; + /** @inheritDoc */ + this.version = 1; + /** @inheritDoc */ + this.transferFormat = _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"].Text; + } + /** Creates an array of {@link @microsoft/signalr.HubMessage} objects from the specified serialized representation. + * + * @param {string} input A string containing the serialized representation. + * @param {ILogger} logger A logger that will be used to log messages that occur during parsing. + */ + JsonHubProtocol.prototype.parseMessages = function (input, logger) { + // The interface does allow "ArrayBuffer" to be passed in, but this implementation does not. So let's throw a useful error. + if (typeof input !== "string") { + throw new Error("Invalid input for JSON hub protocol. Expected a string."); + } + if (!input) { + return []; + } + if (logger === null) { + logger = _Loggers__WEBPACK_IMPORTED_MODULE_3__["NullLogger"].instance; + } + // Parse the messages + var messages = _TextMessageFormat__WEBPACK_IMPORTED_MODULE_4__["TextMessageFormat"].parse(input); + var hubMessages = []; + for (var _i = 0, messages_1 = messages; _i < messages_1.length; _i++) { + var message = messages_1[_i]; + var parsedMessage = JSON.parse(message); + if (typeof parsedMessage.type !== "number") { + throw new Error("Invalid payload."); + } + switch (parsedMessage.type) { + case _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__["MessageType"].Invocation: + this.isInvocationMessage(parsedMessage); + break; + case _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__["MessageType"].StreamItem: + this.isStreamItemMessage(parsedMessage); + break; + case _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__["MessageType"].Completion: + this.isCompletionMessage(parsedMessage); + break; + case _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__["MessageType"].Ping: + // Single value, no need to validate + break; + case _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__["MessageType"].Close: + // All optional values, no need to validate + break; + default: + // Future protocol changes can add message types, old clients can ignore them + logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Information, "Unknown message type '" + parsedMessage.type + "' ignored."); + continue; + } + hubMessages.push(parsedMessage); + } + return hubMessages; + }; + /** Writes the specified {@link @microsoft/signalr.HubMessage} to a string and returns it. + * + * @param {HubMessage} message The message to write. + * @returns {string} A string containing the serialized representation of the message. + */ + JsonHubProtocol.prototype.writeMessage = function (message) { + return _TextMessageFormat__WEBPACK_IMPORTED_MODULE_4__["TextMessageFormat"].write(JSON.stringify(message)); + }; + JsonHubProtocol.prototype.isInvocationMessage = function (message) { + this.assertNotEmptyString(message.target, "Invalid payload for Invocation message."); + if (message.invocationId !== undefined) { + this.assertNotEmptyString(message.invocationId, "Invalid payload for Invocation message."); + } + }; + JsonHubProtocol.prototype.isStreamItemMessage = function (message) { + this.assertNotEmptyString(message.invocationId, "Invalid payload for StreamItem message."); + if (message.item === undefined) { + throw new Error("Invalid payload for StreamItem message."); + } + }; + JsonHubProtocol.prototype.isCompletionMessage = function (message) { + if (message.result && message.error) { + throw new Error("Invalid payload for Completion message."); + } + if (!message.result && message.error) { + this.assertNotEmptyString(message.error, "Invalid payload for Completion message."); + } + this.assertNotEmptyString(message.invocationId, "Invalid payload for Completion message."); + }; + JsonHubProtocol.prototype.assertNotEmptyString = function (value, errorMessage) { + if (typeof value !== "string" || value === "") { + throw new Error(errorMessage); + } + }; + return JsonHubProtocol; +}()); + + + +/***/ }) +/******/ ]); +}); +//# sourceMappingURL=signalr.js.map \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/js/signalr/dist/browser/signalr.min.js b/Sledgemapper.Api/wwwroot/js/signalr/dist/browser/signalr.min.js new file mode 100644 index 0000000..b239a5a --- /dev/null +++ b/Sledgemapper.Api/wwwroot/js/signalr/dist/browser/signalr.min.js @@ -0,0 +1,17 @@ +(function webpackUniversalModuleDefinition(root,factory){if(typeof exports==="object"&&typeof module==="object")module.exports=factory();else if(typeof define==="function"&&define.amd)define([],factory);else if(typeof exports==="object")exports["signalR"]=factory();else root["signalR"]=factory()})(window,function(){return function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId]){return installedModules[moduleId].exports}var module=installedModules[moduleId]={i:moduleId,l:false,exports:{}};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.l=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.d=function(exports,name,getter){if(!__webpack_require__.o(exports,name)){Object.defineProperty(exports,name,{enumerable:true,get:getter})}};__webpack_require__.r=function(exports){if(typeof Symbol!=="undefined"&&Symbol.toStringTag){Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"})}Object.defineProperty(exports,"__esModule",{value:true})};__webpack_require__.t=function(value,mode){if(mode&1)value=__webpack_require__(value);if(mode&8)return value;if(mode&4&&typeof value==="object"&&value&&value.__esModule)return value;var ns=Object.create(null);__webpack_require__.r(ns);Object.defineProperty(ns,"default",{enumerable:true,value:value});if(mode&2&&typeof value!="string")for(var key in value)__webpack_require__.d(ns,key,function(key){return value[key]}.bind(null,key));return ns};__webpack_require__.n=function(module){var getter=module&&module.__esModule?function getDefault(){return module["default"]}:function getModuleExports(){return module};__webpack_require__.d(getter,"a",getter);return getter};__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)};__webpack_require__.p="";return __webpack_require__(__webpack_require__.s=0)}([function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);var es6_promise_dist_es6_promise_auto_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(1);var es6_promise_dist_es6_promise_auto_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(es6_promise_dist_es6_promise_auto_js__WEBPACK_IMPORTED_MODULE_0__);var _index__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(3);__webpack_require__.d(__webpack_exports__,"VERSION",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["VERSION"]});__webpack_require__.d(__webpack_exports__,"AbortError",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["AbortError"]});__webpack_require__.d(__webpack_exports__,"HttpError",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["HttpError"]});__webpack_require__.d(__webpack_exports__,"TimeoutError",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]});__webpack_require__.d(__webpack_exports__,"HttpClient",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["HttpClient"]});__webpack_require__.d(__webpack_exports__,"HttpResponse",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["HttpResponse"]});__webpack_require__.d(__webpack_exports__,"DefaultHttpClient",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["DefaultHttpClient"]});__webpack_require__.d(__webpack_exports__,"HubConnection",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["HubConnection"]});__webpack_require__.d(__webpack_exports__,"HubConnectionState",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["HubConnectionState"]});__webpack_require__.d(__webpack_exports__,"HubConnectionBuilder",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["HubConnectionBuilder"]});__webpack_require__.d(__webpack_exports__,"MessageType",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["MessageType"]});__webpack_require__.d(__webpack_exports__,"LogLevel",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["LogLevel"]});__webpack_require__.d(__webpack_exports__,"HttpTransportType",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["HttpTransportType"]});__webpack_require__.d(__webpack_exports__,"TransferFormat",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["TransferFormat"]});__webpack_require__.d(__webpack_exports__,"NullLogger",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["NullLogger"]});__webpack_require__.d(__webpack_exports__,"JsonHubProtocol",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["JsonHubProtocol"]});__webpack_require__.d(__webpack_exports__,"Subject",function(){return _index__WEBPACK_IMPORTED_MODULE_1__["Subject"]});if(!Uint8Array.prototype.indexOf){Object.defineProperty(Uint8Array.prototype,"indexOf",{value:Array.prototype.indexOf,writable:true})}if(!Uint8Array.prototype.slice){Object.defineProperty(Uint8Array.prototype,"slice",{value:function(start,end){return new Uint8Array(Array.prototype.slice.call(this,start,end))},writable:true})}if(!Uint8Array.prototype.forEach){Object.defineProperty(Uint8Array.prototype,"forEach",{value:Array.prototype.forEach,writable:true})}},function(module,exports,__webpack_require__){(function(global){var require; +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.2+97478eb6 + */ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.2+97478eb6 + */ +(function(global,factory){true?module.exports=factory():undefined})(this,function(){"use strict";function objectOrFunction(x){var type=typeof x;return x!==null&&(type==="object"||type==="function")}function isFunction(x){return typeof x==="function"}var _isArray=void 0;if(Array.isArray){_isArray=Array.isArray}else{_isArray=function(x){return Object.prototype.toString.call(x)==="[object Array]"}}var isArray=_isArray;var len=0;var vertxNext=void 0;var customSchedulerFn=void 0;var asap=function asap(callback,arg){queue[len]=callback;queue[len+1]=arg;len+=2;if(len===2){if(customSchedulerFn){customSchedulerFn(flush)}else{scheduleFlush()}}};function setScheduler(scheduleFn){customSchedulerFn=scheduleFn}function setAsap(asapFn){asap=asapFn}var browserWindow=typeof window!=="undefined"?window:undefined;var browserGlobal=browserWindow||{};var BrowserMutationObserver=browserGlobal.MutationObserver||browserGlobal.WebKitMutationObserver;var isNode=typeof self==="undefined"&&typeof process!=="undefined"&&{}.toString.call(process)==="[object process]";var isWorker=typeof Uint8ClampedArray!=="undefined"&&typeof importScripts!=="undefined"&&typeof MessageChannel!=="undefined";function useNextTick(){return function(){return process.nextTick(flush)}}function useVertxTimer(){if(typeof vertxNext!=="undefined"){return function(){vertxNext(flush)}}return useSetTimeout()}function useMutationObserver(){var iterations=0;var observer=new BrowserMutationObserver(flush);var node=document.createTextNode("");observer.observe(node,{characterData:true});return function(){node.data=iterations=++iterations%2}}function useMessageChannel(){var channel=new MessageChannel;channel.port1.onmessage=flush;return function(){return channel.port2.postMessage(0)}}function useSetTimeout(){var globalSetTimeout=setTimeout;return function(){return globalSetTimeout(flush,1)}}var queue=new Array(1e3);function flush(){for(var i=0;i=200&&xhr.status<300){resolve(new _HttpClient__WEBPACK_IMPORTED_MODULE_1__["HttpResponse"](xhr.status,xhr.statusText,xhr.response||xhr.responseText))}else{reject(new _Errors__WEBPACK_IMPORTED_MODULE_0__["HttpError"](xhr.statusText,xhr.status))}};xhr.onerror=function(){_this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Warning,"Error from HTTP request. "+xhr.status+": "+xhr.statusText+".");reject(new _Errors__WEBPACK_IMPORTED_MODULE_0__["HttpError"](xhr.statusText,xhr.status))};xhr.ontimeout=function(){_this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Warning,"Timeout from HTTP request.");reject(new _Errors__WEBPACK_IMPORTED_MODULE_0__["TimeoutError"])};xhr.send(request.content||"")})};return XhrHttpClient}(_HttpClient__WEBPACK_IMPORTED_MODULE_1__["HttpClient"])},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);__webpack_require__.d(__webpack_exports__,"LogLevel",function(){return LogLevel});var LogLevel;(function(LogLevel){LogLevel[LogLevel["Trace"]=0]="Trace";LogLevel[LogLevel["Debug"]=1]="Debug";LogLevel[LogLevel["Information"]=2]="Information";LogLevel[LogLevel["Warning"]=3]="Warning";LogLevel[LogLevel["Error"]=4]="Error";LogLevel[LogLevel["Critical"]=5]="Critical";LogLevel[LogLevel["None"]=6]="None"})(LogLevel||(LogLevel={}))},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);__webpack_require__.d(__webpack_exports__,"HubConnectionState",function(){return HubConnectionState});__webpack_require__.d(__webpack_exports__,"HubConnection",function(){return HubConnection});var _HandshakeProtocol__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(11);var _IHubProtocol__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(15);var _ILogger__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(9);var _Subject__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(16);var _Utils__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(13);var __awaiter=undefined&&undefined.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):new P(function(resolve){resolve(result.value)}).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};var __generator=undefined&&undefined.__generator||function(thisArg,body){var _={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},f,y,t,g;return g={next:verb(0),throw:verb(1),return:verb(2)},typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]responseLength?binaryData.slice(responseLength).buffer:null}else{var textData=data;var separatorIndex=textData.indexOf(_TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__["TextMessageFormat"].RecordSeparator);if(separatorIndex===-1){throw new Error("Message is incomplete.")}var responseLength=separatorIndex+1;messageData=textData.substring(0,responseLength);remainingData=textData.length>responseLength?textData.substring(responseLength):null}var messages=_TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__["TextMessageFormat"].parse(messageData);var response=JSON.parse(messages[0]);if(response.type){throw new Error("Expected a handshake response from the server.")}responseMessage=response;return[remainingData,responseMessage]};return HandshakeProtocol}()},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);__webpack_require__.d(__webpack_exports__,"TextMessageFormat",function(){return TextMessageFormat});var TextMessageFormat=function(){function TextMessageFormat(){}TextMessageFormat.write=function(output){return""+output+TextMessageFormat.RecordSeparator};TextMessageFormat.parse=function(input){if(input[input.length-1]!==TextMessageFormat.RecordSeparator){throw new Error("Message is incomplete.")}var messages=input.split(TextMessageFormat.RecordSeparator);messages.pop();return messages};TextMessageFormat.RecordSeparatorCode=30;TextMessageFormat.RecordSeparator=String.fromCharCode(TextMessageFormat.RecordSeparatorCode);return TextMessageFormat}()},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);__webpack_require__.d(__webpack_exports__,"Arg",function(){return Arg});__webpack_require__.d(__webpack_exports__,"Platform",function(){return Platform});__webpack_require__.d(__webpack_exports__,"getDataDetail",function(){return getDataDetail});__webpack_require__.d(__webpack_exports__,"formatArrayBuffer",function(){return formatArrayBuffer});__webpack_require__.d(__webpack_exports__,"isArrayBuffer",function(){return isArrayBuffer});__webpack_require__.d(__webpack_exports__,"sendMessage",function(){return sendMessage});__webpack_require__.d(__webpack_exports__,"createLogger",function(){return createLogger});__webpack_require__.d(__webpack_exports__,"SubjectSubscription",function(){return SubjectSubscription});__webpack_require__.d(__webpack_exports__,"ConsoleLogger",function(){return ConsoleLogger});var _ILogger__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(9);var _Loggers__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(14);var __awaiter=undefined&&undefined.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):new P(function(resolve){resolve(result.value)}).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};var __generator=undefined&&undefined.__generator||function(thisArg,body){var _={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},f,y,t,g;return g={next:verb(0),throw:verb(1),return:verb(2)},typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]-1){this.subject.observers.splice(index,1)}if(this.subject.observers.length===0&&this.subject.cancelCallback){this.subject.cancelCallback().catch(function(_){})}};return SubjectSubscription}();var ConsoleLogger=function(){function ConsoleLogger(minimumLogLevel){this.minimumLogLevel=minimumLogLevel;this.outputConsole=console}ConsoleLogger.prototype.log=function(logLevel,message){if(logLevel>=this.minimumLogLevel){switch(logLevel){case _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Critical:case _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Error:this.outputConsole.error("["+(new Date).toISOString()+"] "+_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"][logLevel]+": "+message);break;case _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Warning:this.outputConsole.warn("["+(new Date).toISOString()+"] "+_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"][logLevel]+": "+message);break;case _ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"].Information:this.outputConsole.info("["+(new Date).toISOString()+"] "+_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"][logLevel]+": "+message);break;default:this.outputConsole.log("["+(new Date).toISOString()+"] "+_ILogger__WEBPACK_IMPORTED_MODULE_0__["LogLevel"][logLevel]+": "+message);break}}};return ConsoleLogger}()},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);__webpack_require__.d(__webpack_exports__,"NullLogger",function(){return NullLogger});var NullLogger=function(){function NullLogger(){}NullLogger.prototype.log=function(_logLevel,_message){};NullLogger.instance=new NullLogger;return NullLogger}()},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);__webpack_require__.d(__webpack_exports__,"MessageType",function(){return MessageType});var MessageType;(function(MessageType){MessageType[MessageType["Invocation"]=1]="Invocation";MessageType[MessageType["StreamItem"]=2]="StreamItem";MessageType[MessageType["Completion"]=3]="Completion";MessageType[MessageType["StreamInvocation"]=4]="StreamInvocation";MessageType[MessageType["CancelInvocation"]=5]="CancelInvocation";MessageType[MessageType["Ping"]=6]="Ping";MessageType[MessageType["Close"]=7]="Close"})(MessageType||(MessageType={}))},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);__webpack_require__.d(__webpack_exports__,"Subject",function(){return Subject});var _Utils__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(13);var Subject=function(){function Subject(){this.observers=[]}Subject.prototype.next=function(item){for(var _i=0,_a=this.observers;_i<_a.length;_i++){var observer=_a[_i];observer.next(item)}};Subject.prototype.error=function(err){for(var _i=0,_a=this.observers;_i<_a.length;_i++){var observer=_a[_i];if(observer.error){observer.error(err)}}};Subject.prototype.complete=function(){for(var _i=0,_a=this.observers;_i<_a.length;_i++){var observer=_a[_i];if(observer.complete){observer.complete()}}};Subject.prototype.subscribe=function(observer){this.observers.push(observer);return new _Utils__WEBPACK_IMPORTED_MODULE_0__["SubjectSubscription"](this,observer)};return Subject}()},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);__webpack_require__.d(__webpack_exports__,"HubConnectionBuilder",function(){return HubConnectionBuilder});var _DefaultReconnectPolicy__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(18);var _HttpConnection__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(19);var _HubConnection__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(10);var _ILogger__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(9);var _JsonHubProtocol__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(25);var _Loggers__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(14);var _Utils__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(13);var __assign=undefined&&undefined.__assign||Object.assign||function(t){for(var s,i=1,n=arguments.length;i0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]0){return[2,Promise.reject(new Error("Unable to connect to the server with any of the available transports. "+transportExceptions.join(" ")))]}return[2,Promise.reject(new Error("None of the transports supported by the client are supported by the server."))]}})})};HttpConnection.prototype.constructTransport=function(transport){switch(transport){case _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].WebSockets:if(!this.options.WebSocket){throw new Error("'WebSocket' is not supported in your environment.")}return new _WebSocketTransport__WEBPACK_IMPORTED_MODULE_6__["WebSocketTransport"](this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||false,this.options.WebSocket);case _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].ServerSentEvents:if(!this.options.EventSource){throw new Error("'EventSource' is not supported in your environment.")}return new _ServerSentEventsTransport__WEBPACK_IMPORTED_MODULE_4__["ServerSentEventsTransport"](this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||false,this.options.EventSource);case _ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].LongPolling:return new _LongPollingTransport__WEBPACK_IMPORTED_MODULE_3__["LongPollingTransport"](this.httpClient,this.accessTokenFactory,this.logger,this.options.logMessageContent||false);default:throw new Error("Unknown transport: "+transport+".")}};HttpConnection.prototype.startTransport=function(url,transferFormat){var _this=this;this.transport.onreceive=this.onreceive;this.transport.onclose=function(e){return _this.stopConnection(e)};return this.transport.connect(url,transferFormat)};HttpConnection.prototype.resolveTransportOrError=function(endpoint,requestedTransport,requestedTransferFormat){var transport=_ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][endpoint.transport];if(transport===null||transport===undefined){this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug,"Skipping transport '"+endpoint.transport+"' because it is not supported by this client.");return new Error("Skipping transport '"+endpoint.transport+"' because it is not supported by this client.")}else{if(transportMatches(requestedTransport,transport)){var transferFormats=endpoint.transferFormats.map(function(s){return _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"][s]});if(transferFormats.indexOf(requestedTransferFormat)>=0){if(transport===_ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].WebSockets&&!this.options.WebSocket||transport===_ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"].ServerSentEvents&&!this.options.EventSource){this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug,"Skipping transport '"+_ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport]+"' because it is not supported in your environment.'");return new Error("'"+_ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport]+"' is not supported in your environment.")}else{this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug,"Selecting transport '"+_ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport]+"'.");try{return this.constructTransport(transport)}catch(ex){return ex}}}else{this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug,"Skipping transport '"+_ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport]+"' because it does not support the requested transfer format '"+_ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"][requestedTransferFormat]+"'.");return new Error("'"+_ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport]+"' does not support "+_ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"][requestedTransferFormat]+".")}}else{this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug,"Skipping transport '"+_ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport]+"' because it was disabled by the client.");return new Error("'"+_ITransport__WEBPACK_IMPORTED_MODULE_2__["HttpTransportType"][transport]+"' is disabled by the client.")}}};HttpConnection.prototype.isITransport=function(transport){return transport&&typeof transport==="object"&&"connect"in transport};HttpConnection.prototype.stopConnection=function(error){var _this=this;this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug,"HttpConnection.stopConnection("+error+") called while in state "+this.connectionState+".");this.transport=undefined;error=this.stopError||error;this.stopError=undefined;if(this.connectionState==="Disconnected"){this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Debug,"Call to HttpConnection.stopConnection("+error+") was ignored because the connection is already in the disconnected state.");return}if(this.connectionState==="Connecting "){this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Warning,"Call to HttpConnection.stopConnection("+error+") was ignored because the connection hasn't yet left the in the connecting state.");return}if(this.connectionState==="Disconnecting"){this.stopPromiseResolver()}if(error){this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error,"Connection disconnected with error '"+error+"'.")}else{this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Information,"Connection disconnected.")}if(this.sendQueue){this.sendQueue.stop().catch(function(e){_this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error,"TransportSendQueue.stop() threw error '"+e+"'.")});this.sendQueue=undefined}this.connectionId=undefined;this.connectionState="Disconnected";if(this.connectionStarted){this.connectionStarted=false;try{if(this.onclose){this.onclose(error)}}catch(e){this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error,"HttpConnection.onclose("+error+") threw error '"+e+"'.")}}};HttpConnection.prototype.resolveUrl=function(url){if(url.lastIndexOf("https://",0)===0||url.lastIndexOf("http://",0)===0){return url}if(!_Utils__WEBPACK_IMPORTED_MODULE_5__["Platform"].isBrowser||!window.document){throw new Error("Cannot resolve '"+url+"'.")}var aTag=window.document.createElement("a");aTag.href=url;this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Information,"Normalizing '"+url+"' to '"+aTag.href+"'.");return aTag.href};HttpConnection.prototype.resolveNegotiateUrl=function(url){var index=url.indexOf("?");var negotiateUrl=url.substring(0,index===-1?url.length:index);if(negotiateUrl[negotiateUrl.length-1]!=="/"){negotiateUrl+="/"}negotiateUrl+="negotiate";negotiateUrl+=index===-1?"":url.substring(index);if(negotiateUrl.indexOf("negotiateVersion")===-1){negotiateUrl+=index===-1?"?":"&";negotiateUrl+="negotiateVersion="+this.negotiateVersion}return negotiateUrl};return HttpConnection}();function transportMatches(requestedTransport,actualTransport){return!requestedTransport||(actualTransport&requestedTransport)!==0}var TransportSendQueue=function(){function TransportSendQueue(transport){this.transport=transport;this.buffer=[];this.executing=true;this.sendBufferedData=new PromiseSource;this.transportResult=new PromiseSource;this.sendLoopPromise=this.sendLoop()}TransportSendQueue.prototype.send=function(data){this.bufferData(data);if(!this.transportResult){this.transportResult=new PromiseSource}return this.transportResult.promise};TransportSendQueue.prototype.stop=function(){this.executing=false;this.sendBufferedData.resolve();return this.sendLoopPromise};TransportSendQueue.prototype.bufferData=function(data){if(this.buffer.length&&typeof this.buffer[0]!==typeof data){throw new Error("Expected data to be of type "+typeof this.buffer+" but was of type "+typeof data)}this.buffer.push(data);this.sendBufferedData.resolve()};TransportSendQueue.prototype.sendLoop=function(){return __awaiter(this,void 0,void 0,function(){var transportResult,data,error_1;return __generator(this,function(_a){switch(_a.label){case 0:if(false){}return[4,this.sendBufferedData.promise];case 1:_a.sent();if(!this.executing){if(this.transportResult){this.transportResult.reject("Connection stopped.")}return[3,6]}this.sendBufferedData=new PromiseSource;transportResult=this.transportResult;this.transportResult=undefined;data=typeof this.buffer[0]==="string"?this.buffer.join(""):TransportSendQueue.concatBuffers(this.buffer);this.buffer.length=0;_a.label=2;case 2:_a.trys.push([2,4,,5]);return[4,this.transport.send(data)];case 3:_a.sent();transportResult.resolve();return[3,5];case 4:error_1=_a.sent();transportResult.reject(error_1);return[3,5];case 5:return[3,0];case 6:return[2]}})})};TransportSendQueue.concatBuffers=function(arrayBuffers){var totalLength=arrayBuffers.map(function(b){return b.byteLength}).reduce(function(a,b){return a+b});var result=new Uint8Array(totalLength);var offset=0;for(var _i=0,arrayBuffers_1=arrayBuffers;_i0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1] .col, +.no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; +} + +.col-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; +} + +.col-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.col-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; +} + +.col-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; +} + +.col-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; +} + +.col-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; +} + +.col-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; +} + +.col-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + -ms-flex-order: -1; + order: -1; +} + +.order-last { + -ms-flex-order: 13; + order: 13; +} + +.order-0 { + -ms-flex-order: 0; + order: 0; +} + +.order-1 { + -ms-flex-order: 1; + order: 1; +} + +.order-2 { + -ms-flex-order: 2; + order: 2; +} + +.order-3 { + -ms-flex-order: 3; + order: 3; +} + +.order-4 { + -ms-flex-order: 4; + order: 4; +} + +.order-5 { + -ms-flex-order: 5; + order: 5; +} + +.order-6 { + -ms-flex-order: 6; + order: 6; +} + +.order-7 { + -ms-flex-order: 7; + order: 7; +} + +.order-8 { + -ms-flex-order: 8; + order: 8; +} + +.order-9 { + -ms-flex-order: 9; + order: 9; +} + +.order-10 { + -ms-flex-order: 10; + order: 10; +} + +.order-11 { + -ms-flex-order: 11; + order: 11; +} + +.order-12 { + -ms-flex-order: 12; + order: 12; +} + +.offset-1 { + margin-left: 8.333333%; +} + +.offset-2 { + margin-left: 16.666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.333333%; +} + +.offset-5 { + margin-left: 41.666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.333333%; +} + +.offset-8 { + margin-left: 66.666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.333333%; +} + +.offset-11 { + margin-left: 91.666667%; +} + +@media (min-width: 576px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-sm-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-sm-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-sm-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-sm-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-sm-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-sm-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-sm-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-sm-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-sm-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-sm-first { + -ms-flex-order: -1; + order: -1; + } + .order-sm-last { + -ms-flex-order: 13; + order: 13; + } + .order-sm-0 { + -ms-flex-order: 0; + order: 0; + } + .order-sm-1 { + -ms-flex-order: 1; + order: 1; + } + .order-sm-2 { + -ms-flex-order: 2; + order: 2; + } + .order-sm-3 { + -ms-flex-order: 3; + order: 3; + } + .order-sm-4 { + -ms-flex-order: 4; + order: 4; + } + .order-sm-5 { + -ms-flex-order: 5; + order: 5; + } + .order-sm-6 { + -ms-flex-order: 6; + order: 6; + } + .order-sm-7 { + -ms-flex-order: 7; + order: 7; + } + .order-sm-8 { + -ms-flex-order: 8; + order: 8; + } + .order-sm-9 { + -ms-flex-order: 9; + order: 9; + } + .order-sm-10 { + -ms-flex-order: 10; + order: 10; + } + .order-sm-11 { + -ms-flex-order: 11; + order: 11; + } + .order-sm-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.333333%; + } + .offset-sm-2 { + margin-left: 16.666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.333333%; + } + .offset-sm-5 { + margin-left: 41.666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.333333%; + } + .offset-sm-8 { + margin-left: 66.666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.333333%; + } + .offset-sm-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 768px) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-md-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-md-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-md-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-md-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-md-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-md-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-md-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-md-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-md-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-md-first { + -ms-flex-order: -1; + order: -1; + } + .order-md-last { + -ms-flex-order: 13; + order: 13; + } + .order-md-0 { + -ms-flex-order: 0; + order: 0; + } + .order-md-1 { + -ms-flex-order: 1; + order: 1; + } + .order-md-2 { + -ms-flex-order: 2; + order: 2; + } + .order-md-3 { + -ms-flex-order: 3; + order: 3; + } + .order-md-4 { + -ms-flex-order: 4; + order: 4; + } + .order-md-5 { + -ms-flex-order: 5; + order: 5; + } + .order-md-6 { + -ms-flex-order: 6; + order: 6; + } + .order-md-7 { + -ms-flex-order: 7; + order: 7; + } + .order-md-8 { + -ms-flex-order: 8; + order: 8; + } + .order-md-9 { + -ms-flex-order: 9; + order: 9; + } + .order-md-10 { + -ms-flex-order: 10; + order: 10; + } + .order-md-11 { + -ms-flex-order: 11; + order: 11; + } + .order-md-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.333333%; + } + .offset-md-2 { + margin-left: 16.666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.333333%; + } + .offset-md-5 { + margin-left: 41.666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.333333%; + } + .offset-md-8 { + margin-left: 66.666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.333333%; + } + .offset-md-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 992px) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-lg-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-lg-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-lg-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-lg-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-lg-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-lg-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-lg-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-lg-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-lg-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-lg-first { + -ms-flex-order: -1; + order: -1; + } + .order-lg-last { + -ms-flex-order: 13; + order: 13; + } + .order-lg-0 { + -ms-flex-order: 0; + order: 0; + } + .order-lg-1 { + -ms-flex-order: 1; + order: 1; + } + .order-lg-2 { + -ms-flex-order: 2; + order: 2; + } + .order-lg-3 { + -ms-flex-order: 3; + order: 3; + } + .order-lg-4 { + -ms-flex-order: 4; + order: 4; + } + .order-lg-5 { + -ms-flex-order: 5; + order: 5; + } + .order-lg-6 { + -ms-flex-order: 6; + order: 6; + } + .order-lg-7 { + -ms-flex-order: 7; + order: 7; + } + .order-lg-8 { + -ms-flex-order: 8; + order: 8; + } + .order-lg-9 { + -ms-flex-order: 9; + order: 9; + } + .order-lg-10 { + -ms-flex-order: 10; + order: 10; + } + .order-lg-11 { + -ms-flex-order: 11; + order: 11; + } + .order-lg-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.333333%; + } + .offset-lg-2 { + margin-left: 16.666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.333333%; + } + .offset-lg-5 { + margin-left: 41.666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.333333%; + } + .offset-lg-8 { + margin-left: 66.666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.333333%; + } + .offset-lg-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 1200px) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-xl-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-xl-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-xl-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-xl-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-xl-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-xl-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-xl-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-xl-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-xl-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-xl-first { + -ms-flex-order: -1; + order: -1; + } + .order-xl-last { + -ms-flex-order: 13; + order: 13; + } + .order-xl-0 { + -ms-flex-order: 0; + order: 0; + } + .order-xl-1 { + -ms-flex-order: 1; + order: 1; + } + .order-xl-2 { + -ms-flex-order: 2; + order: 2; + } + .order-xl-3 { + -ms-flex-order: 3; + order: 3; + } + .order-xl-4 { + -ms-flex-order: 4; + order: 4; + } + .order-xl-5 { + -ms-flex-order: 5; + order: 5; + } + .order-xl-6 { + -ms-flex-order: 6; + order: 6; + } + .order-xl-7 { + -ms-flex-order: 7; + order: 7; + } + .order-xl-8 { + -ms-flex-order: 8; + order: 8; + } + .order-xl-9 { + -ms-flex-order: 9; + order: 9; + } + .order-xl-10 { + -ms-flex-order: 10; + order: 10; + } + .order-xl-11 { + -ms-flex-order: 11; + order: 11; + } + .order-xl-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.333333%; + } + .offset-xl-2 { + margin-left: 16.666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.333333%; + } + .offset-xl-5 { + margin-left: 41.666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.333333%; + } + .offset-xl-8 { + margin-left: 66.666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.333333%; + } + .offset-xl-11 { + margin-left: 91.666667%; + } +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: -ms-flexbox !important; + display: flex !important; +} + +.d-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-sm-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-md-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-lg-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-xl-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media print { + .d-print-none { + display: none !important; + } + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-print-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +.flex-row { + -ms-flex-direction: row !important; + flex-direction: row !important; +} + +.flex-column { + -ms-flex-direction: column !important; + flex-direction: column !important; +} + +.flex-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; +} + +.flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; +} + +.flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; +} + +.flex-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; +} + +.flex-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; +} + +.flex-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; +} + +.justify-content-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; +} + +.justify-content-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; +} + +.justify-content-center { + -ms-flex-pack: center !important; + justify-content: center !important; +} + +.justify-content-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; +} + +.justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; +} + +.align-items-start { + -ms-flex-align: start !important; + align-items: flex-start !important; +} + +.align-items-end { + -ms-flex-align: end !important; + align-items: flex-end !important; +} + +.align-items-center { + -ms-flex-align: center !important; + align-items: center !important; +} + +.align-items-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; +} + +.align-items-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; +} + +.align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; +} + +.align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; +} + +.align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important; +} + +.align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; +} + +.align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; +} + +.align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; +} + +.align-self-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; +} + +.align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; +} + +.align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; +} + +.align-self-center { + -ms-flex-item-align: center !important; + align-self: center !important; +} + +.align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; +} + +.align-self-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-sm-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-sm-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-sm-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-sm-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-sm-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-sm-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-sm-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-sm-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-sm-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-sm-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-sm-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-sm-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-sm-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-sm-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-sm-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 768px) { + .flex-md-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-md-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-md-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-md-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-md-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-md-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-md-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-md-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-md-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-md-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-md-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-md-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-md-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-md-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-md-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-md-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-md-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-md-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 992px) { + .flex-lg-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-lg-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-lg-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-lg-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-lg-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-lg-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-lg-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-lg-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-lg-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-lg-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-lg-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-lg-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-lg-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-lg-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-lg-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-lg-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 1200px) { + .flex-xl-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-xl-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-xl-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-xl-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-xl-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-xl-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-xl-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-xl-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-xl-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-xl-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-xl-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-xl-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-xl-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-xl-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-xl-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-xl-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-n1 { + margin: -0.25rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} + +.m-n2 { + margin: -0.5rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} + +.m-n3 { + margin: -1rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} + +.m-n4 { + margin: -1.5rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} + +.m-n5 { + margin: -3rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; + } + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; + } + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; + } + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; + } + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; + } + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; + } + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; + } + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; + } + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; + } + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; + } + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; + } + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; + } + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; + } + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; + } + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; + } + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; + } + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; + } + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; + } + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; + } + .p-sm-0 { + padding: 0 !important; + } + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; + } + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; + } + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; + } + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; + } + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; + } + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; + } + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; + } + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; + } + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; + } + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; + } + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; + } + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; + } + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; + } + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; + } + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; + } + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; + } + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; + } + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; + } + .m-sm-n1 { + margin: -0.25rem !important; + } + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; + } + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; + } + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; + } + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; + } + .m-sm-n2 { + margin: -0.5rem !important; + } + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; + } + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; + } + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; + } + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; + } + .m-sm-n3 { + margin: -1rem !important; + } + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; + } + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; + } + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; + } + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; + } + .m-sm-n4 { + margin: -1.5rem !important; + } + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; + } + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; + } + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; + } + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; + } + .m-sm-n5 { + margin: -3rem !important; + } + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; + } + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; + } + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; + } + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; + } + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; + } + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; + } + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; + } +} + +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; + } + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; + } + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; + } + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; + } + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; + } + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; + } + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; + } + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; + } + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; + } + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; + } + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; + } + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; + } + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; + } + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; + } + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; + } + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; + } + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; + } + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; + } + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; + } + .p-md-0 { + padding: 0 !important; + } + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; + } + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; + } + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; + } + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; + } + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; + } + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; + } + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; + } + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; + } + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; + } + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; + } + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; + } + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; + } + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; + } + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; + } + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; + } + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; + } + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; + } + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; + } + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; + } + .m-md-n1 { + margin: -0.25rem !important; + } + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; + } + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; + } + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; + } + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; + } + .m-md-n2 { + margin: -0.5rem !important; + } + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; + } + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; + } + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; + } + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; + } + .m-md-n3 { + margin: -1rem !important; + } + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; + } + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; + } + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; + } + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; + } + .m-md-n4 { + margin: -1.5rem !important; + } + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; + } + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; + } + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; + } + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; + } + .m-md-n5 { + margin: -3rem !important; + } + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; + } + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; + } + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; + } + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; + } + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; + } + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; + } + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; + } +} + +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; + } + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; + } + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; + } + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; + } + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; + } + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; + } + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; + } + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; + } + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; + } + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; + } + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; + } + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; + } + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; + } + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; + } + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; + } + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; + } + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; + } + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; + } + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; + } + .p-lg-0 { + padding: 0 !important; + } + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; + } + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; + } + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; + } + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; + } + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; + } + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; + } + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; + } + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; + } + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; + } + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; + } + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; + } + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; + } + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; + } + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; + } + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; + } + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; + } + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; + } + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; + } + .m-lg-n1 { + margin: -0.25rem !important; + } + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; + } + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; + } + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; + } + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; + } + .m-lg-n2 { + margin: -0.5rem !important; + } + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; + } + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; + } + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; + } + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; + } + .m-lg-n3 { + margin: -1rem !important; + } + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; + } + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; + } + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; + } + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; + } + .m-lg-n4 { + margin: -1.5rem !important; + } + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; + } + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; + } + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; + } + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; + } + .m-lg-n5 { + margin: -3rem !important; + } + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; + } + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; + } + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; + } + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; + } + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; + } + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; + } + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; + } +} + +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; + } + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; + } + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; + } + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; + } + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; + } + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; + } + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; + } + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; + } + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; + } + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; + } + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; + } + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; + } + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; + } + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; + } + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; + } + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; + } + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; + } + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; + } + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; + } + .p-xl-0 { + padding: 0 !important; + } + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; + } + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; + } + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; + } + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; + } + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; + } + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; + } + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; + } + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; + } + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; + } + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; + } + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; + } + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; + } + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; + } + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; + } + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; + } + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; + } + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; + } + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; + } + .m-xl-n1 { + margin: -0.25rem !important; + } + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; + } + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; + } + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; + } + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; + } + .m-xl-n2 { + margin: -0.5rem !important; + } + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; + } + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; + } + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; + } + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; + } + .m-xl-n3 { + margin: -1rem !important; + } + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; + } + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; + } + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; + } + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; + } + .m-xl-n4 { + margin: -1.5rem !important; + } + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; + } + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; + } + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; + } + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; + } + .m-xl-n5 { + margin: -3rem !important; + } + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; + } + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; + } + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; + } + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; + } + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; + } + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; + } + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; + } +} +/*# sourceMappingURL=bootstrap-grid.css.map */ \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map new file mode 100644 index 0000000..db62f2f --- /dev/null +++ b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap-grid.scss","bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_spacing.scss"],"names":[],"mappings":"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vBQ;IHTR,gBAA8C;EF4vB9C;EKnvBQ;IHTR,uBAA8C;EF+vB9C;EKtvBQ;IHTR,uBAA8C;EFkwB9C;EKzvBQ;IHTR,gBAA8C;EFqwB9C;EK5vBQ;IHTR,uBAA8C;EFwwB9C;EK/vBQ;IHTR,uBAA8C;EF2wB9C;AACF;;AMlzBM;EAAwB,wBAA0B;ANszBxD;;AMtzBM;EAAwB,0BAA0B;AN0zBxD;;AM1zBM;EAAwB,gCAA0B;AN8zBxD;;AM9zBM;EAAwB,yBAA0B;ANk0BxD;;AMl0BM;EAAwB,yBAA0B;ANs0BxD;;AMt0BM;EAAwB,6BAA0B;AN00BxD;;AM10BM;EAAwB,8BAA0B;AN80BxD;;AM90BM;EAAwB,+BAA0B;EAA1B,wBAA0B;ANk1BxD;;AMl1BM;EAAwB,sCAA0B;EAA1B,+BAA0B;ANs1BxD;;AGryBI;EGjDE;IAAwB,wBAA0B;EN21BtD;EM31BI;IAAwB,0BAA0B;EN81BtD;EM91BI;IAAwB,gCAA0B;ENi2BtD;EMj2BI;IAAwB,yBAA0B;ENo2BtD;EMp2BI;IAAwB,yBAA0B;ENu2BtD;EMv2BI;IAAwB,6BAA0B;EN02BtD;EM12BI;IAAwB,8BAA0B;EN62BtD;EM72BI;IAAwB,+BAA0B;IAA1B,wBAA0B;ENg3BtD;EMh3BI;IAAwB,sCAA0B;IAA1B,+BAA0B;ENm3BtD;AACF;;AGn0BI;EGjDE;IAAwB,wBAA0B;ENy3BtD;EMz3BI;IAAwB,0BAA0B;EN43BtD;EM53BI;IAAwB,gCAA0B;EN+3BtD;EM/3BI;IAAwB,yBAA0B;ENk4BtD;EMl4BI;IAAwB,yBAA0B;ENq4BtD;EMr4BI;IAAwB,6BAA0B;ENw4BtD;EMx4BI;IAAwB,8BAA0B;EN24BtD;EM34BI;IAAwB,+BAA0B;IAA1B,wBAA0B;EN84BtD;EM94BI;IAAwB,sCAA0B;IAA1B,+BAA0B;ENi5BtD;AACF;;AGj2BI;EGjDE;IAAwB,wBAA0B;ENu5BtD;EMv5BI;IAAwB,0BAA0B;EN05BtD;EM15BI;IAAwB,gCAA0B;EN65BtD;EM75BI;IAAwB,yBAA0B;ENg6BtD;EMh6BI;IAAwB,yBAA0B;ENm6BtD;EMn6BI;IAAwB,6BAA0B;EN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AEE,+BAAwC;ARgoDlD;;AQ9nDQ;;EAEE,gCAA0C;ARioDpD;;AQ/nDQ;;EAEE,8BAAsC;ARkoDhD;;AQjpDQ;EAAgC,uBAA4B;ARqpDpE;;AQppDQ;;EAEE,2BAAoC;ARupD9C;;AQrpDQ;;EAEE,6BAAwC;ARwpDlD;;AQtpDQ;;EAEE,8BAA0C;ARypDpD;;AQvpDQ;;EAEE,4BAAsC;AR0pDhD;;AQzqDQ;EAAgC,qBAA4B;AR6qDpE;;AQ5qDQ;;EAEE,yBAAoC;AR+qD9C;;AQ7qDQ;;EAEE,2BAAwC;ARgrDlD;;AQ9qDQ;;EAEE,4BAA0C;ARirDpD;;AQ/qDQ;;EAEE,0BAAsC;ARkrDhD;;AQjsDQ;EAAgC,2BAA4B;ARqsDpE;;AQpsDQ;;EAEE,+BAAoC;ARusD9C;;AQrsDQ;;EAEE,iCAAwC;ARwsDlD;;AQtsDQ;;EAEE,kCAA0C;ARysDpD;;AQvsDQ;;EAEE,gCAAsC;AR0sDhD;;AQztDQ;EAAgC,0BAA4B;AR6tDpE;;AQ5tDQ;;EAEE,8BAAoC;AR+tD9C;;AQ7tDQ;;EAEE,gCAAwC;ARguDlD;;AQ9tDQ;;EAEE,iCAA0C;ARiuDpD;;AQ/tDQ;;EAEE,+BAAsC;ARkuDhD;;AQjvDQ;EAAgC,wBAA4B;ARqvDpE;;AQpvDQ;;EAEE,4BAAoC;ARuvD9C;;AQrvDQ;;EAEE,8BAAwC;ARwvDlD;;AQtvDQ;;EAEE,+BAA0C;ARyvDpD;;AQvvDQ;;EAEE,6BAAsC;AR0vDhD;;AQzwDQ;EAAgC,0BAA4B;AR6wDpE;;AQ5wDQ;;EAEE,8BAAoC;AR+wD9C;;AQ7wDQ;;EAEE,gCAAwC;ARgxDlD;;AQ9wDQ;;EAEE,iCAA0C;ARixDpD;;AQ/wDQ;;EAEE,+BAAsC;ARkxDhD;;AQjyDQ;EAAgC,wBAA4B;ARqyDpE;;AQpyDQ;;EAEE,4BAAoC;ARuyD9C;;AQryDQ;;EAEE,8BAAwC;ARwyDlD;;AQtyDQ;;EAEE,+BAA0C;ARyyDpD;;AQvyDQ;;EAEE,6BAAsC;AR0yDhD;;AQlyDQ;EAAwB,2BAA2B;ARsyD3D;;AQryDQ;;EAEE,+BAA+B;ARwyDzC;;AQtyDQ;;EAEE,iCAAiC;ARyyD3C;;AQvyDQ;;EAEE,kCAAkC;AR0yD5C;;AQxyDQ;;EAEE,gCAAgC;AR2yD1C;;AQ1zDQ;EAAwB,0BAA2B;AR8zD3D;;AQ7zDQ;;EAEE,8BAA+B;ARg0DzC;;AQ9zDQ;;EAEE,gCAAiC;ARi0D3C;;AQ/zDQ;;EAEE,iCAAkC;ARk0D5C;;AQh0DQ;;EAEE,+BAAgC;ARm0D1C;;AQl1DQ;EAAwB,wBAA2B;ARs1D3D;;AQr1DQ;;EAEE,4BAA+B;ARw1DzC;;AQt1DQ;;EAEE,8BAAiC;ARy1D3C;;AQv1DQ;;EAEE,+BAAkC;AR01D5C;;AQx1DQ;;EAEE,6BAAgC;AR21D1C;;AQ12DQ;EAAwB,0BAA2B;AR82D3D;;AQ72DQ;;EAEE,8BAA+B;ARg3DzC;;AQ92DQ;;EAEE,gCAAiC;ARi3D3C;;AQ/2DQ;;EAEE,iCAAkC;ARk3D5C;;AQh3DQ;;EAEE,+BAAgC;ARm3D1C;;AQl4DQ;EAAwB,wBAA2B;ARs4D3D;;AQr4DQ;;EAEE,4BAA+B;ARw4DzC;;AQt4DQ;;EAEE,8BAAiC;ARy4D3C;;AQv4DQ;;EAEE,+BAAkC;AR04D5C;;AQx4DQ;;EAEE,6BAAgC;AR24D1C;;AQr4DI;EAAmB,uBAAuB;ARy4D9C;;AQx4DI;;EAEE,2BAA2B;AR24DjC;;AQz4DI;;EAEE,6BAA6B;AR44DnC;;AQ14DI;;EAEE,8BAA8B;AR64DpC;;AQ34DI;;EAEE,4BAA4B;AR84DlC;;AGv5DI;EKlDI;IAAgC,oBAA4B;ER88DlE;EQ78DM;;IAEE,wBAAoC;ER+8D5C;EQ78DM;;IAEE,0BAAwC;ER+8DhD;EQ78DM;;IAEE,2BAA0C;ER+8DlD;EQ78DM;;IAEE,yBAAsC;ER+8D9C;EQ99DM;IAAgC,0BAA4B;ERi+DlE;EQh+DM;;IAEE,8BAAoC;ERk+D5C;EQh+DM;;IAEE,gCAAwC;ERk+DhD;EQh+DM;;IAEE,iCAA0C;ERk+DlD;EQh+DM;;IAEE,+BAAsC;ERk+D9C;EQj/DM;IAAgC,yBAA4B;ERo/DlE;EQn/DM;;IAEE,6BAAoC;ERq/D5C;EQn/DM;;IAEE,+BAAwC;ERq/DhD;EQn/DM;;IAEE,gCAA0C;ERq/DlD;EQn/DM;;IAEE,8BAAsC;ERq/D9C;EQpgEM;IAAgC,uBAA4B;ERugElE;EQtgEM;;IAEE,2BAAoC;ERwgE5C;EQtgEM;;IAEE,6BAAwC;ERwgEhD;EQtgEM;;IAEE,8BAA0C;ERwgElD;EQtgEM;;IAEE,4BAAsC;ERwgE9C;EQvhEM;IAAgC,yBAA4B;ER0hElE;EQzhEM;;IAEE,6BAAoC;ER2hE5C;EQzhEM;;IAEE,+BAAwC;ER2hEhD;EQzhEM;;IAEE,gCAA0C;ER2hElD;EQzhEM;;IAEE,8BAAsC;ER2hE9C;EQ1iEM;IAAgC,uBAA4B;ER6iElE;EQ5iEM;;IAEE,2BAAoC;ER8iE5C;EQ5iEM;;IAEE,6BAAwC;ER8iEhD;EQ5iEM;;IAEE,8BAA0C;ER8iElD;EQ5iEM;;IAEE,4BAAsC;ER8iE9C;EQ7jEM;IAAgC,qBAA4B;ERgkElE;EQ/jEM;;IAEE,yBAAoC;ERikE5C;EQ/jEM;;IAEE,2BAAwC;ERikEhD;EQ/jEM;;IAEE,4BAA0C;ERikElD;EQ/jEM;;IAEE,0BAAsC;ERikE9C;EQhlEM;IAAgC,2BAA4B;ERmlElE;EQllEM;;IAEE,+BAAoC;ERolE5C;EQllEM;;IAEE,iCAAwC;ERolEhD;EQllEM;;IAEE,kCAA0C;ERolElD;EQllEM;;IAEE,gCAAsC;ERolE9C;EQnmEM;IAAgC,0BAA4B;ERsmElE;EQrmEM;;IAEE,8BAAoC;ERumE5C;EQrmEM;;IAEE,gCAAwC;ERumEhD;EQrmEM;;IAEE,iCAA0C;ERumElD;EQrmEM;;IAEE,+BAAsC;ERumE9C;EQtnEM;IAAgC,wBAA4B;ERynElE;EQxnEM;;IAEE,4BAAoC;ER0nE5C;EQxnEM;;IAEE,8BAAwC;ER0nEhD;EQxnEM;;IAEE,+BAA0C;ER0nElD;EQxnEM;;IAEE,6BAAsC;ER0nE9C;EQzoEM;IAAgC,0BAA4B;ER4oElE;EQ3oEM;;IAEE,8BAAoC;ER6oE5C;EQ3oEM;;IAEE,gCAAwC;ER6oEhD;EQ3oEM;;IAEE,iCAA0C;ER6oElD;EQ3oEM;;IAEE,+BAAsC;ER6oE9C;EQ5pEM;IAAgC,wBAA4B;ER+pElE;EQ9pEM;;IAEE,4BAAoC;ERgqE5C;EQ9pEM;;IAEE,8BAAwC;ERgqEhD;EQ9pEM;;IAEE,+BAA0C;ERgqElD;EQ9pEM;;IAEE,6BAAsC;ERgqE9C;EQxpEM;IAAwB,2BAA2B;ER2pEzD;EQ1pEM;;IAEE,+BAA+B;ER4pEvC;EQ1pEM;;IAEE,iCAAiC;ER4pEzC;EQ1pEM;;IAEE,kCAAkC;ER4pE1C;EQ1pEM;;IAEE,gCAAgC;ER4pExC;EQ3qEM;IAAwB,0BAA2B;ER8qEzD;EQ7qEM;;IAEE,8BAA+B;ER+qEvC;EQ7qEM;;IAEE,gCAAiC;ER+qEzC;EQ7qEM;;IAEE,iCAAkC;ER+qE1C;EQ7qEM;;IAEE,+BAAgC;ER+qExC;EQ9rEM;IAAwB,wBAA2B;ERisEzD;EQhsEM;;IAEE,4BAA+B;ERksEvC;EQhsEM;;IAEE,8BAAiC;ERksEzC;EQhsEM;;IAEE,+BAAkC;ERksE1C;EQhsEM;;IAEE,6BAAgC;ERksExC;EQjtEM;IAAwB,0BAA2B;ERotEzD;EQntEM;;IAEE,8BAA+B;ERqtEvC;EQntEM;;IAEE,gCAAiC;ERqtEzC;EQntEM;;IAEE,iCAAkC;ERqtE1C;EQntEM;;IAEE,+BAAgC;ERqtExC;EQpuEM;IAAwB,wBAA2B;ERuuEzD;EQtuEM;;IAEE,4BAA+B;ERwuEvC;EQtuEM;;IAEE,8BAAiC;ERwuEzC;EQtuEM;;IAEE,+BAAkC;ERwuE1C;EQtuEM;;IAEE,6BAAgC;ERwuExC;EQluEE;IAAmB,uBAAuB;ERquE5C;EQpuEE;;IAEE,2BAA2B;ERsuE/B;EQpuEE;;IAEE,6BAA6B;ERsuEjC;EQpuEE;;IAEE,8BAA8B;ERsuElC;EQpuEE;;IAEE,4BAA4B;ERsuEhC;AACF;;AGhvEI;EKlDI;IAAgC,oBAA4B;ERuyElE;EQtyEM;;IAEE,wBAAoC;ERwyE5C;EQtyEM;;IAEE,0BAAwC;ERwyEhD;EQtyEM;;IAEE,2BAA0C;ERwyElD;EQtyEM;;IAEE,yBAAsC;ERwyE9C;EQvzEM;IAAgC,0BAA4B;ER0zElE;EQzzEM;;IAEE,8BAAoC;ER2zE5C;EQzzEM;;IAEE,gCAAwC;ER2zEhD;EQzzEM;;IAEE,iCAA0C;ER2zElD;EQzzEM;;IAEE,+BAAsC;ER2zE9C;EQ10EM;IAAgC,yBAA4B;ER60ElE;EQ50EM;;IAEE,6BAAoC;ER80E5C;EQ50EM;;IAEE,+BAAwC;ER80EhD;EQ50EM;;IAEE,gCAA0C;ER80ElD;EQ50EM;;IAEE,8BAAsC;ER80E9C;EQ71EM;IAAgC,uBAA4B;ERg2ElE;EQ/1EM;;IAEE,2BAAoC;ERi2E5C;EQ/1EM;;IAEE,6BAAwC;ERi2EhD;EQ/1EM;;IAEE,8BAA0C;ERi2ElD;EQ/1EM;;IAEE,4BAAsC;ERi2E9C;EQh3EM;IAAgC,yBAA4B;ERm3ElE;EQl3EM;;IAEE,6BAAoC;ERo3E5C;EQl3EM;;IAEE,+BAAwC;ERo3EhD;EQl3EM;;IAEE,gCAA0C;ERo3ElD;EQl3EM;;IAEE,8BAAsC;ERo3E9C;EQn4EM;IAAgC,uBAA4B;ERs4ElE;EQr4EM;;IAEE,2BAAoC;ERu4E5C;EQr4EM;;IAEE,6BAAwC;ERu4EhD;EQr4EM;;IAEE,8BAA0C;ERu4ElD;EQr4EM;;IAEE,4BAAsC;ERu4E9C;EQt5EM;IAAgC,qBAA4B;ERy5ElE;EQx5EM;;IAEE,yBAAoC;ER05E5C;EQx5EM;;IAEE,2BAAwC;ER05EhD;EQx5EM;;IAEE,4BAA0C;ER05ElD;EQx5EM;;IAEE,0BAAsC;ER05E9C;EQz6EM;IAAgC,2BAA4B;ER46ElE;EQ36EM;;IAEE,+BAAoC;ER66E5C;EQ36EM;;IAEE,iCAAwC;ER66EhD;EQ36EM;;IAEE,kCAA0C;ER66ElD;EQ36EM;;IAEE,gCAAsC;ER66E9C;EQ57EM;IAAgC,0BAA4B;ER+7ElE;EQ97EM;;IAEE,8BAAoC;ERg8E5C;EQ97EM;;IAEE,gCAAwC;ERg8EhD;EQ97EM;;IAEE,iCAA0C;ERg8ElD;EQ97EM;;IAEE,+BAAsC;ERg8E9C;EQ/8EM;IAAgC,wBAA4B;ERk9ElE;EQj9EM;;IAEE,4BAAoC;ERm9E5C;EQj9EM;;IAEE,8BAAwC;ERm9EhD;EQj9EM;;IAEE,+BAA0C;ERm9ElD;EQj9EM;;IAEE,6BAAsC;ERm9E9C;EQl+EM;IAAgC,0BAA4B;ERq+ElE;EQp+EM;;IAEE,8BAAoC;ERs+E5C;EQp+EM;;IAEE,gCAAwC;ERs+EhD;EQp+EM;;IAEE,iCAA0C;ERs+ElD;EQp+EM;;IAEE,+BAAsC;ERs+E9C;EQr/EM;IAAgC,wBAA4B;ERw/ElE;EQv/EM;;IAEE,4BAAoC;ERy/E5C;EQv/EM;;IAEE,8BAAwC;ERy/EhD;EQv/EM;;IAEE,+BAA0C;ERy/ElD;EQv/EM;;IAEE,6BAAsC;ERy/E9C;EQj/EM;IAAwB,2BAA2B;ERo/EzD;EQn/EM;;IAEE,+BAA+B;ERq/EvC;EQn/EM;;IAEE,iCAAiC;ERq/EzC;EQn/EM;;IAEE,kCAAkC;ERq/E1C;EQn/EM;;IAEE,gCAAgC;ERq/ExC;EQpgFM;IAAwB,0BAA2B;ERugFzD;EQtgFM;;IAEE,8BAA+B;ERwgFvC;EQtgFM;;IAEE,gCAAiC;ERwgFzC;EQtgFM;;IAEE,iCAAkC;ERwgF1C;EQtgFM;;IAEE,+BAAgC;ERwgFxC;EQvhFM;IAAwB,wBAA2B;ER0hFzD;EQzhFM;;IAEE,4BAA+B;ER2hFvC;EQzhFM;;IAEE,8BAAiC;ER2hFzC;EQzhFM;;IAEE,+BAAkC;ER2hF1C;EQzhFM;;IAEE,6BAAgC;ER2hFxC;EQ1iFM;IAAwB,0BAA2B;ER6iFzD;EQ5iFM;;IAEE,8BAA+B;ER8iFvC;EQ5iFM;;IAEE,gCAAiC;ER8iFzC;EQ5iFM;;IAEE,iCAAkC;ER8iF1C;EQ5iFM;;IAEE,+BAAgC;ER8iFxC;EQ7jFM;IAAwB,wBAA2B;ERgkFzD;EQ/jFM;;IAEE,4BAA+B;ERikFvC;EQ/jFM;;IAEE,8BAAiC;ERikFzC;EQ/jFM;;IAEE,+BAAkC;ERikF1C;EQ/jFM;;IAEE,6BAAgC;ERikFxC;EQ3jFE;IAAmB,uBAAuB;ER8jF5C;EQ7jFE;;IAEE,2BAA2B;ER+jF/B;EQ7jFE;;IAEE,6BAA6B;ER+jFjC;EQ7jFE;;IAEE,8BAA8B;ER+jFlC;EQ7jFE;;IAEE,4BAA4B;ER+jFhC;AACF;;AGzkFI;EKlDI;IAAgC,oBAA4B;ERgoFlE;EQ/nFM;;IAEE,wBAAoC;ERioF5C;EQ/nFM;;IAEE,0BAAwC;ERioFhD;EQ/nFM;;IAEE,2BAA0C;ERioFlD;EQ/nFM;;IAEE,yBAAsC;ERioF9C;EQhpFM;IAAgC,0BAA4B;ERmpFlE;EQlpFM;;IAEE,8BAAoC;ERopF5C;EQlpFM;;IAEE,gCAAwC;ERopFhD;EQlpFM;;IAEE,iCAA0C;ERopFlD;EQlpFM;;IAEE,+BAAsC;ERopF9C;EQnqFM;IAAgC,yBAA4B;ERsqFlE;EQrqFM;;IAEE,6BAAoC;ERuqF5C;EQrqFM;;IAEE,+BAAwC;ERuqFhD;EQrqFM;;IAEE,gCAA0C;ERuqFlD;EQrqFM;;IAEE,8BAAsC;ERuqF9C;EQtrFM;IAAgC,uBAA4B;ERyrFlE;EQxrFM;;IAEE,2BAAoC;ER0rF5C;EQxrFM;;IAEE,6BAAwC;ER0rFhD;EQxrFM;;IAEE,8BAA0C;ER0rFlD;EQxrFM;;IAEE,4BAAsC;ER0rF9C;EQzsFM;IAAgC,yBAA4B;ER4sFlE;EQ3sFM;;IAEE,6BAAoC;ER6sF5C;EQ3sFM;;IAEE,+BAAwC;ER6sFhD;EQ3sFM;;IAEE,gCAA0C;ER6sFlD;EQ3sFM;;IAEE,8BAAsC;ER6sF9C;EQ5tFM;IAAgC,uBAA4B;ER+tFlE;EQ9tFM;;IAEE,2BAAoC;ERguF5C;EQ9tFM;;IAEE,6BAAwC;ERguFhD;EQ9tFM;;IAEE,8BAA0C;ERguFlD;EQ9tFM;;IAEE,4BAAsC;ERguF9C;EQ/uFM;IAAgC,qBAA4B;ERkvFlE;EQjvFM;;IAEE,yBAAoC;ERmvF5C;EQjvFM;;IAEE,2BAAwC;ERmvFhD;EQjvFM;;IAEE,4BAA0C;ERmvFlD;EQjvFM;;IAEE,0BAAsC;ERmvF9C;EQlwFM;IAAgC,2BAA4B;ERqwFlE;EQpwFM;;IAEE,+BAAoC;ERswF5C;EQpwFM;;IAEE,iCAAwC;ERswFhD;EQpwFM;;IAEE,kCAA0C;ERswFlD;EQpwFM;;IAEE,gCAAsC;ERswF9C;EQrxFM;IAAgC,0BAA4B;ERwxFlE;EQvxFM;;IAEE,8BAAoC;ERyxF5C;EQvxFM;;IAEE,gCAAwC;ERyxFhD;EQvxFM;;IAEE,iCAA0C;ERyxFlD;EQvxFM;;IAEE,+BAAsC;ERyxF9C;EQxyFM;IAAgC,wBAA4B;ER2yFlE;EQ1yFM;;IAEE,4BAAoC;ER4yF5C;EQ1yFM;;IAEE,8BAAwC;ER4yFhD;EQ1yFM;;IAEE,+BAA0C;ER4yFlD;EQ1yFM;;IAEE,6BAAsC;ER4yF9C;EQ3zFM;IAAgC,0BAA4B;ER8zFlE;EQ7zFM;;IAEE,8BAAoC;ER+zF5C;EQ7zFM;;IAEE,gCAAwC;ER+zFhD;EQ7zFM;;IAEE,iCAA0C;ER+zFlD;EQ7zFM;;IAEE,+BAAsC;ER+zF9C;EQ90FM;IAAgC,wBAA4B;ERi1FlE;EQh1FM;;IAEE,4BAAoC;ERk1F5C;EQh1FM;;IAEE,8BAAwC;ERk1FhD;EQh1FM;;IAEE,+BAA0C;ERk1FlD;EQh1FM;;IAEE,6BAAsC;ERk1F9C;EQ10FM;IAAwB,2BAA2B;ER60FzD;EQ50FM;;IAEE,+BAA+B;ER80FvC;EQ50FM;;IAEE,iCAAiC;ER80FzC;EQ50FM;;IAEE,kCAAkC;ER80F1C;EQ50FM;;IAEE,gCAAgC;ER80FxC;EQ71FM;IAAwB,0BAA2B;ERg2FzD;EQ/1FM;;IAEE,8BAA+B;ERi2FvC;EQ/1FM;;IAEE,gCAAiC;ERi2FzC;EQ/1FM;;IAEE,iCAAkC;ERi2F1C;EQ/1FM;;IAEE,+BAAgC;ERi2FxC;EQh3FM;IAAwB,wBAA2B;ERm3FzD;EQl3FM;;IAEE,4BAA+B;ERo3FvC;EQl3FM;;IAEE,8BAAiC;ERo3FzC;EQl3FM;;IAEE,+BAAkC;ERo3F1C;EQl3FM;;IAEE,6BAAgC;ERo3FxC;EQn4FM;IAAwB,0BAA2B;ERs4FzD;EQr4FM;;IAEE,8BAA+B;ERu4FvC;EQr4FM;;IAEE,gCAAiC;ERu4FzC;EQr4FM;;IAEE,iCAAkC;ERu4F1C;EQr4FM;;IAEE,+BAAgC;ERu4FxC;EQt5FM;IAAwB,wBAA2B;ERy5FzD;EQx5FM;;IAEE,4BAA+B;ER05FvC;EQx5FM;;IAEE,8BAAiC;ER05FzC;EQx5FM;;IAEE,+BAAkC;ER05F1C;EQx5FM;;IAEE,6BAAgC;ER05FxC;EQp5FE;IAAmB,uBAAuB;ERu5F5C;EQt5FE;;IAEE,2BAA2B;ERw5F/B;EQt5FE;;IAEE,6BAA6B;ERw5FjC;EQt5FE;;IAEE,8BAA8B;ERw5FlC;EQt5FE;;IAEE,4BAA4B;ERw5FhC;AACF;;AGl6FI;EKlDI;IAAgC,oBAA4B;ERy9FlE;EQx9FM;;IAEE,wBAAoC;ER09F5C;EQx9FM;;IAEE,0BAAwC;ER09FhD;EQx9FM;;IAEE,2BAA0C;ER09FlD;EQx9FM;;IAEE,yBAAsC;ER09F9C;EQz+FM;IAAgC,0BAA4B;ER4+FlE;EQ3+FM;;IAEE,8BAAoC;ER6+F5C;EQ3+FM;;IAEE,gCAAwC;ER6+FhD;EQ3+FM;;IAEE,iCAA0C;ER6+FlD;EQ3+FM;;IAEE,+BAAsC;ER6+F9C;EQ5/FM;IAAgC,yBAA4B;ER+/FlE;EQ9/FM;;IAEE,6BAAoC;ERggG5C;EQ9/FM;;IAEE,+BAAwC;ERggGhD;EQ9/FM;;IAEE,gCAA0C;ERggGlD;EQ9/FM;;IAEE,8BAAsC;ERggG9C;EQ/gGM;IAAgC,uBAA4B;ERkhGlE;EQjhGM;;IAEE,2BAAoC;ERmhG5C;EQjhGM;;IAEE,6BAAwC;ERmhGhD;EQjhGM;;IAEE,8BAA0C;ERmhGlD;EQjhGM;;IAEE,4BAAsC;ERmhG9C;EQliGM;IAAgC,yBAA4B;ERqiGlE;EQpiGM;;IAEE,6BAAoC;ERsiG5C;EQpiGM;;IAEE,+BAAwC;ERsiGhD;EQpiGM;;IAEE,gCAA0C;ERsiGlD;EQpiGM;;IAEE,8BAAsC;ERsiG9C;EQrjGM;IAAgC,uBAA4B;ERwjGlE;EQvjGM;;IAEE,2BAAoC;ERyjG5C;EQvjGM;;IAEE,6BAAwC;ERyjGhD;EQvjGM;;IAEE,8BAA0C;ERyjGlD;EQvjGM;;IAEE,4BAAsC;ERyjG9C;EQxkGM;IAAgC,qBAA4B;ER2kGlE;EQ1kGM;;IAEE,yBAAoC;ER4kG5C;EQ1kGM;;IAEE,2BAAwC;ER4kGhD;EQ1kGM;;IAEE,4BAA0C;ER4kGlD;EQ1kGM;;IAEE,0BAAsC;ER4kG9C;EQ3lGM;IAAgC,2BAA4B;ER8lGlE;EQ7lGM;;IAEE,+BAAoC;ER+lG5C;EQ7lGM;;IAEE,iCAAwC;ER+lGhD;EQ7lGM;;IAEE,kCAA0C;ER+lGlD;EQ7lGM;;IAEE,gCAAsC;ER+lG9C;EQ9mGM;IAAgC,0BAA4B;ERinGlE;EQhnGM;;IAEE,8BAAoC;ERknG5C;EQhnGM;;IAEE,gCAAwC;ERknGhD;EQhnGM;;IAEE,iCAA0C;ERknGlD;EQhnGM;;IAEE,+BAAsC;ERknG9C;EQjoGM;IAAgC,wBAA4B;ERooGlE;EQnoGM;;IAEE,4BAAoC;ERqoG5C;EQnoGM;;IAEE,8BAAwC;ERqoGhD;EQnoGM;;IAEE,+BAA0C;ERqoGlD;EQnoGM;;IAEE,6BAAsC;ERqoG9C;EQppGM;IAAgC,0BAA4B;ERupGlE;EQtpGM;;IAEE,8BAAoC;ERwpG5C;EQtpGM;;IAEE,gCAAwC;ERwpGhD;EQtpGM;;IAEE,iCAA0C;ERwpGlD;EQtpGM;;IAEE,+BAAsC;ERwpG9C;EQvqGM;IAAgC,wBAA4B;ER0qGlE;EQzqGM;;IAEE,4BAAoC;ER2qG5C;EQzqGM;;IAEE,8BAAwC;ER2qGhD;EQzqGM;;IAEE,+BAA0C;ER2qGlD;EQzqGM;;IAEE,6BAAsC;ER2qG9C;EQnqGM;IAAwB,2BAA2B;ERsqGzD;EQrqGM;;IAEE,+BAA+B;ERuqGvC;EQrqGM;;IAEE,iCAAiC;ERuqGzC;EQrqGM;;IAEE,kCAAkC;ERuqG1C;EQrqGM;;IAEE,gCAAgC;ERuqGxC;EQtrGM;IAAwB,0BAA2B;ERyrGzD;EQxrGM;;IAEE,8BAA+B;ER0rGvC;EQxrGM;;IAEE,gCAAiC;ER0rGzC;EQxrGM;;IAEE,iCAAkC;ER0rG1C;EQxrGM;;IAEE,+BAAgC;ER0rGxC;EQzsGM;IAAwB,wBAA2B;ER4sGzD;EQ3sGM;;IAEE,4BAA+B;ER6sGvC;EQ3sGM;;IAEE,8BAAiC;ER6sGzC;EQ3sGM;;IAEE,+BAAkC;ER6sG1C;EQ3sGM;;IAEE,6BAAgC;ER6sGxC;EQ5tGM;IAAwB,0BAA2B;ER+tGzD;EQ9tGM;;IAEE,8BAA+B;ERguGvC;EQ9tGM;;IAEE,gCAAiC;ERguGzC;EQ9tGM;;IAEE,iCAAkC;ERguG1C;EQ9tGM;;IAEE,+BAAgC;ERguGxC;EQ/uGM;IAAwB,wBAA2B;ERkvGzD;EQjvGM;;IAEE,4BAA+B;ERmvGvC;EQjvGM;;IAEE,8BAAiC;ERmvGzC;EQjvGM;;IAEE,+BAAkC;ERmvG1C;EQjvGM;;IAEE,6BAAgC;ERmvGxC;EQ7uGE;IAAmB,uBAAuB;ERgvG5C;EQ/uGE;;IAEE,2BAA2B;ERivG/B;EQ/uGE;;IAEE,6BAA6B;ERivGjC;EQ/uGE;;IAEE,8BAA8B;ERivGlC;EQ/uGE;;IAEE,4BAA4B;ERivGhC;AACF","file":"bootstrap-grid.css","sourcesContent":["/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/display\";\n@import \"utilities/flex\";\n@import \"utilities/spacing\";\n","/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer / 2 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\n$input-height-inner-half: calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n\n$input-height: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\n$input-height-sm: calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\n$input-height-lg: calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default;\n$custom-switch-indicator-size: calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer / 2 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n"]} \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css new file mode 100644 index 0000000..e5e74f7 --- /dev/null +++ b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap Grid v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}} +/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map new file mode 100644 index 0000000..13e33db --- /dev/null +++ b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap-grid.scss","dist/css/bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_spacing.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/display\";\n@import \"utilities/flex\";\n@import \"utilities/spacing\";\n","/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n"]} \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css new file mode 100644 index 0000000..09cf986 --- /dev/null +++ b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css @@ -0,0 +1,331 @@ +/*! + * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) + */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; +} + +[tabindex="-1"]:focus { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +a { + color: #007bff; + text-decoration: none; + background-color: transparent; +} + +a:hover { + color: #0056b3; + text-decoration: underline; +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; +} + +a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; +} + +a:not([href]):not([tabindex]):focus { + outline: 0; +} + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +select { + word-wrap: normal; +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} +/*# sourceMappingURL=bootstrap-reboot.css.map */ \ No newline at end of file diff --git a/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map new file mode 100644 index 0000000..d0b0f02 --- /dev/null +++ b/Sledgemapper.Api/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap-reboot.scss","bootstrap-reboot.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/vendor/_rfs.scss","../../scss/mixins/_hover.scss"],"names":[],"mappings":"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","file":"bootstrap-reboot.css","sourcesContent":["/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `