diff --git a/_proc/.gitignore b/_proc/.gitignore new file mode 100644 index 0000000..075b254 --- /dev/null +++ b/_proc/.gitignore @@ -0,0 +1 @@ +/.quarto/ diff --git a/_proc/docs/AttrDict.html b/_proc/docs/AttrDict.html new file mode 100644 index 0000000..5581685 --- /dev/null +++ b/_proc/docs/AttrDict.html @@ -0,0 +1,1035 @@ + + + + + + + + + +attrdict – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + + +
+
from torch_snippets.loader import L
+
+
[07/01/24 11:12:47] WARNING  Unable to load torch and dependent libraries from torch-snippets.                                                        loader.py:<module>:108
+                             Functionalities might be limited. pip install lovely-tensors in case there are torch related errors                                            
+
+
+
+
+
class AD(object):
+    forbidden = set(":,'\"}{.")
+
+    def __init__(self, *args, given_input_to_ad=None, **kwargs):
+        given_input_to_ad = {} if given_input_to_ad is None else given_input_to_ad
+        if len(args) == 1 and isinstance(args[0], (Mapping, AttrDict)):
+            given_input_to_ad = args[0]
+            args = {}
+        else:
+            _args = dict(ic.io(*args)) if len(args) > 0 else {}
+            args = {}
+            for k, v in _args.items():
+                if any(c in self.forbidden for c in k):
+                    assert isinstance(
+                        v, (dict, AttrDict)
+                    ), f"Input `{v}` can't be a list"
+                    given_input_to_ad = {**v, **given_input_to_ad}
+                else:
+                    args = {**{k: v}, **args}
+
+        given_input_to_ad = {**kwargs, **given_input_to_ad, **args}
+        for name, value in given_input_to_ad.items():
+            setattr(self, str(name), self._wrap(value))
+
+    def items(self):
+        return self.__dict__.items()
+
+    def keys(self):
+        return self.__dict__.keys()
+
+    def values(self):
+        return self.__dict__.values()
+
+    def __json__(self):
+        return self.to_dict()
+
+    def _wrap(self, value):
+        if isinstance(value, (L, tuple, list, set, frozenset)):
+            value = type(value)([self._wrap(v) for v in value])
+            if isinstance(value, (list, L)):
+                value = L(value)
+            return value
+        else:
+            return (
+                AttrDict(given_input_to_ad=value) if isinstance(value, dict) else value
+            )
+
+    __getitem__ = lambda self, x: (
+        AttrDict({_x: self[_x] for _x in x})
+        if isinstance(x, (list, L))
+        else getattr(self, str(x))
+    )
+    __setitem__ = lambda self, k, v: setattr(self, str(k), self._wrap(v))
+
+    def update(self, dict):
+        for k, v in dict.items():
+            self[k] = v
+
+    def get(self, key, default=None):
+        key = str(key)
+        return self[key] if key in self else default
+
+    def __iter__(self):
+        return iter(self.keys())
+
+    def __len__(self):
+        return len(self.keys())
+
+    def __repr__(self):
+        return f"\n```↯ AttrDict ↯\n{self.summary()}\n```\n"
+
+    def __dir__(self):
+        return self.__dict__.keys()
+
+    def __contains__(self, key):
+        key = str(key)
+        if "." not in key:
+            return key in self.__dict__.keys()
+        else:
+            d = self
+            for _k in key.split("."):
+                try:
+                    d = d[_k]
+                except AttributeError:
+                    return False
+            return True
+
+    def __delitem__(self, key):
+        key = str(key)
+        del self.__dict__[key]
+
+    def map(self, func):
+        for k in dir(self):
+            v = self[k]
+            if isinstance(v, AttrDict):
+                v.map(func)
+            elif isinstance(v, (L, tuple, list, set, frozenset)):
+                v = [_v.map(func) if isinstance(_v, AttrDict) else func(_v) for _v in v]
+            else:
+                v = func(v)
+            self[k] = v
+
+    def drop(self, key):
+        if key in self:
+            del self[key]
+        for k in dir(self):
+            v = self[k]
+            if isinstance(v, AttrDict):
+                v.drop(key)
+            if isinstance(v, (L, tuple, list, set, frozenset)):
+                v = [_v.drop(key) for _v in v if isinstance(_v, AttrDict)]
+
+    def to_dict(self):
+        d = {}
+        for k in self.__dict__.keys():  # can't use dir here
+            v = self[k]
+            if isinstance(v, AttrDict):
+                v = v.to_dict()
+            if isinstance(v, (L, tuple, list, set, frozenset)):
+                v = [_v.to_dict() if isinstance(_v, AttrDict) else _v for _v in v]
+            d[k] = v
+        return d
+
+    dict = to_dict
+
+    def pretty(self, print_with_logger=False, *args, **kwargs):
+        pretty_json(
+            self.to_dict(), print_with_logger=print_with_logger, *args, **kwargs
+        )
+
+    def __eq__(self, other):
+        return AttrDict(given_input_to_ad=other).to_dict() == self.to_dict()
+
+    def find_address(self, key, current_path=""):
+        addresses = []
+        for k in self.keys():
+            if current_path:
+                new_path = f"{current_path}.{k}"
+            else:
+                new_path = k
+
+            if k == key:
+                addresses.append(new_path)
+
+            if isinstance(self[k], AttrDict):
+                addresses.extend(self[k].find_address(key, new_path))
+
+            elif isinstance(self[k], (L, tuple, list, set, frozenset)):
+                for i, item in enumerate(self[k]):
+                    if isinstance(item, AttrDict):
+                        addresses.extend(item.find_address(key, f"{new_path}.{i}"))
+        return addresses
+
+    def summary(self, current_path="", depth=0, sep="  ", max_items=10):
+        max_items = int(os.environ.get("AD_MAX_ITEMS", max_items))
+        sep = os.environ.get("AD_SEP", sep)
+
+        def format_path(path, key):
+            return f"{path}.{key}" if path else key
+
+        def format_item(key, item, path, depth, sep):
+            import numpy as np
+            import pandas as pd
+
+            try:
+                import torch
+            except ModuleNotFoundError:
+
+                class Torch:
+                    Tensor = type(None)
+
+                torch = Torch()
+
+            if isinstance(item, (pd.DataFrame,)):
+                return f"{sep * depth}{key} - {type(item).__name__} - shape {item.shape} - columns {item.columns} - {hash_pandas_dataframe(item)}\n"
+            if isinstance(item, AttrDict) or hasattr(item, "keys"):
+                item = AttrDict(**item)
+                return f"{sep*depth}{key}\n" + item.summary(path, depth + 1, sep)
+            elif isinstance(item, (list, tuple, set, frozenset, L)):
+                return summarize_collection(key, item, path, depth + 1, sep)
+            elif isinstance(item, (torch.Tensor, np.ndarray)):
+                is_np = False
+                if isinstance(item, np.ndarray):
+                    is_np = True
+                    item = torch.tensor(item)
+                is_np = "🔦" if not is_np else "np."
+                return f"{sep * depth}{key} - {is_np}{item} - {hash_tensor(item)}\n"
+
+            else:
+                is_multiline = False
+                ogitem = item
+                if isinstance(item, (str, P)):
+                    item = str(item)
+                    is_multiline = "\n" in item
+                    _sep = " ...\n...\n...\n...\n... " if is_multiline else "........."
+                    if len(item) > 100:
+                        item = item[:35] + _sep + item[-35:]
+                    if is_multiline:
+                        _item = item.split("\n")
+                        _item = "\n".join([f"{sep*(depth+1)}{l}" for l in _item])
+                        item = f"↓\n{sep*(depth+1)}```\n{_item}\n{sep*(depth+1)}```"
+                multiline = "" if not is_multiline else "Multiline "
+                return f"{sep * depth}{key} - {item} (🏷️ {multiline}{type(ogitem).__name__})\n"
+
+        def summarize_collection(key, collection, path, d, s):
+            summary_str = f"{s * (d - 1)}{key}\n"
+            for i, item in enumerate(collection):
+                item_path = format_path(path, i)
+                if i < max_items:
+                    summary_str += format_item(i, item, item_path, d, s)
+                else:
+                    summary_str += (
+                        f"{s*d}... {len(collection) - max_items} more items ...\n"
+                    )
+                    break
+            return summary_str
+
+        summary_str = ""
+        for ix, key in enumerate(self.keys()):
+            if ix >= max_items:
+                summary_str += (
+                    f"{sep*depth} ... {len(self.keys()) - max_items} more keys ...\n"
+                )
+                break
+            new_path = format_path(current_path, key)
+            summary_str += format_item(key, self[key], new_path, depth, sep)
+        return summary_str
+
+    def print_summary(self, **kwargs):
+        from builtins import print
+
+        print(self.summary(**kwargs))
+
+    def write_summary(self, to, **kwargs):
+        writelines(self.summary(**kwargs).split("\n"), to)
+
+    def fetch(self, addr):
+        if isinstance(addr, (list, L)):
+            return L([self.fetch(_addr) for _addr in addr])
+
+        o = self
+        for p in addr.split("."):
+            try:
+                o = o[int(p)]
+            except:
+                o = o[p]
+        return o
+
+
+
x = AD(x=1)
+x
+
+
+
---------------------------------------------------------------------------
+NameError                                 Traceback (most recent call last)
+File ~/miniconda3/miniconda3/envs/ts/lib/python3.10/site-packages/IPython/core/formatters.py:708, in PlainTextFormatter.__call__(self, obj)
+    701 stream = StringIO()
+    702 printer = pretty.RepresentationPrinter(stream, self.verbose,
+    703     self.max_width, self.newline,
+    704     max_seq_length=self.max_seq_length,
+    705     singleton_pprinters=self.singleton_printers,
+    706     type_pprinters=self.type_printers,
+    707     deferred_pprinters=self.deferred_printers)
+--> 708 printer.pretty(obj)
+    709 printer.flush()
+    710 return stream.getvalue()
+
+File ~/miniconda3/miniconda3/envs/ts/lib/python3.10/site-packages/IPython/lib/pretty.py:410, in RepresentationPrinter.pretty(self, obj)
+    407                         return meth(obj, self, cycle)
+    408                 if cls is not object \
+    409                         and callable(cls.__dict__.get('__repr__')):
+--> 410                     return _repr_pprint(obj, self, cycle)
+    412     return _default_pprint(obj, self, cycle)
+    413 finally:
+
+File ~/miniconda3/miniconda3/envs/ts/lib/python3.10/site-packages/IPython/lib/pretty.py:778, in _repr_pprint(obj, p, cycle)
+    776 """A pprint that just redirects to the normal repr function."""
+    777 # Find newlines and replace them with p.break_()
+--> 778 output = repr(obj)
+    779 lines = output.splitlines()
+    780 with p.group():
+
+Cell In[8], line 69, in AD.__repr__(self)
+     68 def __repr__(self):
+---> 69     return f"\n```↯ AttrDict ↯\n{self.summary()}\n```\n"
+
+Cell In[8], line 154, in AD.summary(self, current_path, depth, sep, max_items)
+    153 def summary(self, current_path="", depth=0, sep="  ", max_items=10):
+--> 154     max_items = int(os.environ.get("AD_MAX_ITEMS", max_items))
+    155     sep = os.environ.get("AD_SEP", sep)
+    157     def format_path(path, key):
+
+NameError: name 'os' is not defined
+
+
+
+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/adapters.html b/_proc/docs/adapters.html new file mode 100644 index 0000000..9c00617 --- /dev/null +++ b/_proc/docs/adapters.html @@ -0,0 +1,856 @@ + + + + + + + + + +adapters – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + +
+

Adapters

+

To convert data from/to various formats

+ +
+
+

file_2_bytes

+
+
 file_2_bytes (fpath)
+
+
+
+
+

bytes_2_file

+
+
 bytes_2_file (input:bytes, fpath:Union[str,pathlib.Path],
+               silent:bool=False)
+
+

Save bytes input at given fpath

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefaultDetails
inputbytesbytes
fpathUnionPlace where you want to save the file
silentboolFalse
ReturnsNone
+
+
+
+

b64_2_file

+
+
 b64_2_file (input:str, fpath:Union[str,pathlib.Path])
+
+

Save a file encoded as a base64 input at given fpath

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDetails
inputstrbase64 encoded string
fpathUnionPlace where you want to save the file
ReturnsNone
+
+
+
+

b64_2_np

+
+
 b64_2_np (input:str)
+
+

*Converts a base64 encoded image to a NumPy array.

+

Args: input (str): The base64 encoded image.

+

Returns: np.ndarray: The NumPy array representation of the image in RGB format.*

+
+
+
+

np_2_b64

+
+
 np_2_b64 (image:numpy.ndarray)
+
+

Convert a numpy image to base64 string

+
+
+
+

cvat_2_csvs

+
+
 cvat_2_csvs (xmlfile, csvs_folder)
+
+

*Convert CVAT XML annotations to CSV files.

+

Args: xmlfile (str): Path to the CVAT XML file. csvs_folder (str): Path to the folder where the CSV files will be saved.

+

Returns: None*

+
+
+
+

csvs_2_cvat

+
+
 csvs_2_cvat (images_folder, csvs_folder, xml_output_file, items=None,
+              parquet=False, relative_df=True, default_label='Background',
+              extension='jpg')
+
+

*Convert CSV annotations to CVAT XML format.

+

Args: images_folder (str): Path to the folder containing the images. csvs_folder (str): Path to the folder containing the CSV annotations. xml_output_file (str): Path to the output XML file. items (list, optional): List of items to process. If None, all items will be processed. Defaults to None. parquet (bool, optional): Whether the annotations are stored in Parquet format. Defaults to False. relative_df (bool, optional): Whether the bounding box coordinates in the CSV are relative to the image size. Defaults to True. default_label (str, optional): Default label for the bounding boxes. Defaults to “Background”. extension (str, optional): Image file extension. Defaults to “jpg”.

+

Returns: None*

+
+
+
+

yolo_2_df

+
+
 yolo_2_df (yolo, h, w, id2class, class_column)
+
+
+
+
+

df_2_yolo

+
+
 df_2_yolo (df, h, w, class2id, class_column)
+
+ + +
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/bokeh_plotting.html b/_proc/docs/bokeh_plotting.html new file mode 100644 index 0000000..003a150 --- /dev/null +++ b/_proc/docs/bokeh_plotting.html @@ -0,0 +1,756 @@ + + + + + + + + + + +Bokeh Plots – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

Bokeh Plots

+
+ +
+
+ For rapid prototyping bokeh charts +
+
+ + +
+ + + + +
+ + + +
+ + + +
+
bplot = get_bplot()
+bplot.line(np.arange(100), np.cumsum(np.random.uniform(size=100)))
+bshow(bplot)
+
+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/bounding_boxes.html b/_proc/docs/bounding_boxes.html new file mode 100644 index 0000000..283f615 --- /dev/null +++ b/_proc/docs/bounding_boxes.html @@ -0,0 +1,1114 @@ + + + + + + + + + +bounding_boxes – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + +
+

Bounding Box

+ +

Create a box by mentioning the top-left (x, y) and bottom-right (X, Y) coordinates
+Say x, y, X, Y are 10, 20, 40, 50 respectively

+
+
bb = BB([10, 20, 40, 50])
+
+

You get the following attributes for free

+
+
+

+bb.x=10              (top left - x)
+bb.y=20              (top left - y)
+bb.X=40              (bottom right - x)
+bb.Y=50              (bottom right - y)
+bb.w=30              (width)
+bb.h=30              (height)
+bb.xc=25.0           (center x)
+bb.yc=35.0           (center y)
+bb.c=(25.0, 35.0)    (center)
+bb.area=900          (area)
+bb.shape=(30, 30)    (height, width)
+
+
+
+
+
from torch_snippets import show, read, P, pd
+
+
+
assets = P("/Users/yeshwanth.y/code/torch_snippets/assets/")
+im = read(assets / "Preamble.png")
+df = pd.read_csv(assets / "Preamble.csv")
+show(df.head())
+df = to_absolute(df, *im.shape[:2])
+show(df.head())
+df = to_relative(df, *im.shape[:2])
+show(df.head())
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xyXYtextblock_id
0135181308218ConstITUtIO0
1156264217284NLTHE1
2218264276284PEOPLE1
3267265295282OF1
4297264341284INDIA,1
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xyXYtextblock_id
0135181308218ConstITUtIO0
1156264217284NLTHE1
2218264276284PEOPLE1
3267265295282OF1
4297264341284INDIA,1
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xyXYtextblock_id
00.2495380.2535010.5693160.305322ConstITUtIO0
10.2883550.3697480.4011090.397759NLTHE1
20.4029570.3697480.5101660.397759PEOPLE1
30.4935300.3711480.5452870.394958OF1
40.5489830.3697480.6303140.397759INDIA,1
+
+
+
+
show(im, df=df, sz=10)
+
+
+
+

+
+
+
+
+
+
show(im, df=to_absolute(df, *im.shape[:2]), sz=10)
+
+
+
+

+
+
+
+
+
+
_df = to_absolute(df, *im.shape[:2])
+show(im, df=to_relative(_df, *im.shape[:2]), sz=10)
+
+
+
+

+
+
+
+
+
+
_df = combine_xyXY_to_bb(_df)
+show(im, df=to_relative(_df, *im.shape[:2]), sz=10)
+
+
+
+

+
+
+
+
+
+
to_relative(_df, *im.shape[:2])
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
textblock_idbb
0ConstITUtIO0[0.24953789279112754, 0.2535014005602241, 0.56...
1NLTHE1[0.28835489833641403, 0.3697478991596639, 0.40...
2PEOPLE1[0.4029574861367837, 0.3697478991596639, 0.510...
3OF1[0.49353049907578556, 0.3711484593837535, 0.54...
4INDIA,1[0.5489833641404805, 0.3697478991596639, 0.630...
............
68GIVE13[0.4011090573012939, 0.7366946778711485, 0.478...
69TO13[0.4879852125693161, 0.7366946778711485, 0.536...
70oUrSELVES13[0.5508317929759704, 0.7394957983193278, 0.706...
71THIS13[0.7190388170055453, 0.7366946778711485, 0.783...
72CONSTITUTION.14[0.23290203327171904, 0.7689075630252101, 0.44...
+ +

73 rows × 3 columns

+
+
+
+
+
+

isin

+
+
 isin (bboxes1, bboxes2, return_matrix=True)
+
+

return indexes of those boxes from bboxes1 that are completely inside bboxes2

+
+
+
+

merge_by_bb

+
+
 merge_by_bb (df1, df2, suffixes=('_x', '_y'), iou_threshold=0.1)
+
+

Merge df1 columns to df2 by using iou Make sure both df1 & df2 are relative or both absolute

+ + +
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/bounding_boxes_files/figure-html/cell-6-output-1.png b/_proc/docs/bounding_boxes_files/figure-html/cell-6-output-1.png new file mode 100644 index 0000000..df323fd Binary files /dev/null and b/_proc/docs/bounding_boxes_files/figure-html/cell-6-output-1.png differ diff --git a/_proc/docs/bounding_boxes_files/figure-html/cell-7-output-1.png b/_proc/docs/bounding_boxes_files/figure-html/cell-7-output-1.png new file mode 100644 index 0000000..2cc1ff9 Binary files /dev/null and b/_proc/docs/bounding_boxes_files/figure-html/cell-7-output-1.png differ diff --git a/_proc/docs/bounding_boxes_files/figure-html/cell-8-output-1.png b/_proc/docs/bounding_boxes_files/figure-html/cell-8-output-1.png new file mode 100644 index 0000000..2cc1ff9 Binary files /dev/null and b/_proc/docs/bounding_boxes_files/figure-html/cell-8-output-1.png differ diff --git a/_proc/docs/bounding_boxes_files/figure-html/cell-9-output-1.png b/_proc/docs/bounding_boxes_files/figure-html/cell-9-output-1.png new file mode 100644 index 0000000..2cc1ff9 Binary files /dev/null and b/_proc/docs/bounding_boxes_files/figure-html/cell-9-output-1.png differ diff --git a/_proc/docs/capsule.html b/_proc/docs/capsule.html new file mode 100644 index 0000000..1797b78 --- /dev/null +++ b/_proc/docs/capsule.html @@ -0,0 +1,873 @@ + + + + + + + + + +Capsule (Tutorial) – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

Capsule (Tutorial)

+
+ + + +
+ + + + +
+ + + +
+ + + +

Let’s load the iris dataset first

+
+
from sklearn.datasets import load_iris
+from sklearn.model_selection import train_test_split
+
+data = load_iris()
+X, y = data.data, data.target
+X_trn, X_val, y_trn, y_val = train_test_split(X, y, random_state=42)
+
+

… and create the data loaders

+
+
from torch_snippets.markup2 import AD
+from torch.utils.data import TensorDataset
+
+trn_ds = TensorDataset(*[torch.Tensor(i) for i in [X_trn, y_trn]])
+trn_dl = DataLoader(trn_ds, batch_size=32)
+
+val_ds = TensorDataset(*[torch.Tensor(i) for i in [X_val, y_val]])
+val_dl = DataLoader(val_ds, batch_size=32)
+
+AD(next(iter(val_dl)))
+
+

+```↯ AttrDict ↯
+next(iter(val_dl))[]
+  0 - 🔦tensor[32, 4] n=128 x∈[0.100, 7.900] μ=3.488 σ=2.034 - ID:#56f55949
+  1 - 🔦tensor[32] x∈[0., 2.000] μ=0.969 σ=0.861 - ID:#b365fa0a
+
+```
+
+
+

Next we’ll import Capsule and a few decorators that will tell the model to change it’s mode to train/test during the fit function

+
from torch_snippets.trainer.capsule import Capsule, train, validate, predict
+

Create the neural network and define it’s forward function as usual pytorch business. Only difference now is that you’ll also add self.loss_fn and self.optimizer attributes in the init

+
class IrisModel(Capsule):
+    def __init__(self):
+        super().__init__()
+        self.model = nn.Sequential(
+            nn.BatchNorm1d(4),
+            nn.Linear(4, 16),
+            nn.Dropout(0.2),
+            nn.BatchNorm1d(16),
+            nn.ReLU(inplace=True),
+            nn.Linear(16, 8),
+            nn.Dropout(0.2),
+            nn.BatchNorm1d(8),
+            nn.ReLU(inplace=True),
+            nn.Linear(8, 3),
+        )
+        self.loss_fn = nn.CrossEntropyLoss()
+        self.optimizer = optim.Adam(self.parameters())
+
+    def forward(self, x):
+        return self.model(x)
+

To fully describe the model’s behaviour we still need to define three functions
+1. train_batch
+2. validate_batch and,
+3. predict which is optional

+

like so

+

+    @train
+    def train_batch(self, batch):
+        x, y = batch
+        _y = self.forward(x)
+        loss = self.loss_fn(_y, y.long())
+        return {"loss": loss}
+
+    @validate
+    def validate_batch(self, batch=None, dl=None):
+        if dl is not None:
+            output = []
+            for batch in dl:
+                output.extend(self.predict(batch=batch)["val_acc"])
+            return np.mean(output)
+        x, y = batch
+        _y = self.forward(x)
+        loss = self.loss_fn(_y, y.long())
+        acc = (y == _y.max(-1)[1]).float().mean()
+        return {"val_loss": loss, "val_acc": acc}
+
+    @predict
+    def predict(self, batch=None, dl=None):
+        if dl is not None:
+            output = []
+            for batch in dl:
+                output.extend(self.predict(batch=batch))
+            return output
+        x, y = batch
+        _y = self.forward(x)
+        o = _y.max(-1)[1].cpu().detach().numpy().tolist()
+        return o
+ +

We could now create the model…

+
+
model = IrisModel()
+model.device = "cpu"
+
+

… and run model.fit with an optional number of logs to print to the console

+
+
model.fit(trn_dl, val_dl, num_epochs=100, print_total=2, device="cpu")
+
+
EPOCH: 1.000  val_acc: 0.281  loss: 1.118  val_loss: 1.159  (0.05s - 5.02s remaining)
+EPOCH: 50.000  val_acc: 1.000  loss: 0.490  val_loss: 0.406  (0.18s - 0.18s remaining)
+EPOCH: 100.000  val_acc: 1.000  loss: 0.238  val_loss: 0.162  (0.31s - 0.00s remaining)
+
+
+
+
+

+
+
+
+
+

model.evaluate accepts a validation data loader that will repeatedly call validate_batch and return aggregated metrics

+
+
model.evaluate(val_dl, device="cpu")
+
+
EPOCH: 1.000  val_acc: 1.000  val_loss: 0.164  (0.00s - 0.00s remaining)
+
+
+
{'epoch_val_acc': np.float64(1.0),
+ 'epoch_val_loss': np.float64(0.16414348781108856)}
+
+
+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/capsule_files/figure-html/cell-6-output-2.png b/_proc/docs/capsule_files/figure-html/cell-6-output-2.png new file mode 100644 index 0000000..df661f0 Binary files /dev/null and b/_proc/docs/capsule_files/figure-html/cell-6-output-2.png differ diff --git a/_proc/docs/charts.html b/_proc/docs/charts.html new file mode 100644 index 0000000..4cabdc0 --- /dev/null +++ b/_proc/docs/charts.html @@ -0,0 +1,1798 @@ + + + + + + + + + +charts – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + +
+

Altair and Other Charts

+ +
+
from torch_snippets.loader import *
+from sklearn.datasets import make_moons
+
+np.random.seed(10)
+x, y = make_moons(1000, noise=0.1)
+df = pd.DataFrame({"x1": x[:, 0], "x2": x[:, 1], "y": y})
+
+Chart(df).mark_circle().encode(x="x1:Q", y="x2:Q", color="y:N").interactive()
+
+ + +
+ +
+
+

Refer to altair-viz.github.io for more awesome charts.
+torch-snippets exposes a confusion matrix function CM as an example

+
+

Method 1

+
+
n = 10
+a = "qwertyuiopasdfghjklzxcvbnm"
+truth = np.random.randint(4, size=1000000)
+pred = np.random.randint(4, size=1000000)
+show(CM(truth=truth, pred=pred, mapping={i: a for i, a in enumerate(a)}))
+# mapping is optional
+
+
              precision    recall  f1-score   support
+
+           0       0.25      0.25      0.25    250150
+           1       0.25      0.25      0.25    250245
+           2       0.25      0.25      0.25    249836
+           3       0.25      0.25      0.25    249769
+
+    accuracy                           0.25   1000000
+   macro avg       0.25      0.25      0.25   1000000
+weighted avg       0.25      0.25      0.25   1000000
+
+
+
+ + +
+ +
+
+
+
+

Method 2

+
+
df = pd.DataFrame(
+    {
+        "truth": [randint(n) for _ in range(1000)],
+        "pred": [randint(n) for _ in range(1000)],
+    }
+)
+show(CM(df, "truth", "pred", mapping={i: a for i, a in enumerate(a)}))
+# mapping is optional
+
+
              precision    recall  f1-score   support
+
+           0       0.13      0.14      0.13        92
+           1       0.08      0.09      0.08       101
+           2       0.13      0.12      0.13       107
+           3       0.06      0.06      0.06       105
+           4       0.12      0.11      0.11        94
+           5       0.12      0.09      0.10       115
+           6       0.08      0.10      0.09        88
+           7       0.08      0.07      0.08       113
+           8       0.09      0.09      0.09        99
+           9       0.12      0.15      0.13        86
+
+    accuracy                           0.10      1000
+   macro avg       0.10      0.10      0.10      1000
+weighted avg       0.10      0.10      0.10      1000
+
+
+
+ + +
+ +
+
+
+
+

Method 3

+
+
df = pd.DataFrame(
+    {
+        "truth": [choose("abcd") for _ in range(1000)],
+        "pred": [choose("abcd") for _ in range(1000)],
+    }
+)
+show(CM(df, "truth", "pred"))
+# mapping is optional
+
+
              precision    recall  f1-score   support
+
+           a       0.25      0.29      0.27       229
+           b       0.28      0.29      0.28       256
+           c       0.27      0.24      0.26       267
+           d       0.26      0.25      0.25       248
+
+    accuracy                           0.27      1000
+   macro avg       0.26      0.27      0.26      1000
+weighted avg       0.27      0.27      0.26      1000
+
+
+
+ + +
+ +
+
+
+
+
+

spider

+
+
 spider (df, id_column=None, title=None, max_values=None, padding=1.25,
+         global_scale=False, ax=None, sz=10)
+
+

*Plot a spider chart based on the given dataframe.

+

Parameters: - df: pandas DataFrame The input dataframe containing the data to be plotted. - id_column: str, optional The column name to be used as the identifier for each data point. If not provided, the index of the dataframe will be used. - title: str, optional The title of the spider chart. - max_values: dict, optional A dictionary specifying the maximum values for each category. If not provided, the maximum values will be calculated based on the data. - padding: float, optional The padding factor to be applied when calculating the maximum values. Default is 1.25. - global_scale: bool or float, optional If False, each category will have its own maximum value. If True, a single maximum value will be used for all categories. If a float value is provided, it will be used as the maximum value for all categories. - ax: matplotlib Axes, optional The axes on which to plot the spider chart. If not provided, a new figure and axes will be created. - sz: float, optional The size of the figure (both width and height) in inches. Default is 10.

+

Returns: - None

+

Example usage: spider(df, id_column=‘model’, title=‘Spider Chart’, max_values={‘category1’: 10, ‘category2’: 20}, padding=1.5)*

+
+
import pandas as pd
+
+spider(
+    pd.DataFrame(
+        {
+            "x": [*"abcde"],
+            "c1": [10, 11, 12, 13, 14],
+            "c2": [0.1, 0.3, 0.4, 0.1, 0.9],
+            "c3": [1e5, 2e5, 3.5e5, 8e4, 5e4],
+            "c4": [9, 12, 5, 2, 0.2],
+            "test": [1, 1, 1, 1, 5],
+        },
+        index=[*"abcde"],
+    ),
+    title="Sample Spider",
+    padding=1.1,
+)
+
+
+
+

+
+
+
+
+
+
+
+

UpSetAltair

+
+
 UpSetAltair (data=None, title='', subtitle='', sets=None, abbre=None,
+              sort_by='frequency', sort_order='ascending', width=1200,
+              height=700, height_ratio=0.6,
+              horizontal_bar_chart_width=300, color_range=['#55A8DB',
+              '#3070B5', '#30363F', '#F1AD60', '#DF6234', '#BDC6CA'],
+              highlight_color='#EA4667', glyph_size=200,
+              set_label_bg_size=1000, line_connection_size=2,
+              horizontal_bar_size=20, vertical_bar_label_size=16,
+              vertical_bar_padding=20)
+
+

*This function generates Altair-based interactive UpSet plots.

+

Parameters: - data (pandas.DataFrame): Tabular data containing the membership of each element (row) in exclusive intersecting sets (column). - sets (list): List of set names of interest to show in the UpSet plots. This list reflects the order of sets to be shown in the plots as well. - abbre (list): Abbreviated set names. - sort_by (str): “frequency” or “degree” - sort_order (str): “ascending” or “descending” - width (int): Vertical size of the UpSet plot. - height (int): Horizontal size of the UpSet plot. - height_ratio (float): Ratio of height between upper and under views, ranges from 0 to 1. - horizontal_bar_chart_width (int): Width of horizontal bar chart on the bottom-right. - color_range (list): Color to encode sets. - highlight_color (str): Color to encode intersecting sets upon mouse hover. - glyph_size (int): Size of UpSet glyph (⬤). - set_label_bg_size (int): Size of label background in the horizontal bar chart. - line_connection_size (int): width of lines in matrix view. - horizontal_bar_size (int): Height of bars in the horizontal bar chart. - vertical_bar_label_size (int): Font size of texts in the vertical bar chart on the top. - vertical_bar_padding (int): Gap between a pair of bars in the vertical bar charts.*

+
+
+
+

upsetaltair_top_level_configuration

+
+
 upsetaltair_top_level_configuration (base, legend_orient='top-left',
+                                      legend_symbol_size=30)
+
+

*Configure the top-level settings for an UpSet plot in Altair.

+

Parameters: - base: The base chart to configure. - legend_orient: The orientation of the legend. Default is “top-left”. - legend_symbol_size: The size of the legend symbols. Default is 30.

+

Returns: - The configured chart.*

+
+
df
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
truthpred
0cd
1cc
2dd
3ca
4dc
.........
995cc
996ac
997ba
998bc
999ad
+ +

1000 rows × 2 columns

+
+
+
+
+
# import numpy as np
+
+# i = np.random.randn(300, 7) > 0.33
+# df = pd.DataFrame(i.astype(int))
+# df.columns = [rand() for _ in range(len(df.columns))]
+# show(df)
+
+# UpSetAltair(
+#     df,
+#     sets=list(df.columns),
+#     abbre=list(df.columns),
+#     sort_by="frequencey",
+#     sort_order="ascending",
+# )
+
+

df

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
4wST3lv6Vv72WKSGX4LBlidvg0LDKaxpK2f5pW4oKO
00101001
11001010
21010010
31000001
40010101
50001000
61001101
71111011
81001011
91001000
101000001
111011000
120101001
131001011
141101000
........................
2851000000
2861001111
2870011010
2880111000
2890111000
2900111100
2910010100
2920011001
2931000010
2940000001
2950111000
2960001010
2971010001
2980110100
2990010000
+ +
+
+
/opt/miniconda3/lib/python3.12/site-packages/altair/utils/deprecation.py:65: AltairDeprecationWarning: 'selection_multi' is deprecated.  Use 'selection_point'
+  warnings.warn(message, AltairDeprecationWarning, stacklevel=1)
+/opt/miniconda3/lib/python3.12/site-packages/altair/utils/deprecation.py:65: AltairDeprecationWarning: 'selection_single' is deprecated.  Use 'selection_point'
+  warnings.warn(message, AltairDeprecationWarning, stacklevel=1)
+
+
+
+
---------------------------------------------------------------------------
+SchemaValidationError                     Traceback (most recent call last)
+Cell In[14], line 8
+      5 df.columns = [rand() for _ in range(len(df.columns))]
+      6 show(df)
+----> 8 UpSetAltair(
+      9     df,
+     10     sets=list(df.columns),
+     11     abbre=list(df.columns),
+     12     sort_by="frequencey",
+     13     sort_order="ascending",
+     14 )
+
+Cell In[10], line 239, in UpSetAltair(data, title, subtitle, sets, abbre, sort_by, sort_order, width, height, height_ratio, horizontal_bar_chart_width, color_range, highlight_color, glyph_size, set_label_bg_size, line_connection_size, horizontal_bar_size, vertical_bar_label_size, vertical_bar_padding)
+    177 base = (
+    178     alt.Chart(data)
+    179     .transform_filter(legend_selection)
+   (...)
+    232     )
+    233 )
+    234 # Now, we have data in the following format:
+    235 # count, set, is_intersect, degree, intersection_id, set_abbre
+    236 
+    237 # Cardinality by intersecting sets (vertical bar chart)
+    238 vertical_bar = (
+--> 239     base.mark_bar(color=main_color, size=vertical_bar_size)
+    240     .encode(
+    241         x=alt.X(
+    242             "intersection_id:N",
+    243             axis=alt.Axis(grid=False, labels=False, ticks=False, domain=True),
+    244             sort=x_sort,
+    245             title=None,
+    246         ),
+    247         y=alt.Y(
+    248             "max(count):Q",
+    249             axis=alt.Axis(grid=False, tickCount=3, orient="right"),
+    250             title="Intersection Size",
+    251         ),
+    252         color=brush_color,
+    253         tooltip=tooltip,
+    254     )
+    255     .properties(width=matrix_width, height=vertical_bar_chart_height)
+    256 )
+    258 vertical_bar_text = vertical_bar.mark_text(
+    259     color=main_color, dy=-10, size=vertical_bar_label_size
+    260 ).encode(text=alt.Text("count:Q", format=".0f"))
+    262 vertical_bar_chart = (vertical_bar + vertical_bar_text).add_selection(
+    263     color_selection
+    264 )
+
+File /opt/miniconda3/lib/python3.12/site-packages/altair/vegalite/v5/schema/mixins.py:2786, in MarkMethodMixin.mark_bar(self, align, angle, aria, ariaRole, ariaRoleDescription, aspect, bandSize, baseline, binSpacing, blend, clip, color, continuousBandSize, cornerRadius, cornerRadiusBottomLeft, cornerRadiusBottomRight, cornerRadiusEnd, cornerRadiusTopLeft, cornerRadiusTopRight, cursor, description, dir, discreteBandSize, dx, dy, ellipsis, fill, fillOpacity, filled, font, fontSize, fontStyle, fontWeight, height, href, innerRadius, interpolate, invalid, limit, line, lineBreak, lineHeight, minBandSize, opacity, order, orient, outerRadius, padAngle, point, radius, radius2, radius2Offset, radiusOffset, shape, size, smooth, stroke, strokeCap, strokeDash, strokeDashOffset, strokeJoin, strokeMiterLimit, strokeOffset, strokeOpacity, strokeWidth, style, tension, text, theta, theta2, theta2Offset, thetaOffset, thickness, timeUnitBandPosition, timeUnitBandSize, tooltip, url, width, x, x2, x2Offset, xOffset, y, y2, y2Offset, yOffset, **kwds)
+   2784 copy = self.copy(deep=False)  # type: ignore[attr-defined]
+   2785 if any(val is not Undefined for val in kwds.values()):
+-> 2786     copy.mark = core.MarkDef(type="bar", **kwds)
+   2787 else:
+   2788     copy.mark = "bar"
+
+File /opt/miniconda3/lib/python3.12/site-packages/altair/vegalite/v5/schema/core.py:23720, in MarkDef.__init__(self, type, align, angle, aria, ariaRole, ariaRoleDescription, aspect, bandSize, baseline, binSpacing, blend, clip, color, continuousBandSize, cornerRadius, cornerRadiusBottomLeft, cornerRadiusBottomRight, cornerRadiusEnd, cornerRadiusTopLeft, cornerRadiusTopRight, cursor, description, dir, discreteBandSize, dx, dy, ellipsis, fill, fillOpacity, filled, font, fontSize, fontStyle, fontWeight, height, href, innerRadius, interpolate, invalid, limit, line, lineBreak, lineHeight, minBandSize, opacity, order, orient, outerRadius, padAngle, point, radius, radius2, radius2Offset, radiusOffset, shape, size, smooth, stroke, strokeCap, strokeDash, strokeDashOffset, strokeJoin, strokeMiterLimit, strokeOffset, strokeOpacity, strokeWidth, style, tension, text, theta, theta2, theta2Offset, thetaOffset, thickness, timeUnitBandPosition, timeUnitBandSize, tooltip, url, width, x, x2, x2Offset, xOffset, y, y2, y2Offset, yOffset, **kwds)
+  22901 def __init__(
+  22902     self,
+  22903     type: Union[
+   (...)
+  23718     **kwds,
+  23719 ):
+> 23720     super(MarkDef, self).__init__(
+  23721         type=type,
+  23722         align=align,
+  23723         angle=angle,
+  23724         aria=aria,
+  23725         ariaRole=ariaRole,
+  23726         ariaRoleDescription=ariaRoleDescription,
+  23727         aspect=aspect,
+  23728         bandSize=bandSize,
+  23729         baseline=baseline,
+  23730         binSpacing=binSpacing,
+  23731         blend=blend,
+  23732         clip=clip,
+  23733         color=color,
+  23734         continuousBandSize=continuousBandSize,
+  23735         cornerRadius=cornerRadius,
+  23736         cornerRadiusBottomLeft=cornerRadiusBottomLeft,
+  23737         cornerRadiusBottomRight=cornerRadiusBottomRight,
+  23738         cornerRadiusEnd=cornerRadiusEnd,
+  23739         cornerRadiusTopLeft=cornerRadiusTopLeft,
+  23740         cornerRadiusTopRight=cornerRadiusTopRight,
+  23741         cursor=cursor,
+  23742         description=description,
+  23743         dir=dir,
+  23744         discreteBandSize=discreteBandSize,
+  23745         dx=dx,
+  23746         dy=dy,
+  23747         ellipsis=ellipsis,
+  23748         fill=fill,
+  23749         fillOpacity=fillOpacity,
+  23750         filled=filled,
+  23751         font=font,
+  23752         fontSize=fontSize,
+  23753         fontStyle=fontStyle,
+  23754         fontWeight=fontWeight,
+  23755         height=height,
+  23756         href=href,
+  23757         innerRadius=innerRadius,
+  23758         interpolate=interpolate,
+  23759         invalid=invalid,
+  23760         limit=limit,
+  23761         line=line,
+  23762         lineBreak=lineBreak,
+  23763         lineHeight=lineHeight,
+  23764         minBandSize=minBandSize,
+  23765         opacity=opacity,
+  23766         order=order,
+  23767         orient=orient,
+  23768         outerRadius=outerRadius,
+  23769         padAngle=padAngle,
+  23770         point=point,
+  23771         radius=radius,
+  23772         radius2=radius2,
+  23773         radius2Offset=radius2Offset,
+  23774         radiusOffset=radiusOffset,
+  23775         shape=shape,
+  23776         size=size,
+  23777         smooth=smooth,
+  23778         stroke=stroke,
+  23779         strokeCap=strokeCap,
+  23780         strokeDash=strokeDash,
+  23781         strokeDashOffset=strokeDashOffset,
+  23782         strokeJoin=strokeJoin,
+  23783         strokeMiterLimit=strokeMiterLimit,
+  23784         strokeOffset=strokeOffset,
+  23785         strokeOpacity=strokeOpacity,
+  23786         strokeWidth=strokeWidth,
+  23787         style=style,
+  23788         tension=tension,
+  23789         text=text,
+  23790         theta=theta,
+  23791         theta2=theta2,
+  23792         theta2Offset=theta2Offset,
+  23793         thetaOffset=thetaOffset,
+  23794         thickness=thickness,
+  23795         timeUnitBandPosition=timeUnitBandPosition,
+  23796         timeUnitBandSize=timeUnitBandSize,
+  23797         tooltip=tooltip,
+  23798         url=url,
+  23799         width=width,
+  23800         x=x,
+  23801         x2=x2,
+  23802         x2Offset=x2Offset,
+  23803         xOffset=xOffset,
+  23804         y=y,
+  23805         y2=y2,
+  23806         y2Offset=y2Offset,
+  23807         yOffset=yOffset,
+  23808         **kwds,
+  23809     )
+
+File /opt/miniconda3/lib/python3.12/site-packages/altair/vegalite/v5/schema/core.py:149, in AnyMark.__init__(self, *args, **kwds)
+    148 def __init__(self, *args, **kwds):
+--> 149     super(AnyMark, self).__init__(*args, **kwds)
+
+File /opt/miniconda3/lib/python3.12/site-packages/altair/utils/schemapi.py:771, in SchemaBase.__init__(self, *args, **kwds)
+    768 object.__setattr__(self, "_kwds", kwds)
+    770 if DEBUG_MODE and self._class_is_valid_at_instantiation:
+--> 771     self.to_dict(validate=True)
+
+File /opt/miniconda3/lib/python3.12/site-packages/altair/utils/schemapi.py:978, in SchemaBase.to_dict(self, validate, ignore, context)
+    971         self.validate(result)
+    972     except jsonschema.ValidationError as err:
+    973         # We do not raise `from err` as else the resulting
+    974         # traceback is very long as it contains part
+    975         # of the Vega-Lite schema. It would also first
+    976         # show the less helpful ValidationError instead of
+    977         # the more user friendly SchemaValidationError
+--> 978         raise SchemaValidationError(self, err) from None
+    979 return result
+
+SchemaValidationError: '-7.628865979381443' is an invalid value for `size`.
+
+-7.628865979381443 is less than the minimum of 0
+
+
+
+
+
+
+
ERROR:root:No traceback has been produced, nothing to debug.
+
+
+ + +
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/charts_files/figure-html/cell-7-output-1.png b/_proc/docs/charts_files/figure-html/cell-7-output-1.png new file mode 100644 index 0000000..8a23c5a Binary files /dev/null and b/_proc/docs/charts_files/figure-html/cell-7-output-1.png differ diff --git a/_proc/docs/config.html b/_proc/docs/config.html new file mode 100644 index 0000000..6d05e9d --- /dev/null +++ b/_proc/docs/config.html @@ -0,0 +1,922 @@ + + + + + + + + + +config – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + + +
+
+

DeepLearningConfig

+
+
 DeepLearningConfig ()
+
+

*A configuration class for deep learning models.

+

This class provides methods to access and manipulate configuration settings.

+

Attributes: input_variables (list): List of input variables defined in the class constructor.

+

Methods: keys(): Returns the list of input variables. getitem(key): Returns the value of the specified key. contains(key): Checks if the specified key is present in the input variables. from_ini_file(filepath, config_root=None): Creates an instance of the class from an INI file. repr(): Returns a string representation of the class.

+

Example usage: config = DeepLearningConfig() config.from_ini_file(‘config.ini’) print(config.keys()) print(config[‘learning_rate’])*

+
+
from torch_snippets.registry import parse_string
+from torch_snippets.torch_loader import *
+from torch_snippets import writelines
+
+
+
config_str = """
+[META]
+experiment = mnist.v1
+description = Training MLP with 
+    mnist data on 10k images only
+    using huggingface trainer and 
+    cosine annealing
+
+[ModelConfig]
+n_layers = 3
+n_hidden = 256
+n_classes = 10
+
+[DatasetConfig]
+root = /home/datasets/mnist
+train = ${root}/train
+val = ${root}/val
+train_subset = 10000
+val_subest = ${train_subset}//10
+
+[TrainingConfig]
+max_steps = ${DatasetConfig.train_subset} * 5
+learning_rate = 3e-4
+output_dir = ./results/${META.experiment}
+per_device_train_batch_size = 256
+per_device_eval_batch_size = ${per_device_train_batch_size}
+evaluation_strategy = "steps"
+eval_steps = 500
+logging_strategy = ${evaluation_strategy}
+logging_steps = ${eval_steps}//100
+save_strategy = ${evaluation_strategy}
+save_steps = ${eval_steps}
+save_total_limit = 1
+seed = 1234
+label_names = ['targets']
+lr_scheduler_type = cosine
+""".strip()
+
+config = parse_string(config_str)
+
+
+class MNIST(nn.Module):
+    def __init__(self, config):
+        super().__init__()
+        self.model = nn.Sequential(
+            nn.Linear(768, config.n_hidden),
+            *[
+                nn.Sequential(nn.Linear(config.n_hidden, config.n_hidden), nn.ReLU())
+                for _ in range(config.n_layers - 1)
+            ],
+            nn.Linear(config.n_hidden, config.n_classes)
+        )
+
+    def forward(self, images): ...
+
+
+model = MNIST(config.ModelConfig)
+print(model)
+
+
MNIST(
+  (model): Sequential(
+    (0): Linear(in_features=768, out_features=256, bias=True)
+    (1): Sequential(
+      (0): Linear(in_features=256, out_features=256, bias=True)
+      (1): ReLU()
+    )
+    (2): Sequential(
+      (0): Linear(in_features=256, out_features=256, bias=True)
+      (1): ReLU()
+    )
+    (3): Linear(in_features=256, out_features=10, bias=True)
+  )
+)
+
+
+

If needed, configs can be unpacked like a dictionary too

+
+
class MNIST(nn.Module):
+    """
+    A PyTorch module for a multi-layer perceptron (MLP) model for MNIST classification.
+
+    Args:
+        n_hidden (int): The number of hidden units in each hidden layer.
+        n_classes (int): The number of output classes.
+        n_layers (int): The number of hidden layers in the model.
+
+    Attributes:
+        model (nn.Sequential): The sequential model that represents the MLP.
+
+    """
+
+    def __init__(self, *, n_hidden, n_classes, n_layers):
+        super().__init__()
+        self.model = nn.Sequential(
+            nn.Linear(768, n_hidden),
+            *[
+                nn.Sequential(nn.Linear(n_hidden, n_hidden), nn.ReLU())
+                for _ in range(n_layers - 1)
+            ],
+            nn.Linear(n_hidden, n_classes)
+        )
+
+    def forward(self, images): ...
+
+
+model = MNIST(**config.ModelConfig)
+print(model)
+
+
MNIST(
+  (model): Sequential(
+    (0): Linear(in_features=768, out_features=256, bias=True)
+    (1): Sequential(
+      (0): Linear(in_features=256, out_features=256, bias=True)
+      (1): ReLU()
+    )
+    (2): Sequential(
+      (0): Linear(in_features=256, out_features=256, bias=True)
+      (1): ReLU()
+    )
+    (3): Linear(in_features=256, out_features=10, bias=True)
+  )
+)
+
+
+
+
+
+

GenericConfig

+
+
 GenericConfig (**kwargs)
+
+

*A configuration class for deep learning models.

+

This class provides methods to access and manipulate configuration settings.

+

Attributes: input_variables (list): List of input variables defined in the class constructor.

+

Methods: keys(): Returns the list of input variables. getitem(key): Returns the value of the specified key. contains(key): Checks if the specified key is present in the input variables. from_ini_file(filepath, config_root=None): Creates an instance of the class from an INI file. repr(): Returns a string representation of the class.

+

Example usage: config = DeepLearningConfig() config.from_ini_file(‘config.ini’) print(config.keys()) print(config[‘learning_rate’])*

+

GenericConfig is a special class that can have attributes solely based on the config file, i.e., when we are unsure what are the arguments in the config going to be

+
+
writelines(config_str.split("\n"), "/tmp/tmp.ini", "w")
+training_config = GenericConfig.from_ini_file(
+    "/tmp/tmp.ini", config_root="TrainingConfig"
+)
+
+
+def train(**kwargs):
+    for k, v in kwargs.items():
+        print(k, v)
+
+
+train(**training_config)
+
+
max_steps 50000
+learning_rate 0.00030000000000000003
+output_dir ./results/mnist.v1
+per_device_train_batch_size 256
+per_device_eval_batch_size 256
+evaluation_strategy steps
+eval_steps 500
+logging_strategy steps
+logging_steps 5
+save_strategy steps
+save_steps 500
+save_total_limit 1
+seed 1234
+label_names ['targets']
+lr_scheduler_type cosine
+
+
+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/decorators.html b/_proc/docs/decorators.html new file mode 100644 index 0000000..4cfcb8f --- /dev/null +++ b/_proc/docs/decorators.html @@ -0,0 +1,874 @@ + + + + + + + + + +Decorator Utilites – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

Decorator Utilites

+
+ + + +
+ + + + +
+ + + +
+ + + +
+
+

check_kwargs_not_none

+
+
 check_kwargs_not_none (func)
+
+

*A decorator that checks if any keyword argument is None. Raises a ValueError if any argument is None.

+

Args: func: The function to be decorated.

+

Returns: The decorated function.

+

Raises: ValueError: If any keyword argument is None.*

+
+
+
+

io

+
+
 io (func)
+
+

*A decorator that inspects the inputs and outputs of a function.

+

Args: func: The function to be decorated.

+

Returns: The decorated function.*

+
+
+
+

timeit

+
+
 timeit (func)
+
+

*A decorator that measures the execution time of a function.

+

Args: func (callable): The function to be timed.

+

Returns: callable: The wrapped function.

+

Example: @timeit def my_function(): # code to be timed pass

+
my_function()  # prints the execution time of my_function*
+
+
+
+

warn_on_fail

+
+
 warn_on_fail (func)
+
+
+
+
+

format

+
+
 format (input)
+
+
+
@timeit
+@io
+def foo(a, b):
+    """
+    This function takes two arguments, `a` and `b`, and returns their sum.
+
+    Parameters:
+    a (int): The first number.
+    b (int): The second number.
+
+    Returns:
+    int: The sum of `a` and `b`.
+    """
+    import time
+
+    time.sleep(1)
+    return a + b
+
+
+foo(10, 11)
+
+
══════════════════════════════════════════════════════════════════
+INPUTS:ARGS:
+tuple of 2 items
+    int: 10
+    int: 11
+══════════════════════════════════════════════════════════════════
+══════════════════════════════════════════════════════════════════
+OUTPUTS:
+int: 21
+══════════════════════════════════════════════════════════════════
+[08/24/24 12:50:36] INFO     foo took 1.00 seconds to execute                                                                      d=152002;file://<ipython-input-1-6ac2073623b5>:47\<ipython-input-1-6ac2073623b5>;;\:d=283174;file://<ipython-input-1-6ac2073623b5>:47#wrapper:47\wrapper:47;;\
+
+
+
21
+
+
+
+
@check_kwargs_not_none
+@io
+def foo(*, a=None, b=None):
+    return a + b
+
+
+foo(a=None, b=10)
+
+
+
---------------------------------------------------------------------------
+ValueError                                Traceback (most recent call last)
+Cell In[34], line 6
+      1 @check_kwargs_not_none
+      2 @io
+      3 def foo(*, a=None, b=None):
+      4     return a + b
+----> 6 foo(a=None, b=10)
+
+Cell In[32], line 32, in check_kwargs_not_none.<locals>.wrapper(*args, **kwargs)
+     30 for key, value in kwargs.items():
+     31     if value is None:
+---> 32         raise ValueError(f"Input argument '{key}' cannot be None")
+     33 return func(*args, **kwargs)
+
+ValueError: Input argument 'a' cannot be None
+
+
+
+
+
import nbdev
+
+nbdev.nbdev_export()
+
+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/imgaug_loader.html b/_proc/docs/imgaug_loader.html new file mode 100644 index 0000000..a0680bd --- /dev/null +++ b/_proc/docs/imgaug_loader.html @@ -0,0 +1,1355 @@ + + + + + + + + + +imgaug_loader – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + +
+

Imgaug

+

wrappers for common imgaug functions, that accept image and ocr data frame of bounding boxes

+ +
+
from torch_snippets.loader import read, pd, show
+
+IM = read("/Users/yeshwanth.y/code/torch_snippets/assets/Preamble.png")
+DF = pd.read_csv("/Users/yeshwanth.y/code/torch_snippets/assets/Preamble.csv")
+DF = to_relative(DF, *IM.shape[:2])
+DF.head()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xyXYtextblock_id
00.2495380.2535010.5693160.305322ConstITUtIO0
10.2883550.3697480.4011090.397759NLTHE1
20.4029570.3697480.5101660.397759PEOPLE1
30.4935300.3711480.5452870.394958OF1
40.5489830.3697480.6303140.397759INDIA,1
+ +
+
+
+
+

Rescale

+
+
im = IM.copy()
+im = rescale(im, sz=(400, 600))
+show(im, sz=5)
+
+
+
+

+
+
+
+
+
+
df = DF.copy()
+im = IM.copy()
+im, df = rescale(im, df, (400, 600))
+show(im, df=df, sz=5)
+df.head()
+
+
+
---------------------------------------------------------------------------
+ValueError                                Traceback (most recent call last)
+/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb Cell 8 in <cell line: 3>()
+      <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=0'>1</a> df = DF.copy()
+      <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=1'>2</a> im = IM.copy()
+----> <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=2'>3</a> im, df = rescale(im, df, (400, 600))
+      <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=3'>4</a> show(im, df=df, sz=5)
+      <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=4'>5</a> df.head()
+
+/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb Cell 8 in rescale(im, bbs, sz)
+    <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=110'>111</a> H, W = get_size(sz, h, w)
+    <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=111'>112</a> aug = iaa.Resize({"height": H, "width": W})
+--> <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=112'>113</a> im, bbs = do(im, bbs, aug)
+    <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=113'>114</a> if to_pil:
+    <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=114'>115</a>     im = PIL.Image.fromarray(im)
+
+/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb Cell 8 in do(img, bbs, aug, cval)
+     <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=41'>42</a>         __df = combine_xyXY_to_bb(__df)
+     <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=42'>43</a>     bbs = __df
+---> <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=43'>44</a> if bbs == []:
+     <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=44'>45</a>     return img, []
+     <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=45'>46</a> return img, bbs
+
+File ~/miniconda3/lib/python3.9/site-packages/pandas/core/ops/__init__.py:705, in _comp_method_FRAME.<locals>.f(self, other)
+    701 @Appender(f"Wrapper for comparison method {op_name}")
+    702 def f(self, other):
+    703     axis = 1  # only relevant for Series other case
+--> 705     self, other = _align_method_FRAME(self, other, axis, level=None, flex=False)
+    707     # See GH#4537 for discussion of scalar op behavior
+    708     new_data = dispatch_to_series(self, other, op, axis=axis)
+
+File ~/miniconda3/lib/python3.9/site-packages/pandas/core/ops/__init__.py:503, in _align_method_FRAME(left, right, axis, flex, level)
+    496         raise ValueError(
+    497             "Unable to coerce to Series/DataFrame, "
+    498             f"dimension must be <= 2: {right.shape}"
+    499         )
+    501 elif is_list_like(right) and not isinstance(right, (ABCSeries, ABCDataFrame)):
+    502     # GH17901
+--> 503     right = to_series(right)
+    505 if flex is not None and isinstance(right, ABCDataFrame):
+    506     if not left._indexed_same(right):
+
+File ~/miniconda3/lib/python3.9/site-packages/pandas/core/ops/__init__.py:465, in _align_method_FRAME.<locals>.to_series(right)
+    463 else:
+    464     if len(left.columns) != len(right):
+--> 465         raise ValueError(
+    466             msg.format(req_len=len(left.columns), given_len=len(right))
+    467         )
+    468     right = left._constructor_sliced(right, index=left.columns)
+    469 return right
+
+ValueError: Unable to coerce to Series, length must be 6: given 0
+
+
+
+
+
+

Rotate

+
+
for i in range(11):
+    angle = (i - 5) * 5
+    print(angle)
+    im = rotate(IM, angle=angle)
+    show(im, sz=1)
+
+
-25
+
+
+
+
+

+
+
+
+
+
-20
+
+
+
+
+

+
+
+
+
+
-15
+
+
+
+
+

+
+
+
+
+
-10
+
+
+
+
+

+
+
+
+
+
-5
+
+
+
+
+

+
+
+
+
+
0
+
+
+
+
+

+
+
+
+
+
5
+
+
+
+
+

+
+
+
+
+
10
+
+
+
+
+

+
+
+
+
+
15
+
+
+
+
+

+
+
+
+
+
20
+
+
+
+
+

+
+
+
+
+
25
+
+
+
+
+

+
+
+
+
+
+
df = DF.copy()
+im = IM.copy()
+im, df = rotate(im, df, 90)
+show(im, df=df, sz=20)
+print(type(im))
+df.head()
+
+
+
+

+
+
+
+
+
<class 'numpy.ndarray'>
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
textblock_idxyXY
0ConstITUtIO00.6932770.2495380.7450980.569316
1NLTHE10.6008400.2883550.6288520.401109
2PEOPLE10.6008400.4029570.6288520.510166
3OF10.6036410.4935300.6274510.545287
4INDIA,10.6008400.5489830.6288520.630314
+ +
+
+
+
+
+

Pad

+
+
df = DF.copy()
+im = IM.copy()
+im, df = pad(im, df, deltas=(90, 90), cval=0)
+show(im, df=df, sz=20)
+print(type(im))
+df.head()
+
+
+
+

+
+
+
+
+
<class 'numpy.ndarray'>
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
textblock_idxyXY
0ConstITUtIO00.3105360.3025210.5508320.343137
1NLTHE10.3401110.3949580.4251390.417367
2PEOPLE10.4269870.3949580.5064700.417367
3OF10.4935300.3963590.5323480.415966
4INDIA,10.5360440.3949580.5970430.417367
+ +
+
+
+
+
+

Augmentations as Monads

+

All functions will work with data frames that contain either of absolute/relative coordinates, and will preserve the image type (np.ndarray or PIL.Image.Image) too

+
+
df = DF.copy()
+im = IM.copy()
+height, width = im.shape
+show(df.head())
+im = PIL.Image.fromarray(im)
+im, df = rotate(im, df, 45, cval=127)
+im, df = pad(im, df, deltas=(200, 200), cval=0)
+im, df = rescale(im, df, sz=(300, 300))
+show(im, df=df, sz=20)
+print(type(im))
+df.head()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xyXYtextblock_id
00.2495380.2535010.5693160.305322ConstITUtIO0
10.2883550.3697480.4011090.397759NLTHE1
20.4029570.3697480.5101660.397759PEOPLE1
30.4935300.3711480.5452870.394958OF1
40.5489830.3697480.6303140.397759INDIA,1
+ +
+
+
+
+
+

+
+
+
+
+
<class 'PIL.Image.Image'>
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
textblock_idxyXY
0ConstITUtIO00.5000000.3266670.6133330.440000
1NLTHE10.4733330.3833330.5166670.426667
2PEOPLE10.5066670.4166670.5500000.460000
3OF10.5366670.4466670.5600000.470000
4INDIA,10.5500000.4600000.5866670.493333
+ +
+
+
+ + +
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-3-output-1.png b/_proc/docs/imgaug_loader_files/figure-html/cell-3-output-1.png new file mode 100644 index 0000000..26416ff Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-3-output-1.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-10.png b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-10.png new file mode 100644 index 0000000..73e270d Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-10.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-12.png b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-12.png new file mode 100644 index 0000000..7ad3a5f Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-12.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-14.png b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-14.png new file mode 100644 index 0000000..431bffd Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-14.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-16.png b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-16.png new file mode 100644 index 0000000..c257063 Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-16.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-18.png b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-18.png new file mode 100644 index 0000000..6444497 Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-18.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-2.png b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-2.png new file mode 100644 index 0000000..4bd21f6 Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-2.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-20.png b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-20.png new file mode 100644 index 0000000..3cb34b2 Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-20.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-22.png b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-22.png new file mode 100644 index 0000000..f9648d3 Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-22.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-4.png b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-4.png new file mode 100644 index 0000000..eb20833 Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-4.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-6.png b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-6.png new file mode 100644 index 0000000..9289961 Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-6.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-8.png b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-8.png new file mode 100644 index 0000000..52190d5 Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-5-output-8.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-6-output-1.png b/_proc/docs/imgaug_loader_files/figure-html/cell-6-output-1.png new file mode 100644 index 0000000..752a638 Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-6-output-1.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-7-output-1.png b/_proc/docs/imgaug_loader_files/figure-html/cell-7-output-1.png new file mode 100644 index 0000000..c361bb2 Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-7-output-1.png differ diff --git a/_proc/docs/imgaug_loader_files/figure-html/cell-8-output-2.png b/_proc/docs/imgaug_loader_files/figure-html/cell-8-output-2.png new file mode 100644 index 0000000..6a51a1a Binary files /dev/null and b/_proc/docs/imgaug_loader_files/figure-html/cell-8-output-2.png differ diff --git a/_proc/docs/index.html b/_proc/docs/index.html new file mode 100644 index 0000000..aafe963 --- /dev/null +++ b/_proc/docs/index.html @@ -0,0 +1,1358 @@ + + + + + + + + + +Utilities for simple needs – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

Utilities for simple needs

+
+ + + +
+ + + + +
+ + + +
+ + + +
+
# Time it
+from torch_snippets import *
+
+
CPU times: user 263 ms, sys: 53.9 ms, total: 317 ms
+Wall time: 407 ms
+
+
+

Below we are trying to extract the __all__ list from all Python files of the torch_snippets directory.
+Through the code, you can already see some of the elements of torch-snippets in action.

+
+
import ast
+
+os.environ[
+    "AD_MAX_ITEMS"
+] = (  # os is already imported by torch_snippets, along with many other useful libraries
+    "1000"  # Set the maximum number of items to display in the AD object
+)
+
+
+@tryy  # This is a decorator that catches exceptions
+def extract_all_list(file_path):
+    file = readfile(file_path, silent=True)  # Read the file
+    tree = ast.parse(file, filename=file_path)
+
+    for node in tree.body:
+        if isinstance(node, ast.Assign):
+            for target in node.targets:
+                if isinstance(target, ast.Name) and target.id == "__all__":
+                    if isinstance(node.value, ast.List):
+                        all_list = [
+                            elt.value
+                            for elt in node.value.elts
+                            if isinstance(elt, ast.Constant)
+                        ]
+                        return all_list
+    return None
+
+
+def print_all_lists_in_directory(directory):
+    dir = P(directory)  # Create a pathlib.Path object
+    for f in dir.ls():  # Iterate over all files in the directory
+        if f.extn == "py" and f.stem not in [
+            "__init__",
+            "_nbdev",
+        ]:  # If it's a Python file and not __init__.py
+            all_list = extract_all_list(f)
+            if all_list is not None and len(all_list) > 0:
+                h2(f.stem)  # Print the name of the file as a heading in jupyter
+                print(
+                    AD({"items": all_list})
+                )  # AD is an intelligent dictionary that can display itself nicely
+
+
+
print(P().resolve())
+
+
/Users/yeshwanth/Code/Personal/torch_snippets/nbs
+
+
+
+
# Specify the directory containing the Python files
+directory_path = "../torch_snippets"
+print_all_lists_in_directory(directory_path)
+
+

misc

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - Timer (🏷️ str)
+  1 - track2 (🏷️ str)
+  2 - summarize_input (🏷️ str)
+  3 - timeit (🏷️ str)
+  4 - io (🏷️ str)
+  5 - tryy (🏷️ str)
+
+```
+
+
+
+

load_defaults

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - ifnone (🏷️ str)
+  1 - exists (🏷️ str)
+  2 - loadifexists (🏷️ str)
+
+```
+
+
+
+

text_utils

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - textify (🏷️ str)
+  1 - find_lines (🏷️ str)
+  2 - find_blocks (🏷️ str)
+  3 - find_substring (🏷️ str)
+  4 - get_line_data_from_word_data (🏷️ str)
+  5 - edit_distance_path (🏷️ str)
+  6 - group_blocks (🏷️ str)
+
+```
+
+
+
+

paths

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - valid_methods (🏷️ str)
+  1 - P (🏷️ str)
+  2 - ls (🏷️ str)
+  3 - print_folder_summary (🏷️ str)
+  4 - dill (🏷️ str)
+  5 - input_to_str (🏷️ str)
+  6 - output_to_path (🏷️ str)
+  7 - process_f (🏷️ str)
+  8 - get_fs (🏷️ str)
+  9 - P0 (🏷️ str)
+  10 - stem (🏷️ str)
+  11 - stems (🏷️ str)
+  12 - extn (🏷️ str)
+  13 - remove_file (🏷️ str)
+  14 - isdir (🏷️ str)
+  15 - makedir (🏷️ str)
+  16 - fname (🏷️ str)
+  17 - fname2 (🏷️ str)
+  18 - parent (🏷️ str)
+  19 - Glob (🏷️ str)
+  20 - find (🏷️ str)
+  21 - zip_files (🏷️ str)
+  22 - unzip_file (🏷️ str)
+  23 - list_zip (🏷️ str)
+  24 - md5 (🏷️ str)
+  25 - remove_duplicates (🏷️ str)
+  26 - common_items (🏷️ str)
+  27 - folder_summary (🏷️ str)
+  28 - readlines (🏷️ str)
+  29 - readfile (🏷️ str)
+  30 - writelines (🏷️ str)
+  31 - tree (🏷️ str)
+  32 - folder_structure_to_dict (🏷️ str)
+  33 - folder_structure_to_json (🏷️ str)
+  34 - rename_batch (🏷️ str)
+  35 - dumpdill (🏷️ str)
+  36 - loaddill (🏷️ str)
+
+```
+
+
+
+

charts

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - alt (🏷️ str)
+  1 - Chart (🏷️ str)
+  2 - CM (🏷️ str)
+  3 - radar (🏷️ str)
+  4 - confusion_matrix (🏷️ str)
+  5 - spider (🏷️ str)
+  6 - upsetaltair_top_level_configuration (🏷️ str)
+  7 - UpSetAltair (🏷️ str)
+
+```
+
+
+
+

pdf_loader

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - PDF (🏷️ str)
+
+```
+
+
+
+

interactive_show

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - COLORS (🏷️ str)
+  1 - to_networkx (🏷️ str)
+  2 - plot_image (🏷️ str)
+  3 - plot_graph (🏷️ str)
+  4 - tonp (🏷️ str)
+  5 - tolist (🏷️ str)
+  6 - convert_to_nx (🏷️ str)
+  7 - viz2 (🏷️ str)
+  8 - df2graph_nodes (🏷️ str)
+  9 - ishow (🏷️ str)
+
+```
+
+
+
+

registry

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - Config (🏷️ str)
+  1 - AttrDict (🏷️ str)
+  2 - registry (🏷️ str)
+  3 - tryeval (🏷️ str)
+  4 - parse_base (🏷️ str)
+  5 - parse (🏷️ str)
+  6 - parse_and_resolve (🏷️ str)
+  7 - parse_string (🏷️ str)
+
+```
+
+
+
+

markup2

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - AD (🏷️ str)
+  1 - Config (🏷️ str)
+  2 - isnamedtupleinstance (🏷️ str)
+  3 - unpack (🏷️ str)
+  4 - AttrDict (🏷️ str)
+  5 - pretty_json (🏷️ str)
+  6 - read_json (🏷️ str)
+  7 - write_json (🏷️ str)
+  8 - write_jsonl (🏷️ str)
+  9 - read_jsonl (🏷️ str)
+  10 - read_yaml (🏷️ str)
+  11 - write_yaml (🏷️ str)
+  12 - read_xml (🏷️ str)
+  13 - write_xml (🏷️ str)
+
+```
+
+
+
+

inspector

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - inspect (🏷️ str)
+
+```
+
+
+
+

torch_loader

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - torch (🏷️ str)
+  1 - th (🏷️ str)
+  2 - torchvision (🏷️ str)
+  3 - T (🏷️ str)
+  4 - transforms (🏷️ str)
+  5 - nn (🏷️ str)
+  6 - np (🏷️ str)
+  7 - F (🏷️ str)
+  8 - Dataset (🏷️ str)
+  9 - DataLoader (🏷️ str)
+  10 - optim (🏷️ str)
+  11 - Report (🏷️ str)
+  12 - Reshape (🏷️ str)
+  13 - Permute (🏷️ str)
+  14 - device (🏷️ str)
+  15 - save_torch_model_weights_from (🏷️ str)
+  16 - load_torch_model_weights_to (🏷️ str)
+  17 - detach (🏷️ str)
+  18 - cat_with_padding (🏷️ str)
+
+```
+
+
+
+

logger

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - console (🏷️ str)
+  1 - reset_logger_width (🏷️ str)
+  2 - logger (🏷️ str)
+  3 - Trace (🏷️ str)
+  4 - Debug (🏷️ str)
+  5 - Info (🏷️ str)
+  6 - Warn (🏷️ str)
+  7 - Excep (🏷️ str)
+  8 - warn_mode (🏷️ str)
+  9 - info_mode (🏷️ str)
+  10 - debug_mode (🏷️ str)
+  11 - trace_mode (🏷️ str)
+  12 - excep_mode (🏷️ str)
+  13 - in_warn_mode (🏷️ str)
+  14 - in_info_mode (🏷️ str)
+  15 - in_debug_mode (🏷️ str)
+  16 - in_trace_mode (🏷️ str)
+  17 - in_excep_mode (🏷️ str)
+  18 - frames (🏷️ str)
+  19 - get_console (🏷️ str)
+  20 - reset_logger (🏷️ str)
+  21 - get_logger_level (🏷️ str)
+  22 - logger_mode (🏷️ str)
+  23 - in_logger_mode (🏷️ str)
+  24 - notify_waiting (🏷️ str)
+
+```
+
+
+
+

markup

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - AttrDict (🏷️ str)
+  1 - Config (🏷️ str)
+  2 - isnamedtupleinstance (🏷️ str)
+  3 - unpack (🏷️ str)
+  4 - hash_tensor (🏷️ str)
+  5 - hash_pandas_dataframe (🏷️ str)
+  6 - AttrDictDeprecated (🏷️ str)
+  7 - decompose (🏷️ str)
+  8 - pretty_json (🏷️ str)
+  9 - read_json (🏷️ str)
+  10 - write_json (🏷️ str)
+  11 - write_jsonl (🏷️ str)
+  12 - read_jsonl (🏷️ str)
+  13 - read_yaml (🏷️ str)
+  14 - write_yaml (🏷️ str)
+  15 - read_xml (🏷️ str)
+  16 - write_xml (🏷️ str)
+
+```
+
+
+
+

sklegos

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - ColumnSelector (🏷️ str)
+  1 - GroupedPredictor (🏷️ str)
+  2 - EstimatorTransformer (🏷️ str)
+  3 - train_test_split (🏷️ str)
+  4 - MakeFrame (🏷️ str)
+  5 - ImputeMissingValues (🏷️ str)
+  6 - LambdaTransformer (🏷️ str)
+  7 - Cat2Num (🏷️ str)
+  8 - SplitDateColumn (🏷️ str)
+
+```
+
+
+
+

ipython

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - save_notebook (🏷️ str)
+  1 - backup_this_notebook (🏷️ str)
+  2 - backup_all_notebooks (🏷️ str)
+  3 - backup_folders_of_nbs (🏷️ str)
+  4 - display_dfs_side_by_side (🏷️ str)
+  5 - show_big_dataframe (🏷️ str)
+  6 - h1 (🏷️ str)
+  7 - h2 (🏷️ str)
+  8 - h3 (🏷️ str)
+  9 - h4 (🏷️ str)
+  10 - h5 (🏷️ str)
+  11 - h6 (🏷️ str)
+  12 - store_scrap (🏷️ str)
+  13 - shutdown_current_notebook (🏷️ str)
+
+```
+
+
+
+
../torch_snippets/loader.py:532: SyntaxWarning: invalid escape sequence '\$'
+  puttext(ax, text.replace("$", "\$"), tuple(bbs[ix][:2]), size=text_sz)
+
+
+

loader

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - B (🏷️ str)
+  1 - Blank (🏷️ str)
+  2 - batchify (🏷️ str)
+  3 - C (🏷️ str)
+  4 - choose (🏷️ str)
+  5 - common (🏷️ str)
+  6 - crop_from_bb (🏷️ str)
+  7 - diff (🏷️ str)
+  8 - E (🏷️ str)
+  9 - flatten (🏷️ str)
+  10 - Image (🏷️ str)
+  11 - jitter (🏷️ str)
+  12 - L (🏷️ str)
+  13 - lzip (🏷️ str)
+  14 - line (🏷️ str)
+  15 - lines (🏷️ str)
+  16 - to_absolute (🏷️ str)
+  17 - to_relative (🏷️ str)
+  18 - enlarge_bbs (🏷️ str)
+  19 - shrink_bbs (🏷️ str)
+  20 - logger (🏷️ str)
+  21 - np (🏷️ str)
+  22 - now (🏷️ str)
+  23 - nunique (🏷️ str)
+  24 - os (🏷️ str)
+  25 - pad (🏷️ str)
+  26 - pd (🏷️ str)
+  27 - pdfilter (🏷️ str)
+  28 - pdb (🏷️ str)
+  29 - PIL (🏷️ str)
+  30 - print (🏷️ str)
+  31 - puttext (🏷️ str)
+  32 - randint (🏷️ str)
+  33 - rand (🏷️ str)
+  34 - re (🏷️ str)
+  35 - read (🏷️ str)
+  36 - readPIL (🏷️ str)
+  37 - rect (🏷️ str)
+  38 - resize (🏷️ str)
+  39 - rotate (🏷️ str)
+  40 - see (🏷️ str)
+  41 - show (🏷️ str)
+  42 - store_attr (🏷️ str)
+  43 - subplots (🏷️ str)
+  44 - sys (🏷️ str)
+  45 - toss (🏷️ str)
+  46 - track (🏷️ str)
+  47 - tqdm (🏷️ str)
+  48 - Tqdm (🏷️ str)
+  49 - trange (🏷️ str)
+  50 - unique (🏷️ str)
+  51 - uint (🏷️ str)
+  52 - write (🏷️ str)
+  53 - BB (🏷️ str)
+  54 - bbfy (🏷️ str)
+  55 - xywh2xyXY (🏷️ str)
+  56 - df2bbs (🏷️ str)
+  57 - bbs2df (🏷️ str)
+  58 - Info (🏷️ str)
+  59 - Warn (🏷️ str)
+  60 - Debug (🏷️ str)
+  61 - Excep (🏷️ str)
+  62 - reset_logger (🏷️ str)
+  63 - get_logger_level (🏷️ str)
+  64 - in_debug_mode (🏷️ str)
+  65 - debug_mode (🏷️ str)
+  66 - typedispatch (🏷️ str)
+  67 - defaultdict (🏷️ str)
+  68 - Counter (🏷️ str)
+  69 - dcopy (🏷️ str)
+  70 - patch_to (🏷️ str)
+  71 - split (🏷️ str)
+  72 - train_test_split (🏷️ str)
+  73 - init_plt (🏷️ str)
+  74 - init_cv2 (🏷️ str)
+
+```
+
+
+
+

imgaug_loader

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - do (🏷️ str)
+  1 - bw (🏷️ str)
+  2 - rotate (🏷️ str)
+  3 - pad (🏷️ str)
+  4 - get_size (🏷️ str)
+  5 - rescale (🏷️ str)
+  6 - crop (🏷️ str)
+  7 - imgaugbbs2bbs (🏷️ str)
+  8 - bbs2imgaugbbs (🏷️ str)
+
+```
+
+
+
+

dates

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - make_uniform_date_format (🏷️ str)
+  1 - ALL_DATE_FORMATS (🏷️ str)
+  2 - are_dates_equal (🏷️ str)
+  3 - today (🏷️ str)
+
+```
+
+
+
+

bokeh_loader

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - parse_sz (🏷️ str)
+  1 - get_bplot (🏷️ str)
+
+```
+
+
+
+

bb_utils

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - randint (🏷️ str)
+  1 - BB (🏷️ str)
+  2 - df2bbs (🏷️ str)
+  3 - bbs2df (🏷️ str)
+  4 - bbfy (🏷️ str)
+  5 - jitter (🏷️ str)
+  6 - compute_eps (🏷️ str)
+  7 - enlarge_bbs (🏷️ str)
+  8 - shrink_bbs (🏷️ str)
+  9 - iou (🏷️ str)
+  10 - compute_distance_matrix (🏷️ str)
+  11 - compute_distances (🏷️ str)
+  12 - split_bb_to_xyXY (🏷️ str)
+  13 - combine_xyXY_to_bb (🏷️ str)
+  14 - is_absolute (🏷️ str)
+  15 - is_relative (🏷️ str)
+  16 - to_relative (🏷️ str)
+  17 - to_absolute (🏷️ str)
+  18 - merge_by_bb (🏷️ str)
+  19 - isin (🏷️ str)
+
+```
+
+
+
+

adapters

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - np_2_b64 (🏷️ str)
+  1 - b64_2_np (🏷️ str)
+  2 - b64_2_file (🏷️ str)
+  3 - bytes_2_file (🏷️ str)
+  4 - file_2_bytes (🏷️ str)
+  5 - csvs_2_cvat (🏷️ str)
+  6 - cvat_2_csvs (🏷️ str)
+  7 - df_2_yolo (🏷️ str)
+  8 - yolo_2_df (🏷️ str)
+
+```
+
+
+
+

decorators

+
+
+

+```↯ AttrDict ↯
+items[]
+  0 - format (🏷️ str)
+  1 - warn_on_fail (🏷️ str)
+  2 - timeit (🏷️ str)
+  3 - io (🏷️ str)
+  4 - check_kwargs_not_none (🏷️ str)
+
+```
+
+
+
+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/inspector.html b/_proc/docs/inspector.html new file mode 100644 index 0000000..ad04295 --- /dev/null +++ b/_proc/docs/inspector.html @@ -0,0 +1,889 @@ + + + + + + + + + + +Inspect – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

Inspect

+
+ +
+
+ View statistics of tensors and other python containers +
+
+ + +
+ + + + +
+ + + +
+ + + +
+
import torch, numpy as np
+from torch_snippets import inspect
+
+inspect(torch.randint(0, 100, size=(4, 3, 5)), np.random.randint(-10, 10, (9, 19, 1)))
+
+
══════════════════════════════════════════════════════════════════
+
+
+
+
Tensor  Shape: torch.Size([4, 3, 5])    Min: 2.000      Max: 97.000     Mean: 46.317    dtype: torch.int64 @ cpu
+
+
+
+
══════════════════════════════════════════════════════════════════
+
+
+
+
ndarray Shape: (9, 19, 1)       Min: -10.000    Max: 9.000      Mean: -0.345    dtype: int64
+
+
+
+
══════════════════════════════════════════════════════════════════
+
+
+
+
+
x = {
+    "a": [0, 1, 2, 3],
+    "b": torch.rand(10, 10),
+    "c": {
+        "d": np.arange(10),
+        "e": [
+            "np.arange",
+            {},
+            tuple(
+                [
+                    1,
+                    2,
+                ]
+            ),
+            set([1, 2, 3]),
+            [],
+            [11, 10],
+        ],
+    },
+}
+inspect(x)
+
+
══════════════════════════════════════════════════════════════════
+
+
+
+
dict of 3 items
+
+
+
+
        A:
+        list of 4 items
+
+
+
+
                int: 0
+
+
+
+
                int: 1
+
+
+
+
                int: 2
+
+
+
+
                int: 3
+
+
+
+
        B:
+        Tensor  Shape: torch.Size([10, 10])     Min: 0.000      Max: 0.989      Mean: 0.463     dtype: 
+torch.float32 @ cpu
+
+
+
+
        C:
+        dict of 2 items
+
+
+
+
                D:
+                ndarray Shape: (10,)    Min: 0.000      Max: 9.000      Mean: 4.500     dtype: int64
+
+
+
+
                E:
+                list of 6 items
+
+
+
+
                        str `np.arange`
+
+
+
+
                        dict of 0 items
+
+
+
+
                        tuple of 2 items
+
+
+
+
                                int: 1
+
+
+
+
                                int: 2
+
+
+
+
                        set Length: 3
+
+
+
+
                        list of 0 items
+
+
+
+
                        and ... ... 1 more item(s)
+
+
+
+
══════════════════════════════════════════════════════════════════
+
+
+
+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/interactive_show.html b/_proc/docs/interactive_show.html new file mode 100644 index 0000000..d5fc663 --- /dev/null +++ b/_proc/docs/interactive_show.html @@ -0,0 +1,774 @@ + + + + + + + + + +interactive_show – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + + +
+
+

ishow

+
+
 ishow (im, df, additional_attrs=None, **kwargs)
+
+
+
+
+

df2graph_nodes

+
+
 df2graph_nodes (df, text_attr='text', additional_attrs=None)
+
+
+
+
+

viz2

+
+
 viz2 (graph, node_attrs=None, undirected=True, **kwargs)
+
+
+
+
+

convert_to_nx

+
+
 convert_to_nx (g, node_attrs=None, undirected=True)
+
+
+
+
+

tolist

+
+
 tolist (i)
+
+
+
+
+

tonp

+
+
 tonp (i)
+
+
+
+
+

plot_graph

+
+
 plot_graph (g, output, im=None, **kwargs)
+
+
+
+
+

plot_image

+
+
 plot_image (p, image, sz)
+
+
+
+
+

to_networkx

+
+
 to_networkx (data, node_attrs:Optional[Iterable[str]]=None,
+              edge_attrs:Optional[Iterable[str]]=None,
+              graph_attrs:Optional[Iterable[str]]=None,
+              to_undirected:Union[bool,str,NoneType]=False,
+              remove_self_loops:bool=False)
+
+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/jupyter_notebook.html b/_proc/docs/jupyter_notebook.html new file mode 100644 index 0000000..7f07368 --- /dev/null +++ b/_proc/docs/jupyter_notebook.html @@ -0,0 +1,874 @@ + + + + + + + + + + +Jupyter Notebooks – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

Jupyter Notebooks

+
+ +
+
+ Utilities specific to jupyter +
+
+ + +
+ + + + +
+ + + +
+ + + +
+
+

backup_folders_of_nbs

+
+
 backup_folders_of_nbs (src, dest)
+
+
+
+
+

backup_all_notebooks

+
+
 backup_all_notebooks (folder)
+
+
+
+
+

backup_this_notebook

+
+
 backup_this_notebook (this_file_path, save_html_to_dir=None,
+                       override_previous_backup=False, changelog=None,
+                       exclude_input=False, force_save_notebook=True)
+
+
+
+
+

save_notebook

+
+
 save_notebook (file_path)
+
+
+
backup_this_notebook("jupyter_notebook.ipynb")
+
+
+
+
+

show_big_dataframe

+
+
 show_big_dataframe (df, max_rows=30)
+
+
+
+
+

display_dfs_side_by_side

+
+
 display_dfs_side_by_side (*args, titles=<itertools.cycle object at
+                           0x11b22ea00>, max_rows=50)
+
+
+
+
+

h6

+
+
 h6 (text)
+
+
+
+
+

h5

+
+
 h5 (text)
+
+
+
+
+

h4

+
+
 h4 (text)
+
+
+
+
+

h3

+
+
 h3 (text)
+
+
+
+
+

h2

+
+
 h2 (text)
+
+
+
+
+

h1

+
+
 h1 (text)
+
+
+
+
+

store_scrap

+
+
 store_scrap (at)
+
+
+
+
+

shutdown_current_notebook

+
+
 shutdown_current_notebook (delay:int=None)
+
+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/load_defautls.html b/_proc/docs/load_defautls.html new file mode 100644 index 0000000..9abb8bb --- /dev/null +++ b/_proc/docs/load_defautls.html @@ -0,0 +1,725 @@ + + + + + + + + + +load_defautls – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + +
+

File Exists

+

and what to do if it doesn’t

+ +
+
+

loadifexists

+
+
 loadifexists (fpath, default)
+
+

Load data from a dill file if it exists, else return default value

+
+
+
+

exists

+
+
 exists (fpath)
+
+

Alias for os.path.exists

+ + +
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/logging.html b/_proc/docs/logging.html new file mode 100644 index 0000000..a811d32 --- /dev/null +++ b/_proc/docs/logging.html @@ -0,0 +1,1191 @@ + + + + + + + + + +Rich Logging and printing – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

Rich Logging and printing

+
+ + + +
+ + + + +
+ + + +
+ + + +
+

Ez logging

+

Logging is packed in these 5 functions

+
+
reset_logger("trace", console_width=80)
+Trace("Testing {1,2,3}")
+Debug("TESTING {1,2,3}")
+Info("TESTING {1,2,3}")
+Warn("TESTING {1,2,3}")
+Excep("TESTING {1,2,3}")
+
+
[08/24/24 12:16:05] TRACE    Testing {1,2,3}            1838145784.py:<module>:2
+
+
+
+
                    DEBUG    TESTING {1,2,3}            1838145784.py:<module>:3
+
+
+
+
                    INFO     TESTING {1,2,3}            1838145784.py:<module>:4
+
+
+
+
                    WARNING  TESTING {1,2,3}            1838145784.py:<module>:5
+
+
+
+
                    ERROR    TESTING {1,2,3}            1838145784.py:<module>:6
+                             NoneType: None                                     
+                                                                                
+                                                                                
+
+
+
+

Excep will also print a traceback

+
+
def do():
+    try:
+        1 / 0
+    except Exception as e:
+        Excep(e)
+
+def do2():
+    do()
+
+do2()
+
+
[08/24/24 12:16:07] ERROR    division by zero                 1923207781.py:do:5
+                             ZeroDivisionError: division by                     
+                             zero                                               
+                                                                                
+                             ╭─ Traceback (most recent call─╮                   
+                              in do:3                                         
+                                                                              
+                                 1 def do():                                  
+                                 2 try:                                   
+                               3 │   │   1 / 0                              
+                                 4 except Exception as                    
+                                 5 │   │   Excep(e)                           
+                                 6                                            
+                             ╰──────────────────────────────╯                   
+                             ZeroDivisionError: division by                     
+                             zero                                               
+
+
+
+

All logging functions have an optional depth that will be helpful to raise the context level to outer functions

+
+
def do():
+    Info('In do')
+
+do()
+
+
[08/24/24 12:16:15] INFO     In do                             809811040.py:do:2
+
+
+
+
+
def do2():
+    Info('Log will still say it is from `do2` now, to the right of log print')
+
+def do():
+    do2()
+
+do()
+
+
[08/24/24 12:17:13] INFO     Log will still say it is from   2099333876.py:do2:2
+                             `do2` now, to the right of log                     
+                             print                                              
+
+
+
+
+
def do2():
+    Info('But now, log will still say it is from do', depth=1)
+
+def do():
+    do2()
+
+do()
+
+
[08/24/24 12:17:25] INFO     But now, log will still say it   4054019042.py:do:5
+                             is from do                                         
+
+
+
+
+
+

Logging Level and context

+
+
+

in_logger_mode

+
+
 in_logger_mode (level:str)
+
+

return’s T/F, checking if logger is in a specific mode or not

+
+
+
+

logger_mode

+
+
 logger_mode (level)
+
+

temporarily, using with context, set the level to something else

+
+
+
+

get_logger_level

+
+
 get_logger_level ()
+
+

get the current logger’s level

+

Let’s log every level in the do function below. We can control what we need to log from outside the function’s context by
+using with <level>_model():

+
+
def do():
+    Trace(0)
+    Debug(1)
+    Info(2)
+    Warn(3)
+    Excep(4)
+
+
+def line(x):
+    sep = "=" * 20
+    print(f"{sep}{x}{sep}")
+    print(f"{in_excep_mode()=}")
+    print(f"{in_warn_mode()=}")
+    print(f"{in_info_mode()=}")
+    print(f"{in_debug_mode()=}")
+    print(f"{in_trace_mode()=}")
+
+
+reset_logger()
+
+with excep_mode():
+    line("Excep mode")
+    do()
+
+with warn_mode():
+    line("Warn mode")
+    do()
+
+with info_mode():
+    line("Info mode")
+    do()
+
+with debug_mode():
+    line("Debug mode")
+    do()
+
+with trace_mode():
+    line("Trace mode")
+    do()
+
+
====================Excep mode====================
+in_excep_mode()=True
+in_warn_mode()=False
+in_info_mode()=False
+in_debug_mode()=False
+in_trace_mode()=False
+
+
+
[08/24/24 12:13:08] ERROR    4                                                                                                                            3432048509.py:do:6
+                             NoneType: None                                                                                                                                 
+                                                                                                                                                                            
+                                                                                                                                                                            
+
+
+
+
====================Warn mode====================
+in_excep_mode()=False
+in_warn_mode()=True
+in_info_mode()=False
+in_debug_mode()=False
+in_trace_mode()=False
+
+
+
[08/24/24 12:13:08] WARNING  3                                                                                                                            3432048509.py:do:5
+
+
+
+
                    ERROR    4                                                                                                                            3432048509.py:do:6
+                             NoneType: None                                                                                                                                 
+                                                                                                                                                                            
+                                                                                                                                                                            
+
+
+
+
====================Info mode====================
+in_excep_mode()=False
+in_warn_mode()=False
+in_info_mode()=True
+in_debug_mode()=False
+in_trace_mode()=False
+
+
+
[08/24/24 12:13:08] INFO     2                                                                                                                            3432048509.py:do:4
+
+
+
+
                    WARNING  3                                                                                                                            3432048509.py:do:5
+
+
+
+
                    ERROR    4                                                                                                                            3432048509.py:do:6
+                             NoneType: None                                                                                                                                 
+                                                                                                                                                                            
+                                                                                                                                                                            
+
+
+
+
====================Debug mode====================
+in_excep_mode()=False
+in_warn_mode()=False
+in_info_mode()=False
+in_debug_mode()=True
+in_trace_mode()=False
+
+
+
[08/24/24 12:13:08] DEBUG    1                                                                                                                            3432048509.py:do:3
+
+
+
+
                    INFO     2                                                                                                                            3432048509.py:do:4
+
+
+
+
                    WARNING  3                                                                                                                            3432048509.py:do:5
+
+
+
+
                    ERROR    4                                                                                                                            3432048509.py:do:6
+                             NoneType: None                                                                                                                                 
+                                                                                                                                                                            
+                                                                                                                                                                            
+
+
+
+
====================Trace mode====================
+in_excep_mode()=False
+in_warn_mode()=False
+in_info_mode()=False
+in_debug_mode()=False
+in_trace_mode()=True
+
+
+
[08/24/24 12:13:08] TRACE    0                                                                                                                            3432048509.py:do:2
+
+
+
+
                    DEBUG    1                                                                                                                            3432048509.py:do:3
+
+
+
+
                    INFO     2                                                                                                                            3432048509.py:do:4
+
+
+
+
                    WARNING  3                                                                                                                            3432048509.py:do:5
+
+
+
+
                    ERROR    4                                                                                                                            3432048509.py:do:6
+                             NoneType: None                                                                                                                                 
+                                                                                                                                                                            
+                                                                                                                                                                            
+
+
+
+

The in_<level>_mode gives an additional layer of control, to be used for debugging dynamically. Let’s say, you want to show an image (for the sake of debugging)

+
+
def do(im_path):
+    from torch_snippets import show, read
+    im = read(im_path)
+    show(im, sz=3)
+    print(im.mean())
+
+do('assets/Preamble.png')
+
+
+
+

+
+
+
+
+
145.5542982442515
+
+
+

But now you are happy with your code and don’t want the show, say the code is going to production. A common way out is to just comment that line

+
+
def do(im_path):
+    from torch_snippets import show, read
+    im = read(im_path)
+    # show(im, sz=3) # line is commented, but will need to be re-uncommented any time it needs debugging
+    print(im.mean())
+
+do('assets/Preamble.png')
+
+
145.5542982442515
+
+
+

But if you want to re-check, it’s a pain to again uncomment. Not to mention this method is not scalable to 100s of lines of code. The simple way to deal with such transient code that needs to activate only when you want it to, is to enclose in an if in_<level>_mode conditional like so

+
+
def do(im_path):
+    from torch_snippets import show, read
+    im = read(im_path)
+    if in_debug_mode():
+        show(im, sz=3)
+    print(im.mean())
+
+do('assets/Preamble.png')
+
+
145.5542982442515
+
+
+

This way, you can always activate the show by calling do with a temporary with_debug_mode context

+
+
with debug_mode():
+    do('assets/Preamble.png')
+
+
+
+

+
+
+
+
+
145.5542982442515
+
+
+
+
+
+

Notify Waiting

+
+
reset_logger(console_width=100)
+
+with trace_mode():
+    with notify_waiting("Downloading"):
+        time.sleep(10)
+
+with notify_waiting("Downloading", spinner="guess_the_movie"):
+    time.sleep(10)
+
+with notify_waiting("One more message", spinner="earth"):
+    time.sleep(3)
+
+
[08/24/24 12:36:51] TRACE    Available Spinners: dict_keys(['dots', 'dots2', 'dots3', 'dots4', 'dots5', 'dots6', 'dots7', 'dots8', 'dots9',  3340474699.py:notify_waiting:41
+                             'dots10', 'dots11', 'dots12', 'dots8Bit', 'line', 'line2', 'pipe', 'simpleDots', 'simpleDotsScrolling', 'star',                                
+                             'star2', 'flip', 'hamburger', 'growVertical', 'growHorizontal', 'balloon', 'balloon2', 'noise', 'bounce',                                      
+                             'boxBounce', 'boxBounce2', 'triangle', 'arc', 'circle', 'squareCorners', 'circleQuarters', 'circleHalves',                                     
+                             'squish', 'toggle', 'toggle2', 'toggle3', 'toggle4', 'toggle5', 'toggle6', 'toggle7', 'toggle8', 'toggle9',                                    
+                             'toggle10', 'toggle11', 'toggle12', 'toggle13', 'arrow', 'arrow2', 'arrow3', 'bouncingBar', 'bouncingBall',                                    
+                             'smiley', 'monkey', 'hearts', 'clock', 'earth', 'material', 'moon', 'runner', 'pong', 'shark', 'dqpb',                                         
+                             'weather', 'christmas', 'grenade', 'point', 'layer', 'betaWave', 'aesthetic', 'guess', 'guess_the_movie'])                                     
+                                                                                                                                                                            
+                             Using: clock                                                                                                                                   
+
+
+
+ +
+
+

+
+
+
[08/24/24 12:37:01] INFO     Downloading - Completed in 10.01 s                                                                                   contextlib.py:__exit__:144
+
+
+
+ +
+
+

+
+
+
[08/24/24 12:37:11] INFO     Downloading - Completed in 10.01 s                                                                                   contextlib.py:__exit__:144
+
+
+
+ +
+
+

+
+
+
[08/24/24 12:37:14] INFO     One more message - Completed in 3.00 s                                                                               contextlib.py:__exit__:144
+
+
+
+
+
+ + + +
+
+ + +
+ +
+ + +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/logging_files/figure-html/cell-11-output-1.png b/_proc/docs/logging_files/figure-html/cell-11-output-1.png new file mode 100644 index 0000000..7a75f15 Binary files /dev/null and b/_proc/docs/logging_files/figure-html/cell-11-output-1.png differ diff --git a/_proc/docs/logging_files/figure-html/cell-14-output-1.png b/_proc/docs/logging_files/figure-html/cell-14-output-1.png new file mode 100644 index 0000000..7a75f15 Binary files /dev/null and b/_proc/docs/logging_files/figure-html/cell-14-output-1.png differ diff --git a/_proc/docs/markups.html b/_proc/docs/markups.html new file mode 100644 index 0000000..38bfc55 --- /dev/null +++ b/_proc/docs/markups.html @@ -0,0 +1,988 @@ + + + + + + + + + +Markups – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

Markups

+
+ + + +
+ + + + +
+ + + +
+ + + +
+
+

AttrDict

+
+
 AttrDict (*args, given_input_to_ad=None, **kwargs)
+
+

*Utility class to interact with a dictionary as if it were an object. AD is an alias to this class

+

FEATURES: 0. Access and modify keys (including nested keys) as if they were object attributes, supporting tab-completion. Example: self.key1.key2[0].key3 1. Keys and values are recursively converted to AttrDict instances. 2. Pretty-print the dictionary using print. 3. Convert the entire structure to a regular dictionary at any time using self.to_dict() / self.dict(). 3. Recursively remove keys using self.drop(key) from a JSON object. 4. Apply a function to all values at all levels using map.

+

GOTCHAS: 1. All integer keys are implicitly converted to strings due to the enforced self.key format. 2. You can still use self[int], but this internally converts the integer to a string.

+

METHODS: - items(): Return the items of the AttrDict as key-value pairs. - keys(): Return the keys of the AttrDict. - values(): Return the values of the AttrDict. - update(dict): Update the AttrDict with key-value pairs from another dictionary. - get(key, default=None): Get the value associated with a key, with an optional default value. - __iter__(): Allow iteration over the keys of the AttrDict. - __len__(): Return the number of keys in the AttrDict. - __repr__(): Return a string representation of the AttrDict. - __dir__(): List the keys of the AttrDict as attributes. - __contains__(key): Check if a key exists in the AttrDict, use ‘a.b.c’ notation to directly check for a nested attribute. - __delitem__(key): Delete a key from the AttrDict. - map(func): Apply a function to all values in the AttrDict. - drop(key): Recursively remove a key and its values from the AttrDict. - to_dict(): Convert the AttrDict and its nested structure to a regular dictionary. - pretty(print_with_logger=False, *args, **kwargs): Pretty-print the AttrDict as JSON. - __eq__(other): Compare the AttrDict with another dictionary for equality. - find_address(key, current_path=""): Find and return all addresses (paths) of a given key in the AttrDict. - summary(current_path='', summary_str='', depth=0, sep=' '): Generate a summary of the structure and values in the AttrDict. - write_summary(to, **kwargs): Write the summary to a file or stream. - fetch(addr): Retrieve a value at a specified address (path).

+

PARAMETERS: - data (dict, optional): Initial data to populate the AttrDict.

+

USAGE: - Create an AttrDict instance by providing an optional initial dictionary, and then access and manipulate its contents as if they were object attributes.

+

EXAMPLE:

+
my_dict = {'name': 'John', 'age': 30, 'address': {'city': 'New York', 'zip': '10001'}}
+attr_dict = AttrDict(my_dict)
+print(attr_dict.name)  # Access values like attributes
+attr_dict.address.city = 'Los Angeles'  # Modify nested values
+```*
+
+
+::: {#bfb4146f-90bf-42bc-bf40-69fb6d612ea2 .cell tags='[]' execution_count=5}
+``` {.python .cell-code}
+xx = AttrDict({"a": 1, "b": [{"c": 2, "d": 4}, {"e": 3}], "f": {"g": {"h": 20}}})
+print(type(xx.b[0]))
+print(type(xx.to_dict()["b"][0]))
+print("f.g.h" in xx)
+xx.pretty()
+
+
<class 'torch_snippets.markup2.AttrDict'>
+<class 'dict'>
+True
+{
+    "a": 1,
+    "b": [
+        {
+            "c": 2,
+            "d": 4
+        },
+        {
+            "e": 3
+        }
+    ],
+    "f": {
+        "g": {
+            "h": 20
+        }
+    }
+}
+
+

:::

+
+
x = {"abc": {"b": 10, "c": 11}, "d": {"e": {"f": [2, {"abc": "pqrs"}, 2.234]}}}
+
+y = AttrDict(x)
+
+assert y.abc.b == 10
+assert y.d.e.f == [2, {"abc": "pqrs"}, 2.234]
+
+y.d.e.g = 11
+
+# del y.abc.c
+# OR
+del y["abc"]["c"]
+
+assert y.to_dict() == {
+    "abc": {"b": 10},
+    "d": {"e": {"f": [2, {"abc": "pqrs"}, 2.234], "g": 11}},
+}
+
+y.pretty(indent=2)
+
+assert "abc" in y
+assert "def" not in y
+print("e" in y.d)
+
+
{
+  "abc": {
+    "b": 10
+  },
+  "d": {
+    "e": {
+      "f": [
+        2,
+        {
+          "abc": "pqrs"
+        },
+        2.234
+      ],
+      "g": 11
+    }
+  }
+}
+True
+
+
+
+
x = {"abc": {"b": 10, "c": 11}, "d": {"e": {"f": [2, {"abc": "pqrs"}, 2.234]}}}
+y = AttrDict(x)
+y.abc[["b", "c"]]
+
+

+```↯ AttrDict ↯
+b - 10 (🏷️ int)
+c - 11 (🏷️ int)
+
+```
+
+
+
+
+
+

write_json

+
+
 write_json (obj, fpath, silent=False)
+
+
+
+
+

read_json

+
+
 read_json (fpath)
+
+
+
try:
+    import torch
+
+    d = AD(a=torch.Tensor([1, 2, 3]), b="hello")
+    write_json(d, "/tmp/tmp.json")
+    print("\n".join(readlines("/tmp/tmp.json")))
+except ModuleNotFoundError:
+    ...
+
+
[08/24/24 12:50:35] INFO     loaded 8 lines                                                                                        d=266370;file://<ipython-input-1-e6d68859b80d>:6\<ipython-input-1-e6d68859b80d>;;\:d=65937;file://<ipython-input-1-e6d68859b80d>:6#<module>:6\<module>:6;;\
+{
+"a": [
+1.0,
+2.0,
+3.0
+],
+"b": "hello"
+}
+
+
+
+
d = [1, {1: 1, 2: 2}, 3]
+
+pretty_json({1: 1, 2: 2})
+pretty_json(d)
+
+f = write_json(d, "/tmp/test.json")
+print(f)
+read_json(f)
+
+
/tmp/test.json
+
+
+
[1, {'1': 1, '2': 2}, 3]
+
+
+
+
+
+

read_jsonl

+
+
 read_jsonl (file)
+
+
+
+
+

write_jsonl

+
+
 write_jsonl (items, dest, mode='a')
+
+
+
+
+

write_yaml

+
+
 write_yaml (content, fpath)
+
+
+
+
+

read_yaml

+
+
 read_yaml (file)
+
+
+
+
+

write_xml

+
+
 write_xml (data:Union[torch_snippets.markup2.AttrDict,dict],
+            file_path:Union[str,pathlib.Path])
+
+
+
+
+

read_xml

+
+
 read_xml (file_path:Union[str,pathlib.Path])
+
+

Read xml data as a dictionary

+
+
y.to_dict()
+
+
{'abc': {'b': 10, 'c': 11}, 'd': {'e': {'f': [2, {'abc': 'pqrs'}, 2.234]}}}
+
+
+
+
y
+
+

+```↯ AttrDict ↯
+abc
+  b - 10 (🏷️ int)
+  c - 11 (🏷️ int)
+d
+  e
+    f
+      0 - 2 (🏷️ int)
+      1
+        abc - pqrs (🏷️ str)
+      2 - 2.234 (🏷️ float)
+
+```
+
+
+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/misc.html b/_proc/docs/misc.html new file mode 100644 index 0000000..ee16094 --- /dev/null +++ b/_proc/docs/misc.html @@ -0,0 +1,1347 @@ + + + + + + + + + +Miscellaneous – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

Miscellaneous

+
+ + + +
+ + + + +
+ + + +
+ + + +
+
time.sleep(3)
+
+
+

Timer

+

Use timer as a standalone class so you have full control on when to call a lap (most useful in while loops)…

+
+
N = 50
+t = Timer(N)
+info = None
+
+for i in range(N):
+    time.sleep(0.1)
+    t(info=info)  # Lap and present the time
+    if i == N//2:
+        print()
+        info = f"My Info: {i*3.122}"
+
+
26/50 (2.70s - 2.49s remaining - 9.62 iters/s)          
+My Info: 78.05  50/50 (5.20s - 0.00s remaining - 9.61 iters/s)          
+
+
+
+
+

Track2

+

… or use track2 to directly track a for loop

+
+
N = 50
+info = None
+
+for i in (tracker := track2(range(N), total=N)):
+    time.sleep(0.1)
+    info = f"My Info: {i*3.122:.2f}"
+    if i == N // 2:
+        print()
+    if i >= N // 2:
+        tracker.send(info)
+
+
25/50 (2.59s - 2.59s remaining - 9.66 iters/s)          
+My Info: 152.98 50/50 (5.18s - 0.00s remaining - 9.65 iters/s)          
+
+
+

Warning! NEVER RUN tracker.send(None) as this will skip variables silently

+
+
# https://youtu.be/XcU-a-eksMA
+from IPython.display import YouTubeVideo
+
+# Replace 'video_id' with the actual YouTube video ID
+YouTubeVideo('XcU-a-eksMA', width=560, height=315)
+
+ + + +
+
+
+ + +
+

Try Catch with a single line

+
+
@tryy
+def do(a, b, c):
+    return 1 / 0
+
+
+x = do(1, 2, c=10)
+assert x is None  # tryy returns None by default
+
+
[08/24/24 12:46:28] ERROR    Error for `do` with                                                                                                      1057038067.py:inner:30
+                             args()                                                                                                                                         
+                               0 - 1 (🏷️ int)                                                                                                                                
+                               1 - 2 (🏷️ int)                                                                                                                                
+                             kwargs                                                                                                                                         
+                               c - 10 (🏷️ int)                                                                                                                               
+                                                                                                                                                                            
+                             ZeroDivisionError: division by zero                                                                                                            
+                             Traceback (most recent call last):                                                                                                             
+                                                                                                                                                                            
+                               File "/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/1057038067.py", line 21, in inner                                     
+                                 return f(*args, **kwargs)                                                                                                                  
+                                        |  |       -> {'c': 10}                                                                                                             
+                                        |  -> (1, 2)                                                                                                                        
+                                        -> <function do at 0x11ecdd800>                                                                                                     
+                                                                                                                                                                            
+                               File "/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/884313129.py", line 3, in do                                          
+                                 return 1 / 0                                                                                                                               
+                                                                                                                                                                            
+                             ZeroDivisionError: division by zero                                                                                                            
+                                                                                                                                                                            
+                             ╭───────────────────────────────────────── Traceback (most recent call last) ──────────────────────────────────────────╮                       
+                              in inner:21                                                                                                                                 
+                                                                                                                                                                          
+                                18 │   │                                                                                                                                  
+                                19 │   │   def inner(*args, **kwargs):                                                                                                    
+                                20 │   │   │   try:                                                                                                                       
+                              21 │   │   │   │   return f(*args, **kwargs)                                                                                              
+                                22 │   │   │   except Exception as e:                                                                                                     
+                                23 │   │   │   │   if not print_traceback:                                                                                                
+                                24 │   │   │   │   │   tb = f"{type(e).__name__}: {str(e)}"                                                                               
+                                                                                                                                                                          
+                              in do:3                                                                                                                                     
+                                                                                                                                                                          
+                                1 @tryy                                                                                                                                   
+                                2 def do(a, b, c):                                                                                                                        
+                              3 return 1 / 0                                                                                                                        
+                                4                                                                                                                                         
+                                5                                                                                                                                         
+                                6 x = do(1, 2, c=10)                                                                                                                      
+                             ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯                       
+                             ZeroDivisionError: division by zero                                                                                                            
+
+
+
+

Use your own default on failure

+
+
@tryy(output_to_return_on_fail="😔")
+def do(a, b, c):
+    return 1 / 0
+
+
+do(1, 2, c=10)
+
+
                    ERROR    Error for `do` with                                                                                                      1057038067.py:inner:30
+                             args()                                                                                                                                         
+                               0 - 1 (🏷️ int)                                                                                                                                
+                               1 - 2 (🏷️ int)                                                                                                                                
+                             kwargs                                                                                                                                         
+                               c - 10 (🏷️ int)                                                                                                                               
+                                                                                                                                                                            
+                             ZeroDivisionError: division by zero                                                                                                            
+                             Traceback (most recent call last):                                                                                                             
+                                                                                                                                                                            
+                               File "/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/1057038067.py", line 21, in inner                                     
+                                 return f(*args, **kwargs)                                                                                                                  
+                                        |  |       -> {'c': 10}                                                                                                             
+                                        |  -> (1, 2)                                                                                                                        
+                                        -> <function do at 0x11ecdeac0>                                                                                                     
+                                                                                                                                                                            
+                               File "/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/3352784188.py", line 3, in do                                         
+                                 return 1 / 0                                                                                                                               
+                                                                                                                                                                            
+                             ZeroDivisionError: division by zero                                                                                                            
+                                                                                                                                                                            
+                             ╭───────────────────────────────────────── Traceback (most recent call last) ──────────────────────────────────────────╮                       
+                              in inner:21                                                                                                                                 
+                                                                                                                                                                          
+                                18 │   │                                                                                                                                  
+                                19 │   │   def inner(*args, **kwargs):                                                                                                    
+                                20 │   │   │   try:                                                                                                                       
+                              21 │   │   │   │   return f(*args, **kwargs)                                                                                              
+                                22 │   │   │   except Exception as e:                                                                                                     
+                                23 │   │   │   │   if not print_traceback:                                                                                                
+                                24 │   │   │   │   │   tb = f"{type(e).__name__}: {str(e)}"                                                                               
+                                                                                                                                                                          
+                              in do:3                                                                                                                                     
+                                                                                                                                                                          
+                                1 @tryy(output_to_return_on_fail="😔")                                                                                                    
+                                2 def do(a, b, c):                                                                                                                        
+                              3 return 1 / 0                                                                                                                        
+                                4                                                                                                                                         
+                                5                                                                                                                                         
+                                6 do(1, 2, c=10)                                                                                                                          
+                             ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯                       
+                             ZeroDivisionError: division by zero                                                                                                            
+
+
+
+
'😔'
+
+
+

Optionally print the full stacktrace if needed

+
+
@tryy(print_traceback=True, output_to_return_on_fail="😔")
+def do(a, b, c):
+    return 1 / 0
+
+
+do(1, 2, c=10)
+
+
                    ERROR    Error for `do` with                                                                                                      1057038067.py:inner:30
+                             args()                                                                                                                                         
+                               0 - 1 (🏷️ int)                                                                                                                                
+                               1 - 2 (🏷️ int)                                                                                                                                
+                             kwargs                                                                                                                                         
+                               c - 10 (🏷️ int)                                                                                                                               
+                                                                                                                                                                            
+                             Traceback (most recent call last):                                                                                                             
+                               File "/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/1057038067.py", line 21, in inner                                     
+                                 return f(*args, **kwargs)                                                                                                                  
+                                        ^^^^^^^^^^^^^^^^^^                                                                                                                  
+                               File "/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/580638143.py", line 3, in do                                          
+                                 return 1 / 0                                                                                                                               
+                                        ~~^~~                                                                                                                               
+                             ZeroDivisionError: division by zero                                                                                                            
+                                                                                                                                                                            
+                             Traceback (most recent call last):                                                                                                             
+                                                                                                                                                                            
+                               File "/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/1057038067.py", line 21, in inner                                     
+                                 return f(*args, **kwargs)                                                                                                                  
+                                        |  |       -> {'c': 10}                                                                                                             
+                                        |  -> (1, 2)                                                                                                                        
+                                        -> <function do at 0x11ecdeb60>                                                                                                     
+                                                                                                                                                                            
+                               File "/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/580638143.py", line 3, in do                                          
+                                 return 1 / 0                                                                                                                               
+                                                                                                                                                                            
+                             ZeroDivisionError: division by zero                                                                                                            
+                                                                                                                                                                            
+                             ╭───────────────────────────────────────── Traceback (most recent call last) ──────────────────────────────────────────╮                       
+                              in inner:21                                                                                                                                 
+                                                                                                                                                                          
+                                18 │   │                                                                                                                                  
+                                19 │   │   def inner(*args, **kwargs):                                                                                                    
+                                20 │   │   │   try:                                                                                                                       
+                              21 │   │   │   │   return f(*args, **kwargs)                                                                                              
+                                22 │   │   │   except Exception as e:                                                                                                     
+                                23 │   │   │   │   if not print_traceback:                                                                                                
+                                24 │   │   │   │   │   tb = f"{type(e).__name__}: {str(e)}"                                                                               
+                                                                                                                                                                          
+                              in do:3                                                                                                                                     
+                                                                                                                                                                          
+                                1 @tryy(print_traceback=True, output_to_return_on_fail="😔")                                                                              
+                                2 def do(a, b, c):                                                                                                                        
+                              3 return 1 / 0                                                                                                                        
+                                4                                                                                                                                         
+                                5                                                                                                                                         
+                                6 do(1, 2, c=10)                                                                                                                          
+                             ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯                       
+                             ZeroDivisionError: division by zero                                                                                                            
+
+
+
+
'😔'
+
+
+

You can also silence the errors completely

+
+
@tryy(silence_errors=True, output_to_return_on_fail="😔")
+def do(a, b, c):
+    return 1 / 0
+
+
+do(1, 2, c=10)
+
+
'😔'
+
+
+

You can collect all your errors in a list

+
+
import random
+
+errors = []
+
+
+@tryy(silence_errors=True, store_errors=errors)
+def do(a, b, c):
+    if random.randint(0, 100) < 50:
+        return 1 / 0
+    else:
+        raise NotImplementedError("🤔")
+
+
+for _ in range(4):
+    do(1, random.randint(0, 10), c=random.randint(0, 100))
+
+print(errors)
+
+
[
+```↯ AttrDict ↯
+func - do (🏷️ str)
+args()
+  0 - 1 (🏷️ int)
+  1 - 5 (🏷️ int)
+kwargs
+  c - 21 (🏷️ int)
+tb - NotImplementedError: 🤔 (🏷️ str)
+err_type - NotImplementedError (🏷️ str)
+
+```
+, 
+```↯ AttrDict ↯
+func - do (🏷️ str)
+args()
+  0 - 1 (🏷️ int)
+  1 - 7 (🏷️ int)
+kwargs
+  c - 93 (🏷️ int)
+tb - NotImplementedError: 🤔 (🏷️ str)
+err_type - NotImplementedError (🏷️ str)
+
+```
+, 
+```↯ AttrDict ↯
+func - do (🏷️ str)
+args()
+  0 - 1 (🏷️ int)
+  1 - 4 (🏷️ int)
+kwargs
+  c - 4 (🏷️ int)
+tb - ZeroDivisionError: division by zero (🏷️ str)
+err_type - ZeroDivisionError (🏷️ str)
+
+```
+, 
+```↯ AttrDict ↯
+func - do (🏷️ str)
+args()
+  0 - 1 (🏷️ int)
+  1 - 0 (🏷️ int)
+kwargs
+  c - 36 (🏷️ int)
+tb - NotImplementedError: 🤔 (🏷️ str)
+err_type - NotImplementedError (🏷️ str)
+
+```
+]
+
+
+

There’s onlly one usecase where you would want to send in a list by yourself - when you want to append your errors to an existing list. The sensible default is to always store the errors, especially because this is a debugging tool.

+

Just access all the errors in a dataframe like so

+
+
import random
+
+random.seed(10)
+
+
+@tryy(silence_errors=True)
+def do(a, b, c):
+    if c < 50:
+        return 1 / 0
+    else:
+        raise NotImplementedError("🤔")
+
+
+for _ in range(4):
+    do(1, random.randint(0, 10), c=random.randint(0, 100))
+
+do.error_summary()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
funcargskwargstberr_type
0do[1, 9]{'c': 4}ZeroDivisionError: division by zeroZeroDivisionError
1do[1, 6]{'c': 61}NotImplementedError: 🤔NotImplementedError
2do[1, 9]{'c': 1}ZeroDivisionError: division by zeroZeroDivisionError
3do[1, 3]{'c': 59}NotImplementedError: 🤔NotImplementedError
+ +
+
+
+

and the actual list of errors like so

+
+
do.error_store
+
+
[
+ ```↯ AttrDict ↯
+ func - do (🏷️ str)
+ args()
+   0 - 1 (🏷️ int)
+   1 - 9 (🏷️ int)
+ kwargs
+   c - 4 (🏷️ int)
+ tb - ZeroDivisionError: division by zero (🏷️ str)
+ err_type - ZeroDivisionError (🏷️ str)
+ 
+ ```,
+ 
+ ```↯ AttrDict ↯
+ func - do (🏷️ str)
+ args()
+   0 - 1 (🏷️ int)
+   1 - 6 (🏷️ int)
+ kwargs
+   c - 61 (🏷️ int)
+ tb - NotImplementedError: 🤔 (🏷️ str)
+ err_type - NotImplementedError (🏷️ str)
+ 
+ ```,
+ 
+ ```↯ AttrDict ↯
+ func - do (🏷️ str)
+ args()
+   0 - 1 (🏷️ int)
+   1 - 9 (🏷️ int)
+ kwargs
+   c - 1 (🏷️ int)
+ tb - ZeroDivisionError: division by zero (🏷️ str)
+ err_type - ZeroDivisionError (🏷️ str)
+ 
+ ```,
+ 
+ ```↯ AttrDict ↯
+ func - do (🏷️ str)
+ args()
+   0 - 1 (🏷️ int)
+   1 - 3 (🏷️ int)
+ kwargs
+   c - 59 (🏷️ int)
+ tb - NotImplementedError: 🤔 (🏷️ str)
+ err_type - NotImplementedError (🏷️ str)
+ 
+ ```]
+
+
+

Finally, you want to run the function (without try) to reproduce the error and actually start debugging. Just use the .F attribute to access the original function that you created

+
+
ix = 2
+data = do.error_store[ix]
+do.F(*data.args, **data.kwargs)
+
+
+
---------------------------------------------------------------------------
+ZeroDivisionError                         Traceback (most recent call last)
+Cell In[19], line 3
+      1 ix = 2
+      2 data = do.error_store[ix]
+----> 3 do.F(*data.args, **data.kwargs)
+
+Cell In[17], line 9, in do(a, b, c)
+      6 @tryy(silence_errors=True)
+      7 def do(a, b, c):
+      8     if c < 50:
+----> 9         return 1 / 0
+     10     else:
+     11         raise NotImplementedError("🤔")
+
+ZeroDivisionError: division by zero
+
+
+
+
+
def deco(decorator):
+    @wraps(decorator)
+    def wrapper(*args, **kwargs):
+        def real_decorator(func):
+            @wraps(func)
+            def inner_wrapper(*fargs, **fkwargs):
+                return decorator(func, *fargs, **fkwargs)
+
+            return inner_wrapper
+
+        if len(args) == 1 and callable(args[0]) and not kwargs:
+            # Case when B is used without arguments
+            return real_decorator(args[0])
+        else:
+            # Case when B is used with arguments
+            def custom_decorator(func):
+                return decorator(func, **kwargs)
+
+            return custom_decorator
+
+    return wrapper
+
+
+
@deco
+def B(func, *args, deco_param="default", **kwargs):
+    print("B", deco_param, print("args", *args, "kwargs", **kwargs))
+    return func(*args, **kwargs)
+
+
+
@B
+def C(a, b, c):
+    print("C")
+    return a + (b * c)
+
+
+C(1, 2, 3)
+
+
+
@B(deco_param="new_param")
+def C(a, b, c):
+    return a + (b * c)
+
+
+# Testing
+print(C(1, 2, 3))  # Outputs 'new_param' then the result 7
+
+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/paths.html b/_proc/docs/paths.html new file mode 100644 index 0000000..e226cc4 --- /dev/null +++ b/_proc/docs/paths.html @@ -0,0 +1,1573 @@ + + + + + + + + + +paths – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + +
+

Paths

+

Utilities to manipulate Paths

+ +
+
print(P().ls())
+print(P().resolve())
+
+
[» _quarto.yml, » decorators.ipynb, » markups.ipynb, » sidebar.yml, » AttrDict.ipynb, » interactive_show.ipynb, » load_defautls.ipynb, » sklegos.ipynb, » bounding_boxes.ipynb, » show.ipynb, » pdf.ipynb, » charts.ipynb, » paths.ipynb, » nbdev.yml, » tmp.csv, » jupyter_notebook.ipynb, » config.ipynb, » misc.ipynb, » registry.ipynb, » adapters.ipynb, » report.ipynb, » .ipynb_checkpoints, » capsule.ipynb, » logging.ipynb, » inspector.ipynb, » bokeh_plotting.ipynb, » index.ipynb, » imgaug_loader.ipynb]
+/Users/yeshwanth/Code/Personal/torch_snippets/nbs
+
+
+
+
# !touch tmp.txt tmp.csv
+# # x = P()
+# x.tmp__csv, x.tmp__txt, x.misc
+
+
+
!rm tmp.txt tmp.misc
+
+
rm: tmp.txt: No such file or directory
+rm: tmp.misc: No such file or directory
+
+
+
+
+

Path.rm

+
+
 Path.rm (confirm_prompt='Are you sure you want to delete `{self}`?
+          [y/N]', silent=True, missing_ok=True, force=False,
+          dry_run=False)
+
+
+
+
+

remove_file

+
+
 remove_file (dry_run)
+
+
+
+
+

Path.cp

+
+
 Path.cp (to)
+
+
+
+
+

Path.mv

+
+
 Path.mv (to)
+
+
+
+
+

Path.sample

+
+
 Path.sample (pattern='*')
+
+
+
+
+

extn

+
+
 extn (fpath)
+
+
+
+
+

Path.extn

+
+
 Path.extn ()
+
+
+
+
+

Path.sz

+
+
 Path.sz ()
+
+
+
+
+

Path.size

+
+
 Path.size ()
+
+
+
+
+

Path.rmtree

+
+
 Path.rmtree (prompt='Really remove `{self}` and its contents? [y/n] ',
+              force=False)
+
+
+
p = P("test.txt")
+p.touch()
+logger.info(p.size())
+
+
[08/24/24 11:12:12] INFO     0 KB                                                                                                                   1417366103.py:<module>:3
+
+
+
+

Path objects can be moved and copied

+
+
p = p.mv("test1.txt")
+q = p.cp("test2.txt")
+
+

Path objects have a size, extn (extension) and parent attributes

+
+
assert isinstance(q, P)
+assert q.size() == "0 KB"
+assert str(p) == "test1.txt"
+assert p.extn == "txt"
+assert p.parent == P()
+
+

They can be deleted with/without a prompt

+
+
p.rm(force=True)
+q.rm(confirm_prompt=False)
+
+

Folders can be globbed with a default of everything

+
+
p = P("../torch_snippets")
+assert P().ls() == P().Glob()
+p.Glob("*.py")
+
+
(#34) [» ../torch_snippets/misc.py,» ../torch_snippets/load_defaults.py,» ../torch_snippets/text_utils.py,» ../torch_snippets/_nbdev.py,» ../torch_snippets/paths.py,» ../torch_snippets/charts.py,» ../torch_snippets/pdf_loader.py,» ../torch_snippets/interactive_show.py,» ../torch_snippets/registry.py,» ../torch_snippets/markup2.py,» ../torch_snippets/_modidx.py,» ../torch_snippets/inspector.py,» ../torch_snippets/__init__.py,» ../torch_snippets/tmp.py,» ../torch_snippets/torch_loader.py,» ../torch_snippets/logger.py,» ../torch_snippets/markup.py,» ../torch_snippets/fastcores.py,» ../torch_snippets/sklegos.py,» ../torch_snippets/cli.py...]
+
+
+

You can sample a random file from the directory

+
+
q = p.sample("*.py")
+Info(f"Sample file: `{q}`")
+Info(f"Sample file size: `{q.size()}`")
+
+
                    INFO     Sample file: `../torch_snippets/logger.py`                                                                             1725593160.py:<module>:2
+
+
+
+
                    INFO     Sample file size: `9 KB`                                                                                               1725593160.py:<module>:3
+
+
+
+
+
try:
+    p.size()
+except Exception as e:
+    logger.warning(e)
+
+
                    WARNING  `../torch_snippets` is a directory                                                                                     1980994904.py:<module>:4
+
+
+
+
+
p = P("test.txt")
+p.touch()
+assert isdir(p) == False
+assert fname(p) == "test.txt"
+assert parent(p) == P()
+assert stem(p) == "test"
+assert extn(p) == "txt"
+
+print(find("capsule", Glob("./")))
+
+p.rm(confirm_prompt=False)
+
+
capsule.ipynb
+
+
+
+
+
+

list_zip

+
+
 list_zip (file)
+
+
+
+
+

unzip_file

+
+
 unzip_file (file, dest)
+
+
+
+
+

zip_files

+
+
 zip_files (list_of_files, dest)
+
+
+
!touch test1.txt test2.txt
+f = zip_files(P().Glob("*.txt"), "test.tar.gz")
+unzip_file(f, "./")
+[f.rm(force=True) for f in P().Glob("*.txt")]
+P("test.tar.gz").rm(force=True)
+
+!touch test1.txt test2.txt
+f = zip_files(P().Glob("*.txt"), "test.zip")
+unzip_file(f, "./")
+[f.rm(force=True) for f in P().Glob("*.txt")]
+P("test.zip").rm(force=True)
+
+
                    INFO     Zipping 2 files to test.tar.gz...                                                                                     3826617683.py:zip_files:8
+
+
+
+
100%|██████████| 2/2 [00:00<00:00, 649.78it/s]
+/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_40147/3826617683.py:27: DeprecationWarning: Python 3.14 will, by default, filter extracted tar archives and reject files or modify their metadata. Use the filter argument to control this behavior.
+  f.extractall(dest)
+
+
+
                    INFO     Zipping 2 files to test.zip...                                                                                        3826617683.py:zip_files:8
+
+
+
+
100%|██████████| 2/2 [00:00<00:00, 2958.94it/s]
+
+
+
+
+
+

folder_summary

+
+
 folder_summary (thing)
+
+
+
+
+

common_items

+
+
 common_items (*fldrs, verbose=True)
+
+
+
+
+

remove_duplicates

+
+
 remove_duplicates (files)
+
+

Check a list of files and remove duplicates based on their checksum

+
+
+
+

md5

+
+
 md5 (fname)
+
+
+
md5("paths.ipynb")
+
+
'74eb392fa44e9293fb30ffed68c14112'
+
+
+
+
+
+

Path.write_lines

+
+
 Path.write_lines (lines, mode)
+
+
+
+
+

writelines

+
+
 writelines (lines, file, mode)
+
+
+
+
+

Path.read_file

+
+
 Path.read_file (**kwargs)
+
+
+
+
+

readfile

+
+
 readfile (*args, **kwargs)
+
+
+
+
+

Path.read_lines

+
+
 Path.read_lines (silent=False, encoding=None)
+
+
+
+
+

readlines

+
+
 readlines (fpath, silent=False, encoding=None, _strip=True)
+
+
+
P("paths.ipynb").read_lines()[:10]
+
+
                    INFO     loaded 1075 lines                                                                                                   2901855681.py:read_lines:13
+
+
+
+
['{',
+ '"cells": [',
+ '{',
+ '"cell_type": "raw",',
+ '"metadata": {},',
+ '"source": [',
+ '"# Paths\\n",',
+ '"Utilities to manipulate Paths\\n",',
+ '"---\\n",',
+ '"{}\\n",']
+
+
+
+
+
+

tree

+
+
 tree (directory='./', filelimit=50, to=None)
+
+
+
P("../").tree
+
+
/Users/yeshwanth/Code/Personal/torch_snippets
+ ── LICENSE
+ ── LICENSE.txt
+ ── MANIFEST
+ ── MANIFEST.in
+ ── Makefile
+ ── README.md
+ ── Screenshot 2022-09-08 at 4.40.18 PM.png
+ ── __module_timing__.py.lprof
+ ── _proc
+     ── AttrDict.ipynb
+     ── _quarto.yml
+     ── adapters.ipynb
+     ── bokeh_plotting.ipynb
+     ── bounding_boxes.ipynb
+     ── capsule.ipynb
+     ── charts.ipynb
+     ── config.ipynb
+     ── decorators.ipynb
+     ── docs
+         ── AttrDict.html
+         ── adapters.html
+         ── bokeh_plotting.html
+         ── bounding_boxes.html
+         ── bounding_boxes_files
+             ── figure-html
+                 ── cell-6-output-1.png
+                 ── cell-7-output-1.png
+                 ── cell-8-output-1.png
+                 ── cell-9-output-1.png
+         ── capsule.html
+         ── capsule_files
+             ── figure-html
+                 ── cell-6-output-2.png
+         ── charts.html
+         ── charts_files
+             ── figure-html
+                 ── cell-7-output-1.png
+         ── config.html
+         ── decorators.html
+         ── imgaug_loader.html
+         ── imgaug_loader_files
+             ── figure-html
+                 ── cell-3-output-1.png
+                 ── cell-5-output-10.png
+                 ── cell-5-output-12.png
+                 ── cell-5-output-14.png
+                 ── cell-5-output-16.png
+                 ── cell-5-output-18.png
+                 ── cell-5-output-2.png
+                 ── cell-5-output-20.png
+                 ── cell-5-output-22.png
+                 ── cell-5-output-4.png
+                 ── cell-5-output-6.png
+                 ── cell-5-output-8.png
+                 ── cell-6-output-1.png
+                 ── cell-7-output-1.png
+                 ── cell-8-output-2.png
+         ── index.html
+         ── inspector.html
+         ── interactive_show.html
+         ── jupyter_notebook.html
+         ── load_defautls.html
+         ── logging.html
+         ── markups.html
+         ── misc.html
+         ── paths.html
+         ── pdf.html
+         ── registry.html
+         ── report.html
+         ── report_files
+             ── figure-html
+                 ── cell-3-output-2.png
+                 ── cell-5-output-1.png
+         ── robots.txt
+         ── search.json
+         ── show.html
+         ── show_files
+             ── figure-html
+                 ── cell-2-output-1.png
+                 ── cell-3-output-1.png
+                 ── cell-4-output-2.png
+                 ── cell-4-output-4.png
+                 ── cell-4-output-6.png
+                 ── cell-5-output-1.png
+                 ── cell-8-output-1.png
+                 ── cell-9-output-1.png
+         ── site_libs
+             ── bootstrap
+                 ── bootstrap-icons.css
+                 ── bootstrap-icons.woff
+                 ── bootstrap.min.css
+                 ── bootstrap.min.js
+             ── clipboard
+                 ── clipboard.min.js
+             ── quarto-html
+                 ── anchor.min.js
+                 ── popper.min.js
+                 ── quarto-syntax-highlighting.css
+                 ── quarto.js
+                 ── tippy.css
+                 ── tippy.umd.min.js
+             ── quarto-nav
+                 ── headroom.min.js
+                 ── quarto-nav.js
+             ── quarto-search
+                 ── autocomplete.umd.js
+                 ── fuse.min.js
+                 ── quarto-search.js
+         ── sitemap.xml
+         ── sklegos.html
+     ── imgaug_loader.ipynb
+     ── index.ipynb
+     ── inspector.ipynb
+     ── interactive_show.ipynb
+     ── jupyter_notebook.ipynb
+     ── load_defautls.ipynb
+     ── logging.ipynb
+     ── markups.ipynb
+     ── misc.ipynb
+     ── nbdev.yml
+     ── paths.ipynb
+     ── pdf.ipynb
+     ── registry.ipynb
+     ── report.ipynb
+     ── show.ipynb
+     ── sidebar.yml
+     ── sklegos.ipynb
+     ── test.txt
+     ── test1.txt
+     ── test2.txt
+     ── tmp.csv
+     ── tmp.txt
+ ── assets
+     ── Preamble.csv
+     ── Preamble.png
+     ── avgs0.png
+     ── avgs1.png
+     ── demo.gif
+ ── backups
+     ── testing
+         ── 0000.html
+ ── build
+     ── bdist.macosx-11.1-arm64
+     ── lib
+         ── torch_snippets
+             ── __init__.py
+             ── __module_timing__.py
+             ── _modidx.py
+             ── _nbdev.py
+             ── adapters.py
+             ── bb_utils.py
+             ── bokeh_loader.py
+             ── charts.py
+             ── cli.py
+             ── dates.py
+             ── decorators.py
+             ── fastcores.py
+             ── icecream.py
+             ── imgaug_loader.py
+             ── inspector.py
+             ── interactive_show.py
+             ── ipython.py
+             ── load_defaults.py
+             ── loader.py
+             ── logger.py
+             ── markup.py
+             ── markup2.py
+             ── misc.py
+             ── paths.py
+             ── pdf_loader.py
+             ── registry.py
+             ── s3_loader.py
+             ── scp.py
+             ── sklegos.py
+             ── text_utils.py
+             ── thinc_parser
+                 ── __init__.py
+                 ── parser.py
+             ── tmp.py
+             ── torch_loader.py
+             ── trainer
+                 ── __init__.py
+                 ── capsule.py
+                 ── config.py
+                 ── hooks.py
+                 ── neural_graph.py
+             ── video.py
+             ── zen.py
+ ── changelog.md
+ ── conda
+     ── torch_snippets
+         ── meta.yaml
+ ── debug
+     ── profile_time.txt
+     ── profile_time_202408241027.txt
+ ── dist
+     ── torch_snippets-0.6.0-py3-none-any.whl
+     ── torch_snippets-0.6.0.tar.gz
+ ── docker-compose.yml
+ ── docs
+     ── AttrDict.html
+     ── adapters.html
+     ── bokeh_plotting.html
+     ── bounding_boxes.html
+     ── bounding_boxes_files
+         ── figure-html
+             ── cell-6-output-1.png
+             ── cell-7-output-1.png
+             ── cell-8-output-1.png
+             ── cell-9-output-1.png
+     ── capsule.html
+     ── capsule_files
+         ── figure-html
+             ── cell-5-output-2.png
+     ── charts.html
+     ── charts_files
+         ── figure-html
+             ── cell-7-output-1.png
+     ── config.html
+     ── decorators.html
+     ── imgaug_loader.html
+     ── imgaug_loader_files
+         ── figure-html
+             ── cell-3-output-1.png
+             ── cell-5-output-10.png
+             ── cell-5-output-12.png
+             ── cell-5-output-14.png
+             ── cell-5-output-16.png
+             ── cell-5-output-18.png
+             ── cell-5-output-2.png
+             ── cell-5-output-20.png
+             ── cell-5-output-22.png
+             ── cell-5-output-4.png
+             ── cell-5-output-6.png
+             ── cell-5-output-8.png
+             ── cell-6-output-1.png
+             ── cell-7-output-1.png
+             ── cell-8-output-2.png
+     ── index.html
+     ── inspector.html
+     ── interactive_show.html
+     ── jupyter_notebook.html
+     ── load_defautls.html
+     ── logging.html
+     ── markups.html
+     ── misc.html
+     ── paths.html
+     ── pdf.html
+     ── registry.html
+     ── report.html
+     ── report_files
+         ── figure-html
+             ── cell-3-output-2.png
+             ── cell-5-output-1.png
+     ── robots.txt
+     ── search.json
+     ── show.html
+     ── show_files
+         ── figure-html
+             ── cell-2-output-1.png
+             ── cell-3-output-1.png
+             ── cell-4-output-2.png
+             ── cell-4-output-4.png
+             ── cell-4-output-6.png
+             ── cell-5-output-1.png
+             ── cell-8-output-1.png
+             ── cell-9-output-1.png
+     ── site_libs
+         ── bootstrap
+             ── bootstrap-icons.css
+             ── bootstrap-icons.woff
+             ── bootstrap.min.css
+             ── bootstrap.min.js
+         ── clipboard
+             ── clipboard.min.js
+         ── quarto-html
+             ── anchor.min.js
+             ── popper.min.js
+             ── quarto-syntax-highlighting.css
+             ── quarto.js
+             ── tippy.css
+             ── tippy.umd.min.js
+         ── quarto-nav
+             ── headroom.min.js
+             ── quarto-nav.js
+         ── quarto-search
+             ── autocomplete.umd.js
+             ── fuse.min.js
+             ── quarto-search.js
+     ── sitemap.xml
+     ── sklegos.html
+ ── nbs
+     ── AttrDict.ipynb
+     ── _quarto.yml
+     ── adapters.ipynb
+     ── bokeh_plotting.ipynb
+     ── bounding_boxes.ipynb
+     ── capsule.ipynb
+     ── charts.ipynb
+     ── config.ipynb
+     ── decorators.ipynb
+     ── imgaug_loader.ipynb
+     ── index.ipynb
+     ── inspector.ipynb
+     ── interactive_show.ipynb
+     ── jupyter_notebook.ipynb
+     ── load_defautls.ipynb
+     ── logging.ipynb
+     ── markups.ipynb
+     ── misc.ipynb
+     ── nbdev.yml
+     ── paths.ipynb
+     ── pdf.ipynb
+     ── registry.ipynb
+     ── report.ipynb
+     ── show.ipynb
+     ── sidebar.yml
+     ── sklegos.ipynb
+     ── tmp.csv
+ ── requirements.txt
+ ── scripts.ipynb
+ ── settings.ini
+ ── setup.cfg
+ ── setup.py
+ ── testing.ipynb
+ ── tmp.ini
+ ── torch_snippets
+     ── __init__.py
+     ── __module_timing__.py
+     ── __pycache__
+         ── __init__.cpython-312.pyc
+         ── __module_timing__.cpython-312.pyc
+         ── bb_utils.cpython-312.pyc
+         ── bokeh_loader.cpython-312.pyc
+         ── charts.cpython-312.pyc
+         ── cli.cpython-312.pyc
+         ── dates.cpython-312.pyc
+         ── decorators.cpython-312.pyc
+         ── icecream.cpython-312.pyc
+         ── inspector.cpython-312.pyc
+         ── ipython.cpython-312.pyc
+         ── load_defaults.cpython-312.pyc
+         ── loader.cpython-312.pyc
+         ── logger.cpython-312.pyc
+         ── markup.cpython-312.pyc
+         ── markup2.cpython-312.pyc
+         ── misc.cpython-312.pyc
+         ── paths.cpython-312.pyc
+         ── pdf_loader.cpython-312.pyc
+         ── registry.cpython-312.pyc
+         ── s3_loader.cpython-312.pyc
+         ── torch_loader.cpython-312.pyc
+         ── zen.cpython-312.pyc
+     ── _modidx.py
+     ── _nbdev.py
+     ── adapters.py
+     ── bb_utils.py
+     ── bokeh_loader.py
+     ── charts.py
+     ── cli.py
+     ── dates.py
+     ── decorators.py
+     ── fastcores.py
+     ── icecream.py
+     ── imgaug_loader.py
+     ── inspector.py
+     ── interactive_show.py
+     ── ipython.py
+     ── load_defaults.py
+     ── loader.py
+     ── logger.py
+     ── markup.py
+     ── markup2.py
+     ── misc.py
+     ── paths.py
+     ── pdf_loader.py
+     ── registry.py
+     ── s3_loader.py
+     ── scp.py
+     ── sklegos.py
+     ── text_utils.py
+     ── thinc_parser
+         ── __init__.py
+         ── __pycache__
+             ── __init__.cpython-312.pyc
+             ── parser.cpython-312.pyc
+         ── parser.py
+     ── tmp.py
+     ── torch_loader.py
+     ── trainer
+         ── __init__.py
+         ── __pycache__
+             ── __init__.cpython-312.pyc
+             ── capsule.cpython-312.pyc
+         ── capsule.py
+         ── config.py
+         ── hooks.py
+         ── neural_graph.py
+     ── video.py
+     ── zen.py
+ ── torch_snippets.egg-info
+     ── PKG-INFO
+     ── SOURCES.txt
+     ── dependency_links.txt
+     ── entry_points.txt
+     ── not-zip-safe
+     ── requires.txt
+     ── top_level.txt
+
+61 directories, 348 files
+
+
+
+
+
+
+

folder_structure_to_json

+
+
 folder_structure_to_json (path, output_file=None)
+
+

Creates a JSON file representing the folder structure of the given directory.

+
+
+
+

folder_structure_to_dict

+
+
 folder_structure_to_dict (path)
+
+

Recursively constructs a nested dictionary that represents the folder structure.

+
+
x = P("tmp.txt")
+x.touch()
+x.write_lines([i for i in range(1000)], mode="w")
+lines = x.read_lines()
+assert lines == [f"{i}" for i in range(1000)]
+logger.info(x.size())
+
+x.rm(confirm_prompt=False)
+
+
[08/24/24 11:12:13] INFO     loaded 1000 lines                                                                                                   2901855681.py:read_lines:13
+
+
+
+
                    INFO     3 KB                                                                                                                   1033976698.py:<module>:6
+
+
+
+
+
+
+

loaddill

+
+
 loaddill (fpath)
+
+

Load a python object from a dill file

+
+
+
+

dumpdill

+
+
 dumpdill (obj, fpath, silent=False, message='Dumped object of size
+           ≈{fsize} @ "{fpath}" in {dumptime:.2e} seconds')
+
+

Dump a python object as a dill file (better replacement to pickle)

+
+
p = P("test.tmp")
+dumpdill([1, 2, 3], p)
+y = loaddill(p)
+p.rm(confirm_prompt=False)
+assert y == [1, 2, 3]
+
+
                    INFO     Dumped object of size ≈0 KB @ "test.tmp" in 4.11e-04 seconds                                                            554288780.py:<module>:2
+
+
+
+ + +
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/pdf.html b/_proc/docs/pdf.html new file mode 100644 index 0000000..464c77f --- /dev/null +++ b/_proc/docs/pdf.html @@ -0,0 +1,725 @@ + + + + + + + + + +PDF – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

PDF

+
+ + + +
+ + + + +
+ + + +
+ + + +
+
+

PDF

+
+
 PDF (path, dfs=None, dpi=150)
+
+

Load a PDF file from path as a list of images Use show function to see the images WIP

+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/registry.html b/_proc/docs/registry.html new file mode 100644 index 0000000..99a5ef8 --- /dev/null +++ b/_proc/docs/registry.html @@ -0,0 +1,909 @@ + + + + + + + + + +Registry – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

Registry

+
+ + + +
+ + + + +
+ + + +
+ + + +

Suppose you have a file called config.ini like so…

+
+
!cat /tmp/config.ini
+
+

+[META]
+version = 0.0.1
+name = mnist
+root = /home/me/projects/${META.name}
+description = This is a sample
+    config file with a multiline
+    description. These are useful for
+    project descriptions/changelog/devnotes etc...
+
+[Data]
+source = https://files.fast.ai/data/examples/mnist_tiny.tgz
+root = ${META.root}/data/
+
+[misc]
+x = 1
+y = 20
+z = float(${x}*${y}**2)
+a = ['hello','hi','how','are','you', ${x}*${z}*${y}]
+b = {"hi": 1, "hello": 2}
+
+[load]
+    [load.test]
+    @load = print_root_location
+    root = ${Data.root}
+    
+    [load.csv]
+    @load = load_csv_function
+    root = ${Data.root}
+    
+    [load.json]
+    @load = load_json_class
+    root = ${Data.root}
+    
+    
+
+
+
+

You can load it up as an AttrDict

+
+
config = parse("/tmp/config.ini")
+assert config.META.version == "0.0.1"
+assert config.META.root == "/home/me/projects/mnist"
+assert isinstance(config.misc.b, AttrDict), type(config.project.data.b)
+assert isinstance(config.misc.a, L)
+
+

Notice, how the ${} variables got resolved.
+Not just that, the varaible z got computed on the fly.
+Not just that, some of the variables like list and dict got resolved into their respective python data structures.

+
+
config.pretty()
+
+
{
+    "Data": {
+        "root": "/home/me/projects/mnist/data/",
+        "source": "https://files.fast.ai/data/examples/mnist_tiny.tgz"
+    },
+    "META": {
+        "description": "This is a sample\nconfig file with a multiline\ndescription. These are useful for\nproject 
+descriptions/changelog/devnotes etc...",
+        "name": "mnist",
+        "root": "/home/me/projects/mnist",
+        "version": "0.0.1"
+    },
+    "load": {
+        "csv": {
+            "@load": null,
+            "root": "/home/me/projects/mnist/data/"
+        },
+        "json": {
+            "@load": "load_json_class",
+            "root": "/home/me/projects/mnist/data/"
+        },
+        "test": {
+            "@load": "print_root_location",
+            "root": "/home/me/projects/mnist/data/"
+        }
+    },
+    "misc": {
+        "a": [
+            "hello",
+            "hi",
+            "how",
+            "are",
+            "you",
+            8000.0
+        ],
+        "b": {
+            "hello": 2,
+            "hi": 1
+        },
+        "x": 1,
+        "y": 20,
+        "z": 400.0
+    }
+}
+
+
+
+
+
print(config.META.description)
+
+
This is a sample
+config file with a multiline
+description. These are useful for
+project descriptions/changelog/devnotes etc...
+
+
+

You can also register/call python functions/callables/classes/objects to strings by running

+
+
registry.create("load")
+
+
+@registry.load.register("print_root_location")
+def printer(root):
+    return root
+
+
+@registry.load.register("load_csv_function")
+def _load_csv_function(root):
+    def load_csv_function(file):
+        return f"Loading file from {root}/{file}"
+
+    return load_csv_function
+
+
+@registry.load.register("load_json_class")
+class JsonLoader:
+    def __init__(self, root):
+        self.root = root
+
+    def __call__(self, file):
+        assert file.endswith("json")
+        return f"Loading file from {self.root}/{file}"
+
+

… and resolve them on parse

+
+
config = parse_and_resolve("/tmp/config.ini")
+
+
+
config.load.test
+
+
'/home/me/projects/mnist/data/'
+
+
+
+
config.load.csv(file="file.csv")
+
+
'Loading file from /home/me/projects/mnist/data//file.csv'
+
+
+
+
config.load.json(file="file.json")
+
+
'Loading file from /home/me/projects/mnist/data//file.json'
+
+
+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/report.html b/_proc/docs/report.html new file mode 100644 index 0000000..f6c2351 --- /dev/null +++ b/_proc/docs/report.html @@ -0,0 +1,812 @@ + + + + + + + + + +report – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + +
+

Report

+ +
+
from torch_snippets.torch_loader import Report
+import numpy as np
+import time
+
+
+
n_epochs = 3
+report = Report(n_epochs)
+random_walker1 = 0
+random_walker2 = 0
+
+for epoch in range(n_epochs):
+    for ix in range(1000):
+        report.record(
+            pos=epoch + (ix + 1) / 1000,
+            loss=random_walker1,
+            val_loss=random_walker2,
+            end="\r",
+        )
+        random_walker1 += np.random.normal()
+        random_walker2 += np.random.normal()
+        time.sleep(0.001)
+    report.report_avgs(epoch + 1)
+
+report.plot()
+
+
EPOCH: 1.000    loss: -6.503    val_loss: -3.093    (1.19s - 2.38s remaining)))
+EPOCH: 2.000    loss: 48.754    val_loss: -6.265    (2.37s - 1.18s remaining))
+EPOCH: 3.000    loss: 38.115    val_loss: -29.732   (3.54s - 0.00s remaining)
+
+
+
+
+

+
+
+
+
+
+
n_epochs = 5
+report = Report(n_epochs, old_report=report)
+
+for epoch in range(n_epochs):
+    for ix in range(1000):
+        report.record(
+            pos=epoch + (ix + 1) / 1000,
+            loss=random_walker1,
+            val_loss=random_walker2,
+            end="\r",
+        )
+        random_walker1 += np.random.normal()
+        random_walker2 += np.random.normal()
+        time.sleep(0.001)
+    report.report_avgs(epoch + 1)
+
+
EPOCH: 1.000    loss: 29.338    val_loss: -74.955   (1.17s - 4.70s remaining))
+EPOCH: 2.000    loss: 0.340 val_loss: -110.763  (2.35s - 3.52s remaining)))
+EPOCH: 3.000    loss: 30.617    val_loss: -84.599   (3.51s - 2.34s remaining))
+EPOCH: 4.000    loss: 34.309    val_loss: -27.520   (4.68s - 1.17s remaining)
+EPOCH: 5.000    loss: 15.252    val_loss: -46.033   (5.85s - 0.00s remaining)
+
+
+
+
import matplotlib.pyplot as plt
+
+fig, ax = plt.subplots()
+ax.vlines(0, -100, 100, colors=["red"])
+report.plot(ax=ax)
+
+
+
+

+
+
+
+
+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/report_files/figure-html/cell-3-output-2.png b/_proc/docs/report_files/figure-html/cell-3-output-2.png new file mode 100644 index 0000000..497c483 Binary files /dev/null and b/_proc/docs/report_files/figure-html/cell-3-output-2.png differ diff --git a/_proc/docs/report_files/figure-html/cell-5-output-1.png b/_proc/docs/report_files/figure-html/cell-5-output-1.png new file mode 100644 index 0000000..fee45f8 Binary files /dev/null and b/_proc/docs/report_files/figure-html/cell-5-output-1.png differ diff --git a/_proc/docs/robots.txt b/_proc/docs/robots.txt new file mode 100644 index 0000000..9d2e34d --- /dev/null +++ b/_proc/docs/robots.txt @@ -0,0 +1 @@ +Sitemap: https://sizhky.github.io/torch_snippets/sitemap.xml diff --git a/_proc/docs/search.json b/_proc/docs/search.json new file mode 100644 index 0000000..15f7266 --- /dev/null +++ b/_proc/docs/search.json @@ -0,0 +1,582 @@ +[ + { + "objectID": "imgaug_loader.html", + "href": "imgaug_loader.html", + "title": "Imgaug", + "section": "", + "text": "wrappers for common imgaug functions, that accept image and ocr data frame of bounding boxes\n\n\nfrom torch_snippets.loader import read, pd, show\n\nIM = read(\"/Users/yeshwanth.y/code/torch_snippets/assets/Preamble.png\")\nDF = pd.read_csv(\"/Users/yeshwanth.y/code/torch_snippets/assets/Preamble.csv\")\nDF = to_relative(DF, *IM.shape[:2])\nDF.head()\n\n\n\n\n\n\n\n\nx\ny\nX\nY\ntext\nblock_id\n\n\n\n\n0\n0.249538\n0.253501\n0.569316\n0.305322\nConstITUtIO\n0\n\n\n1\n0.288355\n0.369748\n0.401109\n0.397759\nNLTHE\n1\n\n\n2\n0.402957\n0.369748\n0.510166\n0.397759\nPEOPLE\n1\n\n\n3\n0.493530\n0.371148\n0.545287\n0.394958\nOF\n1\n\n\n4\n0.548983\n0.369748\n0.630314\n0.397759\nINDIA,\n1\n\n\n\n\n\n\n\n\n\n\nim = IM.copy()\nim = rescale(im, sz=(400, 600))\nshow(im, sz=5)\n\n\n\n\n\n\n\n\n\ndf = DF.copy()\nim = IM.copy()\nim, df = rescale(im, df, (400, 600))\nshow(im, df=df, sz=5)\ndf.head()\n\n\n---------------------------------------------------------------------------\nValueError Traceback (most recent call last)\n/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb Cell 8 in <cell line: 3>()\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=0'>1</a> df = DF.copy()\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=1'>2</a> im = IM.copy()\n----> <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=2'>3</a> im, df = rescale(im, df, (400, 600))\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=3'>4</a> show(im, df=df, sz=5)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=4'>5</a> df.head()\n\n/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb Cell 8 in rescale(im, bbs, sz)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=110'>111</a> H, W = get_size(sz, h, w)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=111'>112</a> aug = iaa.Resize({\"height\": H, \"width\": W})\n--> <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=112'>113</a> im, bbs = do(im, bbs, aug)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=113'>114</a> if to_pil:\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=114'>115</a> im = PIL.Image.fromarray(im)\n\n/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb Cell 8 in do(img, bbs, aug, cval)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=41'>42</a> __df = combine_xyXY_to_bb(__df)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=42'>43</a> bbs = __df\n---> <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=43'>44</a> if bbs == []:\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=44'>45</a> return img, []\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=45'>46</a> return img, bbs\n\nFile ~/miniconda3/lib/python3.9/site-packages/pandas/core/ops/__init__.py:705, in _comp_method_FRAME.<locals>.f(self, other)\n 701 @Appender(f\"Wrapper for comparison method {op_name}\")\n 702 def f(self, other):\n 703 axis = 1 # only relevant for Series other case\n--> 705 self, other = _align_method_FRAME(self, other, axis, level=None, flex=False)\n 707 # See GH#4537 for discussion of scalar op behavior\n 708 new_data = dispatch_to_series(self, other, op, axis=axis)\n\nFile ~/miniconda3/lib/python3.9/site-packages/pandas/core/ops/__init__.py:503, in _align_method_FRAME(left, right, axis, flex, level)\n 496 raise ValueError(\n 497 \"Unable to coerce to Series/DataFrame, \"\n 498 f\"dimension must be <= 2: {right.shape}\"\n 499 )\n 501 elif is_list_like(right) and not isinstance(right, (ABCSeries, ABCDataFrame)):\n 502 # GH17901\n--> 503 right = to_series(right)\n 505 if flex is not None and isinstance(right, ABCDataFrame):\n 506 if not left._indexed_same(right):\n\nFile ~/miniconda3/lib/python3.9/site-packages/pandas/core/ops/__init__.py:465, in _align_method_FRAME.<locals>.to_series(right)\n 463 else:\n 464 if len(left.columns) != len(right):\n--> 465 raise ValueError(\n 466 msg.format(req_len=len(left.columns), given_len=len(right))\n 467 )\n 468 right = left._constructor_sliced(right, index=left.columns)\n 469 return right\n\nValueError: Unable to coerce to Series, length must be 6: given 0\n\n\n\n\n\n\n\nfor i in range(11):\n angle = (i - 5) * 5\n print(angle)\n im = rotate(IM, angle=angle)\n show(im, sz=1)\n\n-25\n\n\n\n\n\n\n\n\n\n-20\n\n\n\n\n\n\n\n\n\n-15\n\n\n\n\n\n\n\n\n\n-10\n\n\n\n\n\n\n\n\n\n-5\n\n\n\n\n\n\n\n\n\n0\n\n\n\n\n\n\n\n\n\n5\n\n\n\n\n\n\n\n\n\n10\n\n\n\n\n\n\n\n\n\n15\n\n\n\n\n\n\n\n\n\n20\n\n\n\n\n\n\n\n\n\n25\n\n\n\n\n\n\n\n\n\n\ndf = DF.copy()\nim = IM.copy()\nim, df = rotate(im, df, 90)\nshow(im, df=df, sz=20)\nprint(type(im))\ndf.head()\n\n\n\n\n\n\n\n\n<class 'numpy.ndarray'>\n\n\n\n\n\n\n\n\n\ntext\nblock_id\nx\ny\nX\nY\n\n\n\n\n0\nConstITUtIO\n0\n0.693277\n0.249538\n0.745098\n0.569316\n\n\n1\nNLTHE\n1\n0.600840\n0.288355\n0.628852\n0.401109\n\n\n2\nPEOPLE\n1\n0.600840\n0.402957\n0.628852\n0.510166\n\n\n3\nOF\n1\n0.603641\n0.493530\n0.627451\n0.545287\n\n\n4\nINDIA,\n1\n0.600840\n0.548983\n0.628852\n0.630314\n\n\n\n\n\n\n\n\n\n\n\ndf = DF.copy()\nim = IM.copy()\nim, df = pad(im, df, deltas=(90, 90), cval=0)\nshow(im, df=df, sz=20)\nprint(type(im))\ndf.head()\n\n\n\n\n\n\n\n\n<class 'numpy.ndarray'>\n\n\n\n\n\n\n\n\n\ntext\nblock_id\nx\ny\nX\nY\n\n\n\n\n0\nConstITUtIO\n0\n0.310536\n0.302521\n0.550832\n0.343137\n\n\n1\nNLTHE\n1\n0.340111\n0.394958\n0.425139\n0.417367\n\n\n2\nPEOPLE\n1\n0.426987\n0.394958\n0.506470\n0.417367\n\n\n3\nOF\n1\n0.493530\n0.396359\n0.532348\n0.415966\n\n\n4\nINDIA,\n1\n0.536044\n0.394958\n0.597043\n0.417367\n\n\n\n\n\n\n\n\n\n\nAll functions will work with data frames that contain either of absolute/relative coordinates, and will preserve the image type (np.ndarray or PIL.Image.Image) too\n\ndf = DF.copy()\nim = IM.copy()\nheight, width = im.shape\nshow(df.head())\nim = PIL.Image.fromarray(im)\nim, df = rotate(im, df, 45, cval=127)\nim, df = pad(im, df, deltas=(200, 200), cval=0)\nim, df = rescale(im, df, sz=(300, 300))\nshow(im, df=df, sz=20)\nprint(type(im))\ndf.head()\n\n\n\n\n\n\n\n\nx\ny\nX\nY\ntext\nblock_id\n\n\n\n\n0\n0.249538\n0.253501\n0.569316\n0.305322\nConstITUtIO\n0\n\n\n1\n0.288355\n0.369748\n0.401109\n0.397759\nNLTHE\n1\n\n\n2\n0.402957\n0.369748\n0.510166\n0.397759\nPEOPLE\n1\n\n\n3\n0.493530\n0.371148\n0.545287\n0.394958\nOF\n1\n\n\n4\n0.548983\n0.369748\n0.630314\n0.397759\nINDIA,\n1\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<class 'PIL.Image.Image'>\n\n\n\n\n\n\n\n\n\ntext\nblock_id\nx\ny\nX\nY\n\n\n\n\n0\nConstITUtIO\n0\n0.500000\n0.326667\n0.613333\n0.440000\n\n\n1\nNLTHE\n1\n0.473333\n0.383333\n0.516667\n0.426667\n\n\n2\nPEOPLE\n1\n0.506667\n0.416667\n0.550000\n0.460000\n\n\n3\nOF\n1\n0.536667\n0.446667\n0.560000\n0.470000\n\n\n4\nINDIA,\n1\n0.550000\n0.460000\n0.586667\n0.493333", + "crumbs": [ + "Imgaug" + ] + }, + { + "objectID": "imgaug_loader.html#rescale", + "href": "imgaug_loader.html#rescale", + "title": "Imgaug", + "section": "", + "text": "im = IM.copy()\nim = rescale(im, sz=(400, 600))\nshow(im, sz=5)\n\n\n\n\n\n\n\n\n\ndf = DF.copy()\nim = IM.copy()\nim, df = rescale(im, df, (400, 600))\nshow(im, df=df, sz=5)\ndf.head()\n\n\n---------------------------------------------------------------------------\nValueError Traceback (most recent call last)\n/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb Cell 8 in <cell line: 3>()\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=0'>1</a> df = DF.copy()\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=1'>2</a> im = IM.copy()\n----> <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=2'>3</a> im, df = rescale(im, df, (400, 600))\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=3'>4</a> show(im, df=df, sz=5)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=4'>5</a> df.head()\n\n/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb Cell 8 in rescale(im, bbs, sz)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=110'>111</a> H, W = get_size(sz, h, w)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=111'>112</a> aug = iaa.Resize({\"height\": H, \"width\": W})\n--> <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=112'>113</a> im, bbs = do(im, bbs, aug)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=113'>114</a> if to_pil:\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=114'>115</a> im = PIL.Image.fromarray(im)\n\n/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb Cell 8 in do(img, bbs, aug, cval)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=41'>42</a> __df = combine_xyXY_to_bb(__df)\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=42'>43</a> bbs = __df\n---> <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=43'>44</a> if bbs == []:\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=44'>45</a> return img, []\n <a href='vscode-notebook-cell:/Users/yeshwanth.y/code/torch_snippets/nbs/imgaug_loader.ipynb#W6sZmlsZQ%3D%3D?line=45'>46</a> return img, bbs\n\nFile ~/miniconda3/lib/python3.9/site-packages/pandas/core/ops/__init__.py:705, in _comp_method_FRAME.<locals>.f(self, other)\n 701 @Appender(f\"Wrapper for comparison method {op_name}\")\n 702 def f(self, other):\n 703 axis = 1 # only relevant for Series other case\n--> 705 self, other = _align_method_FRAME(self, other, axis, level=None, flex=False)\n 707 # See GH#4537 for discussion of scalar op behavior\n 708 new_data = dispatch_to_series(self, other, op, axis=axis)\n\nFile ~/miniconda3/lib/python3.9/site-packages/pandas/core/ops/__init__.py:503, in _align_method_FRAME(left, right, axis, flex, level)\n 496 raise ValueError(\n 497 \"Unable to coerce to Series/DataFrame, \"\n 498 f\"dimension must be <= 2: {right.shape}\"\n 499 )\n 501 elif is_list_like(right) and not isinstance(right, (ABCSeries, ABCDataFrame)):\n 502 # GH17901\n--> 503 right = to_series(right)\n 505 if flex is not None and isinstance(right, ABCDataFrame):\n 506 if not left._indexed_same(right):\n\nFile ~/miniconda3/lib/python3.9/site-packages/pandas/core/ops/__init__.py:465, in _align_method_FRAME.<locals>.to_series(right)\n 463 else:\n 464 if len(left.columns) != len(right):\n--> 465 raise ValueError(\n 466 msg.format(req_len=len(left.columns), given_len=len(right))\n 467 )\n 468 right = left._constructor_sliced(right, index=left.columns)\n 469 return right\n\nValueError: Unable to coerce to Series, length must be 6: given 0", + "crumbs": [ + "Imgaug" + ] + }, + { + "objectID": "imgaug_loader.html#rotate", + "href": "imgaug_loader.html#rotate", + "title": "Imgaug", + "section": "", + "text": "for i in range(11):\n angle = (i - 5) * 5\n print(angle)\n im = rotate(IM, angle=angle)\n show(im, sz=1)\n\n-25\n\n\n\n\n\n\n\n\n\n-20\n\n\n\n\n\n\n\n\n\n-15\n\n\n\n\n\n\n\n\n\n-10\n\n\n\n\n\n\n\n\n\n-5\n\n\n\n\n\n\n\n\n\n0\n\n\n\n\n\n\n\n\n\n5\n\n\n\n\n\n\n\n\n\n10\n\n\n\n\n\n\n\n\n\n15\n\n\n\n\n\n\n\n\n\n20\n\n\n\n\n\n\n\n\n\n25\n\n\n\n\n\n\n\n\n\n\ndf = DF.copy()\nim = IM.copy()\nim, df = rotate(im, df, 90)\nshow(im, df=df, sz=20)\nprint(type(im))\ndf.head()\n\n\n\n\n\n\n\n\n<class 'numpy.ndarray'>\n\n\n\n\n\n\n\n\n\ntext\nblock_id\nx\ny\nX\nY\n\n\n\n\n0\nConstITUtIO\n0\n0.693277\n0.249538\n0.745098\n0.569316\n\n\n1\nNLTHE\n1\n0.600840\n0.288355\n0.628852\n0.401109\n\n\n2\nPEOPLE\n1\n0.600840\n0.402957\n0.628852\n0.510166\n\n\n3\nOF\n1\n0.603641\n0.493530\n0.627451\n0.545287\n\n\n4\nINDIA,\n1\n0.600840\n0.548983\n0.628852\n0.630314", + "crumbs": [ + "Imgaug" + ] + }, + { + "objectID": "imgaug_loader.html#pad", + "href": "imgaug_loader.html#pad", + "title": "Imgaug", + "section": "", + "text": "df = DF.copy()\nim = IM.copy()\nim, df = pad(im, df, deltas=(90, 90), cval=0)\nshow(im, df=df, sz=20)\nprint(type(im))\ndf.head()\n\n\n\n\n\n\n\n\n<class 'numpy.ndarray'>\n\n\n\n\n\n\n\n\n\ntext\nblock_id\nx\ny\nX\nY\n\n\n\n\n0\nConstITUtIO\n0\n0.310536\n0.302521\n0.550832\n0.343137\n\n\n1\nNLTHE\n1\n0.340111\n0.394958\n0.425139\n0.417367\n\n\n2\nPEOPLE\n1\n0.426987\n0.394958\n0.506470\n0.417367\n\n\n3\nOF\n1\n0.493530\n0.396359\n0.532348\n0.415966\n\n\n4\nINDIA,\n1\n0.536044\n0.394958\n0.597043\n0.417367", + "crumbs": [ + "Imgaug" + ] + }, + { + "objectID": "imgaug_loader.html#augmentations-as-monads", + "href": "imgaug_loader.html#augmentations-as-monads", + "title": "Imgaug", + "section": "", + "text": "All functions will work with data frames that contain either of absolute/relative coordinates, and will preserve the image type (np.ndarray or PIL.Image.Image) too\n\ndf = DF.copy()\nim = IM.copy()\nheight, width = im.shape\nshow(df.head())\nim = PIL.Image.fromarray(im)\nim, df = rotate(im, df, 45, cval=127)\nim, df = pad(im, df, deltas=(200, 200), cval=0)\nim, df = rescale(im, df, sz=(300, 300))\nshow(im, df=df, sz=20)\nprint(type(im))\ndf.head()\n\n\n\n\n\n\n\n\nx\ny\nX\nY\ntext\nblock_id\n\n\n\n\n0\n0.249538\n0.253501\n0.569316\n0.305322\nConstITUtIO\n0\n\n\n1\n0.288355\n0.369748\n0.401109\n0.397759\nNLTHE\n1\n\n\n2\n0.402957\n0.369748\n0.510166\n0.397759\nPEOPLE\n1\n\n\n3\n0.493530\n0.371148\n0.545287\n0.394958\nOF\n1\n\n\n4\n0.548983\n0.369748\n0.630314\n0.397759\nINDIA,\n1\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<class 'PIL.Image.Image'>\n\n\n\n\n\n\n\n\n\ntext\nblock_id\nx\ny\nX\nY\n\n\n\n\n0\nConstITUtIO\n0\n0.500000\n0.326667\n0.613333\n0.440000\n\n\n1\nNLTHE\n1\n0.473333\n0.383333\n0.516667\n0.426667\n\n\n2\nPEOPLE\n1\n0.506667\n0.416667\n0.550000\n0.460000\n\n\n3\nOF\n1\n0.536667\n0.446667\n0.560000\n0.470000\n\n\n4\nINDIA,\n1\n0.550000\n0.460000\n0.586667\n0.493333", + "crumbs": [ + "Imgaug" + ] + }, + { + "objectID": "bokeh_plotting.html", + "href": "bokeh_plotting.html", + "title": "Bokeh Plots", + "section": "", + "text": "bplot = get_bplot()\nbplot.line(np.arange(100), np.cumsum(np.random.uniform(size=100)))\nbshow(bplot)", + "crumbs": [ + "Bokeh Plots" + ] + }, + { + "objectID": "logging.html", + "href": "logging.html", + "title": "Rich Logging and printing", + "section": "", + "text": "Logging is packed in these 5 functions\n\nreset_logger(\"trace\", console_width=80)\nTrace(\"Testing {1,2,3}\")\nDebug(\"TESTING {1,2,3}\")\nInfo(\"TESTING {1,2,3}\")\nWarn(\"TESTING {1,2,3}\")\nExcep(\"TESTING {1,2,3}\")\n\n[08/24/24 12:16:05] TRACE Testing {1,2,3} 1838145784.py:<module>:2\n\n\n\n DEBUG TESTING {1,2,3} 1838145784.py:<module>:3\n\n\n\n INFO TESTING {1,2,3} 1838145784.py:<module>:4\n\n\n\n WARNING TESTING {1,2,3} 1838145784.py:<module>:5\n\n\n\n ERROR TESTING {1,2,3} 1838145784.py:<module>:6\n NoneType: None \n \n \n\n\n\nExcep will also print a traceback\n\ndef do():\n try:\n 1 / 0\n except Exception as e:\n Excep(e)\n\ndef do2():\n do()\n\ndo2()\n\n[08/24/24 12:16:07] ERROR division by zero 1923207781.py:do:5\n ZeroDivisionError: division by \n zero \n \n ╭─ Traceback (most recent call─╮ \n │ in do:3 │ \n │ │ \n │ 1 def do(): │ \n │ 2 │ try: │ \n │ ❱ 3 │ │ 1 / 0 │ \n │ 4 │ except Exception as │ \n │ 5 │ │ Excep(e) │ \n │ 6 │ \n ╰──────────────────────────────╯ \n ZeroDivisionError: division by \n zero \n\n\n\nAll logging functions have an optional depth that will be helpful to raise the context level to outer functions\n\ndef do():\n Info('In do')\n\ndo()\n\n[08/24/24 12:16:15] INFO In do 809811040.py:do:2\n\n\n\n\ndef do2():\n Info('Log will still say it is from `do2` now, to the right of log print')\n\ndef do():\n do2()\n\ndo()\n\n[08/24/24 12:17:13] INFO Log will still say it is from 2099333876.py:do2:2\n `do2` now, to the right of log \n print \n\n\n\n\ndef do2():\n Info('But now, log will still say it is from do', depth=1)\n\ndef do():\n do2()\n\ndo()\n\n[08/24/24 12:17:25] INFO But now, log will still say it 4054019042.py:do:5\n is from do", + "crumbs": [ + "Rich Logging and printing" + ] + }, + { + "objectID": "logging.html#ez-logging", + "href": "logging.html#ez-logging", + "title": "Rich Logging and printing", + "section": "", + "text": "Logging is packed in these 5 functions\n\nreset_logger(\"trace\", console_width=80)\nTrace(\"Testing {1,2,3}\")\nDebug(\"TESTING {1,2,3}\")\nInfo(\"TESTING {1,2,3}\")\nWarn(\"TESTING {1,2,3}\")\nExcep(\"TESTING {1,2,3}\")\n\n[08/24/24 12:16:05] TRACE Testing {1,2,3} 1838145784.py:<module>:2\n\n\n\n DEBUG TESTING {1,2,3} 1838145784.py:<module>:3\n\n\n\n INFO TESTING {1,2,3} 1838145784.py:<module>:4\n\n\n\n WARNING TESTING {1,2,3} 1838145784.py:<module>:5\n\n\n\n ERROR TESTING {1,2,3} 1838145784.py:<module>:6\n NoneType: None \n \n \n\n\n\nExcep will also print a traceback\n\ndef do():\n try:\n 1 / 0\n except Exception as e:\n Excep(e)\n\ndef do2():\n do()\n\ndo2()\n\n[08/24/24 12:16:07] ERROR division by zero 1923207781.py:do:5\n ZeroDivisionError: division by \n zero \n \n ╭─ Traceback (most recent call─╮ \n │ in do:3 │ \n │ │ \n │ 1 def do(): │ \n │ 2 │ try: │ \n │ ❱ 3 │ │ 1 / 0 │ \n │ 4 │ except Exception as │ \n │ 5 │ │ Excep(e) │ \n │ 6 │ \n ╰──────────────────────────────╯ \n ZeroDivisionError: division by \n zero \n\n\n\nAll logging functions have an optional depth that will be helpful to raise the context level to outer functions\n\ndef do():\n Info('In do')\n\ndo()\n\n[08/24/24 12:16:15] INFO In do 809811040.py:do:2\n\n\n\n\ndef do2():\n Info('Log will still say it is from `do2` now, to the right of log print')\n\ndef do():\n do2()\n\ndo()\n\n[08/24/24 12:17:13] INFO Log will still say it is from 2099333876.py:do2:2\n `do2` now, to the right of log \n print \n\n\n\n\ndef do2():\n Info('But now, log will still say it is from do', depth=1)\n\ndef do():\n do2()\n\ndo()\n\n[08/24/24 12:17:25] INFO But now, log will still say it 4054019042.py:do:5\n is from do", + "crumbs": [ + "Rich Logging and printing" + ] + }, + { + "objectID": "logging.html#logging-level-and-context", + "href": "logging.html#logging-level-and-context", + "title": "Rich Logging and printing", + "section": "Logging Level and context", + "text": "Logging Level and context\n\n\nin_logger_mode\n\n in_logger_mode (level:str)\n\nreturn’s T/F, checking if logger is in a specific mode or not\n\n\n\nlogger_mode\n\n logger_mode (level)\n\ntemporarily, using with context, set the level to something else\n\n\n\nget_logger_level\n\n get_logger_level ()\n\nget the current logger’s level\nLet’s log every level in the do function below. We can control what we need to log from outside the function’s context by\nusing with <level>_model():\n\ndef do():\n Trace(0)\n Debug(1)\n Info(2)\n Warn(3)\n Excep(4)\n\n\ndef line(x):\n sep = \"=\" * 20\n print(f\"{sep}{x}{sep}\")\n print(f\"{in_excep_mode()=}\")\n print(f\"{in_warn_mode()=}\")\n print(f\"{in_info_mode()=}\")\n print(f\"{in_debug_mode()=}\")\n print(f\"{in_trace_mode()=}\")\n\n\nreset_logger()\n\nwith excep_mode():\n line(\"Excep mode\")\n do()\n\nwith warn_mode():\n line(\"Warn mode\")\n do()\n\nwith info_mode():\n line(\"Info mode\")\n do()\n\nwith debug_mode():\n line(\"Debug mode\")\n do()\n\nwith trace_mode():\n line(\"Trace mode\")\n do()\n\n====================Excep mode====================\nin_excep_mode()=True\nin_warn_mode()=False\nin_info_mode()=False\nin_debug_mode()=False\nin_trace_mode()=False\n\n\n[08/24/24 12:13:08] ERROR 4 3432048509.py:do:6\n NoneType: None \n \n \n\n\n\n====================Warn mode====================\nin_excep_mode()=False\nin_warn_mode()=True\nin_info_mode()=False\nin_debug_mode()=False\nin_trace_mode()=False\n\n\n[08/24/24 12:13:08] WARNING 3 3432048509.py:do:5\n\n\n\n ERROR 4 3432048509.py:do:6\n NoneType: None \n \n \n\n\n\n====================Info mode====================\nin_excep_mode()=False\nin_warn_mode()=False\nin_info_mode()=True\nin_debug_mode()=False\nin_trace_mode()=False\n\n\n[08/24/24 12:13:08] INFO 2 3432048509.py:do:4\n\n\n\n WARNING 3 3432048509.py:do:5\n\n\n\n ERROR 4 3432048509.py:do:6\n NoneType: None \n \n \n\n\n\n====================Debug mode====================\nin_excep_mode()=False\nin_warn_mode()=False\nin_info_mode()=False\nin_debug_mode()=True\nin_trace_mode()=False\n\n\n[08/24/24 12:13:08] DEBUG 1 3432048509.py:do:3\n\n\n\n INFO 2 3432048509.py:do:4\n\n\n\n WARNING 3 3432048509.py:do:5\n\n\n\n ERROR 4 3432048509.py:do:6\n NoneType: None \n \n \n\n\n\n====================Trace mode====================\nin_excep_mode()=False\nin_warn_mode()=False\nin_info_mode()=False\nin_debug_mode()=False\nin_trace_mode()=True\n\n\n[08/24/24 12:13:08] TRACE 0 3432048509.py:do:2\n\n\n\n DEBUG 1 3432048509.py:do:3\n\n\n\n INFO 2 3432048509.py:do:4\n\n\n\n WARNING 3 3432048509.py:do:5\n\n\n\n ERROR 4 3432048509.py:do:6\n NoneType: None \n \n \n\n\n\nThe in_<level>_mode gives an additional layer of control, to be used for debugging dynamically. Let’s say, you want to show an image (for the sake of debugging)\n\ndef do(im_path):\n from torch_snippets import show, read\n im = read(im_path)\n show(im, sz=3)\n print(im.mean())\n\ndo('assets/Preamble.png')\n\n\n\n\n\n\n\n\n145.5542982442515\n\n\nBut now you are happy with your code and don’t want the show, say the code is going to production. A common way out is to just comment that line\n\ndef do(im_path):\n from torch_snippets import show, read\n im = read(im_path)\n # show(im, sz=3) # line is commented, but will need to be re-uncommented any time it needs debugging\n print(im.mean())\n\ndo('assets/Preamble.png')\n\n145.5542982442515\n\n\nBut if you want to re-check, it’s a pain to again uncomment. Not to mention this method is not scalable to 100s of lines of code. The simple way to deal with such transient code that needs to activate only when you want it to, is to enclose in an if in_<level>_mode conditional like so\n\ndef do(im_path):\n from torch_snippets import show, read\n im = read(im_path)\n if in_debug_mode():\n show(im, sz=3)\n print(im.mean())\n\ndo('assets/Preamble.png')\n\n145.5542982442515\n\n\nThis way, you can always activate the show by calling do with a temporary with_debug_mode context\n\nwith debug_mode():\n do('assets/Preamble.png')\n\n\n\n\n\n\n\n\n145.5542982442515", + "crumbs": [ + "Rich Logging and printing" + ] + }, + { + "objectID": "logging.html#notify-waiting", + "href": "logging.html#notify-waiting", + "title": "Rich Logging and printing", + "section": "Notify Waiting", + "text": "Notify Waiting\n\nreset_logger(console_width=100)\n\nwith trace_mode():\n with notify_waiting(\"Downloading\"):\n time.sleep(10)\n\nwith notify_waiting(\"Downloading\", spinner=\"guess_the_movie\"):\n time.sleep(10)\n\nwith notify_waiting(\"One more message\", spinner=\"earth\"):\n time.sleep(3)\n\n[08/24/24 12:36:51] TRACE Available Spinners: dict_keys(['dots', 'dots2', 'dots3', 'dots4', 'dots5', 'dots6', 'dots7', 'dots8', 'dots9', 3340474699.py:notify_waiting:41\n 'dots10', 'dots11', 'dots12', 'dots8Bit', 'line', 'line2', 'pipe', 'simpleDots', 'simpleDotsScrolling', 'star', \n 'star2', 'flip', 'hamburger', 'growVertical', 'growHorizontal', 'balloon', 'balloon2', 'noise', 'bounce', \n 'boxBounce', 'boxBounce2', 'triangle', 'arc', 'circle', 'squareCorners', 'circleQuarters', 'circleHalves', \n 'squish', 'toggle', 'toggle2', 'toggle3', 'toggle4', 'toggle5', 'toggle6', 'toggle7', 'toggle8', 'toggle9', \n 'toggle10', 'toggle11', 'toggle12', 'toggle13', 'arrow', 'arrow2', 'arrow3', 'bouncingBar', 'bouncingBall', \n 'smiley', 'monkey', 'hearts', 'clock', 'earth', 'material', 'moon', 'runner', 'pong', 'shark', 'dqpb', \n 'weather', 'christmas', 'grenade', 'point', 'layer', 'betaWave', 'aesthetic', 'guess', 'guess_the_movie']) \n \n Using: clock \n\n\n\n\n\n\n\n\n\n[08/24/24 12:37:01] INFO Downloading - Completed in 10.01 s contextlib.py:__exit__:144\n\n\n\n\n\n\n\n\n\n[08/24/24 12:37:11] INFO Downloading - Completed in 10.01 s contextlib.py:__exit__:144\n\n\n\n\n\n\n\n\n\n[08/24/24 12:37:14] INFO One more message - Completed in 3.00 s contextlib.py:__exit__:144", + "crumbs": [ + "Rich Logging and printing" + ] + }, + { + "objectID": "report.html", + "href": "report.html", + "title": "Report", + "section": "", + "text": "Report\n\n\nfrom torch_snippets.torch_loader import Report\nimport numpy as np\nimport time\n\n\nn_epochs = 3\nreport = Report(n_epochs)\nrandom_walker1 = 0\nrandom_walker2 = 0\n\nfor epoch in range(n_epochs):\n for ix in range(1000):\n report.record(\n pos=epoch + (ix + 1) / 1000,\n loss=random_walker1,\n val_loss=random_walker2,\n end=\"\\r\",\n )\n random_walker1 += np.random.normal()\n random_walker2 += np.random.normal()\n time.sleep(0.001)\n report.report_avgs(epoch + 1)\n\nreport.plot()\n\nEPOCH: 1.000 loss: -6.503 val_loss: -3.093 (1.19s - 2.38s remaining)))\nEPOCH: 2.000 loss: 48.754 val_loss: -6.265 (2.37s - 1.18s remaining))\nEPOCH: 3.000 loss: 38.115 val_loss: -29.732 (3.54s - 0.00s remaining)\n\n\n\n\n\n\n\n\n\n\nn_epochs = 5\nreport = Report(n_epochs, old_report=report)\n\nfor epoch in range(n_epochs):\n for ix in range(1000):\n report.record(\n pos=epoch + (ix + 1) / 1000,\n loss=random_walker1,\n val_loss=random_walker2,\n end=\"\\r\",\n )\n random_walker1 += np.random.normal()\n random_walker2 += np.random.normal()\n time.sleep(0.001)\n report.report_avgs(epoch + 1)\n\nEPOCH: 1.000 loss: 29.338 val_loss: -74.955 (1.17s - 4.70s remaining))\nEPOCH: 2.000 loss: 0.340 val_loss: -110.763 (2.35s - 3.52s remaining)))\nEPOCH: 3.000 loss: 30.617 val_loss: -84.599 (3.51s - 2.34s remaining))\nEPOCH: 4.000 loss: 34.309 val_loss: -27.520 (4.68s - 1.17s remaining)\nEPOCH: 5.000 loss: 15.252 val_loss: -46.033 (5.85s - 0.00s remaining)\n\n\n\nimport matplotlib.pyplot as plt\n\nfig, ax = plt.subplots()\nax.vlines(0, -100, 100, colors=[\"red\"])\nreport.plot(ax=ax)", + "crumbs": [ + "Report" + ] + }, + { + "objectID": "registry.html", + "href": "registry.html", + "title": "Registry", + "section": "", + "text": "Suppose you have a file called config.ini like so…\n\n!cat /tmp/config.ini\n\n\n[META]\nversion = 0.0.1\nname = mnist\nroot = /home/me/projects/${META.name}\ndescription = This is a sample\n config file with a multiline\n description. These are useful for\n project descriptions/changelog/devnotes etc...\n\n[Data]\nsource = https://files.fast.ai/data/examples/mnist_tiny.tgz\nroot = ${META.root}/data/\n\n[misc]\nx = 1\ny = 20\nz = float(${x}*${y}**2)\na = ['hello','hi','how','are','you', ${x}*${z}*${y}]\nb = {\"hi\": 1, \"hello\": 2}\n\n[load]\n [load.test]\n @load = print_root_location\n root = ${Data.root}\n \n [load.csv]\n @load = load_csv_function\n root = ${Data.root}\n \n [load.json]\n @load = load_json_class\n root = ${Data.root}\n \n \n\n\n\nYou can load it up as an AttrDict\n\nconfig = parse(\"/tmp/config.ini\")\nassert config.META.version == \"0.0.1\"\nassert config.META.root == \"/home/me/projects/mnist\"\nassert isinstance(config.misc.b, AttrDict), type(config.project.data.b)\nassert isinstance(config.misc.a, L)\n\nNotice, how the ${} variables got resolved.\nNot just that, the varaible z got computed on the fly.\nNot just that, some of the variables like list and dict got resolved into their respective python data structures.\n\nconfig.pretty()\n\n{\n \"Data\": {\n \"root\": \"/home/me/projects/mnist/data/\",\n \"source\": \"https://files.fast.ai/data/examples/mnist_tiny.tgz\"\n },\n \"META\": {\n \"description\": \"This is a sample\\nconfig file with a multiline\\ndescription. These are useful for\\nproject \ndescriptions/changelog/devnotes etc...\",\n \"name\": \"mnist\",\n \"root\": \"/home/me/projects/mnist\",\n \"version\": \"0.0.1\"\n },\n \"load\": {\n \"csv\": {\n \"@load\": null,\n \"root\": \"/home/me/projects/mnist/data/\"\n },\n \"json\": {\n \"@load\": \"load_json_class\",\n \"root\": \"/home/me/projects/mnist/data/\"\n },\n \"test\": {\n \"@load\": \"print_root_location\",\n \"root\": \"/home/me/projects/mnist/data/\"\n }\n },\n \"misc\": {\n \"a\": [\n \"hello\",\n \"hi\",\n \"how\",\n \"are\",\n \"you\",\n 8000.0\n ],\n \"b\": {\n \"hello\": 2,\n \"hi\": 1\n },\n \"x\": 1,\n \"y\": 20,\n \"z\": 400.0\n }\n}\n\n\n\n\nprint(config.META.description)\n\nThis is a sample\nconfig file with a multiline\ndescription. These are useful for\nproject descriptions/changelog/devnotes etc...\n\n\nYou can also register/call python functions/callables/classes/objects to strings by running\n\nregistry.create(\"load\")\n\n\n@registry.load.register(\"print_root_location\")\ndef printer(root):\n return root\n\n\n@registry.load.register(\"load_csv_function\")\ndef _load_csv_function(root):\n def load_csv_function(file):\n return f\"Loading file from {root}/{file}\"\n\n return load_csv_function\n\n\n@registry.load.register(\"load_json_class\")\nclass JsonLoader:\n def __init__(self, root):\n self.root = root\n\n def __call__(self, file):\n assert file.endswith(\"json\")\n return f\"Loading file from {self.root}/{file}\"\n\n… and resolve them on parse\n\nconfig = parse_and_resolve(\"/tmp/config.ini\")\n\n\nconfig.load.test\n\n'/home/me/projects/mnist/data/'\n\n\n\nconfig.load.csv(file=\"file.csv\")\n\n'Loading file from /home/me/projects/mnist/data//file.csv'\n\n\n\nconfig.load.json(file=\"file.json\")\n\n'Loading file from /home/me/projects/mnist/data//file.json'", + "crumbs": [ + "Registry" + ] + }, + { + "objectID": "config.html", + "href": "config.html", + "title": "torch_snippets", + "section": "", + "text": "DeepLearningConfig\n\n DeepLearningConfig ()\n\n*A configuration class for deep learning models.\nThis class provides methods to access and manipulate configuration settings.\nAttributes: input_variables (list): List of input variables defined in the class constructor.\nMethods: keys(): Returns the list of input variables. getitem(key): Returns the value of the specified key. contains(key): Checks if the specified key is present in the input variables. from_ini_file(filepath, config_root=None): Creates an instance of the class from an INI file. repr(): Returns a string representation of the class.\nExample usage: config = DeepLearningConfig() config.from_ini_file(‘config.ini’) print(config.keys()) print(config[‘learning_rate’])*\n\nfrom torch_snippets.registry import parse_string\nfrom torch_snippets.torch_loader import *\nfrom torch_snippets import writelines\n\n\nconfig_str = \"\"\"\n[META]\nexperiment = mnist.v1\ndescription = Training MLP with \n mnist data on 10k images only\n using huggingface trainer and \n cosine annealing\n\n[ModelConfig]\nn_layers = 3\nn_hidden = 256\nn_classes = 10\n\n[DatasetConfig]\nroot = /home/datasets/mnist\ntrain = ${root}/train\nval = ${root}/val\ntrain_subset = 10000\nval_subest = ${train_subset}//10\n\n[TrainingConfig]\nmax_steps = ${DatasetConfig.train_subset} * 5\nlearning_rate = 3e-4\noutput_dir = ./results/${META.experiment}\nper_device_train_batch_size = 256\nper_device_eval_batch_size = ${per_device_train_batch_size}\nevaluation_strategy = \"steps\"\neval_steps = 500\nlogging_strategy = ${evaluation_strategy}\nlogging_steps = ${eval_steps}//100\nsave_strategy = ${evaluation_strategy}\nsave_steps = ${eval_steps}\nsave_total_limit = 1\nseed = 1234\nlabel_names = ['targets']\nlr_scheduler_type = cosine\n\"\"\".strip()\n\nconfig = parse_string(config_str)\n\n\nclass MNIST(nn.Module):\n def __init__(self, config):\n super().__init__()\n self.model = nn.Sequential(\n nn.Linear(768, config.n_hidden),\n *[\n nn.Sequential(nn.Linear(config.n_hidden, config.n_hidden), nn.ReLU())\n for _ in range(config.n_layers - 1)\n ],\n nn.Linear(config.n_hidden, config.n_classes)\n )\n\n def forward(self, images): ...\n\n\nmodel = MNIST(config.ModelConfig)\nprint(model)\n\nMNIST(\n (model): Sequential(\n (0): Linear(in_features=768, out_features=256, bias=True)\n (1): Sequential(\n (0): Linear(in_features=256, out_features=256, bias=True)\n (1): ReLU()\n )\n (2): Sequential(\n (0): Linear(in_features=256, out_features=256, bias=True)\n (1): ReLU()\n )\n (3): Linear(in_features=256, out_features=10, bias=True)\n )\n)\n\n\nIf needed, configs can be unpacked like a dictionary too\n\nclass MNIST(nn.Module):\n \"\"\"\n A PyTorch module for a multi-layer perceptron (MLP) model for MNIST classification.\n\n Args:\n n_hidden (int): The number of hidden units in each hidden layer.\n n_classes (int): The number of output classes.\n n_layers (int): The number of hidden layers in the model.\n\n Attributes:\n model (nn.Sequential): The sequential model that represents the MLP.\n\n \"\"\"\n\n def __init__(self, *, n_hidden, n_classes, n_layers):\n super().__init__()\n self.model = nn.Sequential(\n nn.Linear(768, n_hidden),\n *[\n nn.Sequential(nn.Linear(n_hidden, n_hidden), nn.ReLU())\n for _ in range(n_layers - 1)\n ],\n nn.Linear(n_hidden, n_classes)\n )\n\n def forward(self, images): ...\n\n\nmodel = MNIST(**config.ModelConfig)\nprint(model)\n\nMNIST(\n (model): Sequential(\n (0): Linear(in_features=768, out_features=256, bias=True)\n (1): Sequential(\n (0): Linear(in_features=256, out_features=256, bias=True)\n (1): ReLU()\n )\n (2): Sequential(\n (0): Linear(in_features=256, out_features=256, bias=True)\n (1): ReLU()\n )\n (3): Linear(in_features=256, out_features=10, bias=True)\n )\n)\n\n\n\n\n\nGenericConfig\n\n GenericConfig (**kwargs)\n\n*A configuration class for deep learning models.\nThis class provides methods to access and manipulate configuration settings.\nAttributes: input_variables (list): List of input variables defined in the class constructor.\nMethods: keys(): Returns the list of input variables. getitem(key): Returns the value of the specified key. contains(key): Checks if the specified key is present in the input variables. from_ini_file(filepath, config_root=None): Creates an instance of the class from an INI file. repr(): Returns a string representation of the class.\nExample usage: config = DeepLearningConfig() config.from_ini_file(‘config.ini’) print(config.keys()) print(config[‘learning_rate’])*\nGenericConfig is a special class that can have attributes solely based on the config file, i.e., when we are unsure what are the arguments in the config going to be\n\nwritelines(config_str.split(\"\\n\"), \"/tmp/tmp.ini\", \"w\")\ntraining_config = GenericConfig.from_ini_file(\n \"/tmp/tmp.ini\", config_root=\"TrainingConfig\"\n)\n\n\ndef train(**kwargs):\n for k, v in kwargs.items():\n print(k, v)\n\n\ntrain(**training_config)\n\nmax_steps 50000\nlearning_rate 0.00030000000000000003\noutput_dir ./results/mnist.v1\nper_device_train_batch_size 256\nper_device_eval_batch_size 256\nevaluation_strategy steps\neval_steps 500\nlogging_strategy steps\nlogging_steps 5\nsave_strategy steps\nsave_steps 500\nsave_total_limit 1\nseed 1234\nlabel_names ['targets']\nlr_scheduler_type cosine", + "crumbs": [ + "config.html" + ] + }, + { + "objectID": "paths.html", + "href": "paths.html", + "title": "Paths", + "section": "", + "text": "Paths\nUtilities to manipulate Paths\n\n\nprint(P().ls())\nprint(P().resolve())\n\n[» _quarto.yml, » decorators.ipynb, » markups.ipynb, » sidebar.yml, » AttrDict.ipynb, » interactive_show.ipynb, » load_defautls.ipynb, » sklegos.ipynb, » bounding_boxes.ipynb, » show.ipynb, » pdf.ipynb, » charts.ipynb, » paths.ipynb, » nbdev.yml, » tmp.csv, » jupyter_notebook.ipynb, » config.ipynb, » misc.ipynb, » registry.ipynb, » adapters.ipynb, » report.ipynb, » .ipynb_checkpoints, » capsule.ipynb, » logging.ipynb, » inspector.ipynb, » bokeh_plotting.ipynb, » index.ipynb, » imgaug_loader.ipynb]\n/Users/yeshwanth/Code/Personal/torch_snippets/nbs\n\n\n\n# !touch tmp.txt tmp.csv\n# # x = P()\n# x.tmp__csv, x.tmp__txt, x.misc\n\n\n!rm tmp.txt tmp.misc\n\nrm: tmp.txt: No such file or directory\nrm: tmp.misc: No such file or directory\n\n\n\n\nPath.rm\n\n Path.rm (confirm_prompt='Are you sure you want to delete `{self}`?\n [y/N]', silent=True, missing_ok=True, force=False,\n dry_run=False)\n\n\n\n\nremove_file\n\n remove_file (dry_run)\n\n\n\n\nPath.cp\n\n Path.cp (to)\n\n\n\n\nPath.mv\n\n Path.mv (to)\n\n\n\n\nPath.sample\n\n Path.sample (pattern='*')\n\n\n\n\nextn\n\n extn (fpath)\n\n\n\n\nPath.extn\n\n Path.extn ()\n\n\n\n\nPath.sz\n\n Path.sz ()\n\n\n\n\nPath.size\n\n Path.size ()\n\n\n\n\nPath.rmtree\n\n Path.rmtree (prompt='Really remove `{self}` and its contents? [y/n] ',\n force=False)\n\n\np = P(\"test.txt\")\np.touch()\nlogger.info(p.size())\n\n[08/24/24 11:12:12] INFO 0 KB 1417366103.py:<module>:3\n\n\n\nPath objects can be moved and copied\n\np = p.mv(\"test1.txt\")\nq = p.cp(\"test2.txt\")\n\nPath objects have a size, extn (extension) and parent attributes\n\nassert isinstance(q, P)\nassert q.size() == \"0 KB\"\nassert str(p) == \"test1.txt\"\nassert p.extn == \"txt\"\nassert p.parent == P()\n\nThey can be deleted with/without a prompt\n\np.rm(force=True)\nq.rm(confirm_prompt=False)\n\nFolders can be globbed with a default of everything\n\np = P(\"../torch_snippets\")\nassert P().ls() == P().Glob()\np.Glob(\"*.py\")\n\n(#34) [» ../torch_snippets/misc.py,» ../torch_snippets/load_defaults.py,» ../torch_snippets/text_utils.py,» ../torch_snippets/_nbdev.py,» ../torch_snippets/paths.py,» ../torch_snippets/charts.py,» ../torch_snippets/pdf_loader.py,» ../torch_snippets/interactive_show.py,» ../torch_snippets/registry.py,» ../torch_snippets/markup2.py,» ../torch_snippets/_modidx.py,» ../torch_snippets/inspector.py,» ../torch_snippets/__init__.py,» ../torch_snippets/tmp.py,» ../torch_snippets/torch_loader.py,» ../torch_snippets/logger.py,» ../torch_snippets/markup.py,» ../torch_snippets/fastcores.py,» ../torch_snippets/sklegos.py,» ../torch_snippets/cli.py...]\n\n\nYou can sample a random file from the directory\n\nq = p.sample(\"*.py\")\nInfo(f\"Sample file: `{q}`\")\nInfo(f\"Sample file size: `{q.size()}`\")\n\n INFO Sample file: `../torch_snippets/logger.py` 1725593160.py:<module>:2\n\n\n\n INFO Sample file size: `9 KB` 1725593160.py:<module>:3\n\n\n\n\ntry:\n p.size()\nexcept Exception as e:\n logger.warning(e)\n\n WARNING `../torch_snippets` is a directory 1980994904.py:<module>:4\n\n\n\n\np = P(\"test.txt\")\np.touch()\nassert isdir(p) == False\nassert fname(p) == \"test.txt\"\nassert parent(p) == P()\nassert stem(p) == \"test\"\nassert extn(p) == \"txt\"\n\nprint(find(\"capsule\", Glob(\"./\")))\n\np.rm(confirm_prompt=False)\n\ncapsule.ipynb\n\n\n\n\n\nlist_zip\n\n list_zip (file)\n\n\n\n\nunzip_file\n\n unzip_file (file, dest)\n\n\n\n\nzip_files\n\n zip_files (list_of_files, dest)\n\n\n!touch test1.txt test2.txt\nf = zip_files(P().Glob(\"*.txt\"), \"test.tar.gz\")\nunzip_file(f, \"./\")\n[f.rm(force=True) for f in P().Glob(\"*.txt\")]\nP(\"test.tar.gz\").rm(force=True)\n\n!touch test1.txt test2.txt\nf = zip_files(P().Glob(\"*.txt\"), \"test.zip\")\nunzip_file(f, \"./\")\n[f.rm(force=True) for f in P().Glob(\"*.txt\")]\nP(\"test.zip\").rm(force=True)\n\n INFO Zipping 2 files to test.tar.gz... 3826617683.py:zip_files:8\n\n\n\n100%|██████████| 2/2 [00:00<00:00, 649.78it/s]\n/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_40147/3826617683.py:27: DeprecationWarning: Python 3.14 will, by default, filter extracted tar archives and reject files or modify their metadata. Use the filter argument to control this behavior.\n f.extractall(dest)\n\n\n INFO Zipping 2 files to test.zip... 3826617683.py:zip_files:8\n\n\n\n100%|██████████| 2/2 [00:00<00:00, 2958.94it/s]\n\n\n\n\n\nfolder_summary\n\n folder_summary (thing)\n\n\n\n\ncommon_items\n\n common_items (*fldrs, verbose=True)\n\n\n\n\nremove_duplicates\n\n remove_duplicates (files)\n\nCheck a list of files and remove duplicates based on their checksum\n\n\n\nmd5\n\n md5 (fname)\n\n\nmd5(\"paths.ipynb\")\n\n'74eb392fa44e9293fb30ffed68c14112'\n\n\n\n\n\nPath.write_lines\n\n Path.write_lines (lines, mode)\n\n\n\n\nwritelines\n\n writelines (lines, file, mode)\n\n\n\n\nPath.read_file\n\n Path.read_file (**kwargs)\n\n\n\n\nreadfile\n\n readfile (*args, **kwargs)\n\n\n\n\nPath.read_lines\n\n Path.read_lines (silent=False, encoding=None)\n\n\n\n\nreadlines\n\n readlines (fpath, silent=False, encoding=None, _strip=True)\n\n\nP(\"paths.ipynb\").read_lines()[:10]\n\n INFO loaded 1075 lines 2901855681.py:read_lines:13\n\n\n\n['{',\n '\"cells\": [',\n '{',\n '\"cell_type\": \"raw\",',\n '\"metadata\": {},',\n '\"source\": [',\n '\"# Paths\\\\n\",',\n '\"Utilities to manipulate Paths\\\\n\",',\n '\"---\\\\n\",',\n '\"{}\\\\n\",']\n\n\n\n\n\ntree\n\n tree (directory='./', filelimit=50, to=None)\n\n\nP(\"../\").tree\n\n/Users/yeshwanth/Code/Personal/torch_snippets\n ── LICENSE\n ── LICENSE.txt\n ── MANIFEST\n ── MANIFEST.in\n ── Makefile\n ── README.md\n ── Screenshot 2022-09-08 at 4.40.18 PM.png\n ── __module_timing__.py.lprof\n ── _proc\n    ── AttrDict.ipynb\n    ── _quarto.yml\n    ── adapters.ipynb\n    ── bokeh_plotting.ipynb\n    ── bounding_boxes.ipynb\n    ── capsule.ipynb\n    ── charts.ipynb\n    ── config.ipynb\n    ── decorators.ipynb\n    ── docs\n       ── AttrDict.html\n       ── adapters.html\n       ── bokeh_plotting.html\n       ── bounding_boxes.html\n       ── bounding_boxes_files\n          ── figure-html\n          ── cell-6-output-1.png\n          ── cell-7-output-1.png\n          ── cell-8-output-1.png\n          ── cell-9-output-1.png\n       ── capsule.html\n       ── capsule_files\n          ── figure-html\n          ── cell-6-output-2.png\n       ── charts.html\n       ── charts_files\n          ── figure-html\n          ── cell-7-output-1.png\n       ── config.html\n       ── decorators.html\n       ── imgaug_loader.html\n       ── imgaug_loader_files\n          ── figure-html\n          ── cell-3-output-1.png\n          ── cell-5-output-10.png\n          ── cell-5-output-12.png\n          ── cell-5-output-14.png\n          ── cell-5-output-16.png\n          ── cell-5-output-18.png\n          ── cell-5-output-2.png\n          ── cell-5-output-20.png\n          ── cell-5-output-22.png\n          ── cell-5-output-4.png\n          ── cell-5-output-6.png\n          ── cell-5-output-8.png\n          ── cell-6-output-1.png\n          ── cell-7-output-1.png\n          ── cell-8-output-2.png\n       ── index.html\n       ── inspector.html\n       ── interactive_show.html\n       ── jupyter_notebook.html\n       ── load_defautls.html\n       ── logging.html\n       ── markups.html\n       ── misc.html\n       ── paths.html\n       ── pdf.html\n       ── registry.html\n       ── report.html\n       ── report_files\n          ── figure-html\n          ── cell-3-output-2.png\n          ── cell-5-output-1.png\n       ── robots.txt\n       ── search.json\n       ── show.html\n       ── show_files\n          ── figure-html\n          ── cell-2-output-1.png\n          ── cell-3-output-1.png\n          ── cell-4-output-2.png\n          ── cell-4-output-4.png\n          ── cell-4-output-6.png\n          ── cell-5-output-1.png\n          ── cell-8-output-1.png\n          ── cell-9-output-1.png\n       ── site_libs\n          ── bootstrap\n             ── bootstrap-icons.css\n             ── bootstrap-icons.woff\n             ── bootstrap.min.css\n             ── bootstrap.min.js\n          ── clipboard\n             ── clipboard.min.js\n          ── quarto-html\n             ── anchor.min.js\n             ── popper.min.js\n             ── quarto-syntax-highlighting.css\n             ── quarto.js\n             ── tippy.css\n             ── tippy.umd.min.js\n          ── quarto-nav\n             ── headroom.min.js\n             ── quarto-nav.js\n          ── quarto-search\n          ── autocomplete.umd.js\n          ── fuse.min.js\n          ── quarto-search.js\n       ── sitemap.xml\n       ── sklegos.html\n    ── imgaug_loader.ipynb\n    ── index.ipynb\n    ── inspector.ipynb\n    ── interactive_show.ipynb\n    ── jupyter_notebook.ipynb\n    ── load_defautls.ipynb\n    ── logging.ipynb\n    ── markups.ipynb\n    ── misc.ipynb\n    ── nbdev.yml\n    ── paths.ipynb\n    ── pdf.ipynb\n    ── registry.ipynb\n    ── report.ipynb\n    ── show.ipynb\n    ── sidebar.yml\n    ── sklegos.ipynb\n    ── test.txt\n    ── test1.txt\n    ── test2.txt\n    ── tmp.csv\n    ── tmp.txt\n ── assets\n    ── Preamble.csv\n    ── Preamble.png\n    ── avgs0.png\n    ── avgs1.png\n    ── demo.gif\n ── backups\n    ── testing\n    ── 0000.html\n ── build\n    ── bdist.macosx-11.1-arm64\n    ── lib\n    ── torch_snippets\n    ── __init__.py\n    ── __module_timing__.py\n    ── _modidx.py\n    ── _nbdev.py\n    ── adapters.py\n    ── bb_utils.py\n    ── bokeh_loader.py\n    ── charts.py\n    ── cli.py\n    ── dates.py\n    ── decorators.py\n    ── fastcores.py\n    ── icecream.py\n    ── imgaug_loader.py\n    ── inspector.py\n    ── interactive_show.py\n    ── ipython.py\n    ── load_defaults.py\n    ── loader.py\n    ── logger.py\n    ── markup.py\n    ── markup2.py\n    ── misc.py\n    ── paths.py\n    ── pdf_loader.py\n    ── registry.py\n    ── s3_loader.py\n    ── scp.py\n    ── sklegos.py\n    ── text_utils.py\n    ── thinc_parser\n       ── __init__.py\n       ── parser.py\n    ── tmp.py\n    ── torch_loader.py\n    ── trainer\n       ── __init__.py\n       ── capsule.py\n       ── config.py\n       ── hooks.py\n       ── neural_graph.py\n    ── video.py\n    ── zen.py\n ── changelog.md\n ── conda\n    ── torch_snippets\n    ── meta.yaml\n ── debug\n    ── profile_time.txt\n    ── profile_time_202408241027.txt\n ── dist\n    ── torch_snippets-0.6.0-py3-none-any.whl\n    ── torch_snippets-0.6.0.tar.gz\n ── docker-compose.yml\n ── docs\n    ── AttrDict.html\n    ── adapters.html\n    ── bokeh_plotting.html\n    ── bounding_boxes.html\n    ── bounding_boxes_files\n       ── figure-html\n       ── cell-6-output-1.png\n       ── cell-7-output-1.png\n       ── cell-8-output-1.png\n       ── cell-9-output-1.png\n    ── capsule.html\n    ── capsule_files\n       ── figure-html\n       ── cell-5-output-2.png\n    ── charts.html\n    ── charts_files\n       ── figure-html\n       ── cell-7-output-1.png\n    ── config.html\n    ── decorators.html\n    ── imgaug_loader.html\n    ── imgaug_loader_files\n       ── figure-html\n       ── cell-3-output-1.png\n       ── cell-5-output-10.png\n       ── cell-5-output-12.png\n       ── cell-5-output-14.png\n       ── cell-5-output-16.png\n       ── cell-5-output-18.png\n       ── cell-5-output-2.png\n       ── cell-5-output-20.png\n       ── cell-5-output-22.png\n       ── cell-5-output-4.png\n       ── cell-5-output-6.png\n       ── cell-5-output-8.png\n       ── cell-6-output-1.png\n       ── cell-7-output-1.png\n       ── cell-8-output-2.png\n    ── index.html\n    ── inspector.html\n    ── interactive_show.html\n    ── jupyter_notebook.html\n    ── load_defautls.html\n    ── logging.html\n    ── markups.html\n    ── misc.html\n    ── paths.html\n    ── pdf.html\n    ── registry.html\n    ── report.html\n    ── report_files\n       ── figure-html\n       ── cell-3-output-2.png\n       ── cell-5-output-1.png\n    ── robots.txt\n    ── search.json\n    ── show.html\n    ── show_files\n       ── figure-html\n       ── cell-2-output-1.png\n       ── cell-3-output-1.png\n       ── cell-4-output-2.png\n       ── cell-4-output-4.png\n       ── cell-4-output-6.png\n       ── cell-5-output-1.png\n       ── cell-8-output-1.png\n       ── cell-9-output-1.png\n    ── site_libs\n       ── bootstrap\n          ── bootstrap-icons.css\n          ── bootstrap-icons.woff\n          ── bootstrap.min.css\n          ── bootstrap.min.js\n       ── clipboard\n          ── clipboard.min.js\n       ── quarto-html\n          ── anchor.min.js\n          ── popper.min.js\n          ── quarto-syntax-highlighting.css\n          ── quarto.js\n          ── tippy.css\n          ── tippy.umd.min.js\n       ── quarto-nav\n          ── headroom.min.js\n          ── quarto-nav.js\n       ── quarto-search\n       ── autocomplete.umd.js\n       ── fuse.min.js\n       ── quarto-search.js\n    ── sitemap.xml\n    ── sklegos.html\n ── nbs\n    ── AttrDict.ipynb\n    ── _quarto.yml\n    ── adapters.ipynb\n    ── bokeh_plotting.ipynb\n    ── bounding_boxes.ipynb\n    ── capsule.ipynb\n    ── charts.ipynb\n    ── config.ipynb\n    ── decorators.ipynb\n    ── imgaug_loader.ipynb\n    ── index.ipynb\n    ── inspector.ipynb\n    ── interactive_show.ipynb\n    ── jupyter_notebook.ipynb\n    ── load_defautls.ipynb\n    ── logging.ipynb\n    ── markups.ipynb\n    ── misc.ipynb\n    ── nbdev.yml\n    ── paths.ipynb\n    ── pdf.ipynb\n    ── registry.ipynb\n    ── report.ipynb\n    ── show.ipynb\n    ── sidebar.yml\n    ── sklegos.ipynb\n    ── tmp.csv\n ── requirements.txt\n ── scripts.ipynb\n ── settings.ini\n ── setup.cfg\n ── setup.py\n ── testing.ipynb\n ── tmp.ini\n ── torch_snippets\n    ── __init__.py\n    ── __module_timing__.py\n    ── __pycache__\n       ── __init__.cpython-312.pyc\n       ── __module_timing__.cpython-312.pyc\n       ── bb_utils.cpython-312.pyc\n       ── bokeh_loader.cpython-312.pyc\n       ── charts.cpython-312.pyc\n       ── cli.cpython-312.pyc\n       ── dates.cpython-312.pyc\n       ── decorators.cpython-312.pyc\n       ── icecream.cpython-312.pyc\n       ── inspector.cpython-312.pyc\n       ── ipython.cpython-312.pyc\n       ── load_defaults.cpython-312.pyc\n       ── loader.cpython-312.pyc\n       ── logger.cpython-312.pyc\n       ── markup.cpython-312.pyc\n       ── markup2.cpython-312.pyc\n       ── misc.cpython-312.pyc\n       ── paths.cpython-312.pyc\n       ── pdf_loader.cpython-312.pyc\n       ── registry.cpython-312.pyc\n       ── s3_loader.cpython-312.pyc\n       ── torch_loader.cpython-312.pyc\n       ── zen.cpython-312.pyc\n    ── _modidx.py\n    ── _nbdev.py\n    ── adapters.py\n    ── bb_utils.py\n    ── bokeh_loader.py\n    ── charts.py\n    ── cli.py\n    ── dates.py\n    ── decorators.py\n    ── fastcores.py\n    ── icecream.py\n    ── imgaug_loader.py\n    ── inspector.py\n    ── interactive_show.py\n    ── ipython.py\n    ── load_defaults.py\n    ── loader.py\n    ── logger.py\n    ── markup.py\n    ── markup2.py\n    ── misc.py\n    ── paths.py\n    ── pdf_loader.py\n    ── registry.py\n    ── s3_loader.py\n    ── scp.py\n    ── sklegos.py\n    ── text_utils.py\n    ── thinc_parser\n       ── __init__.py\n       ── __pycache__\n          ── __init__.cpython-312.pyc\n          ── parser.cpython-312.pyc\n       ── parser.py\n    ── tmp.py\n    ── torch_loader.py\n    ── trainer\n       ── __init__.py\n       ── __pycache__\n          ── __init__.cpython-312.pyc\n          ── capsule.cpython-312.pyc\n       ── capsule.py\n       ── config.py\n       ── hooks.py\n       ── neural_graph.py\n    ── video.py\n    ── zen.py\n ── torch_snippets.egg-info\n ── PKG-INFO\n ── SOURCES.txt\n ── dependency_links.txt\n ── entry_points.txt\n ── not-zip-safe\n ── requires.txt\n ── top_level.txt\n\n61 directories, 348 files\n\n\n\n\n\n\nfolder_structure_to_json\n\n folder_structure_to_json (path, output_file=None)\n\nCreates a JSON file representing the folder structure of the given directory.\n\n\n\nfolder_structure_to_dict\n\n folder_structure_to_dict (path)\n\nRecursively constructs a nested dictionary that represents the folder structure.\n\nx = P(\"tmp.txt\")\nx.touch()\nx.write_lines([i for i in range(1000)], mode=\"w\")\nlines = x.read_lines()\nassert lines == [f\"{i}\" for i in range(1000)]\nlogger.info(x.size())\n\nx.rm(confirm_prompt=False)\n\n[08/24/24 11:12:13] INFO loaded 1000 lines 2901855681.py:read_lines:13\n\n\n\n INFO 3 KB 1033976698.py:<module>:6\n\n\n\n\n\n\nloaddill\n\n loaddill (fpath)\n\nLoad a python object from a dill file\n\n\n\ndumpdill\n\n dumpdill (obj, fpath, silent=False, message='Dumped object of size\n ≈{fsize} @ \"{fpath}\" in {dumptime:.2e} seconds')\n\nDump a python object as a dill file (better replacement to pickle)\n\np = P(\"test.tmp\")\ndumpdill([1, 2, 3], p)\ny = loaddill(p)\np.rm(confirm_prompt=False)\nassert y == [1, 2, 3]\n\n INFO Dumped object of size ≈0 KB @ \"test.tmp\" in 4.11e-04 seconds 554288780.py:<module>:2", + "crumbs": [ + "Paths" + ] + }, + { + "objectID": "pdf.html", + "href": "pdf.html", + "title": "PDF", + "section": "", + "text": "PDF\n\n PDF (path, dfs=None, dpi=150)\n\nLoad a PDF file from path as a list of images Use show function to see the images WIP", + "crumbs": [ + "PDF" + ] + }, + { + "objectID": "bounding_boxes.html", + "href": "bounding_boxes.html", + "title": "Bounding Box", + "section": "", + "text": "Bounding Box\n\nCreate a box by mentioning the top-left (x, y) and bottom-right (X, Y) coordinates\nSay x, y, X, Y are 10, 20, 40, 50 respectively\n\nbb = BB([10, 20, 40, 50])\n\nYou get the following attributes for free\n\n\n\nbb.x=10 (top left - x)\nbb.y=20 (top left - y)\nbb.X=40 (bottom right - x)\nbb.Y=50 (bottom right - y)\nbb.w=30 (width)\nbb.h=30 (height)\nbb.xc=25.0 (center x)\nbb.yc=35.0 (center y)\nbb.c=(25.0, 35.0) (center)\nbb.area=900 (area)\nbb.shape=(30, 30) (height, width)\n\n\n\n\nfrom torch_snippets import show, read, P, pd\n\n\nassets = P(\"/Users/yeshwanth.y/code/torch_snippets/assets/\")\nim = read(assets / \"Preamble.png\")\ndf = pd.read_csv(assets / \"Preamble.csv\")\nshow(df.head())\ndf = to_absolute(df, *im.shape[:2])\nshow(df.head())\ndf = to_relative(df, *im.shape[:2])\nshow(df.head())\n\n\n \n \n \n x\n y\n X\n Y\n text\n block_id\n \n \n \n \n 0\n 135\n 181\n 308\n 218\n ConstITUtIO\n 0\n \n \n 1\n 156\n 264\n 217\n 284\n NLTHE\n 1\n \n \n 2\n 218\n 264\n 276\n 284\n PEOPLE\n 1\n \n \n 3\n 267\n 265\n 295\n 282\n OF\n 1\n \n \n 4\n 297\n 264\n 341\n 284\n INDIA,\n 1\n \n \n\n\n\n\n \n \n \n x\n y\n X\n Y\n text\n block_id\n \n \n \n \n 0\n 135\n 181\n 308\n 218\n ConstITUtIO\n 0\n \n \n 1\n 156\n 264\n 217\n 284\n NLTHE\n 1\n \n \n 2\n 218\n 264\n 276\n 284\n PEOPLE\n 1\n \n \n 3\n 267\n 265\n 295\n 282\n OF\n 1\n \n \n 4\n 297\n 264\n 341\n 284\n INDIA,\n 1\n \n \n\n\n\n\n \n \n \n x\n y\n X\n Y\n text\n block_id\n \n \n \n \n 0\n 0.249538\n 0.253501\n 0.569316\n 0.305322\n ConstITUtIO\n 0\n \n \n 1\n 0.288355\n 0.369748\n 0.401109\n 0.397759\n NLTHE\n 1\n \n \n 2\n 0.402957\n 0.369748\n 0.510166\n 0.397759\n PEOPLE\n 1\n \n \n 3\n 0.493530\n 0.371148\n 0.545287\n 0.394958\n OF\n 1\n \n \n 4\n 0.548983\n 0.369748\n 0.630314\n 0.397759\n INDIA,\n 1\n \n \n\n\n\n\nshow(im, df=df, sz=10)\n\n\n\n\n\n\n\n\n\nshow(im, df=to_absolute(df, *im.shape[:2]), sz=10)\n\n\n\n\n\n\n\n\n\n_df = to_absolute(df, *im.shape[:2])\nshow(im, df=to_relative(_df, *im.shape[:2]), sz=10)\n\n\n\n\n\n\n\n\n\n_df = combine_xyXY_to_bb(_df)\nshow(im, df=to_relative(_df, *im.shape[:2]), sz=10)\n\n\n\n\n\n\n\n\n\nto_relative(_df, *im.shape[:2])\n\n\n\n\n\n\n\n\ntext\nblock_id\nbb\n\n\n\n\n0\nConstITUtIO\n0\n[0.24953789279112754, 0.2535014005602241, 0.56...\n\n\n1\nNLTHE\n1\n[0.28835489833641403, 0.3697478991596639, 0.40...\n\n\n2\nPEOPLE\n1\n[0.4029574861367837, 0.3697478991596639, 0.510...\n\n\n3\nOF\n1\n[0.49353049907578556, 0.3711484593837535, 0.54...\n\n\n4\nINDIA,\n1\n[0.5489833641404805, 0.3697478991596639, 0.630...\n\n\n...\n...\n...\n...\n\n\n68\nGIVE\n13\n[0.4011090573012939, 0.7366946778711485, 0.478...\n\n\n69\nTO\n13\n[0.4879852125693161, 0.7366946778711485, 0.536...\n\n\n70\noUrSELVES\n13\n[0.5508317929759704, 0.7394957983193278, 0.706...\n\n\n71\nTHIS\n13\n[0.7190388170055453, 0.7366946778711485, 0.783...\n\n\n72\nCONSTITUTION.\n14\n[0.23290203327171904, 0.7689075630252101, 0.44...\n\n\n\n\n73 rows × 3 columns\n\n\n\n\n\nisin\n\n isin (bboxes1, bboxes2, return_matrix=True)\n\nreturn indexes of those boxes from bboxes1 that are completely inside bboxes2\n\n\n\nmerge_by_bb\n\n merge_by_bb (df1, df2, suffixes=('_x', '_y'), iou_threshold=0.1)\n\nMerge df1 columns to df2 by using iou Make sure both df1 & df2 are relative or both absolute", + "crumbs": [ + "Bounding Box" + ] + }, + { + "objectID": "load_defautls.html", + "href": "load_defautls.html", + "title": "File Exists", + "section": "", + "text": "File Exists\nand what to do if it doesn’t\n\n\n\nloadifexists\n\n loadifexists (fpath, default)\n\nLoad data from a dill file if it exists, else return default value\n\n\n\nexists\n\n exists (fpath)\n\nAlias for os.path.exists", + "crumbs": [ + "File Exists" + ] + }, + { + "objectID": "AttrDict.html", + "href": "AttrDict.html", + "title": "torch_snippets", + "section": "", + "text": "from torch_snippets.loader import L\n\n[07/01/24 11:12:47] WARNING Unable to load torch and dependent libraries from torch-snippets. loader.py:<module>:108\n Functionalities might be limited. pip install lovely-tensors in case there are torch related errors \n\n\n\n\nclass AD(object):\n forbidden = set(\":,'\\\"}{.\")\n\n def __init__(self, *args, given_input_to_ad=None, **kwargs):\n given_input_to_ad = {} if given_input_to_ad is None else given_input_to_ad\n if len(args) == 1 and isinstance(args[0], (Mapping, AttrDict)):\n given_input_to_ad = args[0]\n args = {}\n else:\n _args = dict(ic.io(*args)) if len(args) > 0 else {}\n args = {}\n for k, v in _args.items():\n if any(c in self.forbidden for c in k):\n assert isinstance(\n v, (dict, AttrDict)\n ), f\"Input `{v}` can't be a list\"\n given_input_to_ad = {**v, **given_input_to_ad}\n else:\n args = {**{k: v}, **args}\n\n given_input_to_ad = {**kwargs, **given_input_to_ad, **args}\n for name, value in given_input_to_ad.items():\n setattr(self, str(name), self._wrap(value))\n\n def items(self):\n return self.__dict__.items()\n\n def keys(self):\n return self.__dict__.keys()\n\n def values(self):\n return self.__dict__.values()\n\n def __json__(self):\n return self.to_dict()\n\n def _wrap(self, value):\n if isinstance(value, (L, tuple, list, set, frozenset)):\n value = type(value)([self._wrap(v) for v in value])\n if isinstance(value, (list, L)):\n value = L(value)\n return value\n else:\n return (\n AttrDict(given_input_to_ad=value) if isinstance(value, dict) else value\n )\n\n __getitem__ = lambda self, x: (\n AttrDict({_x: self[_x] for _x in x})\n if isinstance(x, (list, L))\n else getattr(self, str(x))\n )\n __setitem__ = lambda self, k, v: setattr(self, str(k), self._wrap(v))\n\n def update(self, dict):\n for k, v in dict.items():\n self[k] = v\n\n def get(self, key, default=None):\n key = str(key)\n return self[key] if key in self else default\n\n def __iter__(self):\n return iter(self.keys())\n\n def __len__(self):\n return len(self.keys())\n\n def __repr__(self):\n return f\"\\n```↯ AttrDict ↯\\n{self.summary()}\\n```\\n\"\n\n def __dir__(self):\n return self.__dict__.keys()\n\n def __contains__(self, key):\n key = str(key)\n if \".\" not in key:\n return key in self.__dict__.keys()\n else:\n d = self\n for _k in key.split(\".\"):\n try:\n d = d[_k]\n except AttributeError:\n return False\n return True\n\n def __delitem__(self, key):\n key = str(key)\n del self.__dict__[key]\n\n def map(self, func):\n for k in dir(self):\n v = self[k]\n if isinstance(v, AttrDict):\n v.map(func)\n elif isinstance(v, (L, tuple, list, set, frozenset)):\n v = [_v.map(func) if isinstance(_v, AttrDict) else func(_v) for _v in v]\n else:\n v = func(v)\n self[k] = v\n\n def drop(self, key):\n if key in self:\n del self[key]\n for k in dir(self):\n v = self[k]\n if isinstance(v, AttrDict):\n v.drop(key)\n if isinstance(v, (L, tuple, list, set, frozenset)):\n v = [_v.drop(key) for _v in v if isinstance(_v, AttrDict)]\n\n def to_dict(self):\n d = {}\n for k in self.__dict__.keys(): # can't use dir here\n v = self[k]\n if isinstance(v, AttrDict):\n v = v.to_dict()\n if isinstance(v, (L, tuple, list, set, frozenset)):\n v = [_v.to_dict() if isinstance(_v, AttrDict) else _v for _v in v]\n d[k] = v\n return d\n\n dict = to_dict\n\n def pretty(self, print_with_logger=False, *args, **kwargs):\n pretty_json(\n self.to_dict(), print_with_logger=print_with_logger, *args, **kwargs\n )\n\n def __eq__(self, other):\n return AttrDict(given_input_to_ad=other).to_dict() == self.to_dict()\n\n def find_address(self, key, current_path=\"\"):\n addresses = []\n for k in self.keys():\n if current_path:\n new_path = f\"{current_path}.{k}\"\n else:\n new_path = k\n\n if k == key:\n addresses.append(new_path)\n\n if isinstance(self[k], AttrDict):\n addresses.extend(self[k].find_address(key, new_path))\n\n elif isinstance(self[k], (L, tuple, list, set, frozenset)):\n for i, item in enumerate(self[k]):\n if isinstance(item, AttrDict):\n addresses.extend(item.find_address(key, f\"{new_path}.{i}\"))\n return addresses\n\n def summary(self, current_path=\"\", depth=0, sep=\" \", max_items=10):\n max_items = int(os.environ.get(\"AD_MAX_ITEMS\", max_items))\n sep = os.environ.get(\"AD_SEP\", sep)\n\n def format_path(path, key):\n return f\"{path}.{key}\" if path else key\n\n def format_item(key, item, path, depth, sep):\n import numpy as np\n import pandas as pd\n\n try:\n import torch\n except ModuleNotFoundError:\n\n class Torch:\n Tensor = type(None)\n\n torch = Torch()\n\n if isinstance(item, (pd.DataFrame,)):\n return f\"{sep * depth}{key} - {type(item).__name__} - shape {item.shape} - columns {item.columns} - {hash_pandas_dataframe(item)}\\n\"\n if isinstance(item, AttrDict) or hasattr(item, \"keys\"):\n item = AttrDict(**item)\n return f\"{sep*depth}{key}\\n\" + item.summary(path, depth + 1, sep)\n elif isinstance(item, (list, tuple, set, frozenset, L)):\n return summarize_collection(key, item, path, depth + 1, sep)\n elif isinstance(item, (torch.Tensor, np.ndarray)):\n is_np = False\n if isinstance(item, np.ndarray):\n is_np = True\n item = torch.tensor(item)\n is_np = \"🔦\" if not is_np else \"np.\"\n return f\"{sep * depth}{key} - {is_np}{item} - {hash_tensor(item)}\\n\"\n\n else:\n is_multiline = False\n ogitem = item\n if isinstance(item, (str, P)):\n item = str(item)\n is_multiline = \"\\n\" in item\n _sep = \" ...\\n...\\n...\\n...\\n... \" if is_multiline else \".........\"\n if len(item) > 100:\n item = item[:35] + _sep + item[-35:]\n if is_multiline:\n _item = item.split(\"\\n\")\n _item = \"\\n\".join([f\"{sep*(depth+1)}{l}\" for l in _item])\n item = f\"↓\\n{sep*(depth+1)}```\\n{_item}\\n{sep*(depth+1)}```\"\n multiline = \"\" if not is_multiline else \"Multiline \"\n return f\"{sep * depth}{key} - {item} (🏷️ {multiline}{type(ogitem).__name__})\\n\"\n\n def summarize_collection(key, collection, path, d, s):\n summary_str = f\"{s * (d - 1)}{key}\\n\"\n for i, item in enumerate(collection):\n item_path = format_path(path, i)\n if i < max_items:\n summary_str += format_item(i, item, item_path, d, s)\n else:\n summary_str += (\n f\"{s*d}... {len(collection) - max_items} more items ...\\n\"\n )\n break\n return summary_str\n\n summary_str = \"\"\n for ix, key in enumerate(self.keys()):\n if ix >= max_items:\n summary_str += (\n f\"{sep*depth} ... {len(self.keys()) - max_items} more keys ...\\n\"\n )\n break\n new_path = format_path(current_path, key)\n summary_str += format_item(key, self[key], new_path, depth, sep)\n return summary_str\n\n def print_summary(self, **kwargs):\n from builtins import print\n\n print(self.summary(**kwargs))\n\n def write_summary(self, to, **kwargs):\n writelines(self.summary(**kwargs).split(\"\\n\"), to)\n\n def fetch(self, addr):\n if isinstance(addr, (list, L)):\n return L([self.fetch(_addr) for _addr in addr])\n\n o = self\n for p in addr.split(\".\"):\n try:\n o = o[int(p)]\n except:\n o = o[p]\n return o\n\n\nx = AD(x=1)\nx\n\n\n---------------------------------------------------------------------------\nNameError Traceback (most recent call last)\nFile ~/miniconda3/miniconda3/envs/ts/lib/python3.10/site-packages/IPython/core/formatters.py:708, in PlainTextFormatter.__call__(self, obj)\n 701 stream = StringIO()\n 702 printer = pretty.RepresentationPrinter(stream, self.verbose,\n 703 self.max_width, self.newline,\n 704 max_seq_length=self.max_seq_length,\n 705 singleton_pprinters=self.singleton_printers,\n 706 type_pprinters=self.type_printers,\n 707 deferred_pprinters=self.deferred_printers)\n--> 708 printer.pretty(obj)\n 709 printer.flush()\n 710 return stream.getvalue()\n\nFile ~/miniconda3/miniconda3/envs/ts/lib/python3.10/site-packages/IPython/lib/pretty.py:410, in RepresentationPrinter.pretty(self, obj)\n 407 return meth(obj, self, cycle)\n 408 if cls is not object \\\n 409 and callable(cls.__dict__.get('__repr__')):\n--> 410 return _repr_pprint(obj, self, cycle)\n 412 return _default_pprint(obj, self, cycle)\n 413 finally:\n\nFile ~/miniconda3/miniconda3/envs/ts/lib/python3.10/site-packages/IPython/lib/pretty.py:778, in _repr_pprint(obj, p, cycle)\n 776 \"\"\"A pprint that just redirects to the normal repr function.\"\"\"\n 777 # Find newlines and replace them with p.break_()\n--> 778 output = repr(obj)\n 779 lines = output.splitlines()\n 780 with p.group():\n\nCell In[8], line 69, in AD.__repr__(self)\n 68 def __repr__(self):\n---> 69 return f\"\\n```↯ AttrDict ↯\\n{self.summary()}\\n```\\n\"\n\nCell In[8], line 154, in AD.summary(self, current_path, depth, sep, max_items)\n 153 def summary(self, current_path=\"\", depth=0, sep=\" \", max_items=10):\n--> 154 max_items = int(os.environ.get(\"AD_MAX_ITEMS\", max_items))\n 155 sep = os.environ.get(\"AD_SEP\", sep)\n 157 def format_path(path, key):\n\nNameError: name 'os' is not defined", + "crumbs": [ + "AttrDict.html" + ] + }, + { + "objectID": "decorators.html", + "href": "decorators.html", + "title": "Decorator Utilites", + "section": "", + "text": "check_kwargs_not_none\n\n check_kwargs_not_none (func)\n\n*A decorator that checks if any keyword argument is None. Raises a ValueError if any argument is None.\nArgs: func: The function to be decorated.\nReturns: The decorated function.\nRaises: ValueError: If any keyword argument is None.*\n\n\n\nio\n\n io (func)\n\n*A decorator that inspects the inputs and outputs of a function.\nArgs: func: The function to be decorated.\nReturns: The decorated function.*\n\n\n\ntimeit\n\n timeit (func)\n\n*A decorator that measures the execution time of a function.\nArgs: func (callable): The function to be timed.\nReturns: callable: The wrapped function.\nExample: @timeit def my_function(): # code to be timed pass\nmy_function() # prints the execution time of my_function*\n\n\n\nwarn_on_fail\n\n warn_on_fail (func)\n\n\n\n\nformat\n\n format (input)\n\n\n@timeit\n@io\ndef foo(a, b):\n \"\"\"\n This function takes two arguments, `a` and `b`, and returns their sum.\n\n Parameters:\n a (int): The first number.\n b (int): The second number.\n\n Returns:\n int: The sum of `a` and `b`.\n \"\"\"\n import time\n\n time.sleep(1)\n return a + b\n\n\nfoo(10, 11)\n\n══════════════════════════════════════════════════════════════════\nINPUTS:ARGS:\ntuple of 2 items\n int: 10\n int: 11\n══════════════════════════════════════════════════════════════════\n══════════════════════════════════════════════════════════════════\nOUTPUTS:\nint: 21\n══════════════════════════════════════════════════════════════════\n[08/24/24 12:50:36] INFO foo took 1.00 seconds to execute d=152002;file://<ipython-input-1-6ac2073623b5>:47\u001b\\<ipython-input-1-6ac2073623b5>;;\u001b\\:d=283174;file://<ipython-input-1-6ac2073623b5>:47#wrapper:47\u001b\\wrapper:47;;\u001b\\\n\n\n21\n\n\n\n@check_kwargs_not_none\n@io\ndef foo(*, a=None, b=None):\n return a + b\n\n\nfoo(a=None, b=10)\n\n\n---------------------------------------------------------------------------\nValueError Traceback (most recent call last)\nCell In[34], line 6\n 1 @check_kwargs_not_none\n 2 @io\n 3 def foo(*, a=None, b=None):\n 4 return a + b\n----> 6 foo(a=None, b=10)\n\nCell In[32], line 32, in check_kwargs_not_none.<locals>.wrapper(*args, **kwargs)\n 30 for key, value in kwargs.items():\n 31 if value is None:\n---> 32 raise ValueError(f\"Input argument '{key}' cannot be None\")\n 33 return func(*args, **kwargs)\n\nValueError: Input argument 'a' cannot be None\n\n\n\n\nimport nbdev\n\nnbdev.nbdev_export()", + "crumbs": [ + "Decorator Utilites" + ] + }, + { + "objectID": "markups.html", + "href": "markups.html", + "title": "Markups", + "section": "", + "text": "AttrDict\n\n AttrDict (*args, given_input_to_ad=None, **kwargs)\n\n*Utility class to interact with a dictionary as if it were an object. AD is an alias to this class\nFEATURES: 0. Access and modify keys (including nested keys) as if they were object attributes, supporting tab-completion. Example: self.key1.key2[0].key3 1. Keys and values are recursively converted to AttrDict instances. 2. Pretty-print the dictionary using print. 3. Convert the entire structure to a regular dictionary at any time using self.to_dict() / self.dict(). 3. Recursively remove keys using self.drop(key) from a JSON object. 4. Apply a function to all values at all levels using map.\nGOTCHAS: 1. All integer keys are implicitly converted to strings due to the enforced self.key format. 2. You can still use self[int], but this internally converts the integer to a string.\nMETHODS: - items(): Return the items of the AttrDict as key-value pairs. - keys(): Return the keys of the AttrDict. - values(): Return the values of the AttrDict. - update(dict): Update the AttrDict with key-value pairs from another dictionary. - get(key, default=None): Get the value associated with a key, with an optional default value. - __iter__(): Allow iteration over the keys of the AttrDict. - __len__(): Return the number of keys in the AttrDict. - __repr__(): Return a string representation of the AttrDict. - __dir__(): List the keys of the AttrDict as attributes. - __contains__(key): Check if a key exists in the AttrDict, use ‘a.b.c’ notation to directly check for a nested attribute. - __delitem__(key): Delete a key from the AttrDict. - map(func): Apply a function to all values in the AttrDict. - drop(key): Recursively remove a key and its values from the AttrDict. - to_dict(): Convert the AttrDict and its nested structure to a regular dictionary. - pretty(print_with_logger=False, *args, **kwargs): Pretty-print the AttrDict as JSON. - __eq__(other): Compare the AttrDict with another dictionary for equality. - find_address(key, current_path=\"\"): Find and return all addresses (paths) of a given key in the AttrDict. - summary(current_path='', summary_str='', depth=0, sep=' '): Generate a summary of the structure and values in the AttrDict. - write_summary(to, **kwargs): Write the summary to a file or stream. - fetch(addr): Retrieve a value at a specified address (path).\nPARAMETERS: - data (dict, optional): Initial data to populate the AttrDict.\nUSAGE: - Create an AttrDict instance by providing an optional initial dictionary, and then access and manipulate its contents as if they were object attributes.\nEXAMPLE:\nmy_dict = {'name': 'John', 'age': 30, 'address': {'city': 'New York', 'zip': '10001'}}\nattr_dict = AttrDict(my_dict)\nprint(attr_dict.name) # Access values like attributes\nattr_dict.address.city = 'Los Angeles' # Modify nested values\n```*\n\n\n::: {#bfb4146f-90bf-42bc-bf40-69fb6d612ea2 .cell tags='[]' execution_count=5}\n``` {.python .cell-code}\nxx = AttrDict({\"a\": 1, \"b\": [{\"c\": 2, \"d\": 4}, {\"e\": 3}], \"f\": {\"g\": {\"h\": 20}}})\nprint(type(xx.b[0]))\nprint(type(xx.to_dict()[\"b\"][0]))\nprint(\"f.g.h\" in xx)\nxx.pretty()\n\n<class 'torch_snippets.markup2.AttrDict'>\n<class 'dict'>\nTrue\n{\n \"a\": 1,\n \"b\": [\n {\n \"c\": 2,\n \"d\": 4\n },\n {\n \"e\": 3\n }\n ],\n \"f\": {\n \"g\": {\n \"h\": 20\n }\n }\n}\n\n:::\n\nx = {\"abc\": {\"b\": 10, \"c\": 11}, \"d\": {\"e\": {\"f\": [2, {\"abc\": \"pqrs\"}, 2.234]}}}\n\ny = AttrDict(x)\n\nassert y.abc.b == 10\nassert y.d.e.f == [2, {\"abc\": \"pqrs\"}, 2.234]\n\ny.d.e.g = 11\n\n# del y.abc.c\n# OR\ndel y[\"abc\"][\"c\"]\n\nassert y.to_dict() == {\n \"abc\": {\"b\": 10},\n \"d\": {\"e\": {\"f\": [2, {\"abc\": \"pqrs\"}, 2.234], \"g\": 11}},\n}\n\ny.pretty(indent=2)\n\nassert \"abc\" in y\nassert \"def\" not in y\nprint(\"e\" in y.d)\n\n{\n \"abc\": {\n \"b\": 10\n },\n \"d\": {\n \"e\": {\n \"f\": [\n 2,\n {\n \"abc\": \"pqrs\"\n },\n 2.234\n ],\n \"g\": 11\n }\n }\n}\nTrue\n\n\n\nx = {\"abc\": {\"b\": 10, \"c\": 11}, \"d\": {\"e\": {\"f\": [2, {\"abc\": \"pqrs\"}, 2.234]}}}\ny = AttrDict(x)\ny.abc[[\"b\", \"c\"]]\n\n\n```↯ AttrDict ↯\nb - 10 (🏷️ int)\nc - 11 (🏷️ int)\n\n```\n\n\n\n\n\nwrite_json\n\n write_json (obj, fpath, silent=False)\n\n\n\n\nread_json\n\n read_json (fpath)\n\n\ntry:\n import torch\n\n d = AD(a=torch.Tensor([1, 2, 3]), b=\"hello\")\n write_json(d, \"/tmp/tmp.json\")\n print(\"\\n\".join(readlines(\"/tmp/tmp.json\")))\nexcept ModuleNotFoundError:\n ...\n\n[08/24/24 12:50:35] INFO loaded 8 lines d=266370;file://<ipython-input-1-e6d68859b80d>:6\u001b\\<ipython-input-1-e6d68859b80d>;;\u001b\\:d=65937;file://<ipython-input-1-e6d68859b80d>:6#<module>:6\u001b\\<module>:6;;\u001b\\\n{\n\"a\": [\n1.0,\n2.0,\n3.0\n],\n\"b\": \"hello\"\n}\n\n\n\nd = [1, {1: 1, 2: 2}, 3]\n\npretty_json({1: 1, 2: 2})\npretty_json(d)\n\nf = write_json(d, \"/tmp/test.json\")\nprint(f)\nread_json(f)\n\n/tmp/test.json\n\n\n[1, {'1': 1, '2': 2}, 3]\n\n\n\n\n\nread_jsonl\n\n read_jsonl (file)\n\n\n\n\nwrite_jsonl\n\n write_jsonl (items, dest, mode='a')\n\n\n\n\nwrite_yaml\n\n write_yaml (content, fpath)\n\n\n\n\nread_yaml\n\n read_yaml (file)\n\n\n\n\nwrite_xml\n\n write_xml (data:Union[torch_snippets.markup2.AttrDict,dict],\n file_path:Union[str,pathlib.Path])\n\n\n\n\nread_xml\n\n read_xml (file_path:Union[str,pathlib.Path])\n\nRead xml data as a dictionary\n\ny.to_dict()\n\n{'abc': {'b': 10, 'c': 11}, 'd': {'e': {'f': [2, {'abc': 'pqrs'}, 2.234]}}}\n\n\n\ny\n\n\n```↯ AttrDict ↯\nabc\n b - 10 (🏷️ int)\n c - 11 (🏷️ int)\nd\n e\n f\n 0 - 2 (🏷️ int)\n 1\n abc - pqrs (🏷️ str)\n 2 - 2.234 (🏷️ float)\n\n```", + "crumbs": [ + "Markups" + ] + }, + { + "objectID": "interactive_show.html", + "href": "interactive_show.html", + "title": "torch_snippets", + "section": "", + "text": "ishow\n\n ishow (im, df, additional_attrs=None, **kwargs)\n\n\n\n\ndf2graph_nodes\n\n df2graph_nodes (df, text_attr='text', additional_attrs=None)\n\n\n\n\nviz2\n\n viz2 (graph, node_attrs=None, undirected=True, **kwargs)\n\n\n\n\nconvert_to_nx\n\n convert_to_nx (g, node_attrs=None, undirected=True)\n\n\n\n\ntolist\n\n tolist (i)\n\n\n\n\ntonp\n\n tonp (i)\n\n\n\n\nplot_graph\n\n plot_graph (g, output, im=None, **kwargs)\n\n\n\n\nplot_image\n\n plot_image (p, image, sz)\n\n\n\n\nto_networkx\n\n to_networkx (data, node_attrs:Optional[Iterable[str]]=None,\n edge_attrs:Optional[Iterable[str]]=None,\n graph_attrs:Optional[Iterable[str]]=None,\n to_undirected:Union[bool,str,NoneType]=False,\n remove_self_loops:bool=False)", + "crumbs": [ + "interactive_show.html" + ] + }, + { + "objectID": "sklegos.html", + "href": "sklegos.html", + "title": "SK-Legos", + "section": "", + "text": "SK-Legos\nUtilities to do common ML tasks\n\nYou can find 1. train_test_split which also resets the dataframes’ indexes 2. MakeFrame 3. ImputeMisingValues 4. Cat2Num 5. Other scikit-lego blocks that I use a lot\n\n\nMakeFrame\n\n MakeFrame (column_names)\n\nConvert sklearn’s output to a pandas dataframe Especially useful when working with an ensemble of models\nUsage\nCall MakeFrame as the last component in your pipeline with the desired column names.\npipeline = Pipeline([\n ...,\n ('output', MakeFrame(['outlier', 'class'])),\n])\n\nRefer to this notebook for an example\n\n\n\n\nImputeMissingValues\n\n ImputeMissingValues (num_mode=<function mean at 0x10695b6f0>,\n cat_mode='MISSING')\n\n*DataFrame input - DataFrame output During fit - 1. Store imputable value for each column During transform - 2. Impute missing values with imputable value 3. Create a ’{col}_na’ boolean column to tell if cells contained missing value*\n\n\n\nLambdaTransformer\n\n LambdaTransformer (fn)\n\n*Base class for all estimators in scikit-learn.\nInheriting from this class provides default implementations of:\n\nsetting and getting parameters used by GridSearchCV and friends;\ntextual and HTML representation displayed in terminals and IDEs;\nestimator serialization;\nparameters validation;\ndata validation;\nfeature names validation.\n\nRead more in the :ref:User Guide <rolling_your_own_estimator>.*\n\n\n\nMakeFrame\n\n MakeFrame (column_names)\n\n*Base class for all estimators in scikit-learn.\nInheriting from this class provides default implementations of:\n\nsetting and getting parameters used by GridSearchCV and friends;\ntextual and HTML representation displayed in terminals and IDEs;\nestimator serialization;\nparameters validation;\ndata validation;\nfeature names validation.\n\nRead more in the :ref:User Guide <rolling_your_own_estimator>.*\n\n\n\nCat2Num\n\n Cat2Num ()\n\n*Base class for all estimators in scikit-learn.\nInheriting from this class provides default implementations of:\n\nsetting and getting parameters used by GridSearchCV and friends;\ntextual and HTML representation displayed in terminals and IDEs;\nestimator serialization;\nparameters validation;\ndata validation;\nfeature names validation.\n\nRead more in the :ref:User Guide <rolling_your_own_estimator>.*\n\n\n\nSplitDateColumn\n\n SplitDateColumn (column_names, has_date, has_time, date_format=None)\n\n*Base class for all estimators in scikit-learn.\nInheriting from this class provides default implementations of:\n\nsetting and getting parameters used by GridSearchCV and friends;\ntextual and HTML representation displayed in terminals and IDEs;\nestimator serialization;\nparameters validation;\ndata validation;\nfeature names validation.\n\nRead more in the :ref:User Guide <rolling_your_own_estimator>.*", + "crumbs": [ + "SK-Legos" + ] + }, + { + "objectID": "show.html", + "href": "show.html", + "title": "Show", + "section": "", + "text": "Show is intended to show numpy-arrays/PIL-images\n\nfrom torch_snippets import *\n\nim = np.random.rand(100, 100)\nshow(im)\n\n\n\n\n\n\n\n\n\nshow(im, sz=4)\n\n\n\n\n\n\n\n\nShow will even accept pytorch Tensors and show them as images, even if they are on GPU and have channels first\nIt can accept bounding boxes as tuples of (x,y,X,Y) which can be integers (i.e., absolute coordinates) or fractions (between \\([0,1]\\)). There’s provision to give bb_colors and texts as well\n\nshow(im, bbs=[(0, 0, 0.5, 0.35), (0, 0.2, 0.35, 0.95)])\n\nshow(im, bbs=[(0, 0, 0.5, 0.35), (0, 0.2, 0.35, 0.95)], bb_colors=[\"r\", \"g\"])\n\nshow(\n im,\n bbs=[(0, 0, 0.5, 0.35), (0, 0.2, 0.35, 0.95)],\n bb_colors=[\"b\", \"g\"],\n texts=[\"bb1\", \"bb2\"],\n sz=10,\n text_sz=15,\n)\n\nClipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n\n\n\n\n\n\n\n\n\nClipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n\n\n\n\n\n\n\n\n\nClipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n\n\n\n\n\n\n\n\n\nIt can also read a file path directly and display the image\n\nshow(\"../docs/images/company_logo_big.png\", sz=3)\n\n\n\n\n\n\n\n\nif the input is not an image or string, show will simply display the given input as intended by jupyter notebook\n\ndf = pd.DataFrame(np.random.rand(100, 2))\nshow(df)\n\n\n\n\n\n\n\n\n0\n1\n\n\n\n\n0\n0.242478\n0.929517\n\n\n1\n0.971890\n0.506750\n\n\n2\n0.139826\n0.753227\n\n\n3\n0.864799\n0.524166\n\n\n4\n0.563610\n0.135709\n\n\n...\n...\n...\n\n\n95\n0.379874\n0.639771\n\n\n96\n0.993731\n0.811343\n\n\n97\n0.621683\n0.763054\n\n\n98\n0.844509\n0.915156\n\n\n99\n0.314272\n0.392418\n\n\n\n\n100 rows × 2 columns\n\n\n\n\nchart = Chart(df).mark_circle().encode(x=\"0:Q\", y=\"1:Q\")\nshow(chart.interactive())\n\n\n\n\n\n\n\n\ndisplay multiple images Subplots is a wapper around plt.subplots that accepts a list of images, number of columns as nc and additional kwargs\n\nfrom torch_snippets import subplots\n\nims = [np.random.rand(100, 100) for _ in range(16)]\n\nsubplots(ims, nc=4, sz=5)\n\n\n\n\n\n\n\n\n\nsubplots(\n ims,\n nc=2,\n sz=(5, 15),\n suptitle=\"RANDOM IMAGES\",\n titles=[f\"random_{i}\" for i in range(16)],\n)", + "crumbs": [ + "Show" + ] + }, + { + "objectID": "show.html#subplots", + "href": "show.html#subplots", + "title": "Show", + "section": "", + "text": "display multiple images Subplots is a wapper around plt.subplots that accepts a list of images, number of columns as nc and additional kwargs\n\nfrom torch_snippets import subplots\n\nims = [np.random.rand(100, 100) for _ in range(16)]\n\nsubplots(ims, nc=4, sz=5)\n\n\n\n\n\n\n\n\n\nsubplots(\n ims,\n nc=2,\n sz=(5, 15),\n suptitle=\"RANDOM IMAGES\",\n titles=[f\"random_{i}\" for i in range(16)],\n)", + "crumbs": [ + "Show" + ] + }, + { + "objectID": "charts.html", + "href": "charts.html", + "title": "Altair and Other Charts", + "section": "", + "text": "Altair and Other Charts\n\n\nfrom torch_snippets.loader import *\nfrom sklearn.datasets import make_moons\n\nnp.random.seed(10)\nx, y = make_moons(1000, noise=0.1)\ndf = pd.DataFrame({\"x1\": x[:, 0], \"x2\": x[:, 1], \"y\": y})\n\nChart(df).mark_circle().encode(x=\"x1:Q\", y=\"x2:Q\", color=\"y:N\").interactive()\n\n\n\n\n\n\n\nRefer to altair-viz.github.io for more awesome charts.\ntorch-snippets exposes a confusion matrix function CM as an example\n\nMethod 1\n\nn = 10\na = \"qwertyuiopasdfghjklzxcvbnm\"\ntruth = np.random.randint(4, size=1000000)\npred = np.random.randint(4, size=1000000)\nshow(CM(truth=truth, pred=pred, mapping={i: a for i, a in enumerate(a)}))\n# mapping is optional\n\n precision recall f1-score support\n\n 0 0.25 0.25 0.25 250150\n 1 0.25 0.25 0.25 250245\n 2 0.25 0.25 0.25 249836\n 3 0.25 0.25 0.25 249769\n\n accuracy 0.25 1000000\n macro avg 0.25 0.25 0.25 1000000\nweighted avg 0.25 0.25 0.25 1000000\n\n\n\n\n\n\n\n\n\n\n\nMethod 2\n\ndf = pd.DataFrame(\n {\n \"truth\": [randint(n) for _ in range(1000)],\n \"pred\": [randint(n) for _ in range(1000)],\n }\n)\nshow(CM(df, \"truth\", \"pred\", mapping={i: a for i, a in enumerate(a)}))\n# mapping is optional\n\n precision recall f1-score support\n\n 0 0.13 0.14 0.13 92\n 1 0.08 0.09 0.08 101\n 2 0.13 0.12 0.13 107\n 3 0.06 0.06 0.06 105\n 4 0.12 0.11 0.11 94\n 5 0.12 0.09 0.10 115\n 6 0.08 0.10 0.09 88\n 7 0.08 0.07 0.08 113\n 8 0.09 0.09 0.09 99\n 9 0.12 0.15 0.13 86\n\n accuracy 0.10 1000\n macro avg 0.10 0.10 0.10 1000\nweighted avg 0.10 0.10 0.10 1000\n\n\n\n\n\n\n\n\n\n\n\nMethod 3\n\ndf = pd.DataFrame(\n {\n \"truth\": [choose(\"abcd\") for _ in range(1000)],\n \"pred\": [choose(\"abcd\") for _ in range(1000)],\n }\n)\nshow(CM(df, \"truth\", \"pred\"))\n# mapping is optional\n\n precision recall f1-score support\n\n a 0.25 0.29 0.27 229\n b 0.28 0.29 0.28 256\n c 0.27 0.24 0.26 267\n d 0.26 0.25 0.25 248\n\n accuracy 0.27 1000\n macro avg 0.26 0.27 0.26 1000\nweighted avg 0.27 0.27 0.26 1000\n\n\n\n\n\n\n\n\n\n\n\n\nspider\n\n spider (df, id_column=None, title=None, max_values=None, padding=1.25,\n global_scale=False, ax=None, sz=10)\n\n*Plot a spider chart based on the given dataframe.\nParameters: - df: pandas DataFrame The input dataframe containing the data to be plotted. - id_column: str, optional The column name to be used as the identifier for each data point. If not provided, the index of the dataframe will be used. - title: str, optional The title of the spider chart. - max_values: dict, optional A dictionary specifying the maximum values for each category. If not provided, the maximum values will be calculated based on the data. - padding: float, optional The padding factor to be applied when calculating the maximum values. Default is 1.25. - global_scale: bool or float, optional If False, each category will have its own maximum value. If True, a single maximum value will be used for all categories. If a float value is provided, it will be used as the maximum value for all categories. - ax: matplotlib Axes, optional The axes on which to plot the spider chart. If not provided, a new figure and axes will be created. - sz: float, optional The size of the figure (both width and height) in inches. Default is 10.\nReturns: - None\nExample usage: spider(df, id_column=‘model’, title=‘Spider Chart’, max_values={‘category1’: 10, ‘category2’: 20}, padding=1.5)*\n\nimport pandas as pd\n\nspider(\n pd.DataFrame(\n {\n \"x\": [*\"abcde\"],\n \"c1\": [10, 11, 12, 13, 14],\n \"c2\": [0.1, 0.3, 0.4, 0.1, 0.9],\n \"c3\": [1e5, 2e5, 3.5e5, 8e4, 5e4],\n \"c4\": [9, 12, 5, 2, 0.2],\n \"test\": [1, 1, 1, 1, 5],\n },\n index=[*\"abcde\"],\n ),\n title=\"Sample Spider\",\n padding=1.1,\n)\n\n\n\n\n\n\n\n\n\n\n\nUpSetAltair\n\n UpSetAltair (data=None, title='', subtitle='', sets=None, abbre=None,\n sort_by='frequency', sort_order='ascending', width=1200,\n height=700, height_ratio=0.6,\n horizontal_bar_chart_width=300, color_range=['#55A8DB',\n '#3070B5', '#30363F', '#F1AD60', '#DF6234', '#BDC6CA'],\n highlight_color='#EA4667', glyph_size=200,\n set_label_bg_size=1000, line_connection_size=2,\n horizontal_bar_size=20, vertical_bar_label_size=16,\n vertical_bar_padding=20)\n\n*This function generates Altair-based interactive UpSet plots.\nParameters: - data (pandas.DataFrame): Tabular data containing the membership of each element (row) in exclusive intersecting sets (column). - sets (list): List of set names of interest to show in the UpSet plots. This list reflects the order of sets to be shown in the plots as well. - abbre (list): Abbreviated set names. - sort_by (str): “frequency” or “degree” - sort_order (str): “ascending” or “descending” - width (int): Vertical size of the UpSet plot. - height (int): Horizontal size of the UpSet plot. - height_ratio (float): Ratio of height between upper and under views, ranges from 0 to 1. - horizontal_bar_chart_width (int): Width of horizontal bar chart on the bottom-right. - color_range (list): Color to encode sets. - highlight_color (str): Color to encode intersecting sets upon mouse hover. - glyph_size (int): Size of UpSet glyph (⬤). - set_label_bg_size (int): Size of label background in the horizontal bar chart. - line_connection_size (int): width of lines in matrix view. - horizontal_bar_size (int): Height of bars in the horizontal bar chart. - vertical_bar_label_size (int): Font size of texts in the vertical bar chart on the top. - vertical_bar_padding (int): Gap between a pair of bars in the vertical bar charts.*\n\n\n\nupsetaltair_top_level_configuration\n\n upsetaltair_top_level_configuration (base, legend_orient='top-left',\n legend_symbol_size=30)\n\n*Configure the top-level settings for an UpSet plot in Altair.\nParameters: - base: The base chart to configure. - legend_orient: The orientation of the legend. Default is “top-left”. - legend_symbol_size: The size of the legend symbols. Default is 30.\nReturns: - The configured chart.*\n\ndf\n\n\n\n\n\n\n\n\ntruth\npred\n\n\n\n\n0\nc\nd\n\n\n1\nc\nc\n\n\n2\nd\nd\n\n\n3\nc\na\n\n\n4\nd\nc\n\n\n...\n...\n...\n\n\n995\nc\nc\n\n\n996\na\nc\n\n\n997\nb\na\n\n\n998\nb\nc\n\n\n999\na\nd\n\n\n\n\n1000 rows × 2 columns\n\n\n\n\n# import numpy as np\n\n# i = np.random.randn(300, 7) > 0.33\n# df = pd.DataFrame(i.astype(int))\n# df.columns = [rand() for _ in range(len(df.columns))]\n# show(df)\n\n# UpSetAltair(\n# df,\n# sets=list(df.columns),\n# abbre=list(df.columns),\n# sort_by=\"frequencey\",\n# sort_order=\"ascending\",\n# )\n\ndf\n\n\n\n\n4wST3l\nv6Vv72\nWKSGX4\nLBlidv\ng0LDKa\nxpK2f5\npW4oKO\n\n\n\n\n0\n0\n1\n0\n1\n0\n0\n1\n\n\n1\n1\n0\n0\n1\n0\n1\n0\n\n\n2\n1\n0\n1\n0\n0\n1\n0\n\n\n3\n1\n0\n0\n0\n0\n0\n1\n\n\n4\n0\n0\n1\n0\n1\n0\n1\n\n\n5\n0\n0\n0\n1\n0\n0\n0\n\n\n6\n1\n0\n0\n1\n1\n0\n1\n\n\n7\n1\n1\n1\n1\n0\n1\n1\n\n\n8\n1\n0\n0\n1\n0\n1\n1\n\n\n9\n1\n0\n0\n1\n0\n0\n0\n\n\n10\n1\n0\n0\n0\n0\n0\n1\n\n\n11\n1\n0\n1\n1\n0\n0\n0\n\n\n12\n0\n1\n0\n1\n0\n0\n1\n\n\n13\n1\n0\n0\n1\n0\n1\n1\n\n\n14\n1\n1\n0\n1\n0\n0\n0\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n285\n1\n0\n0\n0\n0\n0\n0\n\n\n286\n1\n0\n0\n1\n1\n1\n1\n\n\n287\n0\n0\n1\n1\n0\n1\n0\n\n\n288\n0\n1\n1\n1\n0\n0\n0\n\n\n289\n0\n1\n1\n1\n0\n0\n0\n\n\n290\n0\n1\n1\n1\n1\n0\n0\n\n\n291\n0\n0\n1\n0\n1\n0\n0\n\n\n292\n0\n0\n1\n1\n0\n0\n1\n\n\n293\n1\n0\n0\n0\n0\n1\n0\n\n\n294\n0\n0\n0\n0\n0\n0\n1\n\n\n295\n0\n1\n1\n1\n0\n0\n0\n\n\n296\n0\n0\n0\n1\n0\n1\n0\n\n\n297\n1\n0\n1\n0\n0\n0\n1\n\n\n298\n0\n1\n1\n0\n1\n0\n0\n\n\n299\n0\n0\n1\n0\n0\n0\n0\n\n\n\n\n\n\n/opt/miniconda3/lib/python3.12/site-packages/altair/utils/deprecation.py:65: AltairDeprecationWarning: 'selection_multi' is deprecated. Use 'selection_point'\n warnings.warn(message, AltairDeprecationWarning, stacklevel=1)\n/opt/miniconda3/lib/python3.12/site-packages/altair/utils/deprecation.py:65: AltairDeprecationWarning: 'selection_single' is deprecated. Use 'selection_point'\n warnings.warn(message, AltairDeprecationWarning, stacklevel=1)\n\n\n\n---------------------------------------------------------------------------\nSchemaValidationError Traceback (most recent call last)\nCell In[14], line 8\n 5 df.columns = [rand() for _ in range(len(df.columns))]\n 6 show(df)\n----> 8 UpSetAltair(\n 9 df,\n 10 sets=list(df.columns),\n 11 abbre=list(df.columns),\n 12 sort_by=\"frequencey\",\n 13 sort_order=\"ascending\",\n 14 )\n\nCell In[10], line 239, in UpSetAltair(data, title, subtitle, sets, abbre, sort_by, sort_order, width, height, height_ratio, horizontal_bar_chart_width, color_range, highlight_color, glyph_size, set_label_bg_size, line_connection_size, horizontal_bar_size, vertical_bar_label_size, vertical_bar_padding)\n 177 base = (\n 178 alt.Chart(data)\n 179 .transform_filter(legend_selection)\n (...)\n 232 )\n 233 )\n 234 # Now, we have data in the following format:\n 235 # count, set, is_intersect, degree, intersection_id, set_abbre\n 236 \n 237 # Cardinality by intersecting sets (vertical bar chart)\n 238 vertical_bar = (\n--> 239 base.mark_bar(color=main_color, size=vertical_bar_size)\n 240 .encode(\n 241 x=alt.X(\n 242 \"intersection_id:N\",\n 243 axis=alt.Axis(grid=False, labels=False, ticks=False, domain=True),\n 244 sort=x_sort,\n 245 title=None,\n 246 ),\n 247 y=alt.Y(\n 248 \"max(count):Q\",\n 249 axis=alt.Axis(grid=False, tickCount=3, orient=\"right\"),\n 250 title=\"Intersection Size\",\n 251 ),\n 252 color=brush_color,\n 253 tooltip=tooltip,\n 254 )\n 255 .properties(width=matrix_width, height=vertical_bar_chart_height)\n 256 )\n 258 vertical_bar_text = vertical_bar.mark_text(\n 259 color=main_color, dy=-10, size=vertical_bar_label_size\n 260 ).encode(text=alt.Text(\"count:Q\", format=\".0f\"))\n 262 vertical_bar_chart = (vertical_bar + vertical_bar_text).add_selection(\n 263 color_selection\n 264 )\n\nFile /opt/miniconda3/lib/python3.12/site-packages/altair/vegalite/v5/schema/mixins.py:2786, in MarkMethodMixin.mark_bar(self, align, angle, aria, ariaRole, ariaRoleDescription, aspect, bandSize, baseline, binSpacing, blend, clip, color, continuousBandSize, cornerRadius, cornerRadiusBottomLeft, cornerRadiusBottomRight, cornerRadiusEnd, cornerRadiusTopLeft, cornerRadiusTopRight, cursor, description, dir, discreteBandSize, dx, dy, ellipsis, fill, fillOpacity, filled, font, fontSize, fontStyle, fontWeight, height, href, innerRadius, interpolate, invalid, limit, line, lineBreak, lineHeight, minBandSize, opacity, order, orient, outerRadius, padAngle, point, radius, radius2, radius2Offset, radiusOffset, shape, size, smooth, stroke, strokeCap, strokeDash, strokeDashOffset, strokeJoin, strokeMiterLimit, strokeOffset, strokeOpacity, strokeWidth, style, tension, text, theta, theta2, theta2Offset, thetaOffset, thickness, timeUnitBandPosition, timeUnitBandSize, tooltip, url, width, x, x2, x2Offset, xOffset, y, y2, y2Offset, yOffset, **kwds)\n 2784 copy = self.copy(deep=False) # type: ignore[attr-defined]\n 2785 if any(val is not Undefined for val in kwds.values()):\n-> 2786 copy.mark = core.MarkDef(type=\"bar\", **kwds)\n 2787 else:\n 2788 copy.mark = \"bar\"\n\nFile /opt/miniconda3/lib/python3.12/site-packages/altair/vegalite/v5/schema/core.py:23720, in MarkDef.__init__(self, type, align, angle, aria, ariaRole, ariaRoleDescription, aspect, bandSize, baseline, binSpacing, blend, clip, color, continuousBandSize, cornerRadius, cornerRadiusBottomLeft, cornerRadiusBottomRight, cornerRadiusEnd, cornerRadiusTopLeft, cornerRadiusTopRight, cursor, description, dir, discreteBandSize, dx, dy, ellipsis, fill, fillOpacity, filled, font, fontSize, fontStyle, fontWeight, height, href, innerRadius, interpolate, invalid, limit, line, lineBreak, lineHeight, minBandSize, opacity, order, orient, outerRadius, padAngle, point, radius, radius2, radius2Offset, radiusOffset, shape, size, smooth, stroke, strokeCap, strokeDash, strokeDashOffset, strokeJoin, strokeMiterLimit, strokeOffset, strokeOpacity, strokeWidth, style, tension, text, theta, theta2, theta2Offset, thetaOffset, thickness, timeUnitBandPosition, timeUnitBandSize, tooltip, url, width, x, x2, x2Offset, xOffset, y, y2, y2Offset, yOffset, **kwds)\n 22901 def __init__(\n 22902 self,\n 22903 type: Union[\n (...)\n 23718 **kwds,\n 23719 ):\n> 23720 super(MarkDef, self).__init__(\n 23721 type=type,\n 23722 align=align,\n 23723 angle=angle,\n 23724 aria=aria,\n 23725 ariaRole=ariaRole,\n 23726 ariaRoleDescription=ariaRoleDescription,\n 23727 aspect=aspect,\n 23728 bandSize=bandSize,\n 23729 baseline=baseline,\n 23730 binSpacing=binSpacing,\n 23731 blend=blend,\n 23732 clip=clip,\n 23733 color=color,\n 23734 continuousBandSize=continuousBandSize,\n 23735 cornerRadius=cornerRadius,\n 23736 cornerRadiusBottomLeft=cornerRadiusBottomLeft,\n 23737 cornerRadiusBottomRight=cornerRadiusBottomRight,\n 23738 cornerRadiusEnd=cornerRadiusEnd,\n 23739 cornerRadiusTopLeft=cornerRadiusTopLeft,\n 23740 cornerRadiusTopRight=cornerRadiusTopRight,\n 23741 cursor=cursor,\n 23742 description=description,\n 23743 dir=dir,\n 23744 discreteBandSize=discreteBandSize,\n 23745 dx=dx,\n 23746 dy=dy,\n 23747 ellipsis=ellipsis,\n 23748 fill=fill,\n 23749 fillOpacity=fillOpacity,\n 23750 filled=filled,\n 23751 font=font,\n 23752 fontSize=fontSize,\n 23753 fontStyle=fontStyle,\n 23754 fontWeight=fontWeight,\n 23755 height=height,\n 23756 href=href,\n 23757 innerRadius=innerRadius,\n 23758 interpolate=interpolate,\n 23759 invalid=invalid,\n 23760 limit=limit,\n 23761 line=line,\n 23762 lineBreak=lineBreak,\n 23763 lineHeight=lineHeight,\n 23764 minBandSize=minBandSize,\n 23765 opacity=opacity,\n 23766 order=order,\n 23767 orient=orient,\n 23768 outerRadius=outerRadius,\n 23769 padAngle=padAngle,\n 23770 point=point,\n 23771 radius=radius,\n 23772 radius2=radius2,\n 23773 radius2Offset=radius2Offset,\n 23774 radiusOffset=radiusOffset,\n 23775 shape=shape,\n 23776 size=size,\n 23777 smooth=smooth,\n 23778 stroke=stroke,\n 23779 strokeCap=strokeCap,\n 23780 strokeDash=strokeDash,\n 23781 strokeDashOffset=strokeDashOffset,\n 23782 strokeJoin=strokeJoin,\n 23783 strokeMiterLimit=strokeMiterLimit,\n 23784 strokeOffset=strokeOffset,\n 23785 strokeOpacity=strokeOpacity,\n 23786 strokeWidth=strokeWidth,\n 23787 style=style,\n 23788 tension=tension,\n 23789 text=text,\n 23790 theta=theta,\n 23791 theta2=theta2,\n 23792 theta2Offset=theta2Offset,\n 23793 thetaOffset=thetaOffset,\n 23794 thickness=thickness,\n 23795 timeUnitBandPosition=timeUnitBandPosition,\n 23796 timeUnitBandSize=timeUnitBandSize,\n 23797 tooltip=tooltip,\n 23798 url=url,\n 23799 width=width,\n 23800 x=x,\n 23801 x2=x2,\n 23802 x2Offset=x2Offset,\n 23803 xOffset=xOffset,\n 23804 y=y,\n 23805 y2=y2,\n 23806 y2Offset=y2Offset,\n 23807 yOffset=yOffset,\n 23808 **kwds,\n 23809 )\n\nFile /opt/miniconda3/lib/python3.12/site-packages/altair/vegalite/v5/schema/core.py:149, in AnyMark.__init__(self, *args, **kwds)\n 148 def __init__(self, *args, **kwds):\n--> 149 super(AnyMark, self).__init__(*args, **kwds)\n\nFile /opt/miniconda3/lib/python3.12/site-packages/altair/utils/schemapi.py:771, in SchemaBase.__init__(self, *args, **kwds)\n 768 object.__setattr__(self, \"_kwds\", kwds)\n 770 if DEBUG_MODE and self._class_is_valid_at_instantiation:\n--> 771 self.to_dict(validate=True)\n\nFile /opt/miniconda3/lib/python3.12/site-packages/altair/utils/schemapi.py:978, in SchemaBase.to_dict(self, validate, ignore, context)\n 971 self.validate(result)\n 972 except jsonschema.ValidationError as err:\n 973 # We do not raise `from err` as else the resulting\n 974 # traceback is very long as it contains part\n 975 # of the Vega-Lite schema. It would also first\n 976 # show the less helpful ValidationError instead of\n 977 # the more user friendly SchemaValidationError\n--> 978 raise SchemaValidationError(self, err) from None\n 979 return result\n\nSchemaValidationError: '-7.628865979381443' is an invalid value for `size`.\n\n-7.628865979381443 is less than the minimum of 0\n\n\n\n\n\n\nERROR:root:No traceback has been produced, nothing to debug.", + "crumbs": [ + "Altair and Other Charts" + ] + }, + { + "objectID": "jupyter_notebook.html", + "href": "jupyter_notebook.html", + "title": "Jupyter Notebooks", + "section": "", + "text": "backup_folders_of_nbs\n\n backup_folders_of_nbs (src, dest)\n\n\n\n\nbackup_all_notebooks\n\n backup_all_notebooks (folder)\n\n\n\n\nbackup_this_notebook\n\n backup_this_notebook (this_file_path, save_html_to_dir=None,\n override_previous_backup=False, changelog=None,\n exclude_input=False, force_save_notebook=True)\n\n\n\n\nsave_notebook\n\n save_notebook (file_path)\n\n\nbackup_this_notebook(\"jupyter_notebook.ipynb\")\n\n\n\n\nshow_big_dataframe\n\n show_big_dataframe (df, max_rows=30)\n\n\n\n\ndisplay_dfs_side_by_side\n\n display_dfs_side_by_side (*args, titles=<itertools.cycle object at\n 0x11b22ea00>, max_rows=50)\n\n\n\n\nh6\n\n h6 (text)\n\n\n\n\nh5\n\n h5 (text)\n\n\n\n\nh4\n\n h4 (text)\n\n\n\n\nh3\n\n h3 (text)\n\n\n\n\nh2\n\n h2 (text)\n\n\n\n\nh1\n\n h1 (text)\n\n\n\n\nstore_scrap\n\n store_scrap (at)\n\n\n\n\nshutdown_current_notebook\n\n shutdown_current_notebook (delay:int=None)", + "crumbs": [ + "Jupyter Notebooks" + ] + }, + { + "objectID": "misc.html", + "href": "misc.html", + "title": "Miscellaneous", + "section": "", + "text": "time.sleep(3)", + "crumbs": [ + "Miscellaneous" + ] + }, + { + "objectID": "misc.html#timer", + "href": "misc.html#timer", + "title": "Miscellaneous", + "section": "Timer", + "text": "Timer\nUse timer as a standalone class so you have full control on when to call a lap (most useful in while loops)…\n\nN = 50\nt = Timer(N)\ninfo = None\n\nfor i in range(N):\n time.sleep(0.1)\n t(info=info) # Lap and present the time\n if i == N//2:\n print()\n info = f\"My Info: {i*3.122}\"\n\n26/50 (2.70s - 2.49s remaining - 9.62 iters/s) \nMy Info: 78.05 50/50 (5.20s - 0.00s remaining - 9.61 iters/s)", + "crumbs": [ + "Miscellaneous" + ] + }, + { + "objectID": "misc.html#track2", + "href": "misc.html#track2", + "title": "Miscellaneous", + "section": "Track2", + "text": "Track2\n… or use track2 to directly track a for loop\n\nN = 50\ninfo = None\n\nfor i in (tracker := track2(range(N), total=N)):\n time.sleep(0.1)\n info = f\"My Info: {i*3.122:.2f}\"\n if i == N // 2:\n print()\n if i >= N // 2:\n tracker.send(info)\n\n25/50 (2.59s - 2.59s remaining - 9.66 iters/s) \nMy Info: 152.98 50/50 (5.18s - 0.00s remaining - 9.65 iters/s) \n\n\nWarning! NEVER RUN tracker.send(None) as this will skip variables silently\n\n# https://youtu.be/XcU-a-eksMA\nfrom IPython.display import YouTubeVideo\n\n# Replace 'video_id' with the actual YouTube video ID\nYouTubeVideo('XcU-a-eksMA', width=560, height=315)", + "crumbs": [ + "Miscellaneous" + ] + }, + { + "objectID": "misc.html#print-execution-time", + "href": "misc.html#print-execution-time", + "title": "Miscellaneous", + "section": "Print execution time", + "text": "Print execution time\n@timeit decorates and prints time taken to execute a function as an info log\n\n@timeit\ndef foo(a, b=None):\n if b is None:\n return a + 1\n else:\n time.sleep(2)\n return a + b\n\n\nfoo(10)\nfoo(10, b=20)\n\n[08/24/24 12:46:23] INFO 0.00 seconds to execute `foo` 3503404687.py:inner:16\n\n\n\n[08/24/24 12:46:25] INFO 2.01 seconds to execute `foo` 3503404687.py:inner:16\n\n\n\n30", + "crumbs": [ + "Miscellaneous" + ] + }, + { + "objectID": "misc.html#print-io", + "href": "misc.html#print-io", + "title": "Miscellaneous", + "section": "Print IO", + "text": "Print IO\n@io will decorate to show inputs and outputs (along with time taken to execute) as a debug log\n\n@io\ndef foo(a, b=None):\n if b is None:\n return a + 1\n else:\n time.sleep(2)\n return a + b\n\n\nwith debug_mode():\n foo(10)\n foo(10, b=20)\n\n[08/24/24 12:46:26] DEBUG 3503404687.py:inner:41\n 0.00 seconds to execute `foo` \n args() \n 0 - 10 (🏷️ int) \n kwargs \n outputs - 11 (🏷️ int) \n \n \n\n\n\n[08/24/24 12:46:28] DEBUG 3503404687.py:inner:41\n 2.01 seconds to execute `foo` \n args() \n 0 - 10 (🏷️ int) \n kwargs \n b - 20 (🏷️ int) \n outputs - 30 (🏷️ int) \n \n \n\n\n\n@io can be forced to print as log/trace if needed", + "crumbs": [ + "Miscellaneous" + ] + }, + { + "objectID": "misc.html#try-catch-with-a-single-line", + "href": "misc.html#try-catch-with-a-single-line", + "title": "Miscellaneous", + "section": "Try Catch with a single line", + "text": "Try Catch with a single line\n\n@tryy\ndef do(a, b, c):\n return 1 / 0\n\n\nx = do(1, 2, c=10)\nassert x is None # tryy returns None by default\n\n[08/24/24 12:46:28] ERROR Error for `do` with 1057038067.py:inner:30\n args() \n 0 - 1 (🏷️ int) \n 1 - 2 (🏷️ int) \n kwargs \n c - 10 (🏷️ int) \n \n ZeroDivisionError: division by zero \n Traceback (most recent call last): \n \n File \"/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/1057038067.py\", line 21, in inner \n return f(*args, **kwargs) \n | | -> {'c': 10} \n | -> (1, 2) \n -> <function do at 0x11ecdd800> \n \n File \"/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/884313129.py\", line 3, in do \n return 1 / 0 \n \n ZeroDivisionError: division by zero \n \n ╭───────────────────────────────────────── Traceback (most recent call last) ──────────────────────────────────────────╮ \n │ in inner:21 │ \n │ │ \n │ 18 │ │ │ \n │ 19 │ │ def inner(*args, **kwargs): │ \n │ 20 │ │ │ try: │ \n │ ❱ 21 │ │ │ │ return f(*args, **kwargs) │ \n │ 22 │ │ │ except Exception as e: │ \n │ 23 │ │ │ │ if not print_traceback: │ \n │ 24 │ │ │ │ │ tb = f\"{type(e).__name__}: {str(e)}\" │ \n │ │ \n │ in do:3 │ \n │ │ \n │ 1 @tryy │ \n │ 2 def do(a, b, c): │ \n │ ❱ 3 │ return 1 / 0 │ \n │ 4 │ \n │ 5 │ \n │ 6 x = do(1, 2, c=10) │ \n ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ \n ZeroDivisionError: division by zero \n\n\n\nUse your own default on failure\n\n@tryy(output_to_return_on_fail=\"😔\")\ndef do(a, b, c):\n return 1 / 0\n\n\ndo(1, 2, c=10)\n\n ERROR Error for `do` with 1057038067.py:inner:30\n args() \n 0 - 1 (🏷️ int) \n 1 - 2 (🏷️ int) \n kwargs \n c - 10 (🏷️ int) \n \n ZeroDivisionError: division by zero \n Traceback (most recent call last): \n \n File \"/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/1057038067.py\", line 21, in inner \n return f(*args, **kwargs) \n | | -> {'c': 10} \n | -> (1, 2) \n -> <function do at 0x11ecdeac0> \n \n File \"/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/3352784188.py\", line 3, in do \n return 1 / 0 \n \n ZeroDivisionError: division by zero \n \n ╭───────────────────────────────────────── Traceback (most recent call last) ──────────────────────────────────────────╮ \n │ in inner:21 │ \n │ │ \n │ 18 │ │ │ \n │ 19 │ │ def inner(*args, **kwargs): │ \n │ 20 │ │ │ try: │ \n │ ❱ 21 │ │ │ │ return f(*args, **kwargs) │ \n │ 22 │ │ │ except Exception as e: │ \n │ 23 │ │ │ │ if not print_traceback: │ \n │ 24 │ │ │ │ │ tb = f\"{type(e).__name__}: {str(e)}\" │ \n │ │ \n │ in do:3 │ \n │ │ \n │ 1 @tryy(output_to_return_on_fail=\"😔\") │ \n │ 2 def do(a, b, c): │ \n │ ❱ 3 │ return 1 / 0 │ \n │ 4 │ \n │ 5 │ \n │ 6 do(1, 2, c=10) │ \n ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ \n ZeroDivisionError: division by zero \n\n\n\n'😔'\n\n\nOptionally print the full stacktrace if needed\n\n@tryy(print_traceback=True, output_to_return_on_fail=\"😔\")\ndef do(a, b, c):\n return 1 / 0\n\n\ndo(1, 2, c=10)\n\n ERROR Error for `do` with 1057038067.py:inner:30\n args() \n 0 - 1 (🏷️ int) \n 1 - 2 (🏷️ int) \n kwargs \n c - 10 (🏷️ int) \n \n Traceback (most recent call last): \n File \"/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/1057038067.py\", line 21, in inner \n return f(*args, **kwargs) \n ^^^^^^^^^^^^^^^^^^ \n File \"/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/580638143.py\", line 3, in do \n return 1 / 0 \n ~~^~~ \n ZeroDivisionError: division by zero \n \n Traceback (most recent call last): \n \n File \"/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/1057038067.py\", line 21, in inner \n return f(*args, **kwargs) \n | | -> {'c': 10} \n | -> (1, 2) \n -> <function do at 0x11ecdeb60> \n \n File \"/var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_45033/580638143.py\", line 3, in do \n return 1 / 0 \n \n ZeroDivisionError: division by zero \n \n ╭───────────────────────────────────────── Traceback (most recent call last) ──────────────────────────────────────────╮ \n │ in inner:21 │ \n │ │ \n │ 18 │ │ │ \n │ 19 │ │ def inner(*args, **kwargs): │ \n │ 20 │ │ │ try: │ \n │ ❱ 21 │ │ │ │ return f(*args, **kwargs) │ \n │ 22 │ │ │ except Exception as e: │ \n │ 23 │ │ │ │ if not print_traceback: │ \n │ 24 │ │ │ │ │ tb = f\"{type(e).__name__}: {str(e)}\" │ \n │ │ \n │ in do:3 │ \n │ │ \n │ 1 @tryy(print_traceback=True, output_to_return_on_fail=\"😔\") │ \n │ 2 def do(a, b, c): │ \n │ ❱ 3 │ return 1 / 0 │ \n │ 4 │ \n │ 5 │ \n │ 6 do(1, 2, c=10) │ \n ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ \n ZeroDivisionError: division by zero \n\n\n\n'😔'\n\n\nYou can also silence the errors completely\n\n@tryy(silence_errors=True, output_to_return_on_fail=\"😔\")\ndef do(a, b, c):\n return 1 / 0\n\n\ndo(1, 2, c=10)\n\n'😔'\n\n\nYou can collect all your errors in a list\n\nimport random\n\nerrors = []\n\n\n@tryy(silence_errors=True, store_errors=errors)\ndef do(a, b, c):\n if random.randint(0, 100) < 50:\n return 1 / 0\n else:\n raise NotImplementedError(\"🤔\")\n\n\nfor _ in range(4):\n do(1, random.randint(0, 10), c=random.randint(0, 100))\n\nprint(errors)\n\n[\n```↯ AttrDict ↯\nfunc - do (🏷️ str)\nargs()\n 0 - 1 (🏷️ int)\n 1 - 5 (🏷️ int)\nkwargs\n c - 21 (🏷️ int)\ntb - NotImplementedError: 🤔 (🏷️ str)\nerr_type - NotImplementedError (🏷️ str)\n\n```\n, \n```↯ AttrDict ↯\nfunc - do (🏷️ str)\nargs()\n 0 - 1 (🏷️ int)\n 1 - 7 (🏷️ int)\nkwargs\n c - 93 (🏷️ int)\ntb - NotImplementedError: 🤔 (🏷️ str)\nerr_type - NotImplementedError (🏷️ str)\n\n```\n, \n```↯ AttrDict ↯\nfunc - do (🏷️ str)\nargs()\n 0 - 1 (🏷️ int)\n 1 - 4 (🏷️ int)\nkwargs\n c - 4 (🏷️ int)\ntb - ZeroDivisionError: division by zero (🏷️ str)\nerr_type - ZeroDivisionError (🏷️ str)\n\n```\n, \n```↯ AttrDict ↯\nfunc - do (🏷️ str)\nargs()\n 0 - 1 (🏷️ int)\n 1 - 0 (🏷️ int)\nkwargs\n c - 36 (🏷️ int)\ntb - NotImplementedError: 🤔 (🏷️ str)\nerr_type - NotImplementedError (🏷️ str)\n\n```\n]\n\n\nThere’s onlly one usecase where you would want to send in a list by yourself - when you want to append your errors to an existing list. The sensible default is to always store the errors, especially because this is a debugging tool.\nJust access all the errors in a dataframe like so\n\nimport random\n\nrandom.seed(10)\n\n\n@tryy(silence_errors=True)\ndef do(a, b, c):\n if c < 50:\n return 1 / 0\n else:\n raise NotImplementedError(\"🤔\")\n\n\nfor _ in range(4):\n do(1, random.randint(0, 10), c=random.randint(0, 100))\n\ndo.error_summary()\n\n\n\n\n\n\n\n\nfunc\nargs\nkwargs\ntb\nerr_type\n\n\n\n\n0\ndo\n[1, 9]\n{'c': 4}\nZeroDivisionError: division by zero\nZeroDivisionError\n\n\n1\ndo\n[1, 6]\n{'c': 61}\nNotImplementedError: 🤔\nNotImplementedError\n\n\n2\ndo\n[1, 9]\n{'c': 1}\nZeroDivisionError: division by zero\nZeroDivisionError\n\n\n3\ndo\n[1, 3]\n{'c': 59}\nNotImplementedError: 🤔\nNotImplementedError\n\n\n\n\n\n\n\nand the actual list of errors like so\n\ndo.error_store\n\n[\n ```↯ AttrDict ↯\n func - do (🏷️ str)\n args()\n 0 - 1 (🏷️ int)\n 1 - 9 (🏷️ int)\n kwargs\n c - 4 (🏷️ int)\n tb - ZeroDivisionError: division by zero (🏷️ str)\n err_type - ZeroDivisionError (🏷️ str)\n \n ```,\n \n ```↯ AttrDict ↯\n func - do (🏷️ str)\n args()\n 0 - 1 (🏷️ int)\n 1 - 6 (🏷️ int)\n kwargs\n c - 61 (🏷️ int)\n tb - NotImplementedError: 🤔 (🏷️ str)\n err_type - NotImplementedError (🏷️ str)\n \n ```,\n \n ```↯ AttrDict ↯\n func - do (🏷️ str)\n args()\n 0 - 1 (🏷️ int)\n 1 - 9 (🏷️ int)\n kwargs\n c - 1 (🏷️ int)\n tb - ZeroDivisionError: division by zero (🏷️ str)\n err_type - ZeroDivisionError (🏷️ str)\n \n ```,\n \n ```↯ AttrDict ↯\n func - do (🏷️ str)\n args()\n 0 - 1 (🏷️ int)\n 1 - 3 (🏷️ int)\n kwargs\n c - 59 (🏷️ int)\n tb - NotImplementedError: 🤔 (🏷️ str)\n err_type - NotImplementedError (🏷️ str)\n \n ```]\n\n\nFinally, you want to run the function (without try) to reproduce the error and actually start debugging. Just use the .F attribute to access the original function that you created\n\nix = 2\ndata = do.error_store[ix]\ndo.F(*data.args, **data.kwargs)\n\n\n---------------------------------------------------------------------------\nZeroDivisionError Traceback (most recent call last)\nCell In[19], line 3\n 1 ix = 2\n 2 data = do.error_store[ix]\n----> 3 do.F(*data.args, **data.kwargs)\n\nCell In[17], line 9, in do(a, b, c)\n 6 @tryy(silence_errors=True)\n 7 def do(a, b, c):\n 8 if c < 50:\n----> 9 return 1 / 0\n 10 else:\n 11 raise NotImplementedError(\"🤔\")\n\nZeroDivisionError: division by zero\n\n\n\n\ndef deco(decorator):\n @wraps(decorator)\n def wrapper(*args, **kwargs):\n def real_decorator(func):\n @wraps(func)\n def inner_wrapper(*fargs, **fkwargs):\n return decorator(func, *fargs, **fkwargs)\n\n return inner_wrapper\n\n if len(args) == 1 and callable(args[0]) and not kwargs:\n # Case when B is used without arguments\n return real_decorator(args[0])\n else:\n # Case when B is used with arguments\n def custom_decorator(func):\n return decorator(func, **kwargs)\n\n return custom_decorator\n\n return wrapper\n\n\n@deco\ndef B(func, *args, deco_param=\"default\", **kwargs):\n print(\"B\", deco_param, print(\"args\", *args, \"kwargs\", **kwargs))\n return func(*args, **kwargs)\n\n\n@B\ndef C(a, b, c):\n print(\"C\")\n return a + (b * c)\n\n\nC(1, 2, 3)\n\n\n@B(deco_param=\"new_param\")\ndef C(a, b, c):\n return a + (b * c)\n\n\n# Testing\nprint(C(1, 2, 3)) # Outputs 'new_param' then the result 7", + "crumbs": [ + "Miscellaneous" + ] + }, + { + "objectID": "adapters.html", + "href": "adapters.html", + "title": "Adapters", + "section": "", + "text": "Adapters\nTo convert data from/to various formats\n\n\n\nfile_2_bytes\n\n file_2_bytes (fpath)\n\n\n\n\nbytes_2_file\n\n bytes_2_file (input:bytes, fpath:Union[str,pathlib.Path],\n silent:bool=False)\n\nSave bytes input at given fpath\n\n\n\n\nType\nDefault\nDetails\n\n\n\n\ninput\nbytes\n\nbytes\n\n\nfpath\nUnion\n\nPlace where you want to save the file\n\n\nsilent\nbool\nFalse\n\n\n\nReturns\nNone\n\n\n\n\n\n\n\n\nb64_2_file\n\n b64_2_file (input:str, fpath:Union[str,pathlib.Path])\n\nSave a file encoded as a base64 input at given fpath\n\n\n\n\nType\nDetails\n\n\n\n\ninput\nstr\nbase64 encoded string\n\n\nfpath\nUnion\nPlace where you want to save the file\n\n\nReturns\nNone\n\n\n\n\n\n\n\nb64_2_np\n\n b64_2_np (input:str)\n\n*Converts a base64 encoded image to a NumPy array.\nArgs: input (str): The base64 encoded image.\nReturns: np.ndarray: The NumPy array representation of the image in RGB format.*\n\n\n\nnp_2_b64\n\n np_2_b64 (image:numpy.ndarray)\n\nConvert a numpy image to base64 string\n\n\n\ncvat_2_csvs\n\n cvat_2_csvs (xmlfile, csvs_folder)\n\n*Convert CVAT XML annotations to CSV files.\nArgs: xmlfile (str): Path to the CVAT XML file. csvs_folder (str): Path to the folder where the CSV files will be saved.\nReturns: None*\n\n\n\ncsvs_2_cvat\n\n csvs_2_cvat (images_folder, csvs_folder, xml_output_file, items=None,\n parquet=False, relative_df=True, default_label='Background',\n extension='jpg')\n\n*Convert CSV annotations to CVAT XML format.\nArgs: images_folder (str): Path to the folder containing the images. csvs_folder (str): Path to the folder containing the CSV annotations. xml_output_file (str): Path to the output XML file. items (list, optional): List of items to process. If None, all items will be processed. Defaults to None. parquet (bool, optional): Whether the annotations are stored in Parquet format. Defaults to False. relative_df (bool, optional): Whether the bounding box coordinates in the CSV are relative to the image size. Defaults to True. default_label (str, optional): Default label for the bounding boxes. Defaults to “Background”. extension (str, optional): Image file extension. Defaults to “jpg”.\nReturns: None*\n\n\n\nyolo_2_df\n\n yolo_2_df (yolo, h, w, id2class, class_column)\n\n\n\n\ndf_2_yolo\n\n df_2_yolo (df, h, w, class2id, class_column)", + "crumbs": [ + "Adapters" + ] + }, + { + "objectID": "capsule.html", + "href": "capsule.html", + "title": "Capsule (Tutorial)", + "section": "", + "text": "Let’s load the iris dataset first\n\nfrom sklearn.datasets import load_iris\nfrom sklearn.model_selection import train_test_split\n\ndata = load_iris()\nX, y = data.data, data.target\nX_trn, X_val, y_trn, y_val = train_test_split(X, y, random_state=42)\n\n… and create the data loaders\n\nfrom torch_snippets.markup2 import AD\nfrom torch.utils.data import TensorDataset\n\ntrn_ds = TensorDataset(*[torch.Tensor(i) for i in [X_trn, y_trn]])\ntrn_dl = DataLoader(trn_ds, batch_size=32)\n\nval_ds = TensorDataset(*[torch.Tensor(i) for i in [X_val, y_val]])\nval_dl = DataLoader(val_ds, batch_size=32)\n\nAD(next(iter(val_dl)))\n\n\n```↯ AttrDict ↯\nnext(iter(val_dl))[]\n 0 - 🔦tensor[32, 4] n=128 x∈[0.100, 7.900] μ=3.488 σ=2.034 - ID:#56f55949\n 1 - 🔦tensor[32] x∈[0., 2.000] μ=0.969 σ=0.861 - ID:#b365fa0a\n\n```\n\n\nNext we’ll import Capsule and a few decorators that will tell the model to change it’s mode to train/test during the fit function\nfrom torch_snippets.trainer.capsule import Capsule, train, validate, predict\nCreate the neural network and define it’s forward function as usual pytorch business. Only difference now is that you’ll also add self.loss_fn and self.optimizer attributes in the init\nclass IrisModel(Capsule):\n def __init__(self):\n super().__init__()\n self.model = nn.Sequential(\n nn.BatchNorm1d(4),\n nn.Linear(4, 16),\n nn.Dropout(0.2),\n nn.BatchNorm1d(16),\n nn.ReLU(inplace=True),\n nn.Linear(16, 8),\n nn.Dropout(0.2),\n nn.BatchNorm1d(8),\n nn.ReLU(inplace=True),\n nn.Linear(8, 3),\n )\n self.loss_fn = nn.CrossEntropyLoss()\n self.optimizer = optim.Adam(self.parameters())\n\n def forward(self, x):\n return self.model(x)\nTo fully describe the model’s behaviour we still need to define three functions\n1. train_batch\n2. validate_batch and,\n3. predict which is optional\nlike so\n\n @train\n def train_batch(self, batch):\n x, y = batch\n _y = self.forward(x)\n loss = self.loss_fn(_y, y.long())\n return {\"loss\": loss}\n\n @validate\n def validate_batch(self, batch=None, dl=None):\n if dl is not None:\n output = []\n for batch in dl:\n output.extend(self.predict(batch=batch)[\"val_acc\"])\n return np.mean(output)\n x, y = batch\n _y = self.forward(x)\n loss = self.loss_fn(_y, y.long())\n acc = (y == _y.max(-1)[1]).float().mean()\n return {\"val_loss\": loss, \"val_acc\": acc}\n\n @predict\n def predict(self, batch=None, dl=None):\n if dl is not None:\n output = []\n for batch in dl:\n output.extend(self.predict(batch=batch))\n return output\n x, y = batch\n _y = self.forward(x)\n o = _y.max(-1)[1].cpu().detach().numpy().tolist()\n return o\n\nEnsure you return dictionaries of losses, accuracy metrics in train_batch and validate_batch functions. You can return as many metrics during training and validation, they will be auto logged.\n\nAlso make sure at least one of the keys in train_batch is the key loss, as this is used to compute gradients.*\n\nWe could now create the model…\n\nmodel = IrisModel()\nmodel.device = \"cpu\"\n\n… and run model.fit with an optional number of logs to print to the console\n\nmodel.fit(trn_dl, val_dl, num_epochs=100, print_total=2, device=\"cpu\")\n\nEPOCH: 1.000 val_acc: 0.281 loss: 1.118 val_loss: 1.159 (0.05s - 5.02s remaining)\nEPOCH: 50.000 val_acc: 1.000 loss: 0.490 val_loss: 0.406 (0.18s - 0.18s remaining)\nEPOCH: 100.000 val_acc: 1.000 loss: 0.238 val_loss: 0.162 (0.31s - 0.00s remaining)\n\n\n\n\n\n\n\n\n\nmodel.evaluate accepts a validation data loader that will repeatedly call validate_batch and return aggregated metrics\n\nmodel.evaluate(val_dl, device=\"cpu\")\n\nEPOCH: 1.000 val_acc: 1.000 val_loss: 0.164 (0.00s - 0.00s remaining)\n\n\n{'epoch_val_acc': np.float64(1.0),\n 'epoch_val_loss': np.float64(0.16414348781108856)}", + "crumbs": [ + "Capsule (Tutorial)" + ] + }, + { + "objectID": "inspector.html", + "href": "inspector.html", + "title": "Inspect", + "section": "", + "text": "import torch, numpy as np\nfrom torch_snippets import inspect\n\ninspect(torch.randint(0, 100, size=(4, 3, 5)), np.random.randint(-10, 10, (9, 19, 1)))\n\n══════════════════════════════════════════════════════════════════\n\n\n\nTensor Shape: torch.Size([4, 3, 5]) Min: 2.000 Max: 97.000 Mean: 46.317 dtype: torch.int64 @ cpu\n\n\n\n══════════════════════════════════════════════════════════════════\n\n\n\nndarray Shape: (9, 19, 1) Min: -10.000 Max: 9.000 Mean: -0.345 dtype: int64\n\n\n\n══════════════════════════════════════════════════════════════════\n\n\n\n\nx = {\n \"a\": [0, 1, 2, 3],\n \"b\": torch.rand(10, 10),\n \"c\": {\n \"d\": np.arange(10),\n \"e\": [\n \"np.arange\",\n {},\n tuple(\n [\n 1,\n 2,\n ]\n ),\n set([1, 2, 3]),\n [],\n [11, 10],\n ],\n },\n}\ninspect(x)\n\n══════════════════════════════════════════════════════════════════\n\n\n\ndict of 3 items\n\n\n\n A:\n list of 4 items\n\n\n\n int: 0\n\n\n\n int: 1\n\n\n\n int: 2\n\n\n\n int: 3\n\n\n\n B:\n Tensor Shape: torch.Size([10, 10]) Min: 0.000 Max: 0.989 Mean: 0.463 dtype: \ntorch.float32 @ cpu\n\n\n\n C:\n dict of 2 items\n\n\n\n D:\n ndarray Shape: (10,) Min: 0.000 Max: 9.000 Mean: 4.500 dtype: int64\n\n\n\n E:\n list of 6 items\n\n\n\n str `np.arange`\n\n\n\n dict of 0 items\n\n\n\n tuple of 2 items\n\n\n\n int: 1\n\n\n\n int: 2\n\n\n\n set Length: 3\n\n\n\n list of 0 items\n\n\n\n and ... ... 1 more item(s)\n\n\n\n══════════════════════════════════════════════════════════════════", + "crumbs": [ + "Inspect" + ] + }, + { + "objectID": "index.html", + "href": "index.html", + "title": "Utilities for simple needs", + "section": "", + "text": "# Time it\nfrom torch_snippets import *\n\nCPU times: user 263 ms, sys: 53.9 ms, total: 317 ms\nWall time: 407 ms\nBelow we are trying to extract the __all__ list from all Python files of the torch_snippets directory.\nThrough the code, you can already see some of the elements of torch-snippets in action.\nimport ast\n\nos.environ[\n \"AD_MAX_ITEMS\"\n] = ( # os is already imported by torch_snippets, along with many other useful libraries\n \"1000\" # Set the maximum number of items to display in the AD object\n)\n\n\n@tryy # This is a decorator that catches exceptions\ndef extract_all_list(file_path):\n file = readfile(file_path, silent=True) # Read the file\n tree = ast.parse(file, filename=file_path)\n\n for node in tree.body:\n if isinstance(node, ast.Assign):\n for target in node.targets:\n if isinstance(target, ast.Name) and target.id == \"__all__\":\n if isinstance(node.value, ast.List):\n all_list = [\n elt.value\n for elt in node.value.elts\n if isinstance(elt, ast.Constant)\n ]\n return all_list\n return None\n\n\ndef print_all_lists_in_directory(directory):\n dir = P(directory) # Create a pathlib.Path object\n for f in dir.ls(): # Iterate over all files in the directory\n if f.extn == \"py\" and f.stem not in [\n \"__init__\",\n \"_nbdev\",\n ]: # If it's a Python file and not __init__.py\n all_list = extract_all_list(f)\n if all_list is not None and len(all_list) > 0:\n h2(f.stem) # Print the name of the file as a heading in jupyter\n print(\n AD({\"items\": all_list})\n ) # AD is an intelligent dictionary that can display itself nicely\nprint(P().resolve())\n\n/Users/yeshwanth/Code/Personal/torch_snippets/nbs\n# Specify the directory containing the Python files\ndirectory_path = \"../torch_snippets\"\nprint_all_lists_in_directory(directory_path)\n\nmisc\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - Timer (🏷️ str)\n 1 - track2 (🏷️ str)\n 2 - summarize_input (🏷️ str)\n 3 - timeit (🏷️ str)\n 4 - io (🏷️ str)\n 5 - tryy (🏷️ str)\n\n```\n\n\n\nload_defaults\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - ifnone (🏷️ str)\n 1 - exists (🏷️ str)\n 2 - loadifexists (🏷️ str)\n\n```\n\n\n\ntext_utils\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - textify (🏷️ str)\n 1 - find_lines (🏷️ str)\n 2 - find_blocks (🏷️ str)\n 3 - find_substring (🏷️ str)\n 4 - get_line_data_from_word_data (🏷️ str)\n 5 - edit_distance_path (🏷️ str)\n 6 - group_blocks (🏷️ str)\n\n```\n\n\n\npaths\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - valid_methods (🏷️ str)\n 1 - P (🏷️ str)\n 2 - ls (🏷️ str)\n 3 - print_folder_summary (🏷️ str)\n 4 - dill (🏷️ str)\n 5 - input_to_str (🏷️ str)\n 6 - output_to_path (🏷️ str)\n 7 - process_f (🏷️ str)\n 8 - get_fs (🏷️ str)\n 9 - P0 (🏷️ str)\n 10 - stem (🏷️ str)\n 11 - stems (🏷️ str)\n 12 - extn (🏷️ str)\n 13 - remove_file (🏷️ str)\n 14 - isdir (🏷️ str)\n 15 - makedir (🏷️ str)\n 16 - fname (🏷️ str)\n 17 - fname2 (🏷️ str)\n 18 - parent (🏷️ str)\n 19 - Glob (🏷️ str)\n 20 - find (🏷️ str)\n 21 - zip_files (🏷️ str)\n 22 - unzip_file (🏷️ str)\n 23 - list_zip (🏷️ str)\n 24 - md5 (🏷️ str)\n 25 - remove_duplicates (🏷️ str)\n 26 - common_items (🏷️ str)\n 27 - folder_summary (🏷️ str)\n 28 - readlines (🏷️ str)\n 29 - readfile (🏷️ str)\n 30 - writelines (🏷️ str)\n 31 - tree (🏷️ str)\n 32 - folder_structure_to_dict (🏷️ str)\n 33 - folder_structure_to_json (🏷️ str)\n 34 - rename_batch (🏷️ str)\n 35 - dumpdill (🏷️ str)\n 36 - loaddill (🏷️ str)\n\n```\n\n\n\ncharts\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - alt (🏷️ str)\n 1 - Chart (🏷️ str)\n 2 - CM (🏷️ str)\n 3 - radar (🏷️ str)\n 4 - confusion_matrix (🏷️ str)\n 5 - spider (🏷️ str)\n 6 - upsetaltair_top_level_configuration (🏷️ str)\n 7 - UpSetAltair (🏷️ str)\n\n```\n\n\n\npdf_loader\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - PDF (🏷️ str)\n\n```\n\n\n\ninteractive_show\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - COLORS (🏷️ str)\n 1 - to_networkx (🏷️ str)\n 2 - plot_image (🏷️ str)\n 3 - plot_graph (🏷️ str)\n 4 - tonp (🏷️ str)\n 5 - tolist (🏷️ str)\n 6 - convert_to_nx (🏷️ str)\n 7 - viz2 (🏷️ str)\n 8 - df2graph_nodes (🏷️ str)\n 9 - ishow (🏷️ str)\n\n```\n\n\n\nregistry\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - Config (🏷️ str)\n 1 - AttrDict (🏷️ str)\n 2 - registry (🏷️ str)\n 3 - tryeval (🏷️ str)\n 4 - parse_base (🏷️ str)\n 5 - parse (🏷️ str)\n 6 - parse_and_resolve (🏷️ str)\n 7 - parse_string (🏷️ str)\n\n```\n\n\n\nmarkup2\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - AD (🏷️ str)\n 1 - Config (🏷️ str)\n 2 - isnamedtupleinstance (🏷️ str)\n 3 - unpack (🏷️ str)\n 4 - AttrDict (🏷️ str)\n 5 - pretty_json (🏷️ str)\n 6 - read_json (🏷️ str)\n 7 - write_json (🏷️ str)\n 8 - write_jsonl (🏷️ str)\n 9 - read_jsonl (🏷️ str)\n 10 - read_yaml (🏷️ str)\n 11 - write_yaml (🏷️ str)\n 12 - read_xml (🏷️ str)\n 13 - write_xml (🏷️ str)\n\n```\n\n\n\ninspector\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - inspect (🏷️ str)\n\n```\n\n\n\ntorch_loader\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - torch (🏷️ str)\n 1 - th (🏷️ str)\n 2 - torchvision (🏷️ str)\n 3 - T (🏷️ str)\n 4 - transforms (🏷️ str)\n 5 - nn (🏷️ str)\n 6 - np (🏷️ str)\n 7 - F (🏷️ str)\n 8 - Dataset (🏷️ str)\n 9 - DataLoader (🏷️ str)\n 10 - optim (🏷️ str)\n 11 - Report (🏷️ str)\n 12 - Reshape (🏷️ str)\n 13 - Permute (🏷️ str)\n 14 - device (🏷️ str)\n 15 - save_torch_model_weights_from (🏷️ str)\n 16 - load_torch_model_weights_to (🏷️ str)\n 17 - detach (🏷️ str)\n 18 - cat_with_padding (🏷️ str)\n\n```\n\n\n\nlogger\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - console (🏷️ str)\n 1 - reset_logger_width (🏷️ str)\n 2 - logger (🏷️ str)\n 3 - Trace (🏷️ str)\n 4 - Debug (🏷️ str)\n 5 - Info (🏷️ str)\n 6 - Warn (🏷️ str)\n 7 - Excep (🏷️ str)\n 8 - warn_mode (🏷️ str)\n 9 - info_mode (🏷️ str)\n 10 - debug_mode (🏷️ str)\n 11 - trace_mode (🏷️ str)\n 12 - excep_mode (🏷️ str)\n 13 - in_warn_mode (🏷️ str)\n 14 - in_info_mode (🏷️ str)\n 15 - in_debug_mode (🏷️ str)\n 16 - in_trace_mode (🏷️ str)\n 17 - in_excep_mode (🏷️ str)\n 18 - frames (🏷️ str)\n 19 - get_console (🏷️ str)\n 20 - reset_logger (🏷️ str)\n 21 - get_logger_level (🏷️ str)\n 22 - logger_mode (🏷️ str)\n 23 - in_logger_mode (🏷️ str)\n 24 - notify_waiting (🏷️ str)\n\n```\n\n\n\nmarkup\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - AttrDict (🏷️ str)\n 1 - Config (🏷️ str)\n 2 - isnamedtupleinstance (🏷️ str)\n 3 - unpack (🏷️ str)\n 4 - hash_tensor (🏷️ str)\n 5 - hash_pandas_dataframe (🏷️ str)\n 6 - AttrDictDeprecated (🏷️ str)\n 7 - decompose (🏷️ str)\n 8 - pretty_json (🏷️ str)\n 9 - read_json (🏷️ str)\n 10 - write_json (🏷️ str)\n 11 - write_jsonl (🏷️ str)\n 12 - read_jsonl (🏷️ str)\n 13 - read_yaml (🏷️ str)\n 14 - write_yaml (🏷️ str)\n 15 - read_xml (🏷️ str)\n 16 - write_xml (🏷️ str)\n\n```\n\n\n\nsklegos\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - ColumnSelector (🏷️ str)\n 1 - GroupedPredictor (🏷️ str)\n 2 - EstimatorTransformer (🏷️ str)\n 3 - train_test_split (🏷️ str)\n 4 - MakeFrame (🏷️ str)\n 5 - ImputeMissingValues (🏷️ str)\n 6 - LambdaTransformer (🏷️ str)\n 7 - Cat2Num (🏷️ str)\n 8 - SplitDateColumn (🏷️ str)\n\n```\n\n\n\nipython\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - save_notebook (🏷️ str)\n 1 - backup_this_notebook (🏷️ str)\n 2 - backup_all_notebooks (🏷️ str)\n 3 - backup_folders_of_nbs (🏷️ str)\n 4 - display_dfs_side_by_side (🏷️ str)\n 5 - show_big_dataframe (🏷️ str)\n 6 - h1 (🏷️ str)\n 7 - h2 (🏷️ str)\n 8 - h3 (🏷️ str)\n 9 - h4 (🏷️ str)\n 10 - h5 (🏷️ str)\n 11 - h6 (🏷️ str)\n 12 - store_scrap (🏷️ str)\n 13 - shutdown_current_notebook (🏷️ str)\n\n```\n\n\n\n../torch_snippets/loader.py:532: SyntaxWarning: invalid escape sequence '\\$'\n puttext(ax, text.replace(\"$\", \"\\$\"), tuple(bbs[ix][:2]), size=text_sz)\n\n\nloader\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - B (🏷️ str)\n 1 - Blank (🏷️ str)\n 2 - batchify (🏷️ str)\n 3 - C (🏷️ str)\n 4 - choose (🏷️ str)\n 5 - common (🏷️ str)\n 6 - crop_from_bb (🏷️ str)\n 7 - diff (🏷️ str)\n 8 - E (🏷️ str)\n 9 - flatten (🏷️ str)\n 10 - Image (🏷️ str)\n 11 - jitter (🏷️ str)\n 12 - L (🏷️ str)\n 13 - lzip (🏷️ str)\n 14 - line (🏷️ str)\n 15 - lines (🏷️ str)\n 16 - to_absolute (🏷️ str)\n 17 - to_relative (🏷️ str)\n 18 - enlarge_bbs (🏷️ str)\n 19 - shrink_bbs (🏷️ str)\n 20 - logger (🏷️ str)\n 21 - np (🏷️ str)\n 22 - now (🏷️ str)\n 23 - nunique (🏷️ str)\n 24 - os (🏷️ str)\n 25 - pad (🏷️ str)\n 26 - pd (🏷️ str)\n 27 - pdfilter (🏷️ str)\n 28 - pdb (🏷️ str)\n 29 - PIL (🏷️ str)\n 30 - print (🏷️ str)\n 31 - puttext (🏷️ str)\n 32 - randint (🏷️ str)\n 33 - rand (🏷️ str)\n 34 - re (🏷️ str)\n 35 - read (🏷️ str)\n 36 - readPIL (🏷️ str)\n 37 - rect (🏷️ str)\n 38 - resize (🏷️ str)\n 39 - rotate (🏷️ str)\n 40 - see (🏷️ str)\n 41 - show (🏷️ str)\n 42 - store_attr (🏷️ str)\n 43 - subplots (🏷️ str)\n 44 - sys (🏷️ str)\n 45 - toss (🏷️ str)\n 46 - track (🏷️ str)\n 47 - tqdm (🏷️ str)\n 48 - Tqdm (🏷️ str)\n 49 - trange (🏷️ str)\n 50 - unique (🏷️ str)\n 51 - uint (🏷️ str)\n 52 - write (🏷️ str)\n 53 - BB (🏷️ str)\n 54 - bbfy (🏷️ str)\n 55 - xywh2xyXY (🏷️ str)\n 56 - df2bbs (🏷️ str)\n 57 - bbs2df (🏷️ str)\n 58 - Info (🏷️ str)\n 59 - Warn (🏷️ str)\n 60 - Debug (🏷️ str)\n 61 - Excep (🏷️ str)\n 62 - reset_logger (🏷️ str)\n 63 - get_logger_level (🏷️ str)\n 64 - in_debug_mode (🏷️ str)\n 65 - debug_mode (🏷️ str)\n 66 - typedispatch (🏷️ str)\n 67 - defaultdict (🏷️ str)\n 68 - Counter (🏷️ str)\n 69 - dcopy (🏷️ str)\n 70 - patch_to (🏷️ str)\n 71 - split (🏷️ str)\n 72 - train_test_split (🏷️ str)\n 73 - init_plt (🏷️ str)\n 74 - init_cv2 (🏷️ str)\n\n```\n\n\n\nimgaug_loader\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - do (🏷️ str)\n 1 - bw (🏷️ str)\n 2 - rotate (🏷️ str)\n 3 - pad (🏷️ str)\n 4 - get_size (🏷️ str)\n 5 - rescale (🏷️ str)\n 6 - crop (🏷️ str)\n 7 - imgaugbbs2bbs (🏷️ str)\n 8 - bbs2imgaugbbs (🏷️ str)\n\n```\n\n\n\ndates\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - make_uniform_date_format (🏷️ str)\n 1 - ALL_DATE_FORMATS (🏷️ str)\n 2 - are_dates_equal (🏷️ str)\n 3 - today (🏷️ str)\n\n```\n\n\n\nbokeh_loader\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - parse_sz (🏷️ str)\n 1 - get_bplot (🏷️ str)\n\n```\n\n\n\nbb_utils\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - randint (🏷️ str)\n 1 - BB (🏷️ str)\n 2 - df2bbs (🏷️ str)\n 3 - bbs2df (🏷️ str)\n 4 - bbfy (🏷️ str)\n 5 - jitter (🏷️ str)\n 6 - compute_eps (🏷️ str)\n 7 - enlarge_bbs (🏷️ str)\n 8 - shrink_bbs (🏷️ str)\n 9 - iou (🏷️ str)\n 10 - compute_distance_matrix (🏷️ str)\n 11 - compute_distances (🏷️ str)\n 12 - split_bb_to_xyXY (🏷️ str)\n 13 - combine_xyXY_to_bb (🏷️ str)\n 14 - is_absolute (🏷️ str)\n 15 - is_relative (🏷️ str)\n 16 - to_relative (🏷️ str)\n 17 - to_absolute (🏷️ str)\n 18 - merge_by_bb (🏷️ str)\n 19 - isin (🏷️ str)\n\n```\n\n\n\nadapters\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - np_2_b64 (🏷️ str)\n 1 - b64_2_np (🏷️ str)\n 2 - b64_2_file (🏷️ str)\n 3 - bytes_2_file (🏷️ str)\n 4 - file_2_bytes (🏷️ str)\n 5 - csvs_2_cvat (🏷️ str)\n 6 - cvat_2_csvs (🏷️ str)\n 7 - df_2_yolo (🏷️ str)\n 8 - yolo_2_df (🏷️ str)\n\n```\n\n\n\ndecorators\n\n\n\n```↯ AttrDict ↯\nitems[]\n 0 - format (🏷️ str)\n 1 - warn_on_fail (🏷️ str)\n 2 - timeit (🏷️ str)\n 3 - io (🏷️ str)\n 4 - check_kwargs_not_none (🏷️ str)\n\n```", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#misc", + "href": "index.html#misc", + "title": "Utilities for simple needs", + "section": "misc", + "text": "misc", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#load_defaults", + "href": "index.html#load_defaults", + "title": "Utilities for simple needs", + "section": "load_defaults", + "text": "load_defaults", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#text_utils", + "href": "index.html#text_utils", + "title": "Utilities for simple needs", + "section": "text_utils", + "text": "text_utils", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#paths", + "href": "index.html#paths", + "title": "Utilities for simple needs", + "section": "paths", + "text": "paths", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#charts", + "href": "index.html#charts", + "title": "Utilities for simple needs", + "section": "charts", + "text": "charts", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#pdf_loader", + "href": "index.html#pdf_loader", + "title": "Utilities for simple needs", + "section": "pdf_loader", + "text": "pdf_loader", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#interactive_show", + "href": "index.html#interactive_show", + "title": "Utilities for simple needs", + "section": "interactive_show", + "text": "interactive_show", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#registry", + "href": "index.html#registry", + "title": "Utilities for simple needs", + "section": "registry", + "text": "registry", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#markup2", + "href": "index.html#markup2", + "title": "Utilities for simple needs", + "section": "markup2", + "text": "markup2", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#inspector", + "href": "index.html#inspector", + "title": "Utilities for simple needs", + "section": "inspector", + "text": "inspector", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#torch_loader", + "href": "index.html#torch_loader", + "title": "Utilities for simple needs", + "section": "torch_loader", + "text": "torch_loader", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#logger", + "href": "index.html#logger", + "title": "Utilities for simple needs", + "section": "logger", + "text": "logger", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#markup", + "href": "index.html#markup", + "title": "Utilities for simple needs", + "section": "markup", + "text": "markup", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#sklegos", + "href": "index.html#sklegos", + "title": "Utilities for simple needs", + "section": "sklegos", + "text": "sklegos", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#ipython", + "href": "index.html#ipython", + "title": "Utilities for simple needs", + "section": "ipython", + "text": "ipython", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#loader", + "href": "index.html#loader", + "title": "Utilities for simple needs", + "section": "loader", + "text": "loader", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#imgaug_loader", + "href": "index.html#imgaug_loader", + "title": "Utilities for simple needs", + "section": "imgaug_loader", + "text": "imgaug_loader", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#dates", + "href": "index.html#dates", + "title": "Utilities for simple needs", + "section": "dates", + "text": "dates", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#bokeh_loader", + "href": "index.html#bokeh_loader", + "title": "Utilities for simple needs", + "section": "bokeh_loader", + "text": "bokeh_loader", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#bb_utils", + "href": "index.html#bb_utils", + "title": "Utilities for simple needs", + "section": "bb_utils", + "text": "bb_utils", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#adapters", + "href": "index.html#adapters", + "title": "Utilities for simple needs", + "section": "adapters", + "text": "adapters", + "crumbs": [ + "Utilities for simple needs" + ] + }, + { + "objectID": "index.html#decorators", + "href": "index.html#decorators", + "title": "Utilities for simple needs", + "section": "decorators", + "text": "decorators", + "crumbs": [ + "Utilities for simple needs" + ] + } +] \ No newline at end of file diff --git a/_proc/docs/show.html b/_proc/docs/show.html new file mode 100644 index 0000000..2dcbf63 --- /dev/null +++ b/_proc/docs/show.html @@ -0,0 +1,1028 @@ + + + + + + + + + +show – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + +
+

Show

+ +

Show is intended to show numpy-arrays/PIL-images

+
+
from torch_snippets import *
+
+im = np.random.rand(100, 100)
+show(im)
+
+
+
+

+
+
+
+
+
+
show(im, sz=4)
+
+
+
+

+
+
+
+
+

Show will even accept pytorch Tensors and show them as images, even if they are on GPU and have channels first

+

It can accept bounding boxes as tuples of (x,y,X,Y) which can be integers (i.e., absolute coordinates) or fractions (between \([0,1]\)). There’s provision to give bb_colors and texts as well

+
+
show(im, bbs=[(0, 0, 0.5, 0.35), (0, 0.2, 0.35, 0.95)])
+
+show(im, bbs=[(0, 0, 0.5, 0.35), (0, 0.2, 0.35, 0.95)], bb_colors=["r", "g"])
+
+show(
+    im,
+    bbs=[(0, 0, 0.5, 0.35), (0, 0.2, 0.35, 0.95)],
+    bb_colors=["b", "g"],
+    texts=["bb1", "bb2"],
+    sz=10,
+    text_sz=15,
+)
+
+
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
+
+
+
+
+

+
+
+
+
+
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
+
+
+
+
+

+
+
+
+
+
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
+
+
+
+
+

+
+
+
+
+

It can also read a file path directly and display the image

+
+
show("../docs/images/company_logo_big.png", sz=3)
+
+
+
+

+
+
+
+
+

if the input is not an image or string, show will simply display the given input as intended by jupyter notebook

+
+
df = pd.DataFrame(np.random.rand(100, 2))
+show(df)
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
01
00.2424780.929517
10.9718900.506750
20.1398260.753227
30.8647990.524166
40.5636100.135709
.........
950.3798740.639771
960.9937310.811343
970.6216830.763054
980.8445090.915156
990.3142720.392418
+ +

100 rows × 2 columns

+
+
+
+
+
chart = Chart(df).mark_circle().encode(x="0:Q", y="1:Q")
+show(chart.interactive())
+
+ +
+ +
+
+
+

Subplots

+

display multiple images Subplots is a wapper around plt.subplots that accepts a list of images, number of columns as nc and additional kwargs

+
+
from torch_snippets import subplots
+
+ims = [np.random.rand(100, 100) for _ in range(16)]
+
+subplots(ims, nc=4, sz=5)
+
+
+
+

+
+
+
+
+
+
subplots(
+    ims,
+    nc=2,
+    sz=(5, 15),
+    suptitle="RANDOM IMAGES",
+    titles=[f"random_{i}" for i in range(16)],
+)
+
+
+
+

+
+
+
+
+ + +
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/docs/show_files/figure-html/cell-2-output-1.png b/_proc/docs/show_files/figure-html/cell-2-output-1.png new file mode 100644 index 0000000..a84b69b Binary files /dev/null and b/_proc/docs/show_files/figure-html/cell-2-output-1.png differ diff --git a/_proc/docs/show_files/figure-html/cell-3-output-1.png b/_proc/docs/show_files/figure-html/cell-3-output-1.png new file mode 100644 index 0000000..4259f2d Binary files /dev/null and b/_proc/docs/show_files/figure-html/cell-3-output-1.png differ diff --git a/_proc/docs/show_files/figure-html/cell-4-output-2.png b/_proc/docs/show_files/figure-html/cell-4-output-2.png new file mode 100644 index 0000000..0d338a3 Binary files /dev/null and b/_proc/docs/show_files/figure-html/cell-4-output-2.png differ diff --git a/_proc/docs/show_files/figure-html/cell-4-output-4.png b/_proc/docs/show_files/figure-html/cell-4-output-4.png new file mode 100644 index 0000000..cb0d039 Binary files /dev/null and b/_proc/docs/show_files/figure-html/cell-4-output-4.png differ diff --git a/_proc/docs/show_files/figure-html/cell-4-output-6.png b/_proc/docs/show_files/figure-html/cell-4-output-6.png new file mode 100644 index 0000000..91e250c Binary files /dev/null and b/_proc/docs/show_files/figure-html/cell-4-output-6.png differ diff --git a/_proc/docs/show_files/figure-html/cell-5-output-1.png b/_proc/docs/show_files/figure-html/cell-5-output-1.png new file mode 100644 index 0000000..9e8d2d6 Binary files /dev/null and b/_proc/docs/show_files/figure-html/cell-5-output-1.png differ diff --git a/_proc/docs/show_files/figure-html/cell-8-output-1.png b/_proc/docs/show_files/figure-html/cell-8-output-1.png new file mode 100644 index 0000000..92e92e2 Binary files /dev/null and b/_proc/docs/show_files/figure-html/cell-8-output-1.png differ diff --git a/_proc/docs/show_files/figure-html/cell-9-output-1.png b/_proc/docs/show_files/figure-html/cell-9-output-1.png new file mode 100644 index 0000000..5ab71e1 Binary files /dev/null and b/_proc/docs/show_files/figure-html/cell-9-output-1.png differ diff --git a/_proc/docs/site_libs/bootstrap/bootstrap-icons.css b/_proc/docs/site_libs/bootstrap/bootstrap-icons.css new file mode 100644 index 0000000..285e444 --- /dev/null +++ b/_proc/docs/site_libs/bootstrap/bootstrap-icons.css @@ -0,0 +1,2078 @@ +/*! + * Bootstrap Icons v1.11.1 (https://icons.getbootstrap.com/) + * Copyright 2019-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + +@font-face { + font-display: block; + font-family: "bootstrap-icons"; + src: +url("./bootstrap-icons.woff?2820a3852bdb9a5832199cc61cec4e65") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } +.bi-1-circle-fill::before { content: "\f796"; } +.bi-1-circle::before { content: "\f797"; } +.bi-1-square-fill::before { content: "\f798"; } +.bi-1-square::before { content: "\f799"; } +.bi-2-circle-fill::before { content: "\f79c"; } +.bi-2-circle::before { content: "\f79d"; } +.bi-2-square-fill::before { content: "\f79e"; } +.bi-2-square::before { content: "\f79f"; } +.bi-3-circle-fill::before { content: "\f7a2"; } +.bi-3-circle::before { content: "\f7a3"; } +.bi-3-square-fill::before { content: "\f7a4"; } +.bi-3-square::before { content: "\f7a5"; } +.bi-4-circle-fill::before { content: "\f7a8"; } +.bi-4-circle::before { content: "\f7a9"; } +.bi-4-square-fill::before { content: "\f7aa"; } +.bi-4-square::before { content: "\f7ab"; } +.bi-5-circle-fill::before { content: "\f7ae"; } +.bi-5-circle::before { content: "\f7af"; } +.bi-5-square-fill::before { content: "\f7b0"; } +.bi-5-square::before { content: "\f7b1"; } +.bi-6-circle-fill::before { content: "\f7b4"; } +.bi-6-circle::before { content: "\f7b5"; } +.bi-6-square-fill::before { content: "\f7b6"; } +.bi-6-square::before { content: "\f7b7"; } +.bi-7-circle-fill::before { content: "\f7ba"; } +.bi-7-circle::before { content: "\f7bb"; } +.bi-7-square-fill::before { content: "\f7bc"; } +.bi-7-square::before { content: "\f7bd"; } +.bi-8-circle-fill::before { content: "\f7c0"; } +.bi-8-circle::before { content: "\f7c1"; } +.bi-8-square-fill::before { content: "\f7c2"; } +.bi-8-square::before { content: "\f7c3"; } +.bi-9-circle-fill::before { content: "\f7c6"; } +.bi-9-circle::before { content: "\f7c7"; } +.bi-9-square-fill::before { content: "\f7c8"; } +.bi-9-square::before { content: "\f7c9"; } +.bi-airplane-engines-fill::before { content: "\f7ca"; } +.bi-airplane-engines::before { content: "\f7cb"; } +.bi-airplane-fill::before { content: "\f7cc"; } +.bi-airplane::before { content: "\f7cd"; } +.bi-alexa::before { content: "\f7ce"; } +.bi-alipay::before { content: "\f7cf"; } +.bi-android::before { content: "\f7d0"; } +.bi-android2::before { content: "\f7d1"; } +.bi-box-fill::before { content: "\f7d2"; } +.bi-box-seam-fill::before { content: "\f7d3"; } +.bi-browser-chrome::before { content: "\f7d4"; } +.bi-browser-edge::before { content: "\f7d5"; } +.bi-browser-firefox::before { content: "\f7d6"; } +.bi-browser-safari::before { content: "\f7d7"; } +.bi-c-circle-fill::before { content: "\f7da"; } +.bi-c-circle::before { content: "\f7db"; } +.bi-c-square-fill::before { content: "\f7dc"; } +.bi-c-square::before { content: "\f7dd"; } +.bi-capsule-pill::before { content: "\f7de"; } +.bi-capsule::before { content: "\f7df"; } +.bi-car-front-fill::before { content: "\f7e0"; } +.bi-car-front::before { content: "\f7e1"; } +.bi-cassette-fill::before { content: "\f7e2"; } +.bi-cassette::before { content: "\f7e3"; } +.bi-cc-circle-fill::before { content: "\f7e6"; } +.bi-cc-circle::before { content: "\f7e7"; } +.bi-cc-square-fill::before { content: "\f7e8"; } +.bi-cc-square::before { content: "\f7e9"; } +.bi-cup-hot-fill::before { content: "\f7ea"; } +.bi-cup-hot::before { content: "\f7eb"; } +.bi-currency-rupee::before { content: "\f7ec"; } +.bi-dropbox::before { content: "\f7ed"; } +.bi-escape::before { content: "\f7ee"; } +.bi-fast-forward-btn-fill::before { content: "\f7ef"; } +.bi-fast-forward-btn::before { content: "\f7f0"; } +.bi-fast-forward-circle-fill::before { content: "\f7f1"; } +.bi-fast-forward-circle::before { content: "\f7f2"; } +.bi-fast-forward-fill::before { content: "\f7f3"; } +.bi-fast-forward::before { content: "\f7f4"; } +.bi-filetype-sql::before { content: "\f7f5"; } +.bi-fire::before { content: "\f7f6"; } +.bi-google-play::before { content: "\f7f7"; } +.bi-h-circle-fill::before { content: "\f7fa"; } +.bi-h-circle::before { content: "\f7fb"; } +.bi-h-square-fill::before { content: "\f7fc"; } +.bi-h-square::before { content: "\f7fd"; } +.bi-indent::before { content: "\f7fe"; } +.bi-lungs-fill::before { content: "\f7ff"; } +.bi-lungs::before { content: "\f800"; } +.bi-microsoft-teams::before { content: "\f801"; } +.bi-p-circle-fill::before { content: "\f804"; } +.bi-p-circle::before { content: "\f805"; } +.bi-p-square-fill::before { content: "\f806"; } +.bi-p-square::before { content: "\f807"; } +.bi-pass-fill::before { content: "\f808"; } +.bi-pass::before { content: "\f809"; } +.bi-prescription::before { content: "\f80a"; } +.bi-prescription2::before { content: "\f80b"; } +.bi-r-circle-fill::before { content: "\f80e"; } +.bi-r-circle::before { content: "\f80f"; } +.bi-r-square-fill::before { content: "\f810"; } +.bi-r-square::before { content: "\f811"; } +.bi-repeat-1::before { content: "\f812"; } +.bi-repeat::before { content: "\f813"; } +.bi-rewind-btn-fill::before { content: "\f814"; } +.bi-rewind-btn::before { content: "\f815"; } +.bi-rewind-circle-fill::before { content: "\f816"; } +.bi-rewind-circle::before { content: "\f817"; } +.bi-rewind-fill::before { content: "\f818"; } +.bi-rewind::before { content: "\f819"; } +.bi-train-freight-front-fill::before { content: "\f81a"; } +.bi-train-freight-front::before { content: "\f81b"; } +.bi-train-front-fill::before { content: "\f81c"; } +.bi-train-front::before { content: "\f81d"; } +.bi-train-lightrail-front-fill::before { content: "\f81e"; } +.bi-train-lightrail-front::before { content: "\f81f"; } +.bi-truck-front-fill::before { content: "\f820"; } +.bi-truck-front::before { content: "\f821"; } +.bi-ubuntu::before { content: "\f822"; } +.bi-unindent::before { content: "\f823"; } +.bi-unity::before { content: "\f824"; } +.bi-universal-access-circle::before { content: "\f825"; } +.bi-universal-access::before { content: "\f826"; } +.bi-virus::before { content: "\f827"; } +.bi-virus2::before { content: "\f828"; } +.bi-wechat::before { content: "\f829"; } +.bi-yelp::before { content: "\f82a"; } +.bi-sign-stop-fill::before { content: "\f82b"; } +.bi-sign-stop-lights-fill::before { content: "\f82c"; } +.bi-sign-stop-lights::before { content: "\f82d"; } +.bi-sign-stop::before { content: "\f82e"; } +.bi-sign-turn-left-fill::before { content: "\f82f"; } +.bi-sign-turn-left::before { content: "\f830"; } +.bi-sign-turn-right-fill::before { content: "\f831"; } +.bi-sign-turn-right::before { content: "\f832"; } +.bi-sign-turn-slight-left-fill::before { content: "\f833"; } +.bi-sign-turn-slight-left::before { content: "\f834"; } +.bi-sign-turn-slight-right-fill::before { content: "\f835"; } +.bi-sign-turn-slight-right::before { content: "\f836"; } +.bi-sign-yield-fill::before { content: "\f837"; } +.bi-sign-yield::before { content: "\f838"; } +.bi-ev-station-fill::before { content: "\f839"; } +.bi-ev-station::before { content: "\f83a"; } +.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } +.bi-fuel-pump-diesel::before { content: "\f83c"; } +.bi-fuel-pump-fill::before { content: "\f83d"; } +.bi-fuel-pump::before { content: "\f83e"; } +.bi-0-circle-fill::before { content: "\f83f"; } +.bi-0-circle::before { content: "\f840"; } +.bi-0-square-fill::before { content: "\f841"; } +.bi-0-square::before { content: "\f842"; } +.bi-rocket-fill::before { content: "\f843"; } +.bi-rocket-takeoff-fill::before { content: "\f844"; } +.bi-rocket-takeoff::before { content: "\f845"; } +.bi-rocket::before { content: "\f846"; } +.bi-stripe::before { content: "\f847"; } +.bi-subscript::before { content: "\f848"; } +.bi-superscript::before { content: "\f849"; } +.bi-trello::before { content: "\f84a"; } +.bi-envelope-at-fill::before { content: "\f84b"; } +.bi-envelope-at::before { content: "\f84c"; } +.bi-regex::before { content: "\f84d"; } +.bi-text-wrap::before { content: "\f84e"; } +.bi-sign-dead-end-fill::before { content: "\f84f"; } +.bi-sign-dead-end::before { content: "\f850"; } +.bi-sign-do-not-enter-fill::before { content: "\f851"; } +.bi-sign-do-not-enter::before { content: "\f852"; } +.bi-sign-intersection-fill::before { content: "\f853"; } +.bi-sign-intersection-side-fill::before { content: "\f854"; } +.bi-sign-intersection-side::before { content: "\f855"; } +.bi-sign-intersection-t-fill::before { content: "\f856"; } +.bi-sign-intersection-t::before { content: "\f857"; } +.bi-sign-intersection-y-fill::before { content: "\f858"; } +.bi-sign-intersection-y::before { content: "\f859"; } +.bi-sign-intersection::before { content: "\f85a"; } +.bi-sign-merge-left-fill::before { content: "\f85b"; } +.bi-sign-merge-left::before { content: "\f85c"; } +.bi-sign-merge-right-fill::before { content: "\f85d"; } +.bi-sign-merge-right::before { content: "\f85e"; } +.bi-sign-no-left-turn-fill::before { content: "\f85f"; } +.bi-sign-no-left-turn::before { content: "\f860"; } +.bi-sign-no-parking-fill::before { content: "\f861"; } +.bi-sign-no-parking::before { content: "\f862"; } +.bi-sign-no-right-turn-fill::before { content: "\f863"; } +.bi-sign-no-right-turn::before { content: "\f864"; } +.bi-sign-railroad-fill::before { content: "\f865"; } +.bi-sign-railroad::before { content: "\f866"; } +.bi-building-add::before { content: "\f867"; } +.bi-building-check::before { content: "\f868"; } +.bi-building-dash::before { content: "\f869"; } +.bi-building-down::before { content: "\f86a"; } +.bi-building-exclamation::before { content: "\f86b"; } +.bi-building-fill-add::before { content: "\f86c"; } +.bi-building-fill-check::before { content: "\f86d"; } +.bi-building-fill-dash::before { content: "\f86e"; } +.bi-building-fill-down::before { content: "\f86f"; } +.bi-building-fill-exclamation::before { content: "\f870"; } +.bi-building-fill-gear::before { content: "\f871"; } +.bi-building-fill-lock::before { content: "\f872"; } +.bi-building-fill-slash::before { content: "\f873"; } +.bi-building-fill-up::before { content: "\f874"; } +.bi-building-fill-x::before { content: "\f875"; } +.bi-building-fill::before { content: "\f876"; } +.bi-building-gear::before { content: "\f877"; } +.bi-building-lock::before { content: "\f878"; } +.bi-building-slash::before { content: "\f879"; } +.bi-building-up::before { content: "\f87a"; } +.bi-building-x::before { content: "\f87b"; } +.bi-buildings-fill::before { content: "\f87c"; } +.bi-buildings::before { content: "\f87d"; } +.bi-bus-front-fill::before { content: "\f87e"; } +.bi-bus-front::before { content: "\f87f"; } +.bi-ev-front-fill::before { content: "\f880"; } +.bi-ev-front::before { content: "\f881"; } +.bi-globe-americas::before { content: "\f882"; } +.bi-globe-asia-australia::before { content: "\f883"; } +.bi-globe-central-south-asia::before { content: "\f884"; } +.bi-globe-europe-africa::before { content: "\f885"; } +.bi-house-add-fill::before { content: "\f886"; } +.bi-house-add::before { content: "\f887"; } +.bi-house-check-fill::before { content: "\f888"; } +.bi-house-check::before { content: "\f889"; } +.bi-house-dash-fill::before { content: "\f88a"; } +.bi-house-dash::before { content: "\f88b"; } +.bi-house-down-fill::before { content: "\f88c"; } +.bi-house-down::before { content: "\f88d"; } +.bi-house-exclamation-fill::before { content: "\f88e"; } +.bi-house-exclamation::before { content: "\f88f"; } +.bi-house-gear-fill::before { content: "\f890"; } +.bi-house-gear::before { content: "\f891"; } +.bi-house-lock-fill::before { content: "\f892"; } +.bi-house-lock::before { content: "\f893"; } +.bi-house-slash-fill::before { content: "\f894"; } +.bi-house-slash::before { content: "\f895"; } +.bi-house-up-fill::before { content: "\f896"; } +.bi-house-up::before { content: "\f897"; } +.bi-house-x-fill::before { content: "\f898"; } +.bi-house-x::before { content: "\f899"; } +.bi-person-add::before { content: "\f89a"; } +.bi-person-down::before { content: "\f89b"; } +.bi-person-exclamation::before { content: "\f89c"; } +.bi-person-fill-add::before { content: "\f89d"; } +.bi-person-fill-check::before { content: "\f89e"; } +.bi-person-fill-dash::before { content: "\f89f"; } +.bi-person-fill-down::before { content: "\f8a0"; } +.bi-person-fill-exclamation::before { content: "\f8a1"; } +.bi-person-fill-gear::before { content: "\f8a2"; } +.bi-person-fill-lock::before { content: "\f8a3"; } +.bi-person-fill-slash::before { content: "\f8a4"; } +.bi-person-fill-up::before { content: "\f8a5"; } +.bi-person-fill-x::before { content: "\f8a6"; } +.bi-person-gear::before { content: "\f8a7"; } +.bi-person-lock::before { content: "\f8a8"; } +.bi-person-slash::before { content: "\f8a9"; } +.bi-person-up::before { content: "\f8aa"; } +.bi-scooter::before { content: "\f8ab"; } +.bi-taxi-front-fill::before { content: "\f8ac"; } +.bi-taxi-front::before { content: "\f8ad"; } +.bi-amd::before { content: "\f8ae"; } +.bi-database-add::before { content: "\f8af"; } +.bi-database-check::before { content: "\f8b0"; } +.bi-database-dash::before { content: "\f8b1"; } +.bi-database-down::before { content: "\f8b2"; } +.bi-database-exclamation::before { content: "\f8b3"; } +.bi-database-fill-add::before { content: "\f8b4"; } +.bi-database-fill-check::before { content: "\f8b5"; } +.bi-database-fill-dash::before { content: "\f8b6"; } +.bi-database-fill-down::before { content: "\f8b7"; } +.bi-database-fill-exclamation::before { content: "\f8b8"; } +.bi-database-fill-gear::before { content: "\f8b9"; } +.bi-database-fill-lock::before { content: "\f8ba"; } +.bi-database-fill-slash::before { content: "\f8bb"; } +.bi-database-fill-up::before { content: "\f8bc"; } +.bi-database-fill-x::before { content: "\f8bd"; } +.bi-database-fill::before { content: "\f8be"; } +.bi-database-gear::before { content: "\f8bf"; } +.bi-database-lock::before { content: "\f8c0"; } +.bi-database-slash::before { content: "\f8c1"; } +.bi-database-up::before { content: "\f8c2"; } +.bi-database-x::before { content: "\f8c3"; } +.bi-database::before { content: "\f8c4"; } +.bi-houses-fill::before { content: "\f8c5"; } +.bi-houses::before { content: "\f8c6"; } +.bi-nvidia::before { content: "\f8c7"; } +.bi-person-vcard-fill::before { content: "\f8c8"; } +.bi-person-vcard::before { content: "\f8c9"; } +.bi-sina-weibo::before { content: "\f8ca"; } +.bi-tencent-qq::before { content: "\f8cb"; } +.bi-wikipedia::before { content: "\f8cc"; } +.bi-alphabet-uppercase::before { content: "\f2a5"; } +.bi-alphabet::before { content: "\f68a"; } +.bi-amazon::before { content: "\f68d"; } +.bi-arrows-collapse-vertical::before { content: "\f690"; } +.bi-arrows-expand-vertical::before { content: "\f695"; } +.bi-arrows-vertical::before { content: "\f698"; } +.bi-arrows::before { content: "\f6a2"; } +.bi-ban-fill::before { content: "\f6a3"; } +.bi-ban::before { content: "\f6b6"; } +.bi-bing::before { content: "\f6c2"; } +.bi-cake::before { content: "\f6e0"; } +.bi-cake2::before { content: "\f6ed"; } +.bi-cookie::before { content: "\f6ee"; } +.bi-copy::before { content: "\f759"; } +.bi-crosshair::before { content: "\f769"; } +.bi-crosshair2::before { content: "\f794"; } +.bi-emoji-astonished-fill::before { content: "\f795"; } +.bi-emoji-astonished::before { content: "\f79a"; } +.bi-emoji-grimace-fill::before { content: "\f79b"; } +.bi-emoji-grimace::before { content: "\f7a0"; } +.bi-emoji-grin-fill::before { content: "\f7a1"; } +.bi-emoji-grin::before { content: "\f7a6"; } +.bi-emoji-surprise-fill::before { content: "\f7a7"; } +.bi-emoji-surprise::before { content: "\f7ac"; } +.bi-emoji-tear-fill::before { content: "\f7ad"; } +.bi-emoji-tear::before { content: "\f7b2"; } +.bi-envelope-arrow-down-fill::before { content: "\f7b3"; } +.bi-envelope-arrow-down::before { content: "\f7b8"; } +.bi-envelope-arrow-up-fill::before { content: "\f7b9"; } +.bi-envelope-arrow-up::before { content: "\f7be"; } +.bi-feather::before { content: "\f7bf"; } +.bi-feather2::before { content: "\f7c4"; } +.bi-floppy-fill::before { content: "\f7c5"; } +.bi-floppy::before { content: "\f7d8"; } +.bi-floppy2-fill::before { content: "\f7d9"; } +.bi-floppy2::before { content: "\f7e4"; } +.bi-gitlab::before { content: "\f7e5"; } +.bi-highlighter::before { content: "\f7f8"; } +.bi-marker-tip::before { content: "\f802"; } +.bi-nvme-fill::before { content: "\f803"; } +.bi-nvme::before { content: "\f80c"; } +.bi-opencollective::before { content: "\f80d"; } +.bi-pci-card-network::before { content: "\f8cd"; } +.bi-pci-card-sound::before { content: "\f8ce"; } +.bi-radar::before { content: "\f8cf"; } +.bi-send-arrow-down-fill::before { content: "\f8d0"; } +.bi-send-arrow-down::before { content: "\f8d1"; } +.bi-send-arrow-up-fill::before { content: "\f8d2"; } +.bi-send-arrow-up::before { content: "\f8d3"; } +.bi-sim-slash-fill::before { content: "\f8d4"; } +.bi-sim-slash::before { content: "\f8d5"; } +.bi-sourceforge::before { content: "\f8d6"; } +.bi-substack::before { content: "\f8d7"; } +.bi-threads-fill::before { content: "\f8d8"; } +.bi-threads::before { content: "\f8d9"; } +.bi-transparency::before { content: "\f8da"; } +.bi-twitter-x::before { content: "\f8db"; } +.bi-type-h4::before { content: "\f8dc"; } +.bi-type-h5::before { content: "\f8dd"; } +.bi-type-h6::before { content: "\f8de"; } +.bi-backpack-fill::before { content: "\f8df"; } +.bi-backpack::before { content: "\f8e0"; } +.bi-backpack2-fill::before { content: "\f8e1"; } +.bi-backpack2::before { content: "\f8e2"; } +.bi-backpack3-fill::before { content: "\f8e3"; } +.bi-backpack3::before { content: "\f8e4"; } +.bi-backpack4-fill::before { content: "\f8e5"; } +.bi-backpack4::before { content: "\f8e6"; } +.bi-brilliance::before { content: "\f8e7"; } +.bi-cake-fill::before { content: "\f8e8"; } +.bi-cake2-fill::before { content: "\f8e9"; } +.bi-duffle-fill::before { content: "\f8ea"; } +.bi-duffle::before { content: "\f8eb"; } +.bi-exposure::before { content: "\f8ec"; } +.bi-gender-neuter::before { content: "\f8ed"; } +.bi-highlights::before { content: "\f8ee"; } +.bi-luggage-fill::before { content: "\f8ef"; } +.bi-luggage::before { content: "\f8f0"; } +.bi-mailbox-flag::before { content: "\f8f1"; } +.bi-mailbox2-flag::before { content: "\f8f2"; } +.bi-noise-reduction::before { content: "\f8f3"; } +.bi-passport-fill::before { content: "\f8f4"; } +.bi-passport::before { content: "\f8f5"; } +.bi-person-arms-up::before { content: "\f8f6"; } +.bi-person-raised-hand::before { content: "\f8f7"; } +.bi-person-standing-dress::before { content: "\f8f8"; } +.bi-person-standing::before { content: "\f8f9"; } +.bi-person-walking::before { content: "\f8fa"; } +.bi-person-wheelchair::before { content: "\f8fb"; } +.bi-shadows::before { content: "\f8fc"; } +.bi-suitcase-fill::before { content: "\f8fd"; } +.bi-suitcase-lg-fill::before { content: "\f8fe"; } +.bi-suitcase-lg::before { content: "\f8ff"; } +.bi-suitcase::before { content: "\f900"; } +.bi-suitcase2-fill::before { content: "\f901"; } +.bi-suitcase2::before { content: "\f902"; } +.bi-vignette::before { content: "\f903"; } diff --git a/_proc/docs/site_libs/bootstrap/bootstrap-icons.woff b/_proc/docs/site_libs/bootstrap/bootstrap-icons.woff new file mode 100644 index 0000000..dbeeb05 Binary files /dev/null and b/_proc/docs/site_libs/bootstrap/bootstrap-icons.woff differ diff --git a/_proc/docs/site_libs/bootstrap/bootstrap.min.css b/_proc/docs/site_libs/bootstrap/bootstrap.min.css new file mode 100644 index 0000000..476a93a --- /dev/null +++ b/_proc/docs/site_libs/bootstrap/bootstrap.min.css @@ -0,0 +1,12 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */@import"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;700&display=swap";:root,[data-bs-theme=light]{--bs-blue: #2780e3;--bs-indigo: #6610f2;--bs-purple: #613d7c;--bs-pink: #e83e8c;--bs-red: #ff0039;--bs-orange: #f0ad4e;--bs-yellow: #ff7518;--bs-green: #3fb618;--bs-teal: #20c997;--bs-cyan: #9954bb;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #343a40;--bs-primary: #2780e3;--bs-secondary: #343a40;--bs-success: #3fb618;--bs-info: #9954bb;--bs-warning: #ff7518;--bs-danger: #ff0039;--bs-light: #f8f9fa;--bs-dark: #343a40;--bs-default-rgb: 52, 58, 64;--bs-primary-rgb: 39, 128, 227;--bs-secondary-rgb: 52, 58, 64;--bs-success-rgb: 63, 182, 24;--bs-info-rgb: 153, 84, 187;--bs-warning-rgb: 255, 117, 24;--bs-danger-rgb: 255, 0, 57;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 52, 58, 64;--bs-primary-text-emphasis: #10335b;--bs-secondary-text-emphasis: #15171a;--bs-success-text-emphasis: #19490a;--bs-info-text-emphasis: #3d224b;--bs-warning-text-emphasis: #662f0a;--bs-danger-text-emphasis: #660017;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #d4e6f9;--bs-secondary-bg-subtle: #d6d8d9;--bs-success-bg-subtle: #d9f0d1;--bs-info-bg-subtle: #ebddf1;--bs-warning-bg-subtle: #ffe3d1;--bs-danger-bg-subtle: #ffccd7;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #a9ccf4;--bs-secondary-border-subtle: #aeb0b3;--bs-success-border-subtle: #b2e2a3;--bs-info-border-subtle: #d6bbe4;--bs-warning-border-subtle: #ffc8a3;--bs-danger-border-subtle: #ff99b0;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #343a40;--bs-body-color-rgb: 52, 58, 64;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(52, 58, 64, 0.75);--bs-secondary-color-rgb: 52, 58, 64;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(52, 58, 64, 0.5);--bs-tertiary-color-rgb: 52, 58, 64;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #2761e3;--bs-link-color-rgb: 39, 97, 227;--bs-link-decoration: underline;--bs-link-hover-color: #1f4eb6;--bs-link-hover-color-rgb: 31, 78, 182;--bs-code-color: #7d12ba;--bs-highlight-bg: #ffe3d1;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(39, 128, 227, 0.25);--bs-form-valid-color: #3fb618;--bs-form-valid-border-color: #3fb618;--bs-form-invalid-color: #ff0039;--bs-form-invalid-border-color: #ff0039}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #7db3ee;--bs-secondary-text-emphasis: #85898c;--bs-success-text-emphasis: #8cd374;--bs-info-text-emphasis: #c298d6;--bs-warning-text-emphasis: #ffac74;--bs-danger-text-emphasis: #ff6688;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #081a2d;--bs-secondary-bg-subtle: #0a0c0d;--bs-success-bg-subtle: #0d2405;--bs-info-bg-subtle: #1f1125;--bs-warning-bg-subtle: #331705;--bs-danger-bg-subtle: #33000b;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #174d88;--bs-secondary-border-subtle: #1f2326;--bs-success-border-subtle: #266d0e;--bs-info-border-subtle: #5c3270;--bs-warning-border-subtle: #99460e;--bs-danger-border-subtle: #990022;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #7db3ee;--bs-link-hover-color: #97c2f1;--bs-link-color-rgb: 125, 179, 238;--bs-link-hover-color-rgb: 151, 194, 241;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #8cd374;--bs-form-valid-border-color: #8cd374;--bs-form-invalid-color: #ff6688;--bs-form-invalid-border-color: #ff6688}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}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;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6)}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#343a40}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(52,58,64,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}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}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.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:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(52,58,64,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #343a40;--bs-table-bg: #fff;--bs-table-border-color: #dee2e6;--bs-table-accent-bg: transparent;--bs-table-striped-color: #343a40;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #343a40;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #343a40;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #b2bac1}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #d4e6f9;--bs-table-border-color: #bfcfe0;--bs-table-striped-bg: #c9dbed;--bs-table-striped-color: #000;--bs-table-active-bg: #bfcfe0;--bs-table-active-color: #000;--bs-table-hover-bg: #c4d5e6;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #d6d8d9;--bs-table-border-color: #c1c2c3;--bs-table-striped-bg: #cbcdce;--bs-table-striped-color: #000;--bs-table-active-bg: #c1c2c3;--bs-table-active-color: #000;--bs-table-hover-bg: #c6c8c9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d9f0d1;--bs-table-border-color: #c3d8bc;--bs-table-striped-bg: #cee4c7;--bs-table-striped-color: #000;--bs-table-active-bg: #c3d8bc;--bs-table-active-color: #000;--bs-table-hover-bg: #c9dec1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #ebddf1;--bs-table-border-color: #d4c7d9;--bs-table-striped-bg: #dfd2e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4c7d9;--bs-table-active-color: #000;--bs-table-hover-bg: #d9ccdf;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #ffe3d1;--bs-table-border-color: #e6ccbc;--bs-table-striped-bg: #f2d8c7;--bs-table-striped-color: #000;--bs-table-active-bg: #e6ccbc;--bs-table-active-color: #000;--bs-table-hover-bg: #ecd2c1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #ffccd7;--bs-table-border-color: #e6b8c2;--bs-table-striped-bg: #f2c2cc;--bs-table-striped-color: #000;--bs-table-active-bg: #e6b8c2;--bs-table-active-color: #000;--bs-table-hover-bg: #ecbdc7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #dfe0e1;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #343a40;--bs-table-border-color: #484e53;--bs-table-striped-bg: #3e444a;--bs-table-striped-color: #fff;--bs-table-active-bg: #484e53;--bs-table-active-color: #fff;--bs-table-hover-bg: #43494e;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.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}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(52,58,64,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#343a40;background-color:#fff;border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(52,58,64,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#343a40;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#343a40;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important}.form-control-color::-webkit-color-swatch{border:0 !important}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #343a40}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #dee2e6;print-color-adjust:exact}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2780e3;border-color:#2780e3}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2780e3;border-color:#2780e3;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2393c0f1'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: 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")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bed9f7}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#bed9f7}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(52,58,64,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(52,58,64,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #dee2e6}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1)}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#3fb618}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#3fb618}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3fb618;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='%233fb618' d='M2.3 6.73.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:right calc(0.375em + 0.1875rem) center;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:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.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 .form-select:valid,.form-select.is-valid{border-color:#3fb618}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.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");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#3fb618}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#3fb618}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3fb618}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#ff0039}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#ff0039}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ff0039;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 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;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:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.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 .form-select:invalid,.form-select.is-invalid{border-color:#ff0039}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#ff0039}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#ff0039}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ff0039}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #343a40;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #216dc1;--bs-btn-hover-border-color: #1f66b6;--bs-btn-focus-shadow-rgb: 71, 147, 231;--bs-btn-active-color: #fff;--bs-btn-active-bg: #1f66b6;--bs-btn-active-border-color: #1d60aa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2780e3;--bs-btn-disabled-border-color: #2780e3}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #369b14;--bs-btn-hover-border-color: #329213;--bs-btn-focus-shadow-rgb: 92, 193, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #329213;--bs-btn-active-border-color: #2f8912;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3fb618;--bs-btn-disabled-border-color: #3fb618}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #82479f;--bs-btn-hover-border-color: #7a4396;--bs-btn-focus-shadow-rgb: 168, 110, 197;--bs-btn-active-color: #fff;--bs-btn-active-bg: #7a4396;--bs-btn-active-border-color: #733f8c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #9954bb;--bs-btn-disabled-border-color: #9954bb}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d96314;--bs-btn-hover-border-color: #cc5e13;--bs-btn-focus-shadow-rgb: 255, 138, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc5e13;--bs-btn-active-border-color: #bf5812;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff7518;--bs-btn-disabled-border-color: #ff7518}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d90030;--bs-btn-hover-border-color: #cc002e;--bs-btn-focus-shadow-rgb: 255, 38, 87;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc002e;--bs-btn-active-border-color: #bf002b;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff0039;--bs-btn-disabled-border-color: #ff0039}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #52585d;--bs-btn-hover-border-color: #484e53;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #5d6166;--bs-btn-active-border-color: #484e53;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-outline-default{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2780e3;--bs-btn-hover-border-color: #2780e3;--bs-btn-focus-shadow-rgb: 39, 128, 227;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2780e3;--bs-btn-active-border-color: #2780e3;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2780e3;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2780e3;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3fb618;--bs-btn-hover-border-color: #3fb618;--bs-btn-focus-shadow-rgb: 63, 182, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3fb618;--bs-btn-active-border-color: #3fb618;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3fb618;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3fb618;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #9954bb;--bs-btn-hover-border-color: #9954bb;--bs-btn-focus-shadow-rgb: 153, 84, 187;--bs-btn-active-color: #fff;--bs-btn-active-bg: #9954bb;--bs-btn-active-border-color: #9954bb;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #9954bb;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #9954bb;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff7518;--bs-btn-hover-border-color: #ff7518;--bs-btn-focus-shadow-rgb: 255, 117, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff7518;--bs-btn-active-border-color: #ff7518;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff7518;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff7518;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff0039;--bs-btn-hover-border-color: #ff0039;--bs-btn-focus-shadow-rgb: 255, 0, 57;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff0039;--bs-btn-active-border-color: #ff0039;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff0039;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff0039;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #2761e3;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #1f4eb6;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #1f4eb6;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 71, 121, 231;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #343a40;--bs-dropdown-bg: #fff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #343a40;--bs-dropdown-link-hover-color: #343a40;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: rgba(52, 58, 64, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-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:calc(1px*-1)}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #2761e3;--bs-nav-link-hover-color: #1f4eb6;--bs-nav-link-disabled-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #dee2e6;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #fff;--bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width))}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #2780e3}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: #fdfeff;--bs-navbar-hover-color: rgba(253, 253, 255, 0.8);--bs-navbar-disabled-color: rgba(253, 254, 255, 0.75);--bs-navbar-active-color: #fdfdff;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #fdfeff;--bs-navbar-brand-hover-color: #fdfdff;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfeff' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(253, 254, 255, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #fdfeff;--bs-navbar-hover-color: rgba(253, 253, 255, 0.8);--bs-navbar-disabled-color: rgba(253, 254, 255, 0.75);--bs-navbar-active-color: #fdfdff;--bs-navbar-brand-color: #fdfeff;--bs-navbar-brand-hover-color: #fdfdff;--bs-navbar-toggler-border-color: rgba(253, 254, 255, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfeff' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfeff' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #fff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0}.card>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.accordion{--bs-accordion-color: #343a40;--bs-accordion-bg: #fff;--bs-accordion-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, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #343a40;--bs-accordion-btn-bg: #fff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23343a40'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2310335b'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #93c0f1;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #10335b;--bs-accordion-active-bg: #d4e6f9}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(52, 58, 64, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #2761e3;--bs-pagination-bg: #fff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: #dee2e6;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #1f4eb6;--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: #dee2e6;--bs-pagination-focus-color: #1f4eb6;--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #2780e3;--bs-pagination-active-border-color: #2780e3;--bs-pagination-disabled-color: rgba(52, 58, 64, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: #dee2e6;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 0 solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress,.progress-stacked{--bs-progress-height: 0.5rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #2780e3;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@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:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #343a40;--bs-list-group-bg: #fff;--bs-list-group-border-color: #dee2e6;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(52, 58, 64, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #343a40;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(52, 58, 64, 0.75);--bs-list-group-disabled-bg: #fff;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #2780e3;--bs-list-group-active-border-color: #2780e3;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(52, 58, 64, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color)}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #fff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #dee2e6;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #dee2e6;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #fff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";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;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #fff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #343a40;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";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;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-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%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .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-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .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:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #343a40;--bs-offcanvas-bg: #fff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(31, 102, 182, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(31, 102, 182, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(50, 146, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(50, 146, 19, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(122, 67, 150, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(122, 67, 150, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(204, 94, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 94, 19, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(204, 0, 46, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 0, 46, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.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}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.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}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.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}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !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}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !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:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !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:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !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:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !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:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !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:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #fff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}:root{--bslib-page-sidebar-title-bg: #2780e3;--bslib-page-sidebar-title-color: #fff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-collapse .quarto-navbar-tools{margin-left:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#fdfeff}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#fdfdff}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#595959}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#595959;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(33,81,191,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#8c8c8c}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#595959}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(33,81,191,.8)}div.sidebar-item-container.disabled{color:rgba(89,89,89,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#2151bf}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#fff}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#fff;border-bottom:1px solid #dee2e6}.quarto-banner nav.quarto-secondary-nav{background-color:#2780e3;color:#fdfeff;border-top:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(min-width: 992px){#quarto-sidebar-glass{display:none}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#1f4eb6}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}body.nav-fixed{padding-top:64px}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#757575}.nav-footer a{color:#757575}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}@media(min-width: 768px){.nav-footer-left{flex:1 1 0px;text-align:left}}@media(max-width: 575.98px){.nav-footer-left{margin-bottom:1em;flex:100%}}@media(min-width: 768px){.nav-footer-right{flex:1 1 0px;text-align:right}}@media(max-width: 575.98px){.nav-footer-right{margin-bottom:1em;flex:100%}}.nav-footer-center{text-align:center;min-height:3em}@media(min-width: 768px){.nav-footer-center{flex:1 1 0px}}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-bottom:1em;flex:100%}}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em;order:10}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#fdfeff;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#595959;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#fff;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}#quarto-announcement{padding:.5em;display:flex;justify-content:space-between;margin-bottom:0;font-size:.9em}#quarto-announcement .quarto-announcement-content{margin-right:auto}#quarto-announcement .quarto-announcement-content p{margin-bottom:0}#quarto-announcement .quarto-announcement-icon{margin-right:.5em;font-size:1.2em;margin-top:-0.15em}#quarto-announcement .quarto-announcement-action{cursor:pointer}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#fdfeff;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#fdfeff;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;color:#343a40;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#343a40;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#343a40;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#343a40;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#343a40;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #dee2e6 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#f2f2f2;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#4b95e8}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#343a40}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#e5effc}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#fff;color:#343a40}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#dee2e6;color:#343a40}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #dee2e6}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#fdfeff}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#595959}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(255,255,255,.65);width:90%;bottom:0;box-shadow:rgba(222,226,230,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #dee2e6;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#343a40;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(52,58,64,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:#5397e9 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#343a40 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:#3aa716 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:rgba(153,84,187,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:#fa6400 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:rgba(255,0,57,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#f8f9fa !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#343a40 !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #549be9;border-bottom:solid 1px #549be9}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#4b95e8}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#fdfeff}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#343a40}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#343a40}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px #bcbfc0;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#fff;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#fff;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#343a40}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#fff}.tableFloatingHeaderOriginal{background-color:#fff;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}div.value-box-area span.observablehq--number{font-size:calc(clamp(.1em,15cqw,5em)*1.25);line-height:1.2;color:inherit;font-family:var(--bs-body-font-family)}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#343a40;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#2761e3}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#2761e3}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#2761e3}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#2761e3}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#2761e3}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #dee2e6;border-radius:.25rem;color:#343a40;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#343a40}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*! +* +* ansi colors from IPython notebook's +* +* we also add `bright-[color]-` synonyms for the `-[color]-intense` classes since +* that seems to be what ansi_up emits +* +*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-black,.ansi-bright-black-fg{color:#282c36}.ansi-black-intense-black,.ansi-bright-black-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-red,.ansi-bright-red-fg{color:#b22b31}.ansi-red-intense-red,.ansi-bright-red-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-green,.ansi-bright-green-fg{color:#007427}.ansi-green-intense-green,.ansi-bright-green-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-yellow,.ansi-bright-yellow-fg{color:#b27d12}.ansi-yellow-intense-yellow,.ansi-bright-yellow-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-blue,.ansi-bright-blue-fg{color:#0065ca}.ansi-blue-intense-blue,.ansi-bright-blue-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-magenta,.ansi-bright-magenta-fg{color:#a03196}.ansi-magenta-intense-magenta,.ansi-bright-magenta-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-cyan,.ansi-bright-cyan-fg{color:#258f8f}.ansi-cyan-intense-cyan,.ansi-bright-cyan-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-white,.ansi-bright-white-fg{color:#a1a6b2}.ansi-white-intense-white,.ansi-bright-white-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #fff;--quarto-body-color: #343a40;--quarto-text-muted: #6c757d;--quarto-border-color: #dee2e6;--quarto-border-width: 1px;--quarto-border-radius: 0.25rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:rgba(0,0,0,0)}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}.code-annotation-tip-content{word-wrap:break-word}.code-annotation-container-hidden{display:none !important}dl.code-annotation-container-grid{display:grid;grid-template-columns:min-content auto}dl.code-annotation-container-grid dt{grid-column:1}dl.code-annotation-container-grid dd{grid-column:2}pre.sourceCode.code-annotation-code{padding-right:0}code.sourceCode .code-annotation-anchor{z-index:100;position:relative;float:right;background-color:rgba(0,0,0,0)}input[type=checkbox]{margin-right:.5ch}:root{--mermaid-bg-color: #fff;--mermaid-edge-color: #343a40;--mermaid-node-fg-color: #343a40;--mermaid-fg-color: #343a40;--mermaid-fg-color--lighter: #4b545c;--mermaid-fg-color--lightest: #626d78;--mermaid-font-family: Source Sans Pro, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;--mermaid-label-bg-color: #fff;--mermaid-label-fg-color: #2780e3;--mermaid-node-bg-color: rgba(39, 128, 227, 0.1);--mermaid-node-fg-color: #343a40}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:rgba(0,0,0,0);z-index:3}.code-copy-button:focus{outline:none}.code-copy-button-tooltip{font-size:.75em}pre.sourceCode:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}pre.sourceCode:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}ul>li:not(:has(>p))>ul,ol>li:not(:has(>p))>ul,ul>li:not(:has(>p))>ol,ol>li:not(:has(>p))>ol{margin-bottom:0}ul>li:not(:has(>p))>ul>li:has(>p),ol>li:not(:has(>p))>ul>li:has(>p),ul>li:not(:has(>p))>ol>li:has(>p),ol>li:not(:has(>p))>ol>li:has(>p){margin-top:1rem}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] minmax(50px, 100px) [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1250px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left .page-columns.page-full>*,.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right .page-columns.page-full>*,.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;opacity:.999}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse,#quarto-content.page-columns #quarto-margin-sidebar.collapsing,#quarto-content.page-columns #quarto-sidebar.collapsing{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}.zindex-content{z-index:998;opacity:.999}.zindex-modal{z-index:1055;opacity:.999}.zindex-over-content{z-index:999;opacity:.999}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside:not(.footnotes):not(.sidebar),.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}#quarto-sidebar-toc-left{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{color:inherit;margin-top:2rem;margin-bottom:1rem;font-weight:600}h1.title,.title.h1{margin-top:0}main.content>section:first-of-type>h2:first-child,main.content>section:first-of-type>.h2:first-child{margin-top:0}h2,.h2{border-bottom:1px solid #dee2e6;padding-bottom:.5rem}h3,.h3{font-weight:600}h3,.h3,h4,.h4{opacity:.9;margin-top:1.5rem}h5,.h5,h6,.h6{opacity:.9}.header-section-number{color:#6d7a86}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,.figure-caption,.subfigure-caption,.table-caption,figcaption,caption{font-size:.9rem;color:#6d7a86}.quarto-layout-cell[data-ref-parent] caption{color:#6d7a86}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:#6d7a86;font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse):first-child{padding-bottom:.5em;display:block}.column-margin.column-container>*:not(.collapse):not(:first-child){padding-top:.5em;padding-bottom:.5em;display:block}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.nav-tabs .nav-item{margin-top:1px;cursor:pointer}.tab-content{margin-top:0px;border-left:#dee2e6 1px solid;border-right:#dee2e6 1px solid;border-bottom:#dee2e6 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:0}.tab-pane>p:nth-child(1){padding-top:0}.tab-pane>p:last-child{margin-bottom:0}.tab-pane>pre:last-child{margin-bottom:0}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.25rem}pre.sourceCode{background-color:rgba(0,0,0,0)}pre.sourceCode{border:none;font-size:.875em;overflow:visible !important;padding:.4em}.callout pre.sourceCode{padding-left:0}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:#6d7a86}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p pre code:not(.sourceCode),li pre code:not(.sourceCode),pre code:not(.sourceCode){background-color:initial}p code:not(.sourceCode),li code:not(.sourceCode),td code:not(.sourceCode){background-color:#f8f9fa;padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode),nav td code:not(.sourceCode){background-color:rgba(0,0,0,0);padding:0}td code:not(.sourceCode){white-space:pre-wrap}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:#6c757d;background-color:rgba(0,0,0,0);transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}figure .quarto-notebook-link{margin-top:.5em}.quarto-notebook-link{font-size:.75em;color:#6c757d;margin-bottom:1em;text-decoration:none;display:block}.quarto-notebook-link:hover{text-decoration:underline;color:#2761e3}.quarto-notebook-link::before{display:inline-block;height:.75rem;width:.75rem;margin-bottom:0em;margin-right:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}.toc-actions i.bi,.quarto-code-links i.bi,.quarto-other-links i.bi,.quarto-alternate-notebooks i.bi,.quarto-alternate-formats i.bi{margin-right:.4em;font-size:.8rem}.quarto-other-links-text-target .quarto-code-links i.bi,.quarto-other-links-text-target .quarto-other-links i.bi{margin-right:.2em}.quarto-other-formats-text-target .quarto-alternate-formats i.bi{margin-right:.1em}.toc-actions i.bi.empty,.quarto-code-links i.bi.empty,.quarto-other-links i.bi.empty,.quarto-alternate-notebooks i.bi.empty,.quarto-alternate-formats i.bi.empty{padding-left:1em}.quarto-notebook h2,.quarto-notebook .h2{border-bottom:none}.quarto-notebook .cell-container{display:flex}.quarto-notebook .cell-container .cell{flex-grow:4}.quarto-notebook .cell-container .cell-decorator{padding-top:1.5em;padding-right:1em;text-align:right}.quarto-notebook .cell-container.code-fold .cell-decorator{padding-top:3em}.quarto-notebook .cell-code code{white-space:pre-wrap}.quarto-notebook .cell .cell-output-stderr pre code,.quarto-notebook .cell .cell-output-stdout pre code{white-space:pre-wrap;overflow-wrap:anywhere}.toc-actions,.quarto-alternate-formats,.quarto-other-links,.quarto-code-links,.quarto-alternate-notebooks{padding-left:0em}.sidebar .toc-actions a,.sidebar .quarto-alternate-formats a,.sidebar .quarto-other-links a,.sidebar .quarto-code-links a,.sidebar .quarto-alternate-notebooks a,.sidebar nav[role=doc-toc] a{text-decoration:none}.sidebar .toc-actions a:hover,.sidebar .quarto-other-links a:hover,.sidebar .quarto-code-links a:hover,.sidebar .quarto-alternate-formats a:hover,.sidebar .quarto-alternate-notebooks a:hover{color:#2761e3}.sidebar .toc-actions h2,.sidebar .toc-actions .h2,.sidebar .quarto-code-links h2,.sidebar .quarto-code-links .h2,.sidebar .quarto-other-links h2,.sidebar .quarto-other-links .h2,.sidebar .quarto-alternate-notebooks h2,.sidebar .quarto-alternate-notebooks .h2,.sidebar .quarto-alternate-formats h2,.sidebar .quarto-alternate-formats .h2,.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-weight:500;margin-bottom:.2rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar .toc-actions>h2,.sidebar .toc-actions>.h2,.sidebar .quarto-code-links>h2,.sidebar .quarto-code-links>.h2,.sidebar .quarto-other-links>h2,.sidebar .quarto-other-links>.h2,.sidebar .quarto-alternate-notebooks>h2,.sidebar .quarto-alternate-notebooks>.h2,.sidebar .quarto-alternate-formats>h2,.sidebar .quarto-alternate-formats>.h2{font-size:.8rem}.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar .toc-actions h2>ul a,.sidebar .toc-actions .h2>ul a,.sidebar .quarto-code-links h2>ul a,.sidebar .quarto-code-links .h2>ul a,.sidebar .quarto-other-links h2>ul a,.sidebar .quarto-other-links .h2>ul a,.sidebar .quarto-alternate-notebooks h2>ul a,.sidebar .quarto-alternate-notebooks .h2>ul a,.sidebar .quarto-alternate-formats h2>ul a,.sidebar .quarto-alternate-formats .h2>ul a{border-left:none;padding-left:.6rem}.sidebar .toc-actions ul a:empty,.sidebar .quarto-code-links ul a:empty,.sidebar .quarto-other-links ul a:empty,.sidebar .quarto-alternate-notebooks ul a:empty,.sidebar .quarto-alternate-formats ul a:empty,.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar .toc-actions ul,.sidebar .quarto-code-links ul,.sidebar .quarto-other-links ul,.sidebar .quarto-alternate-notebooks ul,.sidebar .quarto-alternate-formats ul{padding-left:0;list-style:none}.sidebar nav[role=doc-toc] ul{list-style:none;padding-left:0;list-style:none}.sidebar nav[role=doc-toc]>ul{margin-left:.45em}.quarto-margin-sidebar nav[role=doc-toc]{padding-left:.5em}.sidebar .toc-actions>ul,.sidebar .quarto-code-links>ul,.sidebar .quarto-other-links>ul,.sidebar .quarto-alternate-notebooks>ul,.sidebar .quarto-alternate-formats>ul{font-size:.8rem}.sidebar nav[role=doc-toc]>ul{font-size:.875rem}.sidebar .toc-actions ul li a,.sidebar .quarto-code-links ul li a,.sidebar .quarto-other-links ul li a,.sidebar .quarto-alternate-notebooks ul li a,.sidebar .quarto-alternate-formats ul li a,.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>a.active,.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #2761e3;color:#2761e3 !important}.sidebar nav[role=doc-toc] ul>li>a:hover,.sidebar nav[role=doc-toc] ul>li>ul>li>a:hover{color:#2761e3 !important}kbd,.kbd{color:#343a40;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:#dee2e6}.quarto-appendix-contents div.hanging-indent{margin-left:0em}.quarto-appendix-contents div.hanging-indent div.csl-entry{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.25rem;overflow-wrap:break-word}.callout .callout-title-container{overflow-wrap:anywhere}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout.callout-style-default{border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout:not(.no-icon).callout-titled.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-titled>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body>:first-child{padding-top:.5rem;margin-top:0}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-titled .callout-body>:last-child:not(.sourceCode),.callout.callout-titled .callout-body>div>:last-child:not(.sourceCode){padding-bottom:.5rem;margin-bottom:0}.callout:not(.callout-titled) .callout-body>:first-child,.callout:not(.callout-titled) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-titled) .callout-body>:last-child,.callout:not(.callout-titled) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-title-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:#6c757d}div.callout.callout-style-default>.callout-header{background-color:#6c757d}div.callout-note.callout{border-left-color:#2780e3}div.callout-note.callout-style-default>.callout-header{background-color:#e9f2fc}div.callout-note:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#3fb618}div.callout-tip.callout-style-default>.callout-header{background-color:#ecf8e8}div.callout-tip:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ff7518}div.callout-warning.callout-style-default>.callout-header{background-color:#fff1e8}div.callout-warning:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#f0ad4e}div.callout-caution.callout-style-default>.callout-header{background-color:#fef7ed}div.callout-caution:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#ff0039}div.callout-important.callout-style-default>.callout-header{background-color:#ffe6eb}div.callout-important:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.sidebar-navigation{padding-left:20px}.navbar{background-color:#2780e3;color:#fdfeff}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:#dee2e6;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:#fafafa}#quarto-content .quarto-sidebar-toggle-title{color:#343a40}.quarto-sidebar-toggle-icon{color:#dee2e6;margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid #dee2e6 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}@media(max-width: 767.98px){.sidebar-menu-container{padding-bottom:5em}}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid #dee2e6}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .footnotes ol{margin-left:.5em}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{--bs-btn-color: #cacccd;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #cacccd;--bs-btn-hover-bg: #52585d;--bs-btn-hover-border-color: #484e53;--bs-btn-focus-shadow-rgb: 75, 80, 85;--bs-btn-active-color: #fff;--bs-btn-active-bg: #5d6166;--bs-btn-active-border-color: #484e53;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}nav.quarto-secondary-nav.color-navbar{background-color:#2780e3;color:#fdfeff}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:#fdfeff}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner{margin-bottom:0;padding-bottom:1em}body.nav-sidebar #title-block-header{margin-block-end:0}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}.code-annotated .code-copy-button{margin-right:1.25em;margin-top:0;padding-bottom:0;padding-top:3px}.code-annotation-gutter-bg{background-color:#fff}.code-annotation-gutter{background-color:rgba(233,236,239,.65)}.code-annotation-gutter,.code-annotation-gutter-bg{height:100%;width:calc(20px + .5em);position:absolute;top:0;right:0}dl.code-annotation-container-grid dt{margin-right:1em;margin-top:.25rem}dl.code-annotation-container-grid dt{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:#4b545c;border:solid #4b545c 1px;border-radius:50%;height:22px;width:22px;line-height:22px;font-size:11px;text-align:center;vertical-align:middle;text-decoration:none}dl.code-annotation-container-grid dt[data-target-cell]{cursor:pointer}dl.code-annotation-container-grid dt[data-target-cell].code-annotation-active{color:#fff;border:solid #aaa 1px;background-color:#aaa}pre.code-annotation-code{padding-top:0;padding-bottom:0}pre.code-annotation-code code{z-index:3}#code-annotation-line-highlight-gutter{width:100%;border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}#code-annotation-line-highlight{margin-left:-4em;width:calc(100% + 4em);border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}code.sourceCode .code-annotation-anchor.code-annotation-active{background-color:var(--quarto-hl-normal-color, #aaaaaa);border:solid var(--quarto-hl-normal-color, #aaaaaa) 1px;color:#e9ecef;font-weight:bolder}code.sourceCode .code-annotation-anchor{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:var(--quarto-hl-co-color);border:solid var(--quarto-hl-co-color) 1px;border-radius:50%;height:18px;width:18px;font-size:9px;margin-top:2px}code.sourceCode button.code-annotation-anchor{padding:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none}code.sourceCode a.code-annotation-anchor{line-height:18px;text-align:center;vertical-align:middle;cursor:default;text-decoration:none}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}}.quarto-video{margin-bottom:1em}.table{border-top:1px solid #ebedee;border-bottom:1px solid #ebedee}.table>thead{border-top-width:0;border-bottom:1px solid #b2bac1}.table a{word-break:break-word}.table>:not(caption)>*>*{background-color:unset;color:unset}#quarto-document-content .crosstalk-input .checkbox input[type=checkbox],#quarto-document-content .crosstalk-input .checkbox-inline input[type=checkbox]{position:unset;margin-top:unset;margin-left:unset}#quarto-document-content .row{margin-left:unset;margin-right:unset}.quarto-xref{white-space:nowrap}#quarto-draft-alert{margin-top:0px;margin-bottom:0px;padding:.3em;text-align:center;font-size:.9em}#quarto-draft-alert i{margin-right:.3em}a.external:after{content:"";background-image:url('data:image/svg+xml,');background-size:contain;background-repeat:no-repeat;background-position:center center;margin-left:.2em;padding-right:.75em}div.sourceCode code a.external:after{content:none}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:#fdfeff;background:#2780e3}.quarto-title-banner a{color:#fdfeff}.quarto-title-banner h1,.quarto-title-banner .h1,.quarto-title-banner h2,.quarto-title-banner .h2{color:#fdfeff}.quarto-title-banner .code-tools-button{color:#97cbff}.quarto-title-banner .code-tools-button:hover{color:#fdfeff}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}@media(max-width: 767.98px){body.hypothesis-enabled #title-block-header>*{padding-right:20px}}main.quarto-banner-title-block>section:first-child>h2,main.quarto-banner-title-block>section:first-child>.h2,main.quarto-banner-title-block>section:first-child>h3,main.quarto-banner-title-block>section:first-child>.h3,main.quarto-banner-title-block>section:first-child>h4,main.quarto-banner-title-block>section:first-child>.h4{margin-top:0}.quarto-title .quarto-categories{display:flex;flex-wrap:wrap;row-gap:.5em;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.25rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}.quarto-title-meta-container{display:grid;grid-template-columns:1fr auto}.quarto-title-meta-column-end{display:flex;flex-direction:column;padding-left:1em}.quarto-title-meta-column-end a .bi{margin-right:.3em}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr);grid-column-gap:1em}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-0.2em;height:.8em;width:.8em}#title-block-header.quarto-title-block.default .quarto-title-author-email{opacity:.7}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.1em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .keywords,#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .keywords>p,#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .keywords>p:last-of-type,#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .keywords .block-title,#title-block-header.quarto-title-block.default .description .block-title,#title-block-header.quarto-title-block.default .abstract .block-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:minmax(max-content, 1fr) 1fr;grid-column-gap:1em}.quarto-title-tools-only{display:flex;justify-content:right}body{-webkit-font-smoothing:antialiased}.badge.bg-light{color:#343a40}.progress .progress-bar{font-size:8px;line-height:8px} diff --git a/_proc/docs/site_libs/bootstrap/bootstrap.min.js b/_proc/docs/site_libs/bootstrap/bootstrap.min.js new file mode 100644 index 0000000..e8f21f7 --- /dev/null +++ b/_proc/docs/site_libs/bootstrap/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof 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()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/_proc/docs/site_libs/clipboard/clipboard.min.js b/_proc/docs/site_libs/clipboard/clipboard.min.js new file mode 100644 index 0000000..1103f81 --- /dev/null +++ b/_proc/docs/site_libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}}); +// @license-end \ No newline at end of file diff --git a/_proc/docs/site_libs/quarto-html/popper.min.js b/_proc/docs/site_libs/quarto-html/popper.min.js new file mode 100644 index 0000000..e3726d7 --- /dev/null +++ b/_proc/docs/site_libs/quarto-html/popper.min.js @@ -0,0 +1,6 @@ +/** + * @popperjs/core v2.11.7 - MIT License + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function c(){return!/^((?!chrome|android).)*safari/i.test(f())}function p(e,o,i){void 0===o&&(o=!1),void 0===i&&(i=!1);var a=e.getBoundingClientRect(),f=1,p=1;o&&r(e)&&(f=e.offsetWidth>0&&s(a.width)/e.offsetWidth||1,p=e.offsetHeight>0&&s(a.height)/e.offsetHeight||1);var u=(n(e)?t(e):window).visualViewport,l=!c()&&i,d=(a.left+(l&&u?u.offsetLeft:0))/f,h=(a.top+(l&&u?u.offsetTop:0))/p,m=a.width/f,v=a.height/p;return{width:m,height:v,top:h,right:d+m,bottom:h+v,left:d,x:d,y:h}}function u(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return p(d(e)).left+u(e).scrollLeft}function m(e){return t(e).getComputedStyle(e)}function v(e){var t=m(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function y(e,n,o){void 0===o&&(o=!1);var i,a,f=r(n),c=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),m=d(n),y=p(e,c,o),g={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(f||!f&&!o)&&(("body"!==l(n)||v(m))&&(g=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:u(i)),r(n)?((b=p(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):m&&(b.x=h(m))),{x:y.left+g.scrollLeft-b.x,y:y.top+g.scrollTop-b.y,width:y.width,height:y.height}}function g(e){var t=p(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||d(e)}function x(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:r(e)&&v(e)?e:x(b(e))}function w(e,n){var r;void 0===n&&(n=[]);var o=x(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],v(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(w(b(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return r(e)&&"fixed"!==m(e).position?e.offsetParent:null}function E(e){for(var n=t(e),i=j(e);i&&O(i)&&"static"===m(i).position;)i=j(i);return i&&("html"===l(i)||"body"===l(i)&&"static"===m(i).position)?n:i||function(e){var t=/firefox/i.test(f());if(/Trident/i.test(f())&&r(e)&&"fixed"===m(e).position)return null;var n=b(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(l(n))<0;){var i=m(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var D="top",A="bottom",L="right",P="left",M="auto",k=[D,A,L,P],W="start",B="end",H="viewport",T="popper",R=k.reduce((function(e,t){return e.concat([t+"-"+W,t+"-"+B])}),[]),S=[].concat(k,[M]).reduce((function(e,t){return e.concat([t,t+"-"+W,t+"-"+B])}),[]),V=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function q(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function N(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function I(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function _(e,r,o){return r===H?I(function(e,n){var r=t(e),o=d(e),i=r.visualViewport,a=o.clientWidth,s=o.clientHeight,f=0,p=0;if(i){a=i.width,s=i.height;var u=c();(u||!u&&"fixed"===n)&&(f=i.offsetLeft,p=i.offsetTop)}return{width:a,height:s,x:f+h(e),y:p}}(e,o)):n(r)?function(e,t){var n=p(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(r,o):I(function(e){var t,n=d(e),r=u(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+h(e),c=-r.scrollTop;return"rtl"===m(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:c}}(d(e)))}function F(e,t,o,s){var f="clippingParents"===t?function(e){var t=w(b(e)),o=["absolute","fixed"].indexOf(m(e).position)>=0&&r(e)?E(e):e;return n(o)?t.filter((function(e){return n(e)&&N(e,o)&&"body"!==l(e)})):[]}(e):[].concat(t),c=[].concat(f,[o]),p=c[0],u=c.reduce((function(t,n){var r=_(e,n,s);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),_(e,p,s));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function U(e){return e.split("-")[1]}function z(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?U(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case D:t={x:s,y:n.y-r.height};break;case A:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:f};break;case P:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?z(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case W:t[c]=t[c]-(n[p]/2-r[p]/2);break;case B:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function J(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.strategy,s=void 0===a?e.strategy:a,f=r.boundary,c=void 0===f?"clippingParents":f,u=r.rootBoundary,l=void 0===u?H:u,h=r.elementContext,m=void 0===h?T:h,v=r.altBoundary,y=void 0!==v&&v,g=r.padding,b=void 0===g?0:g,x=Y("number"!=typeof b?b:G(b,k)),w=m===T?"reference":T,O=e.rects.popper,j=e.elements[y?w:m],E=F(n(j)?j:j.contextElement||d(e.elements.popper),c,l,s),P=p(e.elements.reference),M=X({reference:P,element:O,strategy:"absolute",placement:i}),W=I(Object.assign({},O,M)),B=m===T?W:P,R={top:E.top-B.top+x.top,bottom:B.bottom-E.bottom+x.bottom,left:E.left-B.left+x.left,right:B.right-E.right+x.right},S=e.modifiersData.offset;if(m===T&&S){var V=S[i];Object.keys(R).forEach((function(e){var t=[L,A].indexOf(e)>=0?1:-1,n=[D,A].indexOf(e)>=0?"y":"x";R[e]+=V[n]*t}))}return R}var K={placement:"bottom",modifiers:[],strategy:"absolute"};function Q(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[P,L].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},se={left:"right",right:"left",bottom:"top",top:"bottom"};function fe(e){return e.replace(/left|right|bottom|top/g,(function(e){return se[e]}))}var ce={start:"end",end:"start"};function pe(e){return e.replace(/start|end/g,(function(e){return ce[e]}))}function ue(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?S:f,p=U(r),u=p?s?R:R.filter((function(e){return U(e)===p})):k,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=J(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var le={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,y=C(v),g=f||(y===v||!h?[fe(v)]:function(e){if(C(e)===M)return[];var t=fe(e);return[pe(e),t,pe(t)]}(v)),b=[v].concat(g).reduce((function(e,n){return e.concat(C(n)===M?ue(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,j=!0,E=b[0],k=0;k=0,S=R?"width":"height",V=J(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),q=R?T?L:P:T?A:D;x[S]>w[S]&&(q=fe(q));var N=fe(q),I=[];if(i&&I.push(V[H]<=0),s&&I.push(V[q]<=0,V[N]<=0),I.every((function(e){return e}))){E=B,j=!1;break}O.set(B,I)}if(j)for(var _=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},F=h?3:1;F>0;F--){if("break"===_(F))break}t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function de(e,t,n){return i(e,a(t,n))}var he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,v=n.tetherOffset,y=void 0===v?0:v,b=J(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=U(t.placement),O=!w,j=z(x),M="x"===j?"y":"x",k=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,V={x:0,y:0};if(k){if(s){var q,N="y"===j?D:P,I="y"===j?A:L,_="y"===j?"height":"width",F=k[j],X=F+b[N],Y=F-b[I],G=m?-H[_]/2:0,K=w===W?B[_]:H[_],Q=w===W?-H[_]:-B[_],Z=t.elements.arrow,$=m&&Z?g(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=de(0,B[_],$[_]),oe=O?B[_]/2-G-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=O?-B[_]/2+G+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===j?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(q=null==S?void 0:S[j])?q:0,ce=F+ie-fe,pe=de(m?a(X,F+oe-fe-se):X,F,m?i(Y,ce):Y);k[j]=pe,V[j]=pe-F}if(c){var ue,le="x"===j?D:P,he="x"===j?A:L,me=k[M],ve="y"===M?"height":"width",ye=me+b[le],ge=me-b[he],be=-1!==[D,P].indexOf(x),xe=null!=(ue=null==S?void 0:S[M])?ue:0,we=be?ye:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ge,je=m&&be?function(e,t,n){var r=de(e,t,n);return r>n?n:r}(we,me,Oe):de(m?we:ye,me,m?Oe:ge);k[M]=je,V[M]=je-me}t.modifiersData[r]=V}},requiresIfExists:["offset"]};var me={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=z(s),c=[P,L].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,k))}(o.padding,n),u=g(i),l="y"===f?D:P,d="y"===f?A:L,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],v=E(i),y=v?"y"===f?v.clientHeight||0:v.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],O=y/2-u[c]/2+b,j=de(x,O,w),M=f;n.modifiersData[r]=((t={})[M]=j,t.centerOffset=j-O,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&N(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ve(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ye(e){return[D,L,A,P].some((function(t){return e[t]>=0}))}var ge={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=J(t,{elementContext:"reference"}),s=J(t,{altBoundary:!0}),f=ve(a,r),c=ve(s,o,i),p=ye(f),u=ye(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},be=Z({defaultModifiers:[ee,te,oe,ie]}),xe=[ee,te,oe,ie,ae,le,he,me,ge],we=Z({defaultModifiers:xe});e.applyStyles=ie,e.arrow=me,e.computeStyles=oe,e.createPopper=we,e.createPopperLite=be,e.defaultModifiers=xe,e.detectOverflow=J,e.eventListeners=ee,e.flip=le,e.hide=ge,e.offset=ae,e.popperGenerator=Z,e.popperOffsets=te,e.preventOverflow=he,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/_proc/docs/site_libs/quarto-html/quarto-syntax-highlighting.css b/_proc/docs/site_libs/quarto-html/quarto-syntax-highlighting.css new file mode 100644 index 0000000..b30ce57 --- /dev/null +++ b/_proc/docs/site_libs/quarto-html/quarto-syntax-highlighting.css @@ -0,0 +1,205 @@ +/* quarto syntax highlight colors */ +:root { + --quarto-hl-ot-color: #003B4F; + --quarto-hl-at-color: #657422; + --quarto-hl-ss-color: #20794D; + --quarto-hl-an-color: #5E5E5E; + --quarto-hl-fu-color: #4758AB; + --quarto-hl-st-color: #20794D; + --quarto-hl-cf-color: #003B4F; + --quarto-hl-op-color: #5E5E5E; + --quarto-hl-er-color: #AD0000; + --quarto-hl-bn-color: #AD0000; + --quarto-hl-al-color: #AD0000; + --quarto-hl-va-color: #111111; + --quarto-hl-bu-color: inherit; + --quarto-hl-ex-color: inherit; + --quarto-hl-pp-color: #AD0000; + --quarto-hl-in-color: #5E5E5E; + --quarto-hl-vs-color: #20794D; + --quarto-hl-wa-color: #5E5E5E; + --quarto-hl-do-color: #5E5E5E; + --quarto-hl-im-color: #00769E; + --quarto-hl-ch-color: #20794D; + --quarto-hl-dt-color: #AD0000; + --quarto-hl-fl-color: #AD0000; + --quarto-hl-co-color: #5E5E5E; + --quarto-hl-cv-color: #5E5E5E; + --quarto-hl-cn-color: #8f5902; + --quarto-hl-sc-color: #5E5E5E; + --quarto-hl-dv-color: #AD0000; + --quarto-hl-kw-color: #003B4F; +} + +/* other quarto variables */ +:root { + --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +pre > code.sourceCode > span { + color: #003B4F; +} + +code span { + color: #003B4F; +} + +code.sourceCode > span { + color: #003B4F; +} + +div.sourceCode, +div.sourceCode pre.sourceCode { + color: #003B4F; +} + +code span.ot { + color: #003B4F; + font-style: inherit; +} + +code span.at { + color: #657422; + font-style: inherit; +} + +code span.ss { + color: #20794D; + font-style: inherit; +} + +code span.an { + color: #5E5E5E; + font-style: inherit; +} + +code span.fu { + color: #4758AB; + font-style: inherit; +} + +code span.st { + color: #20794D; + font-style: inherit; +} + +code span.cf { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +code span.op { + color: #5E5E5E; + font-style: inherit; +} + +code span.er { + color: #AD0000; + font-style: inherit; +} + +code span.bn { + color: #AD0000; + font-style: inherit; +} + +code span.al { + color: #AD0000; + font-style: inherit; +} + +code span.va { + color: #111111; + font-style: inherit; +} + +code span.bu { + font-style: inherit; +} + +code span.ex { + font-style: inherit; +} + +code span.pp { + color: #AD0000; + font-style: inherit; +} + +code span.in { + color: #5E5E5E; + font-style: inherit; +} + +code span.vs { + color: #20794D; + font-style: inherit; +} + +code span.wa { + color: #5E5E5E; + font-style: italic; +} + +code span.do { + color: #5E5E5E; + font-style: italic; +} + +code span.im { + color: #00769E; + font-style: inherit; +} + +code span.ch { + color: #20794D; + font-style: inherit; +} + +code span.dt { + color: #AD0000; + font-style: inherit; +} + +code span.fl { + color: #AD0000; + font-style: inherit; +} + +code span.co { + color: #5E5E5E; + font-style: inherit; +} + +code span.cv { + color: #5E5E5E; + font-style: italic; +} + +code span.cn { + color: #8f5902; + font-style: inherit; +} + +code span.sc { + color: #5E5E5E; + font-style: inherit; +} + +code span.dv { + color: #AD0000; + font-style: inherit; +} + +code span.kw { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +.prevent-inlining { + content: " { + // Find any conflicting margin elements and add margins to the + // top to prevent overlap + const marginChildren = window.document.querySelectorAll( + ".column-margin.column-container > *, .margin-caption, .aside" + ); + + let lastBottom = 0; + for (const marginChild of marginChildren) { + if (marginChild.offsetParent !== null) { + // clear the top margin so we recompute it + marginChild.style.marginTop = null; + const top = marginChild.getBoundingClientRect().top + window.scrollY; + if (top < lastBottom) { + const marginChildStyle = window.getComputedStyle(marginChild); + const marginBottom = parseFloat(marginChildStyle["marginBottom"]); + const margin = lastBottom - top + marginBottom; + marginChild.style.marginTop = `${margin}px`; + } + const styles = window.getComputedStyle(marginChild); + const marginTop = parseFloat(styles["marginTop"]); + lastBottom = top + marginChild.getBoundingClientRect().height + marginTop; + } + } +}; + +window.document.addEventListener("DOMContentLoaded", function (_event) { + // Recompute the position of margin elements anytime the body size changes + if (window.ResizeObserver) { + const resizeObserver = new window.ResizeObserver( + throttle(() => { + layoutMarginEls(); + if ( + window.document.body.getBoundingClientRect().width < 990 && + isReaderMode() + ) { + quartoToggleReader(); + } + }, 50) + ); + resizeObserver.observe(window.document.body); + } + + const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]'); + const sidebarEl = window.document.getElementById("quarto-sidebar"); + const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left"); + const marginSidebarEl = window.document.getElementById( + "quarto-margin-sidebar" + ); + // function to determine whether the element has a previous sibling that is active + const prevSiblingIsActiveLink = (el) => { + const sibling = el.previousElementSibling; + if (sibling && sibling.tagName === "A") { + return sibling.classList.contains("active"); + } else { + return false; + } + }; + + // fire slideEnter for bootstrap tab activations (for htmlwidget resize behavior) + function fireSlideEnter(e) { + const event = window.document.createEvent("Event"); + event.initEvent("slideenter", true, true); + window.document.dispatchEvent(event); + } + const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]'); + tabs.forEach((tab) => { + tab.addEventListener("shown.bs.tab", fireSlideEnter); + }); + + // fire slideEnter for tabby tab activations (for htmlwidget resize behavior) + document.addEventListener("tabby", fireSlideEnter, false); + + // Track scrolling and mark TOC links as active + // get table of contents and sidebar (bail if we don't have at least one) + const tocLinks = tocEl + ? [...tocEl.querySelectorAll("a[data-scroll-target]")] + : []; + const makeActive = (link) => tocLinks[link].classList.add("active"); + const removeActive = (link) => tocLinks[link].classList.remove("active"); + const removeAllActive = () => + [...Array(tocLinks.length).keys()].forEach((link) => removeActive(link)); + + // activate the anchor for a section associated with this TOC entry + tocLinks.forEach((link) => { + link.addEventListener("click", () => { + if (link.href.indexOf("#") !== -1) { + const anchor = link.href.split("#")[1]; + const heading = window.document.querySelector( + `[data-anchor-id="${anchor}"]` + ); + if (heading) { + // Add the class + heading.classList.add("reveal-anchorjs-link"); + + // function to show the anchor + const handleMouseout = () => { + heading.classList.remove("reveal-anchorjs-link"); + heading.removeEventListener("mouseout", handleMouseout); + }; + + // add a function to clear the anchor when the user mouses out of it + heading.addEventListener("mouseout", handleMouseout); + } + } + }); + }); + + const sections = tocLinks.map((link) => { + const target = link.getAttribute("data-scroll-target"); + if (target.startsWith("#")) { + return window.document.getElementById(decodeURI(`${target.slice(1)}`)); + } else { + return window.document.querySelector(decodeURI(`${target}`)); + } + }); + + const sectionMargin = 200; + let currentActive = 0; + // track whether we've initialized state the first time + let init = false; + + const updateActiveLink = () => { + // The index from bottom to top (e.g. reversed list) + let sectionIndex = -1; + if ( + window.innerHeight + window.pageYOffset >= + window.document.body.offsetHeight + ) { + // This is the no-scroll case where last section should be the active one + sectionIndex = 0; + } else { + // This finds the last section visible on screen that should be made active + sectionIndex = [...sections].reverse().findIndex((section) => { + if (section) { + return window.pageYOffset >= section.offsetTop - sectionMargin; + } else { + return false; + } + }); + } + if (sectionIndex > -1) { + const current = sections.length - sectionIndex - 1; + if (current !== currentActive) { + removeAllActive(); + currentActive = current; + makeActive(current); + if (init) { + window.dispatchEvent(sectionChanged); + } + init = true; + } + } + }; + + const inHiddenRegion = (top, bottom, hiddenRegions) => { + for (const region of hiddenRegions) { + if (top <= region.bottom && bottom >= region.top) { + return true; + } + } + return false; + }; + + const categorySelector = "header.quarto-title-block .quarto-category"; + const activateCategories = (href) => { + // Find any categories + // Surround them with a link pointing back to: + // #category=Authoring + try { + const categoryEls = window.document.querySelectorAll(categorySelector); + for (const categoryEl of categoryEls) { + const categoryText = categoryEl.textContent; + if (categoryText) { + const link = `${href}#category=${encodeURIComponent(categoryText)}`; + const linkEl = window.document.createElement("a"); + linkEl.setAttribute("href", link); + for (const child of categoryEl.childNodes) { + linkEl.append(child); + } + categoryEl.appendChild(linkEl); + } + } + } catch { + // Ignore errors + } + }; + function hasTitleCategories() { + return window.document.querySelector(categorySelector) !== null; + } + + function offsetRelativeUrl(url) { + const offset = getMeta("quarto:offset"); + return offset ? offset + url : url; + } + + function offsetAbsoluteUrl(url) { + const offset = getMeta("quarto:offset"); + const baseUrl = new URL(offset, window.location); + + const projRelativeUrl = url.replace(baseUrl, ""); + if (projRelativeUrl.startsWith("/")) { + return projRelativeUrl; + } else { + return "/" + projRelativeUrl; + } + } + + // read a meta tag value + function getMeta(metaName) { + const metas = window.document.getElementsByTagName("meta"); + for (let i = 0; i < metas.length; i++) { + if (metas[i].getAttribute("name") === metaName) { + return metas[i].getAttribute("content"); + } + } + return ""; + } + + async function findAndActivateCategories() { + const currentPagePath = offsetAbsoluteUrl(window.location.href); + const response = await fetch(offsetRelativeUrl("listings.json")); + if (response.status == 200) { + return response.json().then(function (listingPaths) { + const listingHrefs = []; + for (const listingPath of listingPaths) { + const pathWithoutLeadingSlash = listingPath.listing.substring(1); + for (const item of listingPath.items) { + if ( + item === currentPagePath || + item === currentPagePath + "index.html" + ) { + // Resolve this path against the offset to be sure + // we already are using the correct path to the listing + // (this adjusts the listing urls to be rooted against + // whatever root the page is actually running against) + const relative = offsetRelativeUrl(pathWithoutLeadingSlash); + const baseUrl = window.location; + const resolvedPath = new URL(relative, baseUrl); + listingHrefs.push(resolvedPath.pathname); + break; + } + } + } + + // Look up the tree for a nearby linting and use that if we find one + const nearestListing = findNearestParentListing( + offsetAbsoluteUrl(window.location.pathname), + listingHrefs + ); + if (nearestListing) { + activateCategories(nearestListing); + } else { + // See if the referrer is a listing page for this item + const referredRelativePath = offsetAbsoluteUrl(document.referrer); + const referrerListing = listingHrefs.find((listingHref) => { + const isListingReferrer = + listingHref === referredRelativePath || + listingHref === referredRelativePath + "index.html"; + return isListingReferrer; + }); + + if (referrerListing) { + // Try to use the referrer if possible + activateCategories(referrerListing); + } else if (listingHrefs.length > 0) { + // Otherwise, just fall back to the first listing + activateCategories(listingHrefs[0]); + } + } + }); + } + } + if (hasTitleCategories()) { + findAndActivateCategories(); + } + + const findNearestParentListing = (href, listingHrefs) => { + if (!href || !listingHrefs) { + return undefined; + } + // Look up the tree for a nearby linting and use that if we find one + const relativeParts = href.substring(1).split("/"); + while (relativeParts.length > 0) { + const path = relativeParts.join("/"); + for (const listingHref of listingHrefs) { + if (listingHref.startsWith(path)) { + return listingHref; + } + } + relativeParts.pop(); + } + + return undefined; + }; + + const manageSidebarVisiblity = (el, placeholderDescriptor) => { + let isVisible = true; + let elRect; + + return (hiddenRegions) => { + if (el === null) { + return; + } + + // Find the last element of the TOC + const lastChildEl = el.lastElementChild; + + if (lastChildEl) { + // Converts the sidebar to a menu + const convertToMenu = () => { + for (const child of el.children) { + child.style.opacity = 0; + child.style.overflow = "hidden"; + child.style.pointerEvents = "none"; + } + + nexttick(() => { + const toggleContainer = window.document.createElement("div"); + toggleContainer.style.width = "100%"; + toggleContainer.classList.add("zindex-over-content"); + toggleContainer.classList.add("quarto-sidebar-toggle"); + toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom + toggleContainer.id = placeholderDescriptor.id; + toggleContainer.style.position = "fixed"; + + const toggleIcon = window.document.createElement("i"); + toggleIcon.classList.add("quarto-sidebar-toggle-icon"); + toggleIcon.classList.add("bi"); + toggleIcon.classList.add("bi-caret-down-fill"); + + const toggleTitle = window.document.createElement("div"); + const titleEl = window.document.body.querySelector( + placeholderDescriptor.titleSelector + ); + if (titleEl) { + toggleTitle.append( + titleEl.textContent || titleEl.innerText, + toggleIcon + ); + } + toggleTitle.classList.add("zindex-over-content"); + toggleTitle.classList.add("quarto-sidebar-toggle-title"); + toggleContainer.append(toggleTitle); + + const toggleContents = window.document.createElement("div"); + toggleContents.classList = el.classList; + toggleContents.classList.add("zindex-over-content"); + toggleContents.classList.add("quarto-sidebar-toggle-contents"); + for (const child of el.children) { + if (child.id === "toc-title") { + continue; + } + + const clone = child.cloneNode(true); + clone.style.opacity = 1; + clone.style.pointerEvents = null; + clone.style.display = null; + toggleContents.append(clone); + } + toggleContents.style.height = "0px"; + const positionToggle = () => { + // position the element (top left of parent, same width as parent) + if (!elRect) { + elRect = el.getBoundingClientRect(); + } + toggleContainer.style.left = `${elRect.left}px`; + toggleContainer.style.top = `${elRect.top}px`; + toggleContainer.style.width = `${elRect.width}px`; + }; + positionToggle(); + + toggleContainer.append(toggleContents); + el.parentElement.prepend(toggleContainer); + + // Process clicks + let tocShowing = false; + // Allow the caller to control whether this is dismissed + // when it is clicked (e.g. sidebar navigation supports + // opening and closing the nav tree, so don't dismiss on click) + const clickEl = placeholderDescriptor.dismissOnClick + ? toggleContainer + : toggleTitle; + + const closeToggle = () => { + if (tocShowing) { + toggleContainer.classList.remove("expanded"); + toggleContents.style.height = "0px"; + tocShowing = false; + } + }; + + // Get rid of any expanded toggle if the user scrolls + window.document.addEventListener( + "scroll", + throttle(() => { + closeToggle(); + }, 50) + ); + + // Handle positioning of the toggle + window.addEventListener( + "resize", + throttle(() => { + elRect = undefined; + positionToggle(); + }, 50) + ); + + window.addEventListener("quarto-hrChanged", () => { + elRect = undefined; + }); + + // Process the click + clickEl.onclick = () => { + if (!tocShowing) { + toggleContainer.classList.add("expanded"); + toggleContents.style.height = null; + tocShowing = true; + } else { + closeToggle(); + } + }; + }); + }; + + // Converts a sidebar from a menu back to a sidebar + const convertToSidebar = () => { + for (const child of el.children) { + child.style.opacity = 1; + child.style.overflow = null; + child.style.pointerEvents = null; + } + + const placeholderEl = window.document.getElementById( + placeholderDescriptor.id + ); + if (placeholderEl) { + placeholderEl.remove(); + } + + el.classList.remove("rollup"); + }; + + if (isReaderMode()) { + convertToMenu(); + isVisible = false; + } else { + // Find the top and bottom o the element that is being managed + const elTop = el.offsetTop; + const elBottom = + elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight; + + if (!isVisible) { + // If the element is current not visible reveal if there are + // no conflicts with overlay regions + if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToSidebar(); + isVisible = true; + } + } else { + // If the element is visible, hide it if it conflicts with overlay regions + // and insert a placeholder toggle (or if we're in reader mode) + if (inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToMenu(); + isVisible = false; + } + } + } + } + }; + }; + + const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]'); + for (const tabEl of tabEls) { + const id = tabEl.getAttribute("data-bs-target"); + if (id) { + const columnEl = document.querySelector( + `${id} .column-margin, .tabset-margin-content` + ); + if (columnEl) + tabEl.addEventListener("shown.bs.tab", function (event) { + const el = event.srcElement; + if (el) { + const visibleCls = `${el.id}-margin-content`; + // walk up until we find a parent tabset + let panelTabsetEl = el.parentElement; + while (panelTabsetEl) { + if (panelTabsetEl.classList.contains("panel-tabset")) { + break; + } + panelTabsetEl = panelTabsetEl.parentElement; + } + + if (panelTabsetEl) { + const prevSib = panelTabsetEl.previousElementSibling; + if ( + prevSib && + prevSib.classList.contains("tabset-margin-container") + ) { + const childNodes = prevSib.querySelectorAll( + ".tabset-margin-content" + ); + for (const childEl of childNodes) { + if (childEl.classList.contains(visibleCls)) { + childEl.classList.remove("collapse"); + } else { + childEl.classList.add("collapse"); + } + } + } + } + } + + layoutMarginEls(); + }); + } + } + + // Manage the visibility of the toc and the sidebar + const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, { + id: "quarto-toc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, { + id: "quarto-sidebarnav-toggle", + titleSelector: ".title", + dismissOnClick: false, + }); + let tocLeftScrollVisibility; + if (leftTocEl) { + tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, { + id: "quarto-lefttoc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + } + + // Find the first element that uses formatting in special columns + const conflictingEls = window.document.body.querySelectorAll( + '[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]' + ); + + // Filter all the possibly conflicting elements into ones + // the do conflict on the left or ride side + const arrConflictingEls = Array.from(conflictingEls); + const leftSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return false; + } + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + className.startsWith("column-") && + !className.endsWith("right") && + !className.endsWith("container") && + className !== "column-margin" + ); + }); + }); + const rightSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return true; + } + + const hasMarginCaption = Array.from(el.classList).find((className) => { + return className == "margin-caption"; + }); + if (hasMarginCaption) { + return true; + } + + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + !className.endsWith("container") && + className.startsWith("column-") && + !className.endsWith("left") + ); + }); + }); + + const kOverlapPaddingSize = 10; + function toRegions(els) { + return els.map((el) => { + const boundRect = el.getBoundingClientRect(); + const top = + boundRect.top + + document.documentElement.scrollTop - + kOverlapPaddingSize; + return { + top, + bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize, + }; + }); + } + + let hasObserved = false; + const visibleItemObserver = (els) => { + let visibleElements = [...els]; + const intersectionObserver = new IntersectionObserver( + (entries, _observer) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + if (visibleElements.indexOf(entry.target) === -1) { + visibleElements.push(entry.target); + } + } else { + visibleElements = visibleElements.filter((visibleEntry) => { + return visibleEntry !== entry; + }); + } + }); + + if (!hasObserved) { + hideOverlappedSidebars(); + } + hasObserved = true; + }, + {} + ); + els.forEach((el) => { + intersectionObserver.observe(el); + }); + + return { + getVisibleEntries: () => { + return visibleElements; + }, + }; + }; + + const rightElementObserver = visibleItemObserver(rightSideConflictEls); + const leftElementObserver = visibleItemObserver(leftSideConflictEls); + + const hideOverlappedSidebars = () => { + marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries())); + sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries())); + if (tocLeftScrollVisibility) { + tocLeftScrollVisibility( + toRegions(leftElementObserver.getVisibleEntries()) + ); + } + }; + + window.quartoToggleReader = () => { + // Applies a slow class (or removes it) + // to update the transition speed + const slowTransition = (slow) => { + const manageTransition = (id, slow) => { + const el = document.getElementById(id); + if (el) { + if (slow) { + el.classList.add("slow"); + } else { + el.classList.remove("slow"); + } + } + }; + + manageTransition("TOC", slow); + manageTransition("quarto-sidebar", slow); + }; + const readerMode = !isReaderMode(); + setReaderModeValue(readerMode); + + // If we're entering reader mode, slow the transition + if (readerMode) { + slowTransition(readerMode); + } + highlightReaderToggle(readerMode); + hideOverlappedSidebars(); + + // If we're exiting reader mode, restore the non-slow transition + if (!readerMode) { + slowTransition(!readerMode); + } + }; + + const highlightReaderToggle = (readerMode) => { + const els = document.querySelectorAll(".quarto-reader-toggle"); + if (els) { + els.forEach((el) => { + if (readerMode) { + el.classList.add("reader"); + } else { + el.classList.remove("reader"); + } + }); + } + }; + + const setReaderModeValue = (val) => { + if (window.location.protocol !== "file:") { + window.localStorage.setItem("quarto-reader-mode", val); + } else { + localReaderMode = val; + } + }; + + const isReaderMode = () => { + if (window.location.protocol !== "file:") { + return window.localStorage.getItem("quarto-reader-mode") === "true"; + } else { + return localReaderMode; + } + }; + let localReaderMode = null; + + const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded"); + const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1; + + // Walk the TOC and collapse/expand nodes + // Nodes are expanded if: + // - they are top level + // - they have children that are 'active' links + // - they are directly below an link that is 'active' + const walk = (el, depth) => { + // Tick depth when we enter a UL + if (el.tagName === "UL") { + depth = depth + 1; + } + + // It this is active link + let isActiveNode = false; + if (el.tagName === "A" && el.classList.contains("active")) { + isActiveNode = true; + } + + // See if there is an active child to this element + let hasActiveChild = false; + for (child of el.children) { + hasActiveChild = walk(child, depth) || hasActiveChild; + } + + // Process the collapse state if this is an UL + if (el.tagName === "UL") { + if (tocOpenDepth === -1 && depth > 1) { + // toc-expand: false + el.classList.add("collapse"); + } else if ( + depth <= tocOpenDepth || + hasActiveChild || + prevSiblingIsActiveLink(el) + ) { + el.classList.remove("collapse"); + } else { + el.classList.add("collapse"); + } + + // untick depth when we leave a UL + depth = depth - 1; + } + return hasActiveChild || isActiveNode; + }; + + // walk the TOC and expand / collapse any items that should be shown + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + + // Throttle the scroll event and walk peridiocally + window.document.addEventListener( + "scroll", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 5) + ); + window.addEventListener( + "resize", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 10) + ); + hideOverlappedSidebars(); + highlightReaderToggle(isReaderMode()); +}); + +// grouped tabsets +window.addEventListener("pageshow", (_event) => { + function getTabSettings() { + const data = localStorage.getItem("quarto-persistent-tabsets-data"); + if (!data) { + localStorage.setItem("quarto-persistent-tabsets-data", "{}"); + return {}; + } + if (data) { + return JSON.parse(data); + } + } + + function setTabSettings(data) { + localStorage.setItem( + "quarto-persistent-tabsets-data", + JSON.stringify(data) + ); + } + + function setTabState(groupName, groupValue) { + const data = getTabSettings(); + data[groupName] = groupValue; + setTabSettings(data); + } + + function toggleTab(tab, active) { + const tabPanelId = tab.getAttribute("aria-controls"); + const tabPanel = document.getElementById(tabPanelId); + if (active) { + tab.classList.add("active"); + tabPanel.classList.add("active"); + } else { + tab.classList.remove("active"); + tabPanel.classList.remove("active"); + } + } + + function toggleAll(selectedGroup, selectorsToSync) { + for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) { + const active = selectedGroup === thisGroup; + for (const tab of tabs) { + toggleTab(tab, active); + } + } + } + + function findSelectorsToSyncByLanguage() { + const result = {}; + const tabs = Array.from( + document.querySelectorAll(`div[data-group] a[id^='tabset-']`) + ); + for (const item of tabs) { + const div = item.parentElement.parentElement.parentElement; + const group = div.getAttribute("data-group"); + if (!result[group]) { + result[group] = {}; + } + const selectorsToSync = result[group]; + const value = item.innerHTML; + if (!selectorsToSync[value]) { + selectorsToSync[value] = []; + } + selectorsToSync[value].push(item); + } + return result; + } + + function setupSelectorSync() { + const selectorsToSync = findSelectorsToSyncByLanguage(); + Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => { + Object.entries(tabSetsByValue).forEach(([value, items]) => { + items.forEach((item) => { + item.addEventListener("click", (_event) => { + setTabState(group, value); + toggleAll(value, selectorsToSync[group]); + }); + }); + }); + }); + return selectorsToSync; + } + + const selectorsToSync = setupSelectorSync(); + for (const [group, selectedName] of Object.entries(getTabSettings())) { + const selectors = selectorsToSync[group]; + // it's possible that stale state gives us empty selections, so we explicitly check here. + if (selectors) { + toggleAll(selectedName, selectors); + } + } +}); + +function throttle(func, wait) { + let waiting = false; + return function () { + if (!waiting) { + func.apply(this, arguments); + waiting = true; + setTimeout(function () { + waiting = false; + }, wait); + } + }; +} + +function nexttick(func) { + return setTimeout(func, 0); +} diff --git a/_proc/docs/site_libs/quarto-html/tippy.css b/_proc/docs/site_libs/quarto-html/tippy.css new file mode 100644 index 0000000..e6ae635 --- /dev/null +++ b/_proc/docs/site_libs/quarto-html/tippy.css @@ -0,0 +1 @@ +.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} \ No newline at end of file diff --git a/_proc/docs/site_libs/quarto-html/tippy.umd.min.js b/_proc/docs/site_libs/quarto-html/tippy.umd.min.js new file mode 100644 index 0000000..ca292be --- /dev/null +++ b/_proc/docs/site_libs/quarto-html/tippy.umd.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); + diff --git a/_proc/docs/site_libs/quarto-nav/headroom.min.js b/_proc/docs/site_libs/quarto-nav/headroom.min.js new file mode 100644 index 0000000..b08f1df --- /dev/null +++ b/_proc/docs/site_libs/quarto-nav/headroom.min.js @@ -0,0 +1,7 @@ +/*! + * headroom.js v0.12.0 - Give your page some headroom. Hide your header until you need it + * Copyright (c) 2020 Nick Williams - http://wicky.nillia.ms/headroom.js + * License: MIT + */ + +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).Headroom=n()}(this,function(){"use strict";function t(){return"undefined"!=typeof window}function d(t){return function(t){return t&&t.document&&function(t){return 9===t.nodeType}(t.document)}(t)?function(t){var n=t.document,o=n.body,s=n.documentElement;return{scrollHeight:function(){return Math.max(o.scrollHeight,s.scrollHeight,o.offsetHeight,s.offsetHeight,o.clientHeight,s.clientHeight)},height:function(){return t.innerHeight||s.clientHeight||o.clientHeight},scrollY:function(){return void 0!==t.pageYOffset?t.pageYOffset:(s||o.parentNode||o).scrollTop}}}(t):function(t){return{scrollHeight:function(){return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight)},height:function(){return Math.max(t.offsetHeight,t.clientHeight)},scrollY:function(){return t.scrollTop}}}(t)}function n(t,s,e){var n,o=function(){var n=!1;try{var t={get passive(){n=!0}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){n=!1}return n}(),i=!1,r=d(t),l=r.scrollY(),a={};function c(){var t=Math.round(r.scrollY()),n=r.height(),o=r.scrollHeight();a.scrollY=t,a.lastScrollY=l,a.direction=ls.tolerance[a.direction],e(a),l=t,i=!1}function h(){i||(i=!0,n=requestAnimationFrame(c))}var u=!!o&&{passive:!0,capture:!1};return t.addEventListener("scroll",h,u),c(),{destroy:function(){cancelAnimationFrame(n),t.removeEventListener("scroll",h,u)}}}function o(t){return t===Object(t)?t:{down:t,up:t}}function s(t,n){n=n||{},Object.assign(this,s.options,n),this.classes=Object.assign({},s.options.classes,n.classes),this.elem=t,this.tolerance=o(this.tolerance),this.offset=o(this.offset),this.initialised=!1,this.frozen=!1}return s.prototype={constructor:s,init:function(){return s.cutsTheMustard&&!this.initialised&&(this.addClass("initial"),this.initialised=!0,setTimeout(function(t){t.scrollTracker=n(t.scroller,{offset:t.offset,tolerance:t.tolerance},t.update.bind(t))},100,this)),this},destroy:function(){this.initialised=!1,Object.keys(this.classes).forEach(this.removeClass,this),this.scrollTracker.destroy()},unpin:function(){!this.hasClass("pinned")&&this.hasClass("unpinned")||(this.addClass("unpinned"),this.removeClass("pinned"),this.onUnpin&&this.onUnpin.call(this))},pin:function(){this.hasClass("unpinned")&&(this.addClass("pinned"),this.removeClass("unpinned"),this.onPin&&this.onPin.call(this))},freeze:function(){this.frozen=!0,this.addClass("frozen")},unfreeze:function(){this.frozen=!1,this.removeClass("frozen")},top:function(){this.hasClass("top")||(this.addClass("top"),this.removeClass("notTop"),this.onTop&&this.onTop.call(this))},notTop:function(){this.hasClass("notTop")||(this.addClass("notTop"),this.removeClass("top"),this.onNotTop&&this.onNotTop.call(this))},bottom:function(){this.hasClass("bottom")||(this.addClass("bottom"),this.removeClass("notBottom"),this.onBottom&&this.onBottom.call(this))},notBottom:function(){this.hasClass("notBottom")||(this.addClass("notBottom"),this.removeClass("bottom"),this.onNotBottom&&this.onNotBottom.call(this))},shouldUnpin:function(t){return"down"===t.direction&&!t.top&&t.toleranceExceeded},shouldPin:function(t){return"up"===t.direction&&t.toleranceExceeded||t.top},addClass:function(t){this.elem.classList.add.apply(this.elem.classList,this.classes[t].split(" "))},removeClass:function(t){this.elem.classList.remove.apply(this.elem.classList,this.classes[t].split(" "))},hasClass:function(t){return this.classes[t].split(" ").every(function(t){return this.classList.contains(t)},this.elem)},update:function(t){t.isOutOfBounds||!0!==this.frozen&&(t.top?this.top():this.notTop(),t.bottom?this.bottom():this.notBottom(),this.shouldUnpin(t)?this.unpin():this.shouldPin(t)&&this.pin())}},s.options={tolerance:{up:0,down:0},offset:0,scroller:t()?window:null,classes:{frozen:"headroom--frozen",pinned:"headroom--pinned",unpinned:"headroom--unpinned",top:"headroom--top",notTop:"headroom--not-top",bottom:"headroom--bottom",notBottom:"headroom--not-bottom",initial:"headroom"}},s.cutsTheMustard=!!(t()&&function(){}.bind&&"classList"in document.documentElement&&Object.assign&&Object.keys&&requestAnimationFrame),s}); diff --git a/_proc/docs/site_libs/quarto-nav/quarto-nav.js b/_proc/docs/site_libs/quarto-nav/quarto-nav.js new file mode 100644 index 0000000..38cc430 --- /dev/null +++ b/_proc/docs/site_libs/quarto-nav/quarto-nav.js @@ -0,0 +1,325 @@ +const headroomChanged = new CustomEvent("quarto-hrChanged", { + detail: {}, + bubbles: true, + cancelable: false, + composed: false, +}); + +const announceDismiss = () => { + const annEl = window.document.getElementById("quarto-announcement"); + if (annEl) { + annEl.remove(); + + const annId = annEl.getAttribute("data-announcement-id"); + window.localStorage.setItem(`quarto-announce-${annId}`, "true"); + } +}; + +const announceRegister = () => { + const annEl = window.document.getElementById("quarto-announcement"); + if (annEl) { + const annId = annEl.getAttribute("data-announcement-id"); + const isDismissed = + window.localStorage.getItem(`quarto-announce-${annId}`) || false; + if (isDismissed) { + announceDismiss(); + return; + } else { + annEl.classList.remove("hidden"); + } + + const actionEl = annEl.querySelector(".quarto-announcement-action"); + if (actionEl) { + actionEl.addEventListener("click", function (e) { + e.preventDefault(); + // Hide the bar immediately + announceDismiss(); + }); + } + } +}; + +window.document.addEventListener("DOMContentLoaded", function () { + let init = false; + + announceRegister(); + + // Manage the back to top button, if one is present. + let lastScrollTop = window.pageYOffset || document.documentElement.scrollTop; + const scrollDownBuffer = 5; + const scrollUpBuffer = 35; + const btn = document.getElementById("quarto-back-to-top"); + const hideBackToTop = () => { + btn.style.display = "none"; + }; + const showBackToTop = () => { + btn.style.display = "inline-block"; + }; + if (btn) { + window.document.addEventListener( + "scroll", + function () { + const currentScrollTop = + window.pageYOffset || document.documentElement.scrollTop; + + // Shows and hides the button 'intelligently' as the user scrolls + if (currentScrollTop - scrollDownBuffer > lastScrollTop) { + hideBackToTop(); + lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop; + } else if (currentScrollTop < lastScrollTop - scrollUpBuffer) { + showBackToTop(); + lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop; + } + + // Show the button at the bottom, hides it at the top + if (currentScrollTop <= 0) { + hideBackToTop(); + } else if ( + window.innerHeight + currentScrollTop >= + document.body.offsetHeight + ) { + showBackToTop(); + } + }, + false + ); + } + + function throttle(func, wait) { + var timeout; + return function () { + const context = this; + const args = arguments; + const later = function () { + clearTimeout(timeout); + timeout = null; + func.apply(context, args); + }; + + if (!timeout) { + timeout = setTimeout(later, wait); + } + }; + } + + function headerOffset() { + // Set an offset if there is are fixed top navbar + const headerEl = window.document.querySelector("header.fixed-top"); + if (headerEl) { + return headerEl.clientHeight; + } else { + return 0; + } + } + + function footerOffset() { + const footerEl = window.document.querySelector("footer.footer"); + if (footerEl) { + return footerEl.clientHeight; + } else { + return 0; + } + } + + function dashboardOffset() { + const dashboardNavEl = window.document.getElementById( + "quarto-dashboard-header" + ); + if (dashboardNavEl !== null) { + return dashboardNavEl.clientHeight; + } else { + return 0; + } + } + + function updateDocumentOffsetWithoutAnimation() { + updateDocumentOffset(false); + } + + function updateDocumentOffset(animated) { + // set body offset + const topOffset = headerOffset(); + const bodyOffset = topOffset + footerOffset() + dashboardOffset(); + const bodyEl = window.document.body; + bodyEl.setAttribute("data-bs-offset", topOffset); + bodyEl.style.paddingTop = topOffset + "px"; + + // deal with sidebar offsets + const sidebars = window.document.querySelectorAll( + ".sidebar, .headroom-target" + ); + sidebars.forEach((sidebar) => { + if (!animated) { + sidebar.classList.add("notransition"); + // Remove the no transition class after the animation has time to complete + setTimeout(function () { + sidebar.classList.remove("notransition"); + }, 201); + } + + if (window.Headroom && sidebar.classList.contains("sidebar-unpinned")) { + sidebar.style.top = "0"; + sidebar.style.maxHeight = "100vh"; + } else { + sidebar.style.top = topOffset + "px"; + sidebar.style.maxHeight = "calc(100vh - " + topOffset + "px)"; + } + }); + + // allow space for footer + const mainContainer = window.document.querySelector(".quarto-container"); + if (mainContainer) { + mainContainer.style.minHeight = "calc(100vh - " + bodyOffset + "px)"; + } + + // link offset + let linkStyle = window.document.querySelector("#quarto-target-style"); + if (!linkStyle) { + linkStyle = window.document.createElement("style"); + linkStyle.setAttribute("id", "quarto-target-style"); + window.document.head.appendChild(linkStyle); + } + while (linkStyle.firstChild) { + linkStyle.removeChild(linkStyle.firstChild); + } + if (topOffset > 0) { + linkStyle.appendChild( + window.document.createTextNode(` + section:target::before { + content: ""; + display: block; + height: ${topOffset}px; + margin: -${topOffset}px 0 0; + }`) + ); + } + if (init) { + window.dispatchEvent(headroomChanged); + } + init = true; + } + + // initialize headroom + var header = window.document.querySelector("#quarto-header"); + if (header && window.Headroom) { + const headroom = new window.Headroom(header, { + tolerance: 5, + onPin: function () { + const sidebars = window.document.querySelectorAll( + ".sidebar, .headroom-target" + ); + sidebars.forEach((sidebar) => { + sidebar.classList.remove("sidebar-unpinned"); + }); + updateDocumentOffset(); + }, + onUnpin: function () { + const sidebars = window.document.querySelectorAll( + ".sidebar, .headroom-target" + ); + sidebars.forEach((sidebar) => { + sidebar.classList.add("sidebar-unpinned"); + }); + updateDocumentOffset(); + }, + }); + headroom.init(); + + let frozen = false; + window.quartoToggleHeadroom = function () { + if (frozen) { + headroom.unfreeze(); + frozen = false; + } else { + headroom.freeze(); + frozen = true; + } + }; + } + + window.addEventListener( + "hashchange", + function (e) { + if ( + getComputedStyle(document.documentElement).scrollBehavior !== "smooth" + ) { + window.scrollTo(0, window.pageYOffset - headerOffset()); + } + }, + false + ); + + // Observe size changed for the header + const headerEl = window.document.querySelector("header.fixed-top"); + if (headerEl && window.ResizeObserver) { + const observer = new window.ResizeObserver(() => { + setTimeout(updateDocumentOffsetWithoutAnimation, 0); + }); + observer.observe(headerEl, { + attributes: true, + childList: true, + characterData: true, + }); + } else { + window.addEventListener( + "resize", + throttle(updateDocumentOffsetWithoutAnimation, 50) + ); + } + setTimeout(updateDocumentOffsetWithoutAnimation, 250); + + // fixup index.html links if we aren't on the filesystem + if (window.location.protocol !== "file:") { + const links = window.document.querySelectorAll("a"); + for (let i = 0; i < links.length; i++) { + if (links[i].href) { + links[i].dataset.originalHref = links[i].href; + links[i].href = links[i].href.replace(/\/index\.html/, "/"); + } + } + + // Fixup any sharing links that require urls + // Append url to any sharing urls + const sharingLinks = window.document.querySelectorAll( + "a.sidebar-tools-main-item, a.quarto-navigation-tool, a.quarto-navbar-tools, a.quarto-navbar-tools-item" + ); + for (let i = 0; i < sharingLinks.length; i++) { + const sharingLink = sharingLinks[i]; + const href = sharingLink.getAttribute("href"); + if (href) { + sharingLink.setAttribute( + "href", + href.replace("|url|", window.location.href) + ); + } + } + + // Scroll the active navigation item into view, if necessary + const navSidebar = window.document.querySelector("nav#quarto-sidebar"); + if (navSidebar) { + // Find the active item + const activeItem = navSidebar.querySelector("li.sidebar-item a.active"); + if (activeItem) { + // Wait for the scroll height and height to resolve by observing size changes on the + // nav element that is scrollable + const resizeObserver = new ResizeObserver((_entries) => { + // The bottom of the element + const elBottom = activeItem.offsetTop; + const viewBottom = navSidebar.scrollTop + navSidebar.clientHeight; + + // The element height and scroll height are the same, then we are still loading + if (viewBottom !== navSidebar.scrollHeight) { + // Determine if the item isn't visible and scroll to it + if (elBottom >= viewBottom) { + navSidebar.scrollTop = elBottom; + } + + // stop observing now since we've completed the scroll + resizeObserver.unobserve(navSidebar); + } + }); + resizeObserver.observe(navSidebar); + } + } + } +}); diff --git a/_proc/docs/site_libs/quarto-search/autocomplete.umd.js b/_proc/docs/site_libs/quarto-search/autocomplete.umd.js new file mode 100644 index 0000000..ae0063a --- /dev/null +++ b/_proc/docs/site_libs/quarto-search/autocomplete.umd.js @@ -0,0 +1,3 @@ +/*! @algolia/autocomplete-js 1.11.1 | MIT License | © Algolia, Inc. and contributors | https://github.com/algolia/autocomplete */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["@algolia/autocomplete-js"]={})}(this,(function(e){"use strict";function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function n(e){for(var n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,u,a=[],l=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(a.push(r.value),a.length!==t);l=!0);}catch(e){c=!0,o=e}finally{try{if(!l&&null!=n.return&&(u=n.return(),Object(u)!==u))return}finally{if(c)throw o}}return a}}(e,t)||c(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||c(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e,t){if(e){if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function x(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function N(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r=3||2===n&&r>=4||1===n&&r>=10);function i(t,n,r){if(o&&void 0!==r){var i=r[0].__autocomplete_algoliaCredentials,u={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(D(n),[{headers:u}]))}else e.apply(void 0,[t].concat(D(n)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("clickedObjectIDsAfterSearch",B(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("clickedObjectIDs",B(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("convertedObjectIDsAfterSearch",B(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("convertedObjectIDs",B(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&t.reduce((function(e,t){var n=t.items,r=k(t,A);return[].concat(D(e),D(q(N(N({},r),{},{objectIDs:(null==n?void 0:n.map((function(e){return e.objectID})))||r.objectIDs})).map((function(e){return{items:n,payload:e}}))))}),[]).forEach((function(e){var t=e.items;return i("viewedObjectIDs",[e.payload],t)}))},viewedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function F(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function L(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function U(e){return U="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},U(e)}function M(e){return function(e){if(Array.isArray(e))return H(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return H(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return H(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function H(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&z({onItemsChange:r,items:n,insights:a,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;function l(e){t({algoliaInsightsPlugin:{__algoliaSearchParameters:W({clickAnalytics:!0},e?{userToken:e}:{}),insights:a}})}u("addAlgoliaAgent","insights-plugin"),l(),u("onUserTokenChange",l),u("getUserToken",null,(function(e,t){l(t)})),n((function(e){var t=e.item,n=e.state,r=e.event,i=e.source;L(t)&&o({state:n,event:r,insights:a,item:t,insightsEvents:[W({eventName:"Item Selected"},j({item:t,items:i.getItems().filter(L)}))]})})),r((function(e){var t=e.item,n=e.source,r=e.state,o=e.event;L(t)&&i({state:r,event:o,insights:a,item:t,insightsEvents:[W({eventName:"Item Active"},j({item:t,items:n.getItems().filter(L)}))]})}))},onStateChange:function(e){var t=e.state;c({state:t})},__autocomplete_pluginOptions:e}}function J(e,t){var n=t;return{then:function(t,r){return J(e.then(Y(t,n,e),Y(r,n,e)),n)},catch:function(t){return J(e.catch(Y(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),J(e.finally(Y(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===n.isCanceled}}}function X(e){return J(e,{isCanceled:!1,onCancelList:[]})}function Y(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function Z(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function ee(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function te(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:d(),plugins:o,initialState:he({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(ye(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:O,onResolve:O};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=te(te({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return m(e)})).then((function(e){return e.map((function(e){return he(he({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:he({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function Se(e){return Se="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Se(e)}function je(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Pe(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var He,Ve,We,Ke=null,Qe=(He=-1,Ve=-1,We=void 0,function(e){var t=++He;return Promise.resolve(e).then((function(e){return We&&t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function et(e){return et="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},et(e)}var tt=["props","refresh","store"],nt=["inputElement","formElement","panelElement"],rt=["inputElement"],ot=["inputElement","maxLength"],it=["source"],ut=["item","source"];function at(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function lt(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function ft(e){var t=e.props,n=e.refresh,r=e.store,o=st(e,tt);return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,i=e.panelElement;function u(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,i].some((function(t){return n=t,r=e.target,n===r||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return lt({onTouchStart:u,onMouseDown:u,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},st(e,nt))},getRootProps:function(e){return lt({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-owns":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return ie(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":ie(t.id,"label")},e)},getFormProps:function(e){return e.inputElement,lt({action:"",noValidate:!0,role:"search",onSubmit:function(i){var u;i.preventDefault(),t.onSubmit(lt({event:i,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(u=e.inputElement)||void 0===u||u.blur()},onReset:function(i){var u;i.preventDefault(),t.onReset(lt({event:i,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(u=e.inputElement)||void 0===u||u.focus()}},st(e,rt))},getLabelProps:function(e){return lt({htmlFor:ie(t.id,"input"),id:ie(t.id,"label")},e)},getInputProps:function(e){var i;function u(e){(t.openOnFocus||Boolean(r.getState().query))&&$e(lt({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var a=e||{};a.inputElement;var l=a.maxLength,c=void 0===l?512:l,s=st(a,ot),f=oe(r.getState()),p=function(e){return Boolean(e&&e.match(ue))}((null===(i=t.environment.navigator)||void 0===i?void 0:i.userAgent)||""),m=t.enterKeyHint||(null!=f&&f.itemUrl&&!p?"go":"search");return lt({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?ie(t.id,"item-".concat(r.getState().activeItemId),null==f?void 0:f.source):void 0,"aria-controls":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return ie(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":ie(t.id,"label"),value:r.getState().completion||r.getState().query,id:ie(t.id,"input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:m,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:c,type:"search",onChange:function(e){$e(lt({event:e,props:t,query:e.currentTarget.value.slice(0,c),refresh:n,store:r},o))},onKeyDown:function(e){!function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,i=Ze(e,Ge);if("ArrowUp"===t.key||"ArrowDown"===t.key){var u=function(){var e=oe(o.getState()),t=n.environment.document.getElementById(ie(n.id,"item-".concat(o.getState().activeItemId),null==e?void 0:e.source));t&&(t.scrollIntoViewIfNeeded?t.scrollIntoViewIfNeeded(!1):t.scrollIntoView(!1))},a=function(){var e=oe(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,u=e.itemInputValue,a=e.itemUrl,l=e.source;l.onActive(Xe({event:t,item:n,itemInputValue:u,itemUrl:a,refresh:r,source:l,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?$e(Xe({event:t,props:n,query:o.getState().query,refresh:r,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),a(),setTimeout(u,0)})):(o.dispatch(t.key,{}),a(),u())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=oe(o.getState()),c=l.item,s=l.itemInputValue,f=l.itemUrl,p=l.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(p.onSelect(Xe({event:t,item:c,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),n.navigator.navigateNewTab({itemUrl:f,item:c,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(p.onSelect(Xe({event:t,item:c,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),n.navigator.navigateNewWindow({itemUrl:f,item:c,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return p.onSelect(Xe({event:t,item:c,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),void n.navigator.navigate({itemUrl:f,item:c,state:o.getState()});$e(Xe({event:t,nextState:{isOpen:!1},props:n,query:s,refresh:r,store:o},i)).then((function(){p.onSelect(Xe({event:t,item:c,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i))}))}}}(lt({event:e,props:t,refresh:n,store:r},o))},onFocus:u,onBlur:O,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||u(n)}},s)},getPanelProps:function(e){return lt({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.source,o=st(n,it);return lt({role:"listbox","aria-labelledby":ie(t.id,"label"),id:ie(t.id,"list",r)},o)},getItemProps:function(e){var i=e.item,u=e.source,a=st(e,ut);return lt({id:ie(t.id,"item-".concat(i.__autocomplete_id),u),role:"option","aria-selected":r.getState().activeItemId===i.__autocomplete_id,onMouseMove:function(e){if(i.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",i.__autocomplete_id);var t=oe(r.getState());if(null!==r.getState().activeItemId&&t){var u=t.item,a=t.itemInputValue,l=t.itemUrl,c=t.source;c.onActive(lt({event:e,item:u,itemInputValue:a,itemUrl:l,refresh:n,source:c,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var a=u.getItemInputValue({item:i,state:r.getState()}),l=u.getItemUrl({item:i,state:r.getState()});(l?Promise.resolve():$e(lt({event:e,nextState:{isOpen:!1},props:t,query:a,refresh:n,store:r},o))).then((function(){u.onSelect(lt({event:e,item:i,itemInputValue:a,itemUrl:l,refresh:n,source:u,state:r.getState()},o))}))}},a)}}}function pt(e){return pt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},pt(e)}function mt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function vt(e){for(var t=1;t=5&&((o||!e&&5===r)&&(u.push(r,0,o,n),r=6),e&&(u.push(r,e,0,n),r=6)),o=""},l=0;l"===t?(r=1,o=""):o=t+o[0]:i?t===i?i="":o+=t:'"'===t||"'"===t?i=t:">"===t?(a(),r=1):r&&("="===t?(r=5,n=o,o=""):"/"===t&&(r<5||">"===e[l][c+1])?(a(),3===r&&(u=u[0]),r=u,(u=u[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(a(),r=2):o+=t),3===r&&"!--"===o&&(r=4,u=u[0])}return a(),u}(e)),t),arguments,[])).length>1?t:t[0]}var kt=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-ClearIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","18"),n.setAttribute("height","18"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M5.293 6.707l5.293 5.293-5.293 5.293c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l5.293-5.293 5.293 5.293c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414l-5.293-5.293 5.293-5.293c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-5.293 5.293-5.293-5.293c-0.391-0.391-1.024-0.391-1.414 0s-0.391 1.024 0 1.414z"),n.appendChild(r),n};function xt(e,t){if("string"==typeof t){var n=e.document.querySelector(t);return"The element ".concat(JSON.stringify(t)," is not in the document."),n}return t}function Nt(){for(var e=arguments.length,t=new Array(e),n=0;n2&&(u.children=arguments.length>3?Jt.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(i in e.defaultProps)void 0===u[i]&&(u[i]=e.defaultProps[i]);return sn(e,u,r,o,null)}function sn(e,t,n,r,o){var i={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++Yt:o};return null==o&&null!=Xt.vnode&&Xt.vnode(i),i}function fn(e){return e.children}function pn(e,t){this.props=e,this.context=t}function mn(e,t){if(null==t)return e.__?mn(e.__,e.__.__k.indexOf(e)+1):null;for(var n;tt&&Zt.sort(nn));yn.__r=0}function bn(e,t,n,r,o,i,u,a,l,c){var s,f,p,m,v,d,y,b=r&&r.__k||on,g=b.length;for(n.__k=[],s=0;s0?sn(m.type,m.props,m.key,m.ref?m.ref:null,m.__v):m)){if(m.__=n,m.__b=n.__b+1,null===(p=b[s])||p&&m.key==p.key&&m.type===p.type)b[s]=void 0;else for(f=0;f=0;t--)if((n=e.__k[t])&&(r=On(n)))return r;return null}function _n(e,t,n){"-"===t[0]?e.setProperty(t,null==n?"":n):e[t]=null==n?"":"number"!=typeof n||un.test(t)?n:n+"px"}function Sn(e,t,n,r,o){var i;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||_n(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||_n(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])i=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+i]=n,n?r||e.addEventListener(t,i?Pn:jn,i):e.removeEventListener(t,i?Pn:jn,i);else if("dangerouslySetInnerHTML"!==t){if(o)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&"-"!==t[4]?e.removeAttribute(t):e.setAttribute(t,n))}}function jn(e){return this.l[e.type+!1](Xt.event?Xt.event(e):e)}function Pn(e){return this.l[e.type+!0](Xt.event?Xt.event(e):e)}function wn(e,t,n,r,o,i,u,a,l){var c,s,f,p,m,v,d,y,b,g,h,O,_,S,j,P=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(l=n.__h,a=t.__e=n.__e,t.__h=null,i=[a]),(c=Xt.__b)&&c(t);try{e:if("function"==typeof P){if(y=t.props,b=(c=P.contextType)&&r[c.__c],g=c?b?b.props.value:c.__:r,n.__c?d=(s=t.__c=n.__c).__=s.__E:("prototype"in P&&P.prototype.render?t.__c=s=new P(y,g):(t.__c=s=new pn(y,g),s.constructor=P,s.render=Cn),b&&b.sub(s),s.props=y,s.state||(s.state={}),s.context=g,s.__n=r,f=s.__d=!0,s.__h=[],s._sb=[]),null==s.__s&&(s.__s=s.state),null!=P.getDerivedStateFromProps&&(s.__s==s.state&&(s.__s=an({},s.__s)),an(s.__s,P.getDerivedStateFromProps(y,s.__s))),p=s.props,m=s.state,s.__v=t,f)null==P.getDerivedStateFromProps&&null!=s.componentWillMount&&s.componentWillMount(),null!=s.componentDidMount&&s.__h.push(s.componentDidMount);else{if(null==P.getDerivedStateFromProps&&y!==p&&null!=s.componentWillReceiveProps&&s.componentWillReceiveProps(y,g),!s.__e&&null!=s.shouldComponentUpdate&&!1===s.shouldComponentUpdate(y,s.__s,g)||t.__v===n.__v){for(t.__v!==n.__v&&(s.props=y,s.state=s.__s,s.__d=!1),s.__e=!1,t.__e=n.__e,t.__k=n.__k,t.__k.forEach((function(e){e&&(e.__=t)})),h=0;h0&&void 0!==arguments[0]?arguments[0]:[];return{get:function(){return e},add:function(t){var n=e[e.length-1];(null==n?void 0:n.isHighlighted)===t.isHighlighted?e[e.length-1]={value:n.value+t.value,isHighlighted:n.isHighlighted}:e.push(t)}}}(n?[{value:n,isHighlighted:!1}]:[]);return t.forEach((function(e){var t=e.split(xn);r.add({value:t[0],isHighlighted:!0}),""!==t[1]&&r.add({value:t[1],isHighlighted:!1})})),r.get()}function Tn(e){return function(e){if(Array.isArray(e))return qn(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return qn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return qn(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function qn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n",""":'"',"'":"'"},Fn=new RegExp(/\w/i),Ln=/&(amp|quot|lt|gt|#39);/g,Un=RegExp(Ln.source);function Mn(e,t){var n,r,o,i=e[t],u=(null===(n=e[t+1])||void 0===n?void 0:n.isHighlighted)||!0,a=(null===(r=e[t-1])||void 0===r?void 0:r.isHighlighted)||!0;return Fn.test((o=i.value)&&Un.test(o)?o.replace(Ln,(function(e){return Rn[e]})):o)||a!==u?i.isHighlighted:a}function Hn(e){return Hn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Hn(e)}function Vn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Wn(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function ur(e){return function(e){if(Array.isArray(e))return ar(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return ar(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ar(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ar(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0;if(!O.value.core.openOnFocus&&!t.query)return n;var r=Boolean(y.current||O.value.renderer.renderNoResults);return!n&&r||n},__autocomplete_metadata:{userAgents:br,options:e}}))})),j=f(n({collections:[],completion:null,context:{},isOpen:!1,query:"",activeItemId:null,status:"idle"},O.value.core.initialState)),P={getEnvironmentProps:O.value.renderer.getEnvironmentProps,getFormProps:O.value.renderer.getFormProps,getInputProps:O.value.renderer.getInputProps,getItemProps:O.value.renderer.getItemProps,getLabelProps:O.value.renderer.getLabelProps,getListProps:O.value.renderer.getListProps,getPanelProps:O.value.renderer.getPanelProps,getRootProps:O.value.renderer.getRootProps},w={setActiveItemId:S.value.setActiveItemId,setQuery:S.value.setQuery,setCollections:S.value.setCollections,setIsOpen:S.value.setIsOpen,setStatus:S.value.setStatus,setContext:S.value.setContext,refresh:S.value.refresh,navigator:S.value.navigator},I=m((function(){return Ct.bind(O.value.renderer.renderer.createElement)})),A=m((function(){return Gt({autocomplete:S.value,autocompleteScopeApi:w,classNames:O.value.renderer.classNames,environment:O.value.core.environment,isDetached:_.value,placeholder:O.value.core.placeholder,propGetters:P,setIsModalOpen:k,state:j.current,translations:O.value.renderer.translations})}));function E(){Ht(A.value.panel,{style:_.value?{}:yr({panelPlacement:O.value.renderer.panelPlacement,container:A.value.root,form:A.value.form,environment:O.value.core.environment})})}function D(e){j.current=e;var t={autocomplete:S.value,autocompleteScopeApi:w,classNames:O.value.renderer.classNames,components:O.value.renderer.components,container:O.value.renderer.container,html:I.value,dom:A.value,panelContainer:_.value?A.value.detachedContainer:O.value.renderer.panelContainer,propGetters:P,state:j.current,renderer:O.value.renderer.renderer},r=!b(e)&&!y.current&&O.value.renderer.renderNoResults||O.value.renderer.render;!function(e){var t=e.autocomplete,r=e.autocompleteScopeApi,o=e.dom,i=e.propGetters,u=e.state;Vt(o.root,i.getRootProps(n({state:u,props:t.getRootProps({})},r))),Vt(o.input,i.getInputProps(n({state:u,props:t.getInputProps({inputElement:o.input}),inputElement:o.input},r))),Ht(o.label,{hidden:"stalled"===u.status}),Ht(o.loadingIndicator,{hidden:"stalled"!==u.status}),Ht(o.clearButton,{hidden:!u.query}),Ht(o.detachedSearchButtonQuery,{textContent:u.query}),Ht(o.detachedSearchButtonPlaceholder,{hidden:Boolean(u.query)})}(t),function(e,t){var r=t.autocomplete,o=t.autocompleteScopeApi,u=t.classNames,a=t.html,l=t.dom,c=t.panelContainer,s=t.propGetters,f=t.state,p=t.components,m=t.renderer;if(f.isOpen){c.contains(l.panel)||"loading"===f.status||c.appendChild(l.panel),l.panel.classList.toggle("aa-Panel--stalled","stalled"===f.status);var v=f.collections.filter((function(e){var t=e.source,n=e.items;return t.templates.noResults||n.length>0})).map((function(e,t){var l=e.source,c=e.items;return m.createElement("section",{key:t,className:u.source,"data-autocomplete-source-id":l.sourceId},l.templates.header&&m.createElement("div",{className:u.sourceHeader},l.templates.header({components:p,createElement:m.createElement,Fragment:m.Fragment,items:c,source:l,state:f,html:a})),l.templates.noResults&&0===c.length?m.createElement("div",{className:u.sourceNoResults},l.templates.noResults({components:p,createElement:m.createElement,Fragment:m.Fragment,source:l,state:f,html:a})):m.createElement("ul",i({className:u.list},s.getListProps(n({state:f,props:r.getListProps({source:l})},o))),c.map((function(e){var t=r.getItemProps({item:e,source:l});return m.createElement("li",i({key:t.id,className:u.item},s.getItemProps(n({state:f,props:t},o))),l.templates.item({components:p,createElement:m.createElement,Fragment:m.Fragment,item:e,state:f,html:a}))}))),l.templates.footer&&m.createElement("div",{className:u.sourceFooter},l.templates.footer({components:p,createElement:m.createElement,Fragment:m.Fragment,items:c,source:l,state:f,html:a})))})),d=m.createElement(m.Fragment,null,m.createElement("div",{className:u.panelLayout},v),m.createElement("div",{className:"aa-GradientBottom"})),y=v.reduce((function(e,t){return e[t.props["data-autocomplete-source-id"]]=t,e}),{});e(n(n({children:d,state:f,sections:v,elements:y},m),{},{components:p,html:a},o),l.panel)}else c.contains(l.panel)&&c.removeChild(l.panel)}(r,t)}function C(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};l();var t=O.value.renderer,n=t.components,r=u(t,gr);g.current=qt(r,O.value.core,{components:Bt(n,(function(e){return!e.value.hasOwnProperty("__autocomplete_componentName")})),initialState:j.current},e),v(),c(),S.value.refresh().then((function(){D(j.current)}))}function k(e){requestAnimationFrame((function(){var t=O.value.core.environment.document.body.contains(A.value.detachedOverlay);e!==t&&(e?(O.value.core.environment.document.body.appendChild(A.value.detachedOverlay),O.value.core.environment.document.body.classList.add("aa-Detached"),A.value.input.focus()):(O.value.core.environment.document.body.removeChild(A.value.detachedOverlay),O.value.core.environment.document.body.classList.remove("aa-Detached")))}))}return a((function(){var e=S.value.getEnvironmentProps({formElement:A.value.form,panelElement:A.value.panel,inputElement:A.value.input});return Ht(O.value.core.environment,e),function(){Ht(O.value.core.environment,Object.keys(e).reduce((function(e,t){return n(n({},e),{},o({},t,void 0))}),{}))}})),a((function(){var e=_.value?O.value.core.environment.document.body:O.value.renderer.panelContainer,t=_.value?A.value.detachedOverlay:A.value.panel;return _.value&&j.current.isOpen&&k(!0),D(j.current),function(){e.contains(t)&&e.removeChild(t)}})),a((function(){var e=O.value.renderer.container;return e.appendChild(A.value.root),function(){e.removeChild(A.value.root)}})),a((function(){var e=p((function(e){D(e.state)}),0);return h.current=function(t){var n=t.state,r=t.prevState;(_.value&&r.isOpen!==n.isOpen&&k(n.isOpen),_.value||!n.isOpen||r.isOpen||E(),n.query!==r.query)&&O.value.core.environment.document.querySelectorAll(".aa-Panel--scrollable").forEach((function(e){0!==e.scrollTop&&(e.scrollTop=0)}));e({state:n})},function(){h.current=void 0}})),a((function(){var e=p((function(){var e=_.value;_.value=O.value.core.environment.matchMedia(O.value.renderer.detachedMediaQuery).matches,e!==_.value?C({}):requestAnimationFrame(E)}),20);return O.value.core.environment.addEventListener("resize",e),function(){O.value.core.environment.removeEventListener("resize",e)}})),a((function(){if(!_.value)return function(){};function e(e){A.value.detachedContainer.classList.toggle("aa-DetachedContainer--modal",e)}function t(t){e(t.matches)}var n=O.value.core.environment.matchMedia(getComputedStyle(O.value.core.environment.document.documentElement).getPropertyValue("--aa-detached-modal-media-query"));e(n.matches);var r=Boolean(n.addEventListener);return r?n.addEventListener("change",t):n.addListener(t),function(){r?n.removeEventListener("change",t):n.removeListener(t)}})),a((function(){return requestAnimationFrame(E),function(){}})),n(n({},w),{},{update:C,destroy:function(){l()}})},e.getAlgoliaFacets=function(e){var t=hr({transformResponse:function(e){return e.facetHits}}),r=e.queries.map((function(e){return n(n({},e),{},{type:"facet"})}));return t(n(n({},e),{},{queries:r}))},e.getAlgoliaResults=Or,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/_proc/docs/site_libs/quarto-search/fuse.min.js b/_proc/docs/site_libs/quarto-search/fuse.min.js new file mode 100644 index 0000000..adc2835 --- /dev/null +++ b/_proc/docs/site_libs/quarto-search/fuse.min.js @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2022 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(C).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),c=parseFloat(Math.round(o*r)/r);return n.set(i,c),c},clear:function(){n.clear()}}}var $=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?I.getFn:n,o=t.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o;r(this,e),this.norm=E(c,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,g(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();g(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?I.getFn:r,o=n.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o,a=new $({getFn:i,fieldNormWeight:c});return a.setKeys(e.map(_)),a.setSources(t),a.create(),a}function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,u=void 0===s?I.distance:s,h=t.ignoreLocation,l=void 0===h?I.ignoreLocation:h,f=r/e.length;if(l)return f;var d=Math.abs(a-o);return u?f+d/u:d?1:f}function N(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:I.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}var P=32;function W(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?I.location:o,a=i.threshold,s=void 0===a?I.threshold:a,u=i.distance,h=void 0===u?I.distance:u,l=i.includeMatches,f=void 0===l?I.includeMatches:l,d=i.findAllMatches,v=void 0===d?I.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?I.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?I.isCaseSensitive:p,k=i.ignoreLocation,M=void 0===k?I.ignoreLocation:k;if(r(this,e),this.options={location:c,threshold:s,distance:h,includeMatches:f,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:M},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var b=function(e,t){n.chunks.push({pattern:e,alphabet:W(e),startIndex:t})},x=this.pattern.length;if(x>P){for(var w=0,L=x%P,S=x-L;w3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?I.location:i,c=r.distance,a=void 0===c?I.distance:c,s=r.threshold,u=void 0===s?I.threshold:s,h=r.findAllMatches,l=void 0===h?I.findAllMatches:h,f=r.minMatchCharLength,d=void 0===f?I.minMatchCharLength:f,v=r.includeMatches,g=void 0===v?I.includeMatches:v,y=r.ignoreLocation,p=void 0===y?I.ignoreLocation:y;if(t.length>P)throw new Error(w(P));for(var m,k=t.length,M=e.length,b=Math.max(0,Math.min(o,M)),x=u,L=b,S=d>1||g,_=S?Array(M):[];(m=e.indexOf(t,L))>-1;){var O=R(t,{currentLocation:m,expectedLocation:b,distance:a,ignoreLocation:p});if(x=Math.min(O,x),L=m+k,S)for(var j=0;j=z;q-=1){var B=q-1,J=n[e.charAt(B)];if(S&&(_[B]=+!!J),K[q]=(K[q+1]<<1|1)&J,F&&(K[q]|=(A[q+1]|A[q])<<1|1|A[q+1]),K[q]&$&&(C=R(t,{errors:F,currentLocation:B,expectedLocation:b,distance:a,ignoreLocation:p}))<=x){if(x=C,(L=B)<=b)break;z=Math.max(1,2*b-L)}}if(R(t,{errors:F+1,currentLocation:b,expectedLocation:b,distance:a,ignoreLocation:p})>x)break;A=K}var U={isMatch:L>=0,score:Math.max(.001,C)};if(S){var V=N(_,d);V.length?g&&(U.indices=V):U.isMatch=!1}return U}(e,n,i,{location:c+o,distance:a,threshold:s,findAllMatches:u,minMatchCharLength:h,includeMatches:r,ignoreLocation:l}),p=y.isMatch,m=y.score,k=y.indices;p&&(g=!0),v+=m,p&&k&&(d=[].concat(f(d),f(k)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=d),y}}]),e}(),z=function(){function e(t){r(this,e),this.pattern=t}return o(e,[{key:"search",value:function(){}}],[{key:"isMultiMatch",value:function(e){return D(e,this.multiRegex)}},{key:"isSingleMatch",value:function(e){return D(e,this.singleRegex)}}]),e}();function D(e,t){var n=e.match(t);return n?n[1]:null}var K=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"exact"}},{key:"multiRegex",get:function(){return/^="(.*)"$/}},{key:"singleRegex",get:function(){return/^=(.*)$/}}]),n}(z),q=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"$/}},{key:"singleRegex",get:function(){return/^!(.*)$/}}]),n}(z),B=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"prefix-exact"}},{key:"multiRegex",get:function(){return/^\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^\^(.*)$/}}]),n}(z),J=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-prefix-exact"}},{key:"multiRegex",get:function(){return/^!\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^!\^(.*)$/}}]),n}(z),U=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}}],[{key:"type",get:function(){return"suffix-exact"}},{key:"multiRegex",get:function(){return/^"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^(.*)\$$/}}]),n}(z),V=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-suffix-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^!(.*)\$$/}}]),n}(z),G=function(e){a(n,e);var t=l(n);function n(e){var i,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},c=o.location,a=void 0===c?I.location:c,s=o.threshold,u=void 0===s?I.threshold:s,h=o.distance,l=void 0===h?I.distance:h,f=o.includeMatches,d=void 0===f?I.includeMatches:f,v=o.findAllMatches,g=void 0===v?I.findAllMatches:v,y=o.minMatchCharLength,p=void 0===y?I.minMatchCharLength:y,m=o.isCaseSensitive,k=void 0===m?I.isCaseSensitive:m,M=o.ignoreLocation,b=void 0===M?I.ignoreLocation:M;return r(this,n),(i=t.call(this,e))._bitapSearch=new T(e,{location:a,threshold:u,distance:l,includeMatches:d,findAllMatches:g,minMatchCharLength:p,isCaseSensitive:k,ignoreLocation:b}),i}return o(n,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),n}(z),H=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){for(var t,n=0,r=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);var o=!!r.length;return{isMatch:o,score:o?0:1,indices:r}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),n}(z),Q=[K,H,B,J,V,U,q,G],X=Q.length,Y=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/;function Z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(Y).filter((function(e){return e&&!!e.trim()})),r=[],i=0,o=n.length;i1&&void 0!==arguments[1]?arguments[1]:{},i=n.isCaseSensitive,o=void 0===i?I.isCaseSensitive:i,c=n.includeMatches,a=void 0===c?I.includeMatches:c,s=n.minMatchCharLength,u=void 0===s?I.minMatchCharLength:s,h=n.ignoreLocation,l=void 0===h?I.ignoreLocation:h,f=n.findAllMatches,d=void 0===f?I.findAllMatches:f,v=n.location,g=void 0===v?I.location:v,y=n.threshold,p=void 0===y?I.threshold:y,m=n.distance,k=void 0===m?I.distance:m;r(this,e),this.query=null,this.options={isCaseSensitive:o,includeMatches:a,minMatchCharLength:u,findAllMatches:d,ignoreLocation:l,location:g,threshold:p,distance:k},this.pattern=o?t:t.toLowerCase(),this.query=Z(this.pattern,this.options)}return o(e,[{key:"searchIn",value:function(e){var t=this.query;if(!t)return{isMatch:!1,score:1};var n=this.options,r=n.includeMatches;e=n.isCaseSensitive?e:e.toLowerCase();for(var i=0,o=[],c=0,a=0,s=t.length;a-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function ve(e,t){t.score=e.score}function ge(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?I.includeMatches:r,o=n.includeScore,c=void 0===o?I.includeScore:o,a=[];return i&&a.push(de),c&&a.push(ve),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}var ye=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;r(this,e),this.options=t(t({},I),i),this.options.useExtendedSearch,this._keyStore=new S(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof $))throw new Error("Incorrect 'index' type");this._myIndex=t||F(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){k(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,c=i.includeScore,a=i.shouldSort,s=i.sortFn,u=i.ignoreFieldNorm,h=g(e)?g(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return fe(h,{ignoreFieldNorm:u}),a&&h.sort(s),y(r)&&r>-1&&(h=h.slice(0,r)),ge(h,this._docs,{includeMatches:o,includeScore:c})}},{key:"_searchStringList",value:function(e){var t=re(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(k(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,u=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:u}]})}})),r}},{key:"_searchLogical",value:function(e){var t=this,n=function(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).auto,r=void 0===n||n,i=function e(n){var i=Object.keys(n),o=ue(n);if(!o&&i.length>1&&!se(n))return e(le(n));if(he(n)){var c=o?n[ce]:i[0],a=o?n[ae]:n[c];if(!g(a))throw new Error(x(c));var s={keyId:j(c),pattern:a};return r&&(s.searcher=re(a,t)),s}var u={children:[],operator:i[0]};return i.forEach((function(t){var r=n[t];v(r)&&r.forEach((function(t){u.children.push(e(t))}))})),u};return se(e)||(e=le(e)),i(e)}(e,this.options),r=function e(n,r,i){if(!n.children){var o=n.keyId,c=n.searcher,a=t._findMatches({key:t._keyStore.get(o),value:t._myIndex.getValueForItemAtKeyId(r,o),searcher:c});return a&&a.length?[{idx:i,item:r,matches:a}]:[]}for(var s=[],u=0,h=n.children.length;u1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?I.getFn:n,i=t.fieldNormWeight,o=void 0===i?I.fieldNormWeight:i,c=e.keys,a=e.records,s=new $({getFn:r,fieldNormWeight:o});return s.setKeys(c),s.setIndexRecords(a),s},ye.config=I,function(){ne.push.apply(ne,arguments)}(te),ye},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/_proc/docs/site_libs/quarto-search/quarto-search.js b/_proc/docs/site_libs/quarto-search/quarto-search.js new file mode 100644 index 0000000..d788a95 --- /dev/null +++ b/_proc/docs/site_libs/quarto-search/quarto-search.js @@ -0,0 +1,1290 @@ +const kQueryArg = "q"; +const kResultsArg = "show-results"; + +// If items don't provide a URL, then both the navigator and the onSelect +// function aren't called (and therefore, the default implementation is used) +// +// We're using this sentinel URL to signal to those handlers that this +// item is a more item (along with the type) and can be handled appropriately +const kItemTypeMoreHref = "0767FDFD-0422-4E5A-BC8A-3BE11E5BBA05"; + +window.document.addEventListener("DOMContentLoaded", function (_event) { + // Ensure that search is available on this page. If it isn't, + // should return early and not do anything + var searchEl = window.document.getElementById("quarto-search"); + if (!searchEl) return; + + const { autocomplete } = window["@algolia/autocomplete-js"]; + + let quartoSearchOptions = {}; + let language = {}; + const searchOptionEl = window.document.getElementById( + "quarto-search-options" + ); + if (searchOptionEl) { + const jsonStr = searchOptionEl.textContent; + quartoSearchOptions = JSON.parse(jsonStr); + language = quartoSearchOptions.language; + } + + // note the search mode + if (quartoSearchOptions.type === "overlay") { + searchEl.classList.add("type-overlay"); + } else { + searchEl.classList.add("type-textbox"); + } + + // Used to determine highlighting behavior for this page + // A `q` query param is expected when the user follows a search + // to this page + const currentUrl = new URL(window.location); + const query = currentUrl.searchParams.get(kQueryArg); + const showSearchResults = currentUrl.searchParams.get(kResultsArg); + const mainEl = window.document.querySelector("main"); + + // highlight matches on the page + if (query && mainEl) { + // perform any highlighting + highlight(escapeRegExp(query), mainEl); + + // fix up the URL to remove the q query param + const replacementUrl = new URL(window.location); + replacementUrl.searchParams.delete(kQueryArg); + window.history.replaceState({}, "", replacementUrl); + } + + // function to clear highlighting on the page when the search query changes + // (e.g. if the user edits the query or clears it) + let highlighting = true; + const resetHighlighting = (searchTerm) => { + if (mainEl && highlighting && query && searchTerm !== query) { + clearHighlight(query, mainEl); + highlighting = false; + } + }; + + // Clear search highlighting when the user scrolls sufficiently + const resetFn = () => { + resetHighlighting(""); + window.removeEventListener("quarto-hrChanged", resetFn); + window.removeEventListener("quarto-sectionChanged", resetFn); + }; + + // Register this event after the initial scrolling and settling of events + // on the page + window.addEventListener("quarto-hrChanged", resetFn); + window.addEventListener("quarto-sectionChanged", resetFn); + + // Responsively switch to overlay mode if the search is present on the navbar + // Note that switching the sidebar to overlay mode requires more coordinate (not just + // the media query since we generate different HTML for sidebar overlays than we do + // for sidebar input UI) + const detachedMediaQuery = + quartoSearchOptions.type === "overlay" ? "all" : "(max-width: 991px)"; + + // If configured, include the analytics client to send insights + const plugins = configurePlugins(quartoSearchOptions); + + let lastState = null; + const { setIsOpen, setQuery, setCollections } = autocomplete({ + container: searchEl, + detachedMediaQuery: detachedMediaQuery, + defaultActiveItemId: 0, + panelContainer: "#quarto-search-results", + panelPlacement: quartoSearchOptions["panel-placement"], + debug: false, + openOnFocus: true, + plugins, + classNames: { + form: "d-flex", + }, + placeholder: language["search-text-placeholder"], + translations: { + clearButtonTitle: language["search-clear-button-title"], + detachedCancelButtonText: language["search-detached-cancel-button-title"], + submitButtonTitle: language["search-submit-button-title"], + }, + initialState: { + query, + }, + getItemUrl({ item }) { + return item.href; + }, + onStateChange({ state }) { + // If this is a file URL, note that + + // Perhaps reset highlighting + resetHighlighting(state.query); + + // If the panel just opened, ensure the panel is positioned properly + if (state.isOpen) { + if (lastState && !lastState.isOpen) { + setTimeout(() => { + positionPanel(quartoSearchOptions["panel-placement"]); + }, 150); + } + } + + // Perhaps show the copy link + showCopyLink(state.query, quartoSearchOptions); + + lastState = state; + }, + reshape({ sources, state }) { + return sources.map((source) => { + try { + const items = source.getItems(); + + // Validate the items + validateItems(items); + + // group the items by document + const groupedItems = new Map(); + items.forEach((item) => { + const hrefParts = item.href.split("#"); + const baseHref = hrefParts[0]; + const isDocumentItem = hrefParts.length === 1; + + const items = groupedItems.get(baseHref); + if (!items) { + groupedItems.set(baseHref, [item]); + } else { + // If the href for this item matches the document + // exactly, place this item first as it is the item that represents + // the document itself + if (isDocumentItem) { + items.unshift(item); + } else { + items.push(item); + } + groupedItems.set(baseHref, items); + } + }); + + const reshapedItems = []; + let count = 1; + for (const [_key, value] of groupedItems) { + const firstItem = value[0]; + reshapedItems.push({ + ...firstItem, + type: kItemTypeDoc, + }); + + const collapseMatches = quartoSearchOptions["collapse-after"]; + const collapseCount = + typeof collapseMatches === "number" ? collapseMatches : 1; + + if (value.length > 1) { + const target = `search-more-${count}`; + const isExpanded = + state.context.expanded && + state.context.expanded.includes(target); + + const remainingCount = value.length - collapseCount; + + for (let i = 1; i < value.length; i++) { + if (collapseMatches && i === collapseCount) { + reshapedItems.push({ + target, + title: isExpanded + ? language["search-hide-matches-text"] + : remainingCount === 1 + ? `${remainingCount} ${language["search-more-match-text"]}` + : `${remainingCount} ${language["search-more-matches-text"]}`, + type: kItemTypeMore, + href: kItemTypeMoreHref, + }); + } + + if (isExpanded || !collapseMatches || i < collapseCount) { + reshapedItems.push({ + ...value[i], + type: kItemTypeItem, + target, + }); + } + } + } + count += 1; + } + + return { + ...source, + getItems() { + return reshapedItems; + }, + }; + } catch (error) { + // Some form of error occurred + return { + ...source, + getItems() { + return [ + { + title: error.name || "An Error Occurred While Searching", + text: + error.message || + "An unknown error occurred while attempting to perform the requested search.", + type: kItemTypeError, + }, + ]; + }, + }; + } + }); + }, + navigator: { + navigate({ itemUrl }) { + if (itemUrl !== offsetURL(kItemTypeMoreHref)) { + window.location.assign(itemUrl); + } + }, + navigateNewTab({ itemUrl }) { + if (itemUrl !== offsetURL(kItemTypeMoreHref)) { + const windowReference = window.open(itemUrl, "_blank", "noopener"); + if (windowReference) { + windowReference.focus(); + } + } + }, + navigateNewWindow({ itemUrl }) { + if (itemUrl !== offsetURL(kItemTypeMoreHref)) { + window.open(itemUrl, "_blank", "noopener"); + } + }, + }, + getSources({ state, setContext, setActiveItemId, refresh }) { + return [ + { + sourceId: "documents", + getItemUrl({ item }) { + if (item.href) { + return offsetURL(item.href); + } else { + return undefined; + } + }, + onSelect({ + item, + state, + setContext, + setIsOpen, + setActiveItemId, + refresh, + }) { + if (item.type === kItemTypeMore) { + toggleExpanded(item, state, setContext, setActiveItemId, refresh); + + // Toggle more + setIsOpen(true); + } + }, + getItems({ query }) { + if (query === null || query === "") { + return []; + } + + const limit = quartoSearchOptions.limit; + if (quartoSearchOptions.algolia) { + return algoliaSearch(query, limit, quartoSearchOptions.algolia); + } else { + // Fuse search options + const fuseSearchOptions = { + isCaseSensitive: false, + shouldSort: true, + minMatchCharLength: 2, + limit: limit, + }; + + return readSearchData().then(function (fuse) { + return fuseSearch(query, fuse, fuseSearchOptions); + }); + } + }, + templates: { + noResults({ createElement }) { + const hasQuery = lastState.query; + + return createElement( + "div", + { + class: `quarto-search-no-results${ + hasQuery ? "" : " no-query" + }`, + }, + language["search-no-results-text"] + ); + }, + header({ items, createElement }) { + // count the documents + const count = items.filter((item) => { + return item.type === kItemTypeDoc; + }).length; + + if (count > 0) { + return createElement( + "div", + { class: "search-result-header" }, + `${count} ${language["search-matching-documents-text"]}` + ); + } else { + return createElement( + "div", + { class: "search-result-header-no-results" }, + `` + ); + } + }, + footer({ _items, createElement }) { + if ( + quartoSearchOptions.algolia && + quartoSearchOptions.algolia["show-logo"] + ) { + const libDir = quartoSearchOptions.algolia["libDir"]; + const logo = createElement("img", { + src: offsetURL( + `${libDir}/quarto-search/search-by-algolia.svg` + ), + class: "algolia-search-logo", + }); + return createElement( + "a", + { href: "http://www.algolia.com/" }, + logo + ); + } + }, + + item({ item, createElement }) { + return renderItem( + item, + createElement, + state, + setActiveItemId, + setContext, + refresh, + quartoSearchOptions + ); + }, + }, + }, + ]; + }, + }); + + window.quartoOpenSearch = () => { + setIsOpen(false); + setIsOpen(true); + focusSearchInput(); + }; + + document.addEventListener("keyup", (event) => { + const { key } = event; + const kbds = quartoSearchOptions["keyboard-shortcut"]; + const focusedEl = document.activeElement; + + const isFormElFocused = [ + "input", + "select", + "textarea", + "button", + "option", + ].find((tag) => { + return focusedEl.tagName.toLowerCase() === tag; + }); + + if ( + kbds && + kbds.includes(key) && + !isFormElFocused && + !document.activeElement.isContentEditable + ) { + event.preventDefault(); + window.quartoOpenSearch(); + } + }); + + // Remove the labeleledby attribute since it is pointing + // to a non-existent label + if (quartoSearchOptions.type === "overlay") { + const inputEl = window.document.querySelector( + "#quarto-search .aa-Autocomplete" + ); + if (inputEl) { + inputEl.removeAttribute("aria-labelledby"); + } + } + + function throttle(func, wait) { + let waiting = false; + return function () { + if (!waiting) { + func.apply(this, arguments); + waiting = true; + setTimeout(function () { + waiting = false; + }, wait); + } + }; + } + + // If the main document scrolls dismiss the search results + // (otherwise, since they're floating in the document they can scroll with the document) + window.document.body.onscroll = throttle(() => { + // Only do this if we're not detached + // Bug #7117 + // This will happen when the keyboard is shown on ios (resulting in a scroll) + // which then closed the search UI + if (!window.matchMedia(detachedMediaQuery).matches) { + setIsOpen(false); + } + }, 50); + + if (showSearchResults) { + setIsOpen(true); + focusSearchInput(); + } +}); + +function configurePlugins(quartoSearchOptions) { + const autocompletePlugins = []; + const algoliaOptions = quartoSearchOptions.algolia; + if ( + algoliaOptions && + algoliaOptions["analytics-events"] && + algoliaOptions["search-only-api-key"] && + algoliaOptions["application-id"] + ) { + const apiKey = algoliaOptions["search-only-api-key"]; + const appId = algoliaOptions["application-id"]; + + // Aloglia insights may not be loaded because they require cookie consent + // Use deferred loading so events will start being recorded when/if consent + // is granted. + const algoliaInsightsDeferredPlugin = deferredLoadPlugin(() => { + if ( + window.aa && + window["@algolia/autocomplete-plugin-algolia-insights"] + ) { + window.aa("init", { + appId, + apiKey, + useCookie: true, + }); + + const { createAlgoliaInsightsPlugin } = + window["@algolia/autocomplete-plugin-algolia-insights"]; + // Register the insights client + const algoliaInsightsPlugin = createAlgoliaInsightsPlugin({ + insightsClient: window.aa, + onItemsChange({ insights, insightsEvents }) { + const events = insightsEvents.flatMap((event) => { + // This API limits the number of items per event to 20 + const chunkSize = 20; + const itemChunks = []; + const eventItems = event.items; + for (let i = 0; i < eventItems.length; i += chunkSize) { + itemChunks.push(eventItems.slice(i, i + chunkSize)); + } + // Split the items into multiple events that can be sent + const events = itemChunks.map((items) => { + return { + ...event, + items, + }; + }); + return events; + }); + + for (const event of events) { + insights.viewedObjectIDs(event); + } + }, + }); + return algoliaInsightsPlugin; + } + }); + + // Add the plugin + autocompletePlugins.push(algoliaInsightsDeferredPlugin); + return autocompletePlugins; + } +} + +// For plugins that may not load immediately, create a wrapper +// plugin and forward events and plugin data once the plugin +// is initialized. This is useful for cases like cookie consent +// which may prevent the analytics insights event plugin from initializing +// immediately. +function deferredLoadPlugin(createPlugin) { + let plugin = undefined; + let subscribeObj = undefined; + const wrappedPlugin = () => { + if (!plugin && subscribeObj) { + plugin = createPlugin(); + if (plugin && plugin.subscribe) { + plugin.subscribe(subscribeObj); + } + } + return plugin; + }; + + return { + subscribe: (obj) => { + subscribeObj = obj; + }, + onStateChange: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.onStateChange) { + plugin.onStateChange(obj); + } + }, + onSubmit: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.onSubmit) { + plugin.onSubmit(obj); + } + }, + onReset: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.onReset) { + plugin.onReset(obj); + } + }, + getSources: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.getSources) { + return plugin.getSources(obj); + } else { + return Promise.resolve([]); + } + }, + data: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.data) { + plugin.data(obj); + } + }, + }; +} + +function validateItems(items) { + // Validate the first item + if (items.length > 0) { + const item = items[0]; + const missingFields = []; + if (item.href == undefined) { + missingFields.push("href"); + } + if (!item.title == undefined) { + missingFields.push("title"); + } + if (!item.text == undefined) { + missingFields.push("text"); + } + + if (missingFields.length === 1) { + throw { + name: `Error: Search index is missing the ${missingFields[0]} field.`, + message: `The items being returned for this search do not include all the required fields. Please ensure that your index items include the ${missingFields[0]} field or use index-fields in your _quarto.yml file to specify the field names.`, + }; + } else if (missingFields.length > 1) { + const missingFieldList = missingFields + .map((field) => { + return `${field}`; + }) + .join(", "); + + throw { + name: `Error: Search index is missing the following fields: ${missingFieldList}.`, + message: `The items being returned for this search do not include all the required fields. Please ensure that your index items includes the following fields: ${missingFieldList}, or use index-fields in your _quarto.yml file to specify the field names.`, + }; + } + } +} + +let lastQuery = null; +function showCopyLink(query, options) { + const language = options.language; + lastQuery = query; + // Insert share icon + const inputSuffixEl = window.document.body.querySelector( + ".aa-Form .aa-InputWrapperSuffix" + ); + + if (inputSuffixEl) { + let copyButtonEl = window.document.body.querySelector( + ".aa-Form .aa-InputWrapperSuffix .aa-CopyButton" + ); + + if (copyButtonEl === null) { + copyButtonEl = window.document.createElement("button"); + copyButtonEl.setAttribute("class", "aa-CopyButton"); + copyButtonEl.setAttribute("type", "button"); + copyButtonEl.setAttribute("title", language["search-copy-link-title"]); + copyButtonEl.onmousedown = (e) => { + e.preventDefault(); + e.stopPropagation(); + }; + + const linkIcon = "bi-clipboard"; + const checkIcon = "bi-check2"; + + const shareIconEl = window.document.createElement("i"); + shareIconEl.setAttribute("class", `bi ${linkIcon}`); + copyButtonEl.appendChild(shareIconEl); + inputSuffixEl.prepend(copyButtonEl); + + const clipboard = new window.ClipboardJS(".aa-CopyButton", { + text: function (_trigger) { + const copyUrl = new URL(window.location); + copyUrl.searchParams.set(kQueryArg, lastQuery); + copyUrl.searchParams.set(kResultsArg, "1"); + return copyUrl.toString(); + }, + }); + clipboard.on("success", function (e) { + // Focus the input + + // button target + const button = e.trigger; + const icon = button.querySelector("i.bi"); + + // flash "checked" + icon.classList.add(checkIcon); + icon.classList.remove(linkIcon); + setTimeout(function () { + icon.classList.remove(checkIcon); + icon.classList.add(linkIcon); + }, 1000); + }); + } + + // If there is a query, show the link icon + if (copyButtonEl) { + if (lastQuery && options["copy-button"]) { + copyButtonEl.style.display = "flex"; + } else { + copyButtonEl.style.display = "none"; + } + } + } +} + +/* Search Index Handling */ +// create the index +var fuseIndex = undefined; +var shownWarning = false; + +// fuse index options +const kFuseIndexOptions = { + keys: [ + { name: "title", weight: 20 }, + { name: "section", weight: 20 }, + { name: "text", weight: 10 }, + ], + ignoreLocation: true, + threshold: 0.1, +}; + +async function readSearchData() { + // Initialize the search index on demand + if (fuseIndex === undefined) { + if (window.location.protocol === "file:" && !shownWarning) { + window.alert( + "Search requires JavaScript features disabled when running in file://... URLs. In order to use search, please run this document in a web server." + ); + shownWarning = true; + return; + } + const fuse = new window.Fuse([], kFuseIndexOptions); + + // fetch the main search.json + const response = await fetch(offsetURL("search.json")); + if (response.status == 200) { + return response.json().then(function (searchDocs) { + searchDocs.forEach(function (searchDoc) { + fuse.add(searchDoc); + }); + fuseIndex = fuse; + return fuseIndex; + }); + } else { + return Promise.reject( + new Error( + "Unexpected status from search index request: " + response.status + ) + ); + } + } + + return fuseIndex; +} + +function inputElement() { + return window.document.body.querySelector(".aa-Form .aa-Input"); +} + +function focusSearchInput() { + setTimeout(() => { + const inputEl = inputElement(); + if (inputEl) { + inputEl.focus(); + } + }, 50); +} + +/* Panels */ +const kItemTypeDoc = "document"; +const kItemTypeMore = "document-more"; +const kItemTypeItem = "document-item"; +const kItemTypeError = "error"; + +function renderItem( + item, + createElement, + state, + setActiveItemId, + setContext, + refresh, + quartoSearchOptions +) { + switch (item.type) { + case kItemTypeDoc: + return createDocumentCard( + createElement, + "file-richtext", + item.title, + item.section, + item.text, + item.href, + item.crumbs, + quartoSearchOptions + ); + case kItemTypeMore: + return createMoreCard( + createElement, + item, + state, + setActiveItemId, + setContext, + refresh + ); + case kItemTypeItem: + return createSectionCard( + createElement, + item.section, + item.text, + item.href + ); + case kItemTypeError: + return createErrorCard(createElement, item.title, item.text); + default: + return undefined; + } +} + +function createDocumentCard( + createElement, + icon, + title, + section, + text, + href, + crumbs, + quartoSearchOptions +) { + const iconEl = createElement("i", { + class: `bi bi-${icon} search-result-icon`, + }); + const titleEl = createElement("p", { class: "search-result-title" }, title); + const titleContents = [iconEl, titleEl]; + const showParent = quartoSearchOptions["show-item-context"]; + if (crumbs && showParent) { + let crumbsOut = undefined; + const crumbClz = ["search-result-crumbs"]; + if (showParent === "root") { + crumbsOut = crumbs.length > 1 ? crumbs[0] : undefined; + } else if (showParent === "parent") { + crumbsOut = crumbs.length > 1 ? crumbs[crumbs.length - 2] : undefined; + } else { + crumbsOut = crumbs.length > 1 ? crumbs.join(" > ") : undefined; + crumbClz.push("search-result-crumbs-wrap"); + } + + const crumbEl = createElement( + "p", + { class: crumbClz.join(" ") }, + crumbsOut + ); + titleContents.push(crumbEl); + } + + const titleContainerEl = createElement( + "div", + { class: "search-result-title-container" }, + titleContents + ); + + const textEls = []; + if (section) { + const sectionEl = createElement( + "p", + { class: "search-result-section" }, + section + ); + textEls.push(sectionEl); + } + const descEl = createElement("p", { + class: "search-result-text", + dangerouslySetInnerHTML: { + __html: text, + }, + }); + textEls.push(descEl); + + const textContainerEl = createElement( + "div", + { class: "search-result-text-container" }, + textEls + ); + + const containerEl = createElement( + "div", + { + class: "search-result-container", + }, + [titleContainerEl, textContainerEl] + ); + + const linkEl = createElement( + "a", + { + href: offsetURL(href), + class: "search-result-link", + }, + containerEl + ); + + const classes = ["search-result-doc", "search-item"]; + if (!section) { + classes.push("document-selectable"); + } + + return createElement( + "div", + { + class: classes.join(" "), + }, + linkEl + ); +} + +function createMoreCard( + createElement, + item, + state, + setActiveItemId, + setContext, + refresh +) { + const moreCardEl = createElement( + "div", + { + class: "search-result-more search-item", + onClick: (e) => { + // Handle expanding the sections by adding the expanded + // section to the list of expanded sections + toggleExpanded(item, state, setContext, setActiveItemId, refresh); + e.stopPropagation(); + }, + }, + item.title + ); + + return moreCardEl; +} + +function toggleExpanded(item, state, setContext, setActiveItemId, refresh) { + const expanded = state.context.expanded || []; + if (expanded.includes(item.target)) { + setContext({ + expanded: expanded.filter((target) => target !== item.target), + }); + } else { + setContext({ expanded: [...expanded, item.target] }); + } + + refresh(); + setActiveItemId(item.__autocomplete_id); +} + +function createSectionCard(createElement, section, text, href) { + const sectionEl = createSection(createElement, section, text, href); + return createElement( + "div", + { + class: "search-result-doc-section search-item", + }, + sectionEl + ); +} + +function createSection(createElement, title, text, href) { + const descEl = createElement("p", { + class: "search-result-text", + dangerouslySetInnerHTML: { + __html: text, + }, + }); + + const titleEl = createElement("p", { class: "search-result-section" }, title); + const linkEl = createElement( + "a", + { + href: offsetURL(href), + class: "search-result-link", + }, + [titleEl, descEl] + ); + return linkEl; +} + +function createErrorCard(createElement, title, text) { + const descEl = createElement("p", { + class: "search-error-text", + dangerouslySetInnerHTML: { + __html: text, + }, + }); + + const titleEl = createElement("p", { + class: "search-error-title", + dangerouslySetInnerHTML: { + __html: ` ${title}`, + }, + }); + const errorEl = createElement("div", { class: "search-error" }, [ + titleEl, + descEl, + ]); + return errorEl; +} + +function positionPanel(pos) { + const panelEl = window.document.querySelector( + "#quarto-search-results .aa-Panel" + ); + const inputEl = window.document.querySelector( + "#quarto-search .aa-Autocomplete" + ); + + if (panelEl && inputEl) { + panelEl.style.top = `${Math.round(panelEl.offsetTop)}px`; + if (pos === "start") { + panelEl.style.left = `${Math.round(inputEl.left)}px`; + } else { + panelEl.style.right = `${Math.round(inputEl.offsetRight)}px`; + } + } +} + +/* Highlighting */ +// highlighting functions +function highlightMatch(query, text) { + if (text) { + const start = text.toLowerCase().indexOf(query.toLowerCase()); + if (start !== -1) { + const startMark = ""; + const endMark = ""; + + const end = start + query.length; + text = + text.slice(0, start) + + startMark + + text.slice(start, end) + + endMark + + text.slice(end); + const startInfo = clipStart(text, start); + const endInfo = clipEnd( + text, + startInfo.position + startMark.length + endMark.length + ); + text = + startInfo.prefix + + text.slice(startInfo.position, endInfo.position) + + endInfo.suffix; + + return text; + } else { + return text; + } + } else { + return text; + } +} + +function clipStart(text, pos) { + const clipStart = pos - 50; + if (clipStart < 0) { + // This will just return the start of the string + return { + position: 0, + prefix: "", + }; + } else { + // We're clipping before the start of the string, walk backwards to the first space. + const spacePos = findSpace(text, pos, -1); + return { + position: spacePos.position, + prefix: "", + }; + } +} + +function clipEnd(text, pos) { + const clipEnd = pos + 200; + if (clipEnd > text.length) { + return { + position: text.length, + suffix: "", + }; + } else { + const spacePos = findSpace(text, clipEnd, 1); + return { + position: spacePos.position, + suffix: spacePos.clipped ? "…" : "", + }; + } +} + +function findSpace(text, start, step) { + let stepPos = start; + while (stepPos > -1 && stepPos < text.length) { + const char = text[stepPos]; + if (char === " " || char === "," || char === ":") { + return { + position: step === 1 ? stepPos : stepPos - step, + clipped: stepPos > 1 && stepPos < text.length, + }; + } + stepPos = stepPos + step; + } + + return { + position: stepPos - step, + clipped: false, + }; +} + +// removes highlighting as implemented by the mark tag +function clearHighlight(searchterm, el) { + const childNodes = el.childNodes; + for (let i = childNodes.length - 1; i >= 0; i--) { + const node = childNodes[i]; + if (node.nodeType === Node.ELEMENT_NODE) { + if ( + node.tagName === "MARK" && + node.innerText.toLowerCase() === searchterm.toLowerCase() + ) { + el.replaceChild(document.createTextNode(node.innerText), node); + } else { + clearHighlight(searchterm, node); + } + } + } +} + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string +} + +// highlight matches +function highlight(term, el) { + const termRegex = new RegExp(term, "ig"); + const childNodes = el.childNodes; + + // walk back to front avoid mutating elements in front of us + for (let i = childNodes.length - 1; i >= 0; i--) { + const node = childNodes[i]; + + if (node.nodeType === Node.TEXT_NODE) { + // Search text nodes for text to highlight + const text = node.nodeValue; + + let startIndex = 0; + let matchIndex = text.search(termRegex); + if (matchIndex > -1) { + const markFragment = document.createDocumentFragment(); + while (matchIndex > -1) { + const prefix = text.slice(startIndex, matchIndex); + markFragment.appendChild(document.createTextNode(prefix)); + + const mark = document.createElement("mark"); + mark.appendChild( + document.createTextNode( + text.slice(matchIndex, matchIndex + term.length) + ) + ); + markFragment.appendChild(mark); + + startIndex = matchIndex + term.length; + matchIndex = text.slice(startIndex).search(new RegExp(term, "ig")); + if (matchIndex > -1) { + matchIndex = startIndex + matchIndex; + } + } + if (startIndex < text.length) { + markFragment.appendChild( + document.createTextNode(text.slice(startIndex, text.length)) + ); + } + + el.replaceChild(markFragment, node); + } + } else if (node.nodeType === Node.ELEMENT_NODE) { + // recurse through elements + highlight(term, node); + } + } +} + +/* Link Handling */ +// get the offset from this page for a given site root relative url +function offsetURL(url) { + var offset = getMeta("quarto:offset"); + return offset ? offset + url : url; +} + +// read a meta tag value +function getMeta(metaName) { + var metas = window.document.getElementsByTagName("meta"); + for (let i = 0; i < metas.length; i++) { + if (metas[i].getAttribute("name") === metaName) { + return metas[i].getAttribute("content"); + } + } + return ""; +} + +function algoliaSearch(query, limit, algoliaOptions) { + const { getAlgoliaResults } = window["@algolia/autocomplete-preset-algolia"]; + + const applicationId = algoliaOptions["application-id"]; + const searchOnlyApiKey = algoliaOptions["search-only-api-key"]; + const indexName = algoliaOptions["index-name"]; + const indexFields = algoliaOptions["index-fields"]; + const searchClient = window.algoliasearch(applicationId, searchOnlyApiKey); + const searchParams = algoliaOptions["params"]; + const searchAnalytics = !!algoliaOptions["analytics-events"]; + + return getAlgoliaResults({ + searchClient, + queries: [ + { + indexName: indexName, + query, + params: { + hitsPerPage: limit, + clickAnalytics: searchAnalytics, + ...searchParams, + }, + }, + ], + transformResponse: (response) => { + if (!indexFields) { + return response.hits.map((hit) => { + return hit.map((item) => { + return { + ...item, + text: highlightMatch(query, item.text), + }; + }); + }); + } else { + const remappedHits = response.hits.map((hit) => { + return hit.map((item) => { + const newItem = { ...item }; + ["href", "section", "title", "text", "crumbs"].forEach( + (keyName) => { + const mappedName = indexFields[keyName]; + if ( + mappedName && + item[mappedName] !== undefined && + mappedName !== keyName + ) { + newItem[keyName] = item[mappedName]; + delete newItem[mappedName]; + } + } + ); + newItem.text = highlightMatch(query, newItem.text); + return newItem; + }); + }); + return remappedHits; + } + }, + }); +} + +let subSearchTerm = undefined; +let subSearchFuse = undefined; +const kFuseMaxWait = 125; + +async function fuseSearch(query, fuse, fuseOptions) { + let index = fuse; + // Fuse.js using the Bitap algorithm for text matching which runs in + // O(nm) time (no matter the structure of the text). In our case this + // means that long search terms mixed with large index gets very slow + // + // This injects a subIndex that will be used once the terms get long enough + // Usually making this subindex is cheap since there will typically be + // a subset of results matching the existing query + if (subSearchFuse !== undefined && query.startsWith(subSearchTerm)) { + // Use the existing subSearchFuse + index = subSearchFuse; + } else if (subSearchFuse !== undefined) { + // The term changed, discard the existing fuse + subSearchFuse = undefined; + subSearchTerm = undefined; + } + + // Search using the active fuse + const then = performance.now(); + const resultsRaw = await index.search(query, fuseOptions); + const now = performance.now(); + + const results = resultsRaw.map((result) => { + const addParam = (url, name, value) => { + const anchorParts = url.split("#"); + const baseUrl = anchorParts[0]; + const sep = baseUrl.search("\\?") > 0 ? "&" : "?"; + anchorParts[0] = baseUrl + sep + name + "=" + value; + return anchorParts.join("#"); + }; + + return { + title: result.item.title, + section: result.item.section, + href: addParam(result.item.href, kQueryArg, query), + text: highlightMatch(query, result.item.text), + crumbs: result.item.crumbs, + }; + }); + + // If we don't have a subfuse and the query is long enough, go ahead + // and create a subfuse to use for subsequent queries + if ( + now - then > kFuseMaxWait && + subSearchFuse === undefined && + resultsRaw.length < fuseOptions.limit + ) { + subSearchTerm = query; + subSearchFuse = new window.Fuse([], kFuseIndexOptions); + resultsRaw.forEach((rr) => { + subSearchFuse.add(rr.item); + }); + } + return results; +} diff --git a/_proc/docs/sitemap.xml b/_proc/docs/sitemap.xml new file mode 100644 index 0000000..d117446 --- /dev/null +++ b/_proc/docs/sitemap.xml @@ -0,0 +1,95 @@ + + + + https://sizhky.github.io/torch_snippets/imgaug_loader.html + 2024-08-24T07:20:35.662Z + + + https://sizhky.github.io/torch_snippets/bokeh_plotting.html + 2024-08-24T07:20:35.921Z + + + https://sizhky.github.io/torch_snippets/logging.html + 2024-08-24T07:25:44.344Z + + + https://sizhky.github.io/torch_snippets/report.html + 2024-08-24T07:20:35.524Z + + + https://sizhky.github.io/torch_snippets/registry.html + 2024-08-24T07:20:35.460Z + + + https://sizhky.github.io/torch_snippets/config.html + 2024-08-24T07:20:35.977Z + + + https://sizhky.github.io/torch_snippets/paths.html + 2024-08-24T07:20:35.590Z + + + https://sizhky.github.io/torch_snippets/pdf.html + 2024-08-24T07:20:35.498Z + + + https://sizhky.github.io/torch_snippets/bounding_boxes.html + 2024-08-24T07:20:35.586Z + + + https://sizhky.github.io/torch_snippets/load_defautls.html + 2024-08-24T07:20:35.498Z + + + https://sizhky.github.io/torch_snippets/AttrDict.html + 2024-08-24T07:20:35.038Z + + + https://sizhky.github.io/torch_snippets/decorators.html + 2024-08-24T07:20:36.418Z + + + https://sizhky.github.io/torch_snippets/markups.html + 2024-08-24T07:20:35.428Z + + + https://sizhky.github.io/torch_snippets/interactive_show.html + 2024-08-24T07:20:35.854Z + + + https://sizhky.github.io/torch_snippets/sklegos.html + 2024-08-24T07:20:35.980Z + + + https://sizhky.github.io/torch_snippets/show.html + 2024-08-24T07:20:35.235Z + + + https://sizhky.github.io/torch_snippets/charts.html + 2024-08-24T07:20:36.311Z + + + https://sizhky.github.io/torch_snippets/jupyter_notebook.html + 2024-08-24T07:20:35.579Z + + + https://sizhky.github.io/torch_snippets/misc.html + 2024-08-24T07:20:35.806Z + + + https://sizhky.github.io/torch_snippets/adapters.html + 2024-08-24T07:20:35.573Z + + + https://sizhky.github.io/torch_snippets/capsule.html + 2024-08-24T07:20:36.534Z + + + https://sizhky.github.io/torch_snippets/inspector.html + 2024-08-24T07:20:35.598Z + + + https://sizhky.github.io/torch_snippets/index.html + 2024-08-24T07:25:06.450Z + + diff --git a/_proc/docs/sklegos.html b/_proc/docs/sklegos.html new file mode 100644 index 0000000..72a6268 --- /dev/null +++ b/_proc/docs/sklegos.html @@ -0,0 +1,846 @@ + + + + + + + + + +sklegos – torch_snippets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ + + + +
+

SK-Legos

+

Utilities to do common ML tasks

+ +

You can find 1. train_test_split which also resets the dataframes’ indexes 2. MakeFrame 3. ImputeMisingValues 4. Cat2Num 5. Other scikit-lego blocks that I use a lot

+
+
+

MakeFrame

+
+
 MakeFrame (column_names)
+
+

Convert sklearn’s output to a pandas dataframe Especially useful when working with an ensemble of models

+

Usage

+

Call MakeFrame as the last component in your pipeline with the desired column names.

+
pipeline = Pipeline([
+    ...,
+    ('output', MakeFrame(['outlier', 'class'])),
+])
+ +
+
+
+

ImputeMissingValues

+
+
 ImputeMissingValues (num_mode=<function mean at 0x10695b6f0>,
+                      cat_mode='MISSING')
+
+

*DataFrame input - DataFrame output During fit - 1. Store imputable value for each column During transform - 2. Impute missing values with imputable value 3. Create a ’{col}_na’ boolean column to tell if cells contained missing value*

+
+
+
+

LambdaTransformer

+
+
 LambdaTransformer (fn)
+
+

*Base class for all estimators in scikit-learn.

+

Inheriting from this class provides default implementations of:

+
    +
  • setting and getting parameters used by GridSearchCV and friends;
  • +
  • textual and HTML representation displayed in terminals and IDEs;
  • +
  • estimator serialization;
  • +
  • parameters validation;
  • +
  • data validation;
  • +
  • feature names validation.
  • +
+

Read more in the :ref:User Guide <rolling_your_own_estimator>.*

+
+
+
+

MakeFrame

+
+
 MakeFrame (column_names)
+
+

*Base class for all estimators in scikit-learn.

+

Inheriting from this class provides default implementations of:

+
    +
  • setting and getting parameters used by GridSearchCV and friends;
  • +
  • textual and HTML representation displayed in terminals and IDEs;
  • +
  • estimator serialization;
  • +
  • parameters validation;
  • +
  • data validation;
  • +
  • feature names validation.
  • +
+

Read more in the :ref:User Guide <rolling_your_own_estimator>.*

+
+
+
+

Cat2Num

+
+
 Cat2Num ()
+
+

*Base class for all estimators in scikit-learn.

+

Inheriting from this class provides default implementations of:

+
    +
  • setting and getting parameters used by GridSearchCV and friends;
  • +
  • textual and HTML representation displayed in terminals and IDEs;
  • +
  • estimator serialization;
  • +
  • parameters validation;
  • +
  • data validation;
  • +
  • feature names validation.
  • +
+

Read more in the :ref:User Guide <rolling_your_own_estimator>.*

+
+
+
+

SplitDateColumn

+
+
 SplitDateColumn (column_names, has_date, has_time, date_format=None)
+
+

*Base class for all estimators in scikit-learn.

+

Inheriting from this class provides default implementations of:

+
    +
  • setting and getting parameters used by GridSearchCV and friends;
  • +
  • textual and HTML representation displayed in terminals and IDEs;
  • +
  • estimator serialization;
  • +
  • parameters validation;
  • +
  • data validation;
  • +
  • feature names validation.
  • +
+

Read more in the :ref:User Guide <rolling_your_own_estimator>.*

+ + +
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/index.ipynb b/_proc/index.ipynb index de32754..e395072 100644 --- a/_proc/index.ipynb +++ b/_proc/index.ipynb @@ -19,15 +19,6 @@ "" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "language": "python" - }, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": 1, @@ -39,8 +30,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 304 ms, sys: 65.3 ms, total: 369 ms\n", - "Wall time: 469 ms\n" + "CPU times: user 263 ms, sys: 53.9 ms, total: 317 ms\n", + "Wall time: 407 ms\n" ] } ], @@ -63,6 +54,76 @@ "metadata": { "language": "python" }, + "outputs": [], + "source": [ + "import ast\n", + "\n", + "os.environ[\n", + " \"AD_MAX_ITEMS\"\n", + "] = ( # os is already imported by torch_snippets, along with many other useful libraries\n", + " \"1000\" # Set the maximum number of items to display in the AD object\n", + ")\n", + "\n", + "\n", + "@tryy # This is a decorator that catches exceptions\n", + "def extract_all_list(file_path):\n", + " file = readfile(file_path, silent=True) # Read the file\n", + " tree = ast.parse(file, filename=file_path)\n", + "\n", + " for node in tree.body:\n", + " if isinstance(node, ast.Assign):\n", + " for target in node.targets:\n", + " if isinstance(target, ast.Name) and target.id == \"__all__\":\n", + " if isinstance(node.value, ast.List):\n", + " all_list = [\n", + " elt.value\n", + " for elt in node.value.elts\n", + " if isinstance(elt, ast.Constant)\n", + " ]\n", + " return all_list\n", + " return None\n", + "\n", + "\n", + "def print_all_lists_in_directory(directory):\n", + " dir = P(directory) # Create a pathlib.Path object\n", + " for f in dir.ls(): # Iterate over all files in the directory\n", + " if f.extn == \"py\" and f.stem not in [\n", + " \"__init__\",\n", + " \"_nbdev\",\n", + " ]: # If it's a Python file and not __init__.py\n", + " all_list = extract_all_list(f)\n", + " if all_list is not None and len(all_list) > 0:\n", + " h2(f.stem) # Print the name of the file as a heading in jupyter\n", + " print(\n", + " AD({\"items\": all_list})\n", + " ) # AD is an intelligent dictionary that can display itself nicely" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yeshwanth/Code/Personal/torch_snippets/nbs\n" + ] + } + ], + "source": [ + "print(P().resolve())" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "language": "python" + }, "outputs": [ { "data": { @@ -464,26 +525,28 @@ " 0 - console (🏷️ str)\n", " 1 - reset_logger_width (🏷️ str)\n", " 2 - logger (🏷️ str)\n", - " 3 - Debug (🏷️ str)\n", - " 4 - Info (🏷️ str)\n", - " 5 - Warn (🏷️ str)\n", - " 6 - Excep (🏷️ str)\n", - " 7 - warn_mode (🏷️ str)\n", - " 8 - info_mode (🏷️ str)\n", - " 9 - debug_mode (🏷️ str)\n", - " 10 - excep_mode (🏷️ str)\n", - " 11 - in_warn_mode (🏷️ str)\n", - " 12 - in_info_mode (🏷️ str)\n", - " 13 - in_debug_mode (🏷️ str)\n", - " 14 - in_excep_mode (🏷️ str)\n", - " 15 - frames (🏷️ str)\n", - " 16 - get_console (🏷️ str)\n", - " 17 - reset_logger (🏷️ str)\n", - " 18 - enter_exit (🏷️ str)\n", - " 19 - get_logger_level (🏷️ str)\n", - " 20 - logger_mode (🏷️ str)\n", - " 21 - in_logger_mode (🏷️ str)\n", - " 22 - notify_waiting (🏷️ str)\n", + " 3 - Trace (🏷️ str)\n", + " 4 - Debug (🏷️ str)\n", + " 5 - Info (🏷️ str)\n", + " 6 - Warn (🏷️ str)\n", + " 7 - Excep (🏷️ str)\n", + " 8 - warn_mode (🏷️ str)\n", + " 9 - info_mode (🏷️ str)\n", + " 10 - debug_mode (🏷️ str)\n", + " 11 - trace_mode (🏷️ str)\n", + " 12 - excep_mode (🏷️ str)\n", + " 13 - in_warn_mode (🏷️ str)\n", + " 14 - in_info_mode (🏷️ str)\n", + " 15 - in_debug_mode (🏷️ str)\n", + " 16 - in_trace_mode (🏷️ str)\n", + " 17 - in_excep_mode (🏷️ str)\n", + " 18 - frames (🏷️ str)\n", + " 19 - get_console (🏷️ str)\n", + " 20 - reset_logger (🏷️ str)\n", + " 21 - get_logger_level (🏷️ str)\n", + " 22 - logger_mode (🏷️ str)\n", + " 23 - in_logger_mode (🏷️ str)\n", + " 24 - notify_waiting (🏷️ str)\n", "\n", "```\n", "\n" @@ -903,58 +966,24 @@ } ], "source": [ - "import ast\n", - "\n", - "os.environ[\n", - " \"AD_MAX_ITEMS\"\n", - "] = ( # os is already imported by torch_snippets, along with many other useful libraries\n", - " \"1000\" # Set the maximum number of items to display in the AD object\n", - ")\n", - "\n", - "\n", - "@tryy # This is a decorator that catches exceptions\n", - "def extract_all_list(file_path):\n", - " file = readfile(file_path, silent=True) # Read the file\n", - " tree = ast.parse(file, filename=file_path)\n", - "\n", - " for node in tree.body:\n", - " if isinstance(node, ast.Assign):\n", - " for target in node.targets:\n", - " if isinstance(target, ast.Name) and target.id == \"__all__\":\n", - " if isinstance(node.value, ast.List):\n", - " all_list = [\n", - " elt.value\n", - " for elt in node.value.elts\n", - " if isinstance(elt, ast.Constant)\n", - " ]\n", - " return all_list\n", - " return None\n", - "\n", - "\n", - "def print_all_lists_in_directory(directory):\n", - " dir = P(directory) # Create a pathlib.Path object\n", - " for f in dir.ls(): # Iterate over all files in the directory\n", - " if f.extn == \"py\" and f.stem not in [\n", - " \"__init__\",\n", - " \"_nbdev\",\n", - " ]: # If it's a Python file and not __init__.py\n", - " all_list = extract_all_list(f)\n", - " if all_list is not None and len(all_list) > 0:\n", - " h2(f.stem) # Print the name of the file as a heading in jupyter\n", - " print(\n", - " AD({\"items\": all_list})\n", - " ) # AD is an intelligent dictionary that can display itself nicely\n", - "\n", - "\n", "# Specify the directory containing the Python files\n", "directory_path = \"../torch_snippets\"\n", "print_all_lists_in_directory(directory_path)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/_proc/logging.ipynb b/_proc/logging.ipynb new file mode 100644 index 0000000..adf38b0 --- /dev/null +++ b/_proc/logging.ipynb @@ -0,0 +1,1154 @@ +{ + "cells": [ + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "output-file: logging.html\n", + "title: Rich Logging and printing\n", + "\n", + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Ez logging\n", + "Logging is packed in these 5 functions" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
[08/24/24 12:16:05] TRACE    Testing {1,2,3}            1838145784.py::2\" target=\"_blank\"><module>:2\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:16:05]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;34mTRACE \u001b[0m Testing \u001b[1m{\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m3\u001b[0m\u001b[1m}\u001b[0m \u001b]8;id=224366;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1838145784.py:2\u001b\\\u001b[2m1838145784.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=418987;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1838145784.py:2#:2\u001b\\\u001b[2m:2\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    DEBUG    TESTING {1,2,3}            1838145784.py::3\" target=\"_blank\"><module>:3\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[2;32mDEBUG \u001b[0m TESTING \u001b[1m{\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m3\u001b[0m\u001b[1m}\u001b[0m \u001b]8;id=937902;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1838145784.py:3\u001b\\\u001b[2m1838145784.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=471006;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1838145784.py:3#:3\u001b\\\u001b[2m:3\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    INFO     TESTING {1,2,3}            1838145784.py::4\" target=\"_blank\"><module>:4\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m TESTING \u001b[1m{\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m3\u001b[0m\u001b[1m}\u001b[0m \u001b]8;id=231274;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1838145784.py:4\u001b\\\u001b[2m1838145784.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=492146;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1838145784.py:4#:4\u001b\\\u001b[2m:4\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    WARNING  TESTING {1,2,3}            1838145784.py::5\" target=\"_blank\"><module>:5\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[2;31mWARNING \u001b[0m TESTING \u001b[1m{\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m3\u001b[0m\u001b[1m}\u001b[0m \u001b]8;id=324753;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1838145784.py:5\u001b\\\u001b[2m1838145784.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=585672;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1838145784.py:5#:5\u001b\\\u001b[2m:5\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    ERROR    TESTING {1,2,3}            1838145784.py::6\" target=\"_blank\"><module>:6\n",
+       "                             NoneType: None                                     \n",
+       "                                                                                \n",
+       "                                                                                \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[1;31mERROR \u001b[0m TESTING \u001b[1m{\u001b[0m\u001b[1;36m1\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m3\u001b[0m\u001b[1m}\u001b[0m \u001b]8;id=714335;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1838145784.py:6\u001b\\\u001b[2m1838145784.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=108282;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1838145784.py:6#:6\u001b\\\u001b[2m:6\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m NoneType: \u001b[3;35mNone\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "reset_logger(\"trace\", console_width=80)\n", + "Trace(\"Testing {1,2,3}\")\n", + "Debug(\"TESTING {1,2,3}\")\n", + "Info(\"TESTING {1,2,3}\")\n", + "Warn(\"TESTING {1,2,3}\")\n", + "Excep(\"TESTING {1,2,3}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`Excep` will also print a traceback" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
[08/24/24 12:16:07] ERROR    division by zero                 1923207781.py:do:5\n",
+       "                             ZeroDivisionError: division by                     \n",
+       "                             zero                                               \n",
+       "                                                                                \n",
+       "                             ╭─ Traceback (most recent call─╮                   \n",
+       "                              in do:3                                         \n",
+       "                                                                              \n",
+       "                                 1 def do():                                  \n",
+       "                                 2 try:                                   \n",
+       "                               3 │   │   1 / 0                              \n",
+       "                                 4 except Exception as                    \n",
+       "                                 5 │   │   Excep(e)                           \n",
+       "                                 6                                            \n",
+       "                             ╰──────────────────────────────╯                   \n",
+       "                             ZeroDivisionError: division by                     \n",
+       "                             zero                                               \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:16:07]\u001b[0m\u001b[2;36m \u001b[0m\u001b[1;31mERROR \u001b[0m division by zero \u001b]8;id=376660;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1923207781.py:5\u001b\\\u001b[2m1923207781.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=229375;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/1923207781.py:5#do:5\u001b\\\u001b[2mdo:5\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m ZeroDivisionError: division by \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m zero \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[31m╭─\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call\u001b[0m\u001b[31m─╮\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[31m│\u001b[0m in \u001b[92mdo\u001b[0m:\u001b[94m3\u001b[0m \u001b[31m│\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[31m│\u001b[0m \u001b[31m│\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[31m│\u001b[0m \u001b[2m 1 \u001b[0m\u001b[94mdef\u001b[0m \u001b[92mdo\u001b[0m(): \u001b[31m│\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[31m│\u001b[0m \u001b[2m 2 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mtry\u001b[0m: \u001b[31m│\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 3 \u001b[2m│ │ \u001b[0m\u001b[94m1\u001b[0m / \u001b[94m0\u001b[0m \u001b[31m│\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[31m│\u001b[0m \u001b[2m 4 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mexcept\u001b[0m \u001b[96mException\u001b[0m \u001b[94mas\u001b[0m \u001b[31m│\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[31m│\u001b[0m \u001b[2m 5 \u001b[0m\u001b[2m│ │ \u001b[0mExcep(e) \u001b[31m│\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[31m│\u001b[0m \u001b[2m 6 \u001b[0m \u001b[31m│\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[31m╰──────────────────────────────╯\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[1;91mZeroDivisionError: \u001b[0mdivision by \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m zero \u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def do():\n", + " try:\n", + " 1 / 0\n", + " except Exception as e:\n", + " Excep(e)\n", + "\n", + "def do2():\n", + " do()\n", + "\n", + "do2()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All logging functions have an optional depth that will be helpful to raise the context level to outer functions" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
[08/24/24 12:16:15] INFO     In do                             809811040.py:do:2\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:16:15]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m In do \u001b]8;id=244287;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/809811040.py:2\u001b\\\u001b[2m809811040.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=530362;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/809811040.py:2#do:2\u001b\\\u001b[2mdo:2\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def do():\n", + " Info('In do')\n", + "\n", + "do()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
[08/24/24 12:17:13] INFO     Log will still say it is from   2099333876.py:do2:2\n",
+       "                             `do2` now, to the right of log                     \n",
+       "                             print                                              \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:17:13]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m Log will still say it is from \u001b]8;id=608563;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/2099333876.py:2\u001b\\\u001b[2m2099333876.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=696305;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/2099333876.py:2#do2:2\u001b\\\u001b[2mdo2:2\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m `do2` now, to the right of log \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m print \u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def do2():\n", + " Info('Log will still say it is from `do2` now, to the right of log print')\n", + "\n", + "def do():\n", + " do2()\n", + "\n", + "do()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
[08/24/24 12:17:25] INFO     But now, log will still say it   4054019042.py:do:5\n",
+       "                             is from do                                         \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:17:25]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m But now, log will still say it \u001b]8;id=342927;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/4054019042.py:5\u001b\\\u001b[2m4054019042.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=431233;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/4054019042.py:5#do:5\u001b\\\u001b[2mdo:5\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m is from do \u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def do2():\n", + " Info('But now, log will still say it is from do', depth=1)\n", + "\n", + "def do():\n", + " do2()\n", + "\n", + "do()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Logging Level and context" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "has_sd": true, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "---\n", + "\n", + "### in_logger_mode\n", + "\n", + "> in_logger_mode (level:str)\n", + "\n", + "*return's T/F, checking if logger is in a specific mode or not*" + ], + "text/plain": [ + "---\n", + "\n", + "### in_logger_mode\n", + "\n", + "> in_logger_mode (level:str)\n", + "\n", + "*return's T/F, checking if logger is in a specific mode or not*" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#| echo: false\n", + "#| output: asis\n", + "show_doc(in_logger_mode)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "has_sd": true, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "---\n", + "\n", + "### logger_mode\n", + "\n", + "> logger_mode (level)\n", + "\n", + "*temporarily, using `with` context,\n", + "set the level to something else*" + ], + "text/plain": [ + "---\n", + "\n", + "### logger_mode\n", + "\n", + "> logger_mode (level)\n", + "\n", + "*temporarily, using `with` context,\n", + "set the level to something else*" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#| echo: false\n", + "#| output: asis\n", + "show_doc(logger_mode)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "has_sd": true, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "---\n", + "\n", + "### get_logger_level\n", + "\n", + "> get_logger_level ()\n", + "\n", + "*get the current logger's level*" + ], + "text/plain": [ + "---\n", + "\n", + "### get_logger_level\n", + "\n", + "> get_logger_level ()\n", + "\n", + "*get the current logger's level*" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#| echo: false\n", + "#| output: asis\n", + "show_doc(get_logger_level)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's log every level in the `do` function below.\n", + "We can control what we need to log from outside the function's context by \n", + "using `with _model():`" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "====================Excep mode====================\n", + "in_excep_mode()=True\n", + "in_warn_mode()=False\n", + "in_info_mode()=False\n", + "in_debug_mode()=False\n", + "in_trace_mode()=False\n" + ] + }, + { + "data": { + "text/html": [ + "
[08/24/24 12:13:08] ERROR    4                                                                                                                            3432048509.py:do:6\n",
+       "                             NoneType: None                                                                                                                                 \n",
+       "                                                                                                                                                                            \n",
+       "                                                                                                                                                                            \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:13:08]\u001b[0m\u001b[2;36m \u001b[0m\u001b[1;31mERROR \u001b[0m \u001b[1;36m4\u001b[0m \u001b]8;id=916055;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:6\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=120477;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:6#do:6\u001b\\\u001b[2mdo:6\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m NoneType: \u001b[3;35mNone\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "====================Warn mode====================\n", + "in_excep_mode()=False\n", + "in_warn_mode()=True\n", + "in_info_mode()=False\n", + "in_debug_mode()=False\n", + "in_trace_mode()=False\n" + ] + }, + { + "data": { + "text/html": [ + "
[08/24/24 12:13:08] WARNING  3                                                                                                                            3432048509.py:do:5\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:13:08]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;31mWARNING \u001b[0m \u001b[1;36m3\u001b[0m \u001b]8;id=218910;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:5\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=668161;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:5#do:5\u001b\\\u001b[2mdo:5\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    ERROR    4                                                                                                                            3432048509.py:do:6\n",
+       "                             NoneType: None                                                                                                                                 \n",
+       "                                                                                                                                                                            \n",
+       "                                                                                                                                                                            \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[1;31mERROR \u001b[0m \u001b[1;36m4\u001b[0m \u001b]8;id=184912;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:6\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=71750;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:6#do:6\u001b\\\u001b[2mdo:6\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m NoneType: \u001b[3;35mNone\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "====================Info mode====================\n", + "in_excep_mode()=False\n", + "in_warn_mode()=False\n", + "in_info_mode()=True\n", + "in_debug_mode()=False\n", + "in_trace_mode()=False\n" + ] + }, + { + "data": { + "text/html": [ + "
[08/24/24 12:13:08] INFO     2                                                                                                                            3432048509.py:do:4\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:13:08]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m \u001b[1;36m2\u001b[0m \u001b]8;id=336403;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:4\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=881230;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:4#do:4\u001b\\\u001b[2mdo:4\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    WARNING  3                                                                                                                            3432048509.py:do:5\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[2;31mWARNING \u001b[0m \u001b[1;36m3\u001b[0m \u001b]8;id=335362;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:5\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=481605;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:5#do:5\u001b\\\u001b[2mdo:5\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    ERROR    4                                                                                                                            3432048509.py:do:6\n",
+       "                             NoneType: None                                                                                                                                 \n",
+       "                                                                                                                                                                            \n",
+       "                                                                                                                                                                            \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[1;31mERROR \u001b[0m \u001b[1;36m4\u001b[0m \u001b]8;id=121173;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:6\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=696301;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:6#do:6\u001b\\\u001b[2mdo:6\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m NoneType: \u001b[3;35mNone\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "====================Debug mode====================\n", + "in_excep_mode()=False\n", + "in_warn_mode()=False\n", + "in_info_mode()=False\n", + "in_debug_mode()=True\n", + "in_trace_mode()=False\n" + ] + }, + { + "data": { + "text/html": [ + "
[08/24/24 12:13:08] DEBUG    1                                                                                                                            3432048509.py:do:3\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:13:08]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;32mDEBUG \u001b[0m \u001b[1;36m1\u001b[0m \u001b]8;id=523515;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:3\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=65924;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:3#do:3\u001b\\\u001b[2mdo:3\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    INFO     2                                                                                                                            3432048509.py:do:4\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m \u001b[1;36m2\u001b[0m \u001b]8;id=428047;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:4\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=902182;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:4#do:4\u001b\\\u001b[2mdo:4\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    WARNING  3                                                                                                                            3432048509.py:do:5\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[2;31mWARNING \u001b[0m \u001b[1;36m3\u001b[0m \u001b]8;id=768299;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:5\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=755565;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:5#do:5\u001b\\\u001b[2mdo:5\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    ERROR    4                                                                                                                            3432048509.py:do:6\n",
+       "                             NoneType: None                                                                                                                                 \n",
+       "                                                                                                                                                                            \n",
+       "                                                                                                                                                                            \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[1;31mERROR \u001b[0m \u001b[1;36m4\u001b[0m \u001b]8;id=203848;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:6\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=459920;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:6#do:6\u001b\\\u001b[2mdo:6\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m NoneType: \u001b[3;35mNone\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "====================Trace mode====================\n", + "in_excep_mode()=False\n", + "in_warn_mode()=False\n", + "in_info_mode()=False\n", + "in_debug_mode()=False\n", + "in_trace_mode()=True\n" + ] + }, + { + "data": { + "text/html": [ + "
[08/24/24 12:13:08] TRACE    0                                                                                                                            3432048509.py:do:2\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:13:08]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;34mTRACE \u001b[0m \u001b[1;36m0\u001b[0m \u001b]8;id=353756;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:2\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=420809;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:2#do:2\u001b\\\u001b[2mdo:2\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    DEBUG    1                                                                                                                            3432048509.py:do:3\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[2;32mDEBUG \u001b[0m \u001b[1;36m1\u001b[0m \u001b]8;id=12861;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:3\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=936132;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:3#do:3\u001b\\\u001b[2mdo:3\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    INFO     2                                                                                                                            3432048509.py:do:4\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m \u001b[1;36m2\u001b[0m \u001b]8;id=464736;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:4\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=856526;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:4#do:4\u001b\\\u001b[2mdo:4\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    WARNING  3                                                                                                                            3432048509.py:do:5\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[2;31mWARNING \u001b[0m \u001b[1;36m3\u001b[0m \u001b]8;id=696903;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:5\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=821308;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:5#do:5\u001b\\\u001b[2mdo:5\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                    ERROR    4                                                                                                                            3432048509.py:do:6\n",
+       "                             NoneType: None                                                                                                                                 \n",
+       "                                                                                                                                                                            \n",
+       "                                                                                                                                                                            \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[1;31mERROR \u001b[0m \u001b[1;36m4\u001b[0m \u001b]8;id=181087;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:6\u001b\\\u001b[2m3432048509.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=999705;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3432048509.py:6#do:6\u001b\\\u001b[2mdo:6\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m NoneType: \u001b[3;35mNone\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def do():\n", + " Trace(0)\n", + " Debug(1)\n", + " Info(2)\n", + " Warn(3)\n", + " Excep(4)\n", + "\n", + "\n", + "def line(x):\n", + " sep = \"=\" * 20\n", + " print(f\"{sep}{x}{sep}\")\n", + " print(f\"{in_excep_mode()=}\")\n", + " print(f\"{in_warn_mode()=}\")\n", + " print(f\"{in_info_mode()=}\")\n", + " print(f\"{in_debug_mode()=}\")\n", + " print(f\"{in_trace_mode()=}\")\n", + "\n", + "\n", + "reset_logger()\n", + "\n", + "with excep_mode():\n", + " line(\"Excep mode\")\n", + " do()\n", + "\n", + "with warn_mode():\n", + " line(\"Warn mode\")\n", + " do()\n", + "\n", + "with info_mode():\n", + " line(\"Info mode\")\n", + " do()\n", + "\n", + "with debug_mode():\n", + " line(\"Debug mode\")\n", + " do()\n", + "\n", + "with trace_mode():\n", + " line(\"Trace mode\")\n", + " do()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `in__mode` gives an additional layer of control, to be used for debugging dynamically. Let's say, you want to show an image (for the sake of debugging)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "145.5542982442515\n" + ] + } + ], + "source": [ + "def do(im_path):\n", + " from torch_snippets import show, read\n", + " im = read(im_path)\n", + " show(im, sz=3)\n", + " print(im.mean())\n", + "\n", + "do('assets/Preamble.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But now you are happy with your code and don't want the show, say the code is going to production. A common way out is to just comment that line" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "145.5542982442515\n" + ] + } + ], + "source": [ + "def do(im_path):\n", + " from torch_snippets import show, read\n", + " im = read(im_path)\n", + " # show(im, sz=3) # line is commented, but will need to be re-uncommented any time it needs debugging\n", + " print(im.mean())\n", + "\n", + "do('assets/Preamble.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But if you want to re-check, it's a pain to again uncomment. Not to mention this method is not scalable to 100s of lines of code. The simple way to deal with such transient code that needs to activate only when you want it to, is to enclose in an `if in__mode` conditional like so" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "145.5542982442515\n" + ] + } + ], + "source": [ + "def do(im_path):\n", + " from torch_snippets import show, read\n", + " im = read(im_path)\n", + " if in_debug_mode():\n", + " show(im, sz=3)\n", + " print(im.mean())\n", + "\n", + "do('assets/Preamble.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This way, you can always activate the show by calling `do` with a temporary `with_debug_mode` context" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "145.5542982442515\n" + ] + } + ], + "source": [ + "with debug_mode():\n", + " do('assets/Preamble.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Notify Waiting" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
[08/24/24 12:36:51] TRACE    Available Spinners: dict_keys(['dots', 'dots2', 'dots3', 'dots4', 'dots5', 'dots6', 'dots7', 'dots8', 'dots9',  3340474699.py:notify_waiting:41\n",
+       "                             'dots10', 'dots11', 'dots12', 'dots8Bit', 'line', 'line2', 'pipe', 'simpleDots', 'simpleDotsScrolling', 'star',                                \n",
+       "                             'star2', 'flip', 'hamburger', 'growVertical', 'growHorizontal', 'balloon', 'balloon2', 'noise', 'bounce',                                      \n",
+       "                             'boxBounce', 'boxBounce2', 'triangle', 'arc', 'circle', 'squareCorners', 'circleQuarters', 'circleHalves',                                     \n",
+       "                             'squish', 'toggle', 'toggle2', 'toggle3', 'toggle4', 'toggle5', 'toggle6', 'toggle7', 'toggle8', 'toggle9',                                    \n",
+       "                             'toggle10', 'toggle11', 'toggle12', 'toggle13', 'arrow', 'arrow2', 'arrow3', 'bouncingBar', 'bouncingBall',                                    \n",
+       "                             'smiley', 'monkey', 'hearts', 'clock', 'earth', 'material', 'moon', 'runner', 'pong', 'shark', 'dqpb',                                         \n",
+       "                             'weather', 'christmas', 'grenade', 'point', 'layer', 'betaWave', 'aesthetic', 'guess', 'guess_the_movie'])                                     \n",
+       "                                                                                                                                                                            \n",
+       "                             Using: clock                                                                                                                                   \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:36:51]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;34mTRACE \u001b[0m Available Spinners: \u001b[1;35mdict_keys\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[32m'dots'\u001b[0m, \u001b[32m'dots2'\u001b[0m, \u001b[32m'dots3'\u001b[0m, \u001b[32m'dots4'\u001b[0m, \u001b[32m'dots5'\u001b[0m, \u001b[32m'dots6'\u001b[0m, \u001b[32m'dots7'\u001b[0m, \u001b[32m'dots8'\u001b[0m, \u001b[32m'dots9'\u001b[0m, \u001b]8;id=248925;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3340474699.py:41\u001b\\\u001b[2m3340474699.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=418244;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_44029/3340474699.py:41#notify_waiting:41\u001b\\\u001b[2mnotify_waiting:41\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m \u001b[32m'dots10'\u001b[0m, \u001b[32m'dots11'\u001b[0m, \u001b[32m'dots12'\u001b[0m, \u001b[32m'dots8Bit'\u001b[0m, \u001b[32m'line'\u001b[0m, \u001b[32m'line2'\u001b[0m, \u001b[32m'pipe'\u001b[0m, \u001b[32m'simpleDots'\u001b[0m, \u001b[32m'simpleDotsScrolling'\u001b[0m, \u001b[32m'star'\u001b[0m, \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[32m'star2'\u001b[0m, \u001b[32m'flip'\u001b[0m, \u001b[32m'hamburger'\u001b[0m, \u001b[32m'growVertical'\u001b[0m, \u001b[32m'growHorizontal'\u001b[0m, \u001b[32m'balloon'\u001b[0m, \u001b[32m'balloon2'\u001b[0m, \u001b[32m'noise'\u001b[0m, \u001b[32m'bounce'\u001b[0m, \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[32m'boxBounce'\u001b[0m, \u001b[32m'boxBounce2'\u001b[0m, \u001b[32m'triangle'\u001b[0m, \u001b[32m'arc'\u001b[0m, \u001b[32m'circle'\u001b[0m, \u001b[32m'squareCorners'\u001b[0m, \u001b[32m'circleQuarters'\u001b[0m, \u001b[32m'circleHalves'\u001b[0m, \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[32m'squish'\u001b[0m, \u001b[32m'toggle'\u001b[0m, \u001b[32m'toggle2'\u001b[0m, \u001b[32m'toggle3'\u001b[0m, \u001b[32m'toggle4'\u001b[0m, \u001b[32m'toggle5'\u001b[0m, \u001b[32m'toggle6'\u001b[0m, \u001b[32m'toggle7'\u001b[0m, \u001b[32m'toggle8'\u001b[0m, \u001b[32m'toggle9'\u001b[0m, \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[32m'toggle10'\u001b[0m, \u001b[32m'toggle11'\u001b[0m, \u001b[32m'toggle12'\u001b[0m, \u001b[32m'toggle13'\u001b[0m, \u001b[32m'arrow'\u001b[0m, \u001b[32m'arrow2'\u001b[0m, \u001b[32m'arrow3'\u001b[0m, \u001b[32m'bouncingBar'\u001b[0m, \u001b[32m'bouncingBall'\u001b[0m, \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[32m'smiley'\u001b[0m, \u001b[32m'monkey'\u001b[0m, \u001b[32m'hearts'\u001b[0m, \u001b[32m'clock'\u001b[0m, \u001b[32m'earth'\u001b[0m, \u001b[32m'material'\u001b[0m, \u001b[32m'moon'\u001b[0m, \u001b[32m'runner'\u001b[0m, \u001b[32m'pong'\u001b[0m, \u001b[32m'shark'\u001b[0m, \u001b[32m'dqpb'\u001b[0m, \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[32m'weather'\u001b[0m, \u001b[32m'christmas'\u001b[0m, \u001b[32m'grenade'\u001b[0m, \u001b[32m'point'\u001b[0m, \u001b[32m'layer'\u001b[0m, \u001b[32m'betaWave'\u001b[0m, \u001b[32m'aesthetic'\u001b[0m, \u001b[32m'guess'\u001b[0m, \u001b[32m'guess_the_movie'\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m \u001b[2m \u001b[0m\n", + "\u001b[2;36m \u001b[0m Using: clock \u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
[08/24/24 12:37:01] INFO     Downloading - Completed in 10.01 s                                                                                   contextlib.py:__exit__:144\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:37:01]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m Downloading - Completed in \u001b[1;36m10.01\u001b[0m s \u001b]8;id=4266;file:///opt/miniconda3/lib/python3.12/contextlib.py:144\u001b\\\u001b[2mcontextlib.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=46533;file:///opt/miniconda3/lib/python3.12/contextlib.py:144#__exit__:144\u001b\\\u001b[2m__exit__:144\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
[08/24/24 12:37:11] INFO     Downloading - Completed in 10.01 s                                                                                   contextlib.py:__exit__:144\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:37:11]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m Downloading - Completed in \u001b[1;36m10.01\u001b[0m s \u001b]8;id=137393;file:///opt/miniconda3/lib/python3.12/contextlib.py:144\u001b\\\u001b[2mcontextlib.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=906004;file:///opt/miniconda3/lib/python3.12/contextlib.py:144#__exit__:144\u001b\\\u001b[2m__exit__:144\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
[08/24/24 12:37:14] INFO     One more message - Completed in 3.00 s                                                                               contextlib.py:__exit__:144\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m[08/24/24 12:37:14]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m One more message - Completed in \u001b[1;36m3.00\u001b[0m s \u001b]8;id=247746;file:///opt/miniconda3/lib/python3.12/contextlib.py:144\u001b\\\u001b[2mcontextlib.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=719324;file:///opt/miniconda3/lib/python3.12/contextlib.py:144#__exit__:144\u001b\\\u001b[2m__exit__:144\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "reset_logger(console_width=100)\n", + "\n", + "with trace_mode():\n", + " with notify_waiting(\"Downloading\"):\n", + " time.sleep(10)\n", + "\n", + "with notify_waiting(\"Downloading\", spinner=\"guess_the_movie\"):\n", + " time.sleep(10)\n", + "\n", + "with notify_waiting(\"One more message\", spinner=\"earth\"):\n", + " time.sleep(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDBoYFhsaGRoeHRwfIy8mIyIiITYtLSctMTAxMi0yMCs1RVBCNzpLPy0tRWFFS1NWW11bMkFlbWRYbFBZW1cBERISGRYZLxsbL189Nz9XV1ddV1ddV1dXV1dXV11XV1dXV1ddV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV11XV//AABEIAWgB4AMBIgACEQEDEQH/xAAbAAEAAgMBAQAAAAAAAAAAAAAAAwQCBQYBB//EAEMQAAEDAgMFBQUGBAUEAwEBAAEAAhEDIQQSMSJBUWGRE1NxgdIFFzKSsQYjNEJyoRRSYsEHM4Lh8BbC0fEVY6JDJP/EABcBAQEBAQAAAAAAAAAAAAAAAAABAgP/xAAhEQEBAQACAQUBAQEAAAAAAAAAARECMRIDIUFRYTKBIv/aAAwDAQACEQMRAD8A+foiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIvp/u4wXe4j5melYD/AA7wfe4j5m+lB8zRfTPd3g+9xHzN9Ke7vB97iPmb6UHzNF9M93eD73EfM30qCv8A4f4YPphtSvlc6HaHda4bbxKD50i7n/omiS3L/EkZy11otmIBEttYA+anwf2GwjmDtatZjzoMzRw/K5gOsjy8gHz9F3P/AERRApycSXOBzQ2AD8u49dy8P2KpQNnEA5SSJBuJhoIZyHjm5IOHRfRWf4f4bs3EvxBeC4ABzRmgmIlu+y9pf4fYd1OXOxDH3gF7D4aNVz5HzlF3n/Q+Hy09rEFz6ZJ2YAdLRB2bausf5VjhvsTRJb2n8Q0ZSXcbZtNjkLc/CYOFRd7W+xGGDiGHEuhoMWkSCZOx/wDnW6y/6ColriH1hFPMLg5nbVhsjgLc1cTXAIvolX7B4NrDFWs6oALBzfM5cs2F45KE/YbDh0ZsSWiLiNCWSfg/qdbXZTDY4FF3jfsNRLSZxA2MwmDcBhiMv9ThH9KzP2EoZngOrwIymRect/g0ubTIjow8nAIvoNT7BYZrau3XLmgZLthxIt+X+aQrFb/D7CNEtdiXmdM7B9WqK+bIvoeN+wWGZSztdiS62zLXHnADbnzCs+7vB95iPmb6UHzNF9M93eD73EfM30p7u8H3uI+ZvpQfM0X0z3d4PvcR8zfSnu7wfe4j5m+lB8zRfTPd3g+9xHzN9Ke7vB97iPmb6UHzNF9M93eD73EfM30p7u8H3uI+ZvpQfM0X0z3d4PvcR8zfSnu7wfe4j5m+lB8zRfTPd3g+9xHzN9Ke7vB97iPmb6UHzNF9M93eD73EfM30p7u8H3uI+ZvpQfM0X0z3d4PvcR8zfSnu7wfe4j5m+lB8zRfTPd3g+9xHzN9Ke7vB97iPmb6UHzNF9M93eD73EfM30p7u8H3uI+ZvpQfM0X0z3d4PvcR8zfSnu7wfe4j5m+lB8zRfTPd3g+9xHzN9Ke7vB97iPmb6UHzNF9M93eD73EfM30p7u8H3uI+ZvpQfM0X0z3d4PvcR8zfSnu7wfe4j5m+lB8zRfTPd3g+9xHzN9Ke7vB97iPmb6UHzNF9M93eD73EfM30p7u8H3uI+ZvpQfM0X0z3d4PvcR8zfSnu7wfe4j5m+lB8zRfTPd3g+9xHzN9K0ftT7KYejiHUmvqloaDcib+SluM8uU4za+nqEKZQhVp6iKGtWLXUwGzndl1iLE/QFBMq9euWPpNhsPcQSXQRaRAi5som+0mu7PI1zs7w24yxLc8mf6brOjjm1MmSTmMXEQMucGDyLevJBVHtcbOyHS8tJa6Y23NFt9hyU+ExzKrWuIDXOnKMwMgAGx8x/y69oYxz4IouDS5wmRbKYkjr0R3tGmyM8idCASIkgEndMIYwb7QlrH2DTmBaLmWiYBtJsVgfa0Cez/KXGHg6Tod+nlKnp+0absoE7UxaNLnx8lg/2jQLBmOy9rjxsAZmPArWz6ZyvDjyRLQCAyo6xmSwtAAI1F1JhMXnYMxaHkOIvYhpjN4aLxntCm57WCc5mAW6fEL8Phd08FPTrA0w82ESeXFYvfsuVBhsWXml8JD6ZcY3EFo/7j0VxQVMQwU3VRtAAnZ3xuCjq49tO1QEO3gAkSZgTxgEqyVZKtL1Ume0mOGxJMGJBAJEmJix2T0Sr7TptDrOLmszloHLNE8YVyrlXIGsXXqqP9oU2uLDmzCJGXeYgeO0OqzbigaHbZTGTPG/SUymLCKCni2OqGmJzAcLaNJg/629V5XxWTMcpcGgTGskwoiwiq1sc1hIcHWDdBJObNu/0le4bHU6pIYSYE6eH/kILKKpU9oMZ2heHNFN2Um19kOt5FYH2rSAdJOy/JYTe56w0mEF5FWp41ji4NzHKQDsne4tnwlpvylZYuv2bc2XNcCAb34cTyQtxOiqMxsuqDIQGPDJO+YuB5hTV8Q2nlzfmcGjxKT36J79JUUVCo505mFkG0mZsL/28lhicUKeUEElxsBwlrSTyBcOqCwipU/atF2XKXEO0OUxGyJ8NtvXkV4PabZZmY9odmEkaZXtZeOJcEF5FVpY5jy3JLg5xbMEQcpdoYO5S4ernbMRdzSObXFp+iX29qfiVERAREQEREBERAREQEREBERAREQEREBERAREQEREAajxXJfaD8bU/Q36FdaNR4rkftF+Nf+hv0Kzy6cfX/l2aiyngpVHnPLotOzyDwKwqUA4tLmSWmW8jxCkzHl0TOeXRBEzDNbEMAgyIAsQ3KP2t4LGnhGNADaYaGmRFoMZfpbwUprQQCWgnQHf4Xussx5dEGLacCA2Br1uVGcIw3NMG83vvn6lTZjy6Lw1IgEgTpz3/ANighGEYI2Ph05LE4Cn3QtN4G+Z11+I9TxVnMeXRM55dEFahgGUwA1pkTtWm5JOnMnqp2sgAAQBYJ221lluaJjfHGJWWc8uiDF9PMCHNkEQQYIIUP8FTsezBIEXvz/ueqn7QzEieH/PFedraZbH/AAcUENPAsY4ubTAOm62unU9V63BsFhTERljdHCFOXnl0WPbf1N0ny466JpqI4Nh1p7gOmnnYX5LL+Gb2fZ5BkjLl3Rw8FmKsmAWzAPkdDryPRZZzy6JpqJmGa0y1kHjv3DX/AEt6BevoB0y2ZEEHQjw81JnPLomc8uiCA4NhdmNMEwBJ5TH1PUrz+DA+AGn+iBpb/wAdFYznl0TOeXRBXfgmOBzUw6dSYvaJPlbwXrsGw60x/wAnf5nqeKnznl0TOeXRBCcIw60xqDoNQ7MD8xJ8V5UwTHfFTB2s2g+KInxiynznl0TOeXRDEfYD+XV2Y8zpJ47kqUQ8AObIBm6kznl0TOeXRBFVoB5YXNJyOzC++CP7lKuHa+MzA7KZExbQ/UDoFLnPLomc8uiCt/AU8zXdn8MwNwktOn+kLP8AhGd2NSdBqSHH9wD4hTZzy6JnPLogiOGbIOQbJkaWPFZMp5RAbA/83Kzznl0TOeXRB5B4FIPAr3OeXRM55dEHkHgUg8Cvc55dEznl0QeQeBSDwK9znl0TOeXRB5B4FIPAr3OeXRM55dEHkHgUg8Cvc55dEznl0QeQeBSDwK9znl0TOeXRB5B4FIPAr3OeXRM55dEHkHgUg8Cvc55dEznl0QeQeBSDwK9znl0TOeXRB5B4FIPAr3OeXRM55dEHkHgUg8Cvc55dEznl0QeQeBSDwK9znl0TOeXRB4AZFlyP2i/Gv/Q36FdeHnkuQ+0X41/6G/QrPLpw9f8Al2IbtE7oH91Vr0O07OTZrsxEna2XCLcyD5K4oQtO7X0/Z7xl+9JIqBxJMyN9uf8AzgvKXs1zchc/O5j88uJvslp8DefJbJEFZzXPyHLkLH5oJBnZc06H+pUR7OrN7MCoXQ4EmTYDs5NzJJyO4/GeZO3RBqcH7Pqgsc97hldOXMeDBOp1LXWn83irVHBlgpw6S0EOJJuSBtCZvLR1KuIg1p9n1MrQKgBDYkF2vG51O+V6/wBnPtlqloAeJuYzAxE7wTMz/tsUQUDgX5IFTKctRsidkPgjLebQP9l6KNRtI0mzJBipMhpMkWkEgGLK8iDXfwFWBNXMcj2lxkE5iCDA4AAW4nRYt9l7JEtktc062l5cIvzhbNEFFmBIM9o5wggMJOWDMSJ3SOih/wDinGNu4YAIG8ADocoW0RTlPLtOU8u1XC4U0y24hrA0R4kny0jzVpEVUREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREAajxXI/aL8a/9DfoV1w1HiuR+0X41/wChv0Kzy6cPX/l2a12OrVWBvZU88gg8jaCeWq2KhCtdrNa4Va+ZsSB2xzTTN2EGIBOkxp46Kb2a6sWEVhcEQYgkQDfnMq4qmNxvZFgyOdnkCNxkATwF9VnM99ZzPe1hQdXhoJE9o8OJpkbIJyxffa/91HhsViHZc9PIC4icjr2YQI/LcvGbTZ538p+0Hns4yEOrOY4ybDaywQN8DXlxlTeysW+tSDqjcrhE85a108vi05KzlL7LOUtxHh8c7sj2xpsrH4WXEmBAh0E7Ui1isGYnFaOptJkgQwgOFt8nLv110XtH2o85AaQaXEWzn8wYbWvGe+lmlSUcc4ijnyBz3FrgHaEA2uOIA8xxWmkeGr4jO0OaMjnGSWOaY4AXy/6tVNhTUihmzZiw9pOk2nznTlKxw+LqfdNewF1SYI0Eag24dVli/aHZPydm50gEEAkb80wDEBpPNBYwznGmwv8AiLROzlvv2ZMeElSrX4f2ianZ2a0vz2LwZLTAgjUHiP3UY9puFOm4hhc6i55aHauaBsi08eh1hBtEWuHtJ2drDSEkuHxG5b2mlrj7v/8AQWTq1QUhUD2FuRpmNSdT4XlFk1fRaz/5NwjNTneYmSJO0G8IHHUxzWbMc94dlYW2dlJ1kCRsxv8AFTV8K2CLXP8AacTsggNBnNrOW+lm7UTOoKj/APlHGSGBoFIvhxvMMI3abRHMhNPCtqioO9oEOIDAW2h2a35JJtYbfP4SvDiavYOrDLBp52Ni85QQCd95Hmrp42NgijbUl7222Y33vOojkpEZEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQBqPFcj9ovxr/ANDfoV1w1HiuR+0X41/6G/QrPLpw9f8Al2ahCmUIWnd6iIgSoatctfTbkLs5IkEbMCbyfopli6m10SAYMiRMHiOBQU3e1Gty5mvGZxbugQ4tvf8ApOkqfDYsVW5gHNnQOEE2BsN9iNF6zCUm/DSYLzZgF+PivWYam2MtNgiYhoETrHigrHE03Br3MGUteHFwBcABJBF+FwsaeNpU2w2k9ggucBTiNbmOOU3VwUGAABjQAZAyix4jqVg7B0i3L2bQIIENAgHWOC17M+7FmLLnhoaQSHkhxuC0tEWn+ZRU/aJc+mzLBe0E3nKSHRuuNk/8lWm0GCAGtAEgACInXqvG4djYysaIECABAOscFi78F1jhnNqNp1soDnMBnUiRMT5qZeNaAAAIAEADcFkq0IiICSiIMXtDgQ4Ag6g3XoAAgCwXqICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiANR4rkftF+Nf+hv0K64ajxXI/aL8a/9DfoVnl04ev8Ay7NQF4GpAtNzuGpU6oYzAsrhucuGWdDEzEg8rK38drvwz/jKcgF7RLiwSdXDcFlQrsqNzMcHDl/cblAMAJnO8kVO0Hw2MEHdoQVJhMIyiCGk3I15CP7KTUnlvuzbiaZiKjDJgQ4XPAc1jTxdN4aWva4OJaIMyRJP0VdnsumMuVztiBqL5cljb/62qb+D+DbfsPLwNnfNtNNo876rTTKhjKdQEse0gHLM7wY+tlKXgakCIm/GwVSphG56UOALS9wB1cSc0RvAMHyCVPZ/aOD6rjmbpklo1kSJMkGY8UFgYmmcsPaQ6YIIIMa35LGni6bg1zXtIcCQQdQNSoaWCbTNOKjpDy4A5dokQZtwnRYnBMdTZT7V2UNc1oBbdpGXheAUFpuIYS0B7CXfDDheNY4qI+0KQAJdYtDxsn4SCQejSohgWmqysx+zOYixDpD4jl94VP8Awo7HsZMZMk74iOqLM+WbMSwxDxfQEwbGDY31svXV2AkZhIBOUGTbW2qqv9lsOrn3mTInMc21pY7buXJZ0fZ9NhBGax3n9XrP7KNZx+0wxDIG20S3Ncxs8Y4Lw4qmCBnbJGbXdx8Oag/+NbA232AGo3CAdOFuHJKXs1rPhe8WI/LqRBOnADlyQzj9rH8Qze9otmMkCBxI3arynimOfka6TE20iGnXT8zeqgd7Obls52YRBMajLG7+gKRuGc2gKTXlrgzKHgCQYiQNESyJ3vDQS4gAakmAPNRuxVMBxL27Il1xYbrL3EURUYWmwMcLQZGvgqg9lD7yajznaW7pALWNdci5OQXKrK2/E025s1Rgy/FLgInSeC9dXYJl7RljNLhadJ4KE4BhdmJcTM7rnZ5f0hR0/ZdNuk6tNwPylrtYm5aEE9bF02NzOcI4i+4ndyBWfbMkjO2RqJFt9+hWFLCsY9z2g5na7RP7HRVnezA51Ql7gHaREic+a5G/O5L+NZFw12CZe0QYO0LE6ArJrwSQCCRYgHTxVM+zGbUFzcxmREgyTZ0T+Y9VK3DOYXGm4bRkhwkDU2Ajjc71DJ8Mv4ylMdo34suv5uCla8GYIMGDBmDwKr1ME10yXXJMWsS3KYsvKWENOeyLRJk5mzvJFxB3nWUMiZuJpnSow3izhrw8V6azbbQvEX1nRVG+yqYiHO0A3XHDRStwTR8LnDbz7tdwuNAhnH7ZuxdMEDMCSYEXvIEW0u4dVmys0xBFyWgGxJEyP2PRR4TCNotys08BuEC4F/NeswwGXaNnufuuXZrG2m1ujQc1UufCdEREEREBERAREQEREBERAREQEREBERAREQEREBERAREQBqPFcj9ovxr/ANDfoV1w1HiuR+0X41/6G/QrPLpw9f8Al2ahCmUIWnd6q+JwwqOpOtNN+a4ncRbhrPkrC8Qa5/s1znNJqAZXucIB3meO5S4HBvota3tMwmXlwJLtmLXsZAJ137zKuogpUcE5rWNz/C4mY3FpbrxvMn/dRN9muaG/eEloO862uL2mL+PjOyRXyqeMUsNg3MyEkGA4EXiHBukzvb/+isafs8h9NxcNjcBG9xEXt8RCvos2b2njEWGpFlNrTcgXjSd8clKiKtCIiAiIgIiICIvEHqIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiANR4rkftF+Nf+hv0K64ajxXI/aL8a/8AQ36FZ5dOHr/y7Na7HVazA3sWB8gg8jaD4a2WxUIVvu7Wa1wfXzCMwArHNLNWEGLE6TGnipvZhq5CK2oIgxBIga+cq4q+Jqua6kGhuVz8riZsMpIjzAHnzUnFJxy9qlOvitjMwXImG8RTka2ial/6R5yU31R2YdmJ7RwfsH4YdlNt3w/8Cjd7SeHNDWB8vcHEO0ANoteQpsDju1a0vZ2ZcYDZzflzGY0IuL8PJaaQsrVaZY1xDi9zy4n8rWumYn4cojkS1SVcY8uHYNbVYYlzSDlIO0De8giF7SxjnCm6Ilxa5ouPhJEO8QBPPio2e03kNJpRMztjdFvHlrZXxrPlGVCvWd2edpaS5wMNMRGyT5xqsBVrtpU5DnVMjswyH4w20xbVSUcY55ZIDWkOJIuCQGkAEgcXfIVlh8Q9xpgkGc8xvAIh09B/qUvtcXUQxVYV6dN2WHE/l1A7S+tvhZx+I+WQp1uwa4Pf2nZDZMfHlM675PhshbBEalxrBVxIBytzC+XML/8A9MsmeAp2ibqznq9hIA7TwMa8DB0VpFFvL8a1uIxMGWDNldAy2kB0GZ4hojnKnpvrdrldlLI+INIn+w4RKtoh5fjX4mtiA92RgLLRY8BJmbxe0Ia9e+yPgBBDHRmkSOPHSY389giHl+NZUxlcEksyMDQS5w0JLJ3wfidafy9fcNUr1Rt/dgta4FoMzDSdba5hGq2SJi+U+kVKpJcy8sgEkWJIm3/N6pYnE1mueALZmhpDCdQZtaTbdZbJFWGvfVry4NbBhurSQNlxcBcTeB5rCrXxQBLWNubS07Il/CSdGbt5WzRBSqOxG0Whp2oALd0azmE3XlftqYlhzlzr5gSGjaNg2+pA8B5q8ivwsqg2rXc5wyhozwHFs22p4cG/MvHuriYuQ9xjLYtjZGv7rYIsr5fio6m9uWHueTUGu4ReY3RJvvhTUHOIdm/mcBaLTbeZtv38ApUVZEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAGo8VyP2i/Gv/AEN+hXXDUeK5H7RfjX/ob9Cs8unD1/5dmowzdIUiqYig52YAakG+8RC07Wp8h4hMh4hV20HguPERPS/1WZoHMYAaIgEbxaZ6QibUuQ8UyHiFCyi7KAQDlZAG4nf/AM8Up4dwcwyIbNvGZj9kNTZDxQ0yeCxq0yXtIAMTN+Sxo0nNDbAXJIBtpwRdSCn4JkPEKt/DOmQANqQLW05cj1Ulai5w0uHEiTMcNR+yJv4lLY3hMh4hRGkduG/E4EQfCfos8XR7Sm5sAki08UWVlkPEJkPEKi/2e7M/LlDX7JEaN2dw1sCI5r04N5Y4ODXOLQM83sAIuN8T5lXFXch4hMh4hMOzKwCIjdb+wAUigjyHiEyHiFUxuFqvrUnsLQ2neDMnMQHaaQ2Y1+LdqoP4XFwzbBIfc5yLAsA5GQHEgjV0c0Gyy8wmQ8QqRw1Qh+yJFZtRsumwib7jY9YVXEYHFOcTIgPzNAquEbNVsg3j4qdtLG3ENuGcwmQ8QqNfCVZfkIGctc4tOUmBBFtNAZnkp8VhjUw/ZulzobJkAkggzcQdNCIKCfIeITIeIWswtDEBzg8QA0Nhri1p+7ZZg3DNmuhweJ7MQ/K4U8kB9hsOEgRHxZDPJBs8h4hMh4hUKWFriq0moTTEwM02zPjNOuyWD/T1ypYSs3+H23OLR97meSCYEn9rbuQQXch4heERqQNy8wrXBkP1l35s1sxi8DdHhpfVaTD+zsW1suyvqdpTc4mr8WUAO/LvgwN1lZFk1vch4hMh4hamt7PxD2ODnEuFYPaRWIDmh5MAAbMNgeI81L7TZUxDAyiXU6jXZg5zCAIBFiRfVXFxsch4hMh4haTE0Maw1ajXk6GkxpLry2GnlZwJ5yeUr8BivvWtqkh1Asa5zjIqZQA4AW1knfz3Bh4/rbZeYTIeIVPD0CMQHdllb2DWjTZgmW/uOVljiMFUzMFI5WMbDJcdmGPbpv1bfkfPFuMW4vZDxCZDxCqUsLUD2PdNswjtCYBIIn+bQ9RwUmEwzsje1u5jiWkuJOhEnnc8k1NT5DxCZDxC8w9RzmkvZkOZwAmbBxDT5gAxulVfaODc6m5tKxfmzbREktgGeGlkq32W8h4hMh4hUX4Ss4PDnEjMHN2yJh5No02YHiPNe18PVPa7LXtdGUPMgcbaW101U1N/F3IeITIeIUDqZpUnPp0y+o2kGhua7soJa3MeZN+atRIutNMMh4hMh4hUcVgqpc3sjDWNhkuOzsPbpvuW35dcqeFqB7HOJsHiO0JgEgtnjp9NYWdZ2/S5kPEJkPEKgMJVIpZgC5j5zF0mJGpMnoQPKytkGmWNp05D3nOc3wghzi7ntQI/q5KyrLqTIeITIeIXtSmHABwmCD5gyFrH4Ovme4HW3+YRIBqRusBmZbkfNbhbjZZDxCZDxCpvwlQCrlJzPLSCHncACI3aHTcV63BPNVzqha5j6eQgTbS0zprfmpt+k2/S3kPEJkPELxr3do5mSGBrSHzqSXS2OQAM/wBSxxNEuDnMtUyOa0zpMf3AWmmeQ8QmQ8QqGHwlZrmyYbJJGc2Bc8meJILb7oPnlRw1VjaIB+AQ6Xkg6X4+G5Z38Z8r9LuQ8QmQ8QquAwWRga5oAY6WCbjZi5AEm7uqs4eo5wJczIczgBMyASAfMCY5qxY9yHiEyHiFU9oYNzqbxSsXkl20ROxlF/JvRSYWlUa9xeZaZi87zEDdAgc033N91gMK4/7RfjX/AKG/Qrs1xn2i/Gv/AEN+hU5dOPr/AMuzREWncREQEREBERAREQEREBERAREQYVKQcWne0y3xgj+5Wso4fEtvJkuBO0NYpiTy2X25jy2b6YcWkzsmR0Iv1VGlTrkUy8vltS92gublNyBbXdJWaxyOwqtbDS6e0Ju6QWkki8yBcdNCocZgqrxUawQHVM3xajJltw2oPLUXCmosxLrPJaC+5GWQ3K6QNbTl58gs6OHLnVMzXMBcIGYQcpmbE3O/S0BTNTNTVAabXPa0vecoIB1Nmzy4qWtSD2OY7RwIPgbFY0qpc54ykBpABOjrAyOV48QVFjMOXMqlhcHvZlEGNJiOGq1031EGIoVjVLmkwActxpDbAcbPvzHl62hV1JdJpkWcLGTlkGxMEX4hSdgWOOVpINMNluUGRPGOP7KHCmv2jAQ4Na1ocDlj4TMReZy8oWWGVOjUzUnPaSQ1wcQ7cdN+v/JKlweHhjM7SHMJgTxnhyKzp/dmnRa1xaGHbOgy5QATvJk9CpKtIOIN5bMX4gj+6sjUjzD1HPYHOYWEzsnWJMdRB81VxuFeW5acw4uLhMXO++7W3goWU8UxtNoJIBbJJbpDJB0/r/5dYNo4uGklxcBrLbEzr/TpzUt34S3fhMaFY5sxdZzSAHRMOMxyjLY8F7XoVXNrAguBjJeL9dBbh/dZBuIcSCS0SBIy6ZnSR5ZVA52JLqjWudY6w3SXfDMXjLMnj5xKsDC56lXOzK17ctj8U6kxv3DhHNWW1HGo5mQhoa0h82JJMgDlA+ZQsoPeKgqudlcMoAgWLRJtcGZ3qZtUmo5mQgNaDn3EmbDwgdQtxuMcTRJDnMtUyloM+fVU8Nh6zXNBJDJcTtDQueb87svyPnbxbDlc9pIeGED66cbKrRFd7Mwc4HK/KHRc5nZM1uEKXtm9vaVCs1tFt9lsPl1pjWZn9uiqUvZtUGnaMpnUWvTmY0+F2ms31KshmJOyZyOsS4jM0SZ0tJFl5So4kFhLiJdtxB0ytGpEAgE24rNms2akFCocphwy1S6MwEtII3a6jVWX/d3YwuL3ib6TAJ8AAoDRq7BL3kioS4AtGztAeIu3/wBrFwrS+A8A1JsWZi3LFpt8QGu5a6ansu1aYe3KdLfsZVTE0HRXyN/zGCCCPiuLz5eSjdSru7UOEtkFgtqHE2PhGsf3Vqseza+o1jnuIGwNSdAP3Tte1atSxBLy1xAOjSRYfd2HO1TfvVhjCxnaODn1GsjmYvEC0qeowOaWnQgi3Na+u6sKrmMLvgOXSPhtJO/N5J0dNhTJLQSIJFxMweEqv/DZHUcjZDAW63Ai1zrooa7MQHbDnOAbqctzDrG2s5eUKHsMU4lxIB2YAOzZzvOND5xuS38S38S06NaGxLYcTEi4Lwbxrsz5qNmGrFrBUGdwcCXWlsROW+hI6TZT4enXJbnc4NBJM5c2jYBi2ubTdCxaK0NGV7fvCSZZ8Mzx8uqziYsv+7jIwuzvvfSdT4ABSVaQeIdpIPQgj6LX5MUQdogiT+W5g6f0zl56r3EU8QBU7MuLi+WklpAGXcDzj/da38a38eOZWc2sNq+YNBI1nZgcI14rx7cQ51TKXNE2BI02DDefx3nfrwstw5LqgcCG1AJII1iDzlTsqkve3KQGxDjo4mZA8LdVM1M1E1pZTNQhz6gpwRvdEmIFpVhhJAJEGLiZjzVbGUC5ryyc5aAIPAzabSoKTcQajA8Hs7h05TI2omN/wzFuau4u57JRQex9JtOeya3KRPAGLzJOmv7KuKGI2IJaAbiRcZnEzxtH7rNlCq1lKG7babmSSNYEE3uJHjfReNGJlvxRO8tmJE545ZojlKyy8wlKqWUn1AS5rg7aIzAFkO/ckx/6UTsHiHAZzmdBAMgBriBDheYVzCUamUds4lzXBwMj+QAzHMuU+Hql4JLC2HOADt4BInwMSFZx2LOOxSdQrHNmLrOaQA6JhxmOAy5bHePM2cO2oKlTNJafhn6Rw6f3UOPw74DqObMXlxgjuy0fFaJyrPC9t2r+0+D8unHdF9I1/wB0+Sdri4z7RfjX/ob9CuzXGfaL8a/9DfoVeXTn6/8ALs0RFp3EREBERAREQEREBERAREQEREGFSnmLTJGUzY62Iv1WrwwxTWUwc1oBnKToyZ/p+O4voto+nJaZIymYB1sRB5XnyWtNfENa0uB+KCcovdkW3CC/nbU78cmOTDE08S4fmkE5YIFo2Zgi/HUclK9+KGcgE3MDZ4PiOX+XrfVZGpWLbtdIczQa32/KFjW/iCXZcwyvJaQBBGV8CPHLx13bojN38RtXdBO4NkDN+Xy4r1lOs91RtQuFNzSBAAIkC4cLz8W7/eeo/sg6oc7pLdkXgmG2Hmpa1PMxzZLcwIkGCJ3g8VrGsYtrTUczK7Za12aNkyXCAeIy38Qo8dRc5jywuz9m5rQDFzp52UdftRUeWlxBY3KIEAyc0c4g81VqYuu05ZGbKTBDdAHQ517GQOSWlqVpxMic+W+5kxLtecZIi3FROp4kvpuM5h8UGG/F46RyJUlKpVc1tRsuMVWibA7X3ZIFtBrzVnCte5rTUc6Wk7okRFx5rPbOarU3YoBshxkwZyyPgmYtH+ZpyWTP4gBuYuNwXEBkjZuOET5q5h63aMDg1zQZs4QbEifOJ81DXpPGTI98doS6INjNr7gYWsXMVKrcQ5rw4PJLtnJDcnxXBBGa0QDv/a9Vd2Qc8B7y5zRlF9SG2G4bz5rX4vFYimx7tNYsJmHwAN4sznc+Una1Xms25LIIDYEbRgAg/wAoFjxUlSVsa1POxzSSMwIkGCJ4FVa7KwfVLC69MZBs5Q4Tu1nRRVn1iaktcW/la2WnUQcwIPGfDrPPZUzVcaj8tISIucoJJDf5j/4V7a7YVhVa7Zzv+7cJ2RtSI89d0aKAHFxM3DTYhsE/eQTHhT04raAyOCpVKdVhaKbnODaRAmCC8AZcx1vxSxLEeHdUeGVNpxzPALoFvykxYi25TYOnUc1prOdma6RYD8sQYsRc/sqzsTWDmN/mOyCBLrmcw3WjRe4WrUqBj5c4NqRIgS0svIBgjMf2WZUlX8PWztLsrm7ThDhBOVxE+BiRyKrY5tVjCaGYvc4nUW2bCDukBQf/AOh1NufN2mYHZBAGmYWIEawTPmrz3dlfbfneAALxMDyA16rXbXaGo2ttEOdd8ANDZDeInfPHcparuza+pD3mBsC5J0AA0m6lqszNiSNLjXVVKnbNdUgvILmxABhsCcvOZsU6OlyqzM1zZIkESNRPBVz2gqEbeQN2cuXheZvP7KicbXDi1xDSGguAyw3/AC5Mzrd9jwHnKx9YsbUaCXOpeWaZ0mAYKnlqeWs6Ta/Zt1a5tL4TEF8EXN7aaLItqfduAeXAOG3lBuLZg20SNyxpjEGpSLvgE5oMbnXc2P0/urDH9madHbcS0nMb/DA2jxMj90kJNYYSnULWmq52ZrpFgJ2YgxY6n9lNh62dubK5tyIcL2JE+BiRyKyfTktMkZTMA62Ig9Z8lQBxDQ0bTjmdJIF9oZf9MSZ/9K9L0mxLKjQDSLiS+XC2kaSdBoqzquJD3gBxi4EN0PaAQfJmqifj6wa45rgxYNO3B2RxE+as1+2aanZg3qAybw0s3D9Q05rO6zu9PJxJc8XAlsHZMbQmP9Mm68qsxBc8S4stEQC4AtmHAiCRm/2UlGk8uqtcXhrh8UkQZNm3IjwA81bZWl72ZXbIFyLGZsOY/uFZNWTVJ3bgvyBwGQ5Acpg5REnXNmnfEL2u3EgnI4utAzBuuVxnQb8oVjE0nFryxzg4sIbB0N4PiqtarXbdswGTtAD8rpJPGcttI/ZfYvskpNrnLme6wcTstkmdkEeE6R5KTCse5jDVLg9pO8X1FwLb9FSoYyo59MEy1xIFhLgC+5jkGXHEqVhrjs2gEASHF15vvPCN/wD6SVJV3D1u0ZmyubJNna2JAPnE+airse2MheQXkuiCRIOma0TCi9nUqhY3tS4Oa6bk7WzeZJtJPKwVrD1hUBIDhDnN2hE5SRI5Wstdt9xWiqTUAzNmoIds/DAmPMHUKbD9pnfnzRNvhyxuiLzxlYYqk8NJY98l7XECDAsCADutMeK9w7qpqPDxs3iwjUxB32gnmp8p8rS4z7RfjX/ob9CuzXGfaL8a/wDQ36FOXTl6/wDLs0RFp3EREBERAREQEREBERAREQEREGD2ElpzEZTMDfYiD1nyVBtWu0NF3HM4Eln9QgeEEmeXkr72ElpDiIMkcbER+8+S1oxeJIbDN5zfdugwAREkEbxcLNY5Ine0qoa4yJBj4fzROXW996sV31mdoKYJmoCC4FwDSzdE/mGnNZGo4hxh+xVGjHCW2m2/fp4qN+NrtDyWNs/K1sOBMlwbc2N8ptNpWU/15inVvvA3tNW7jYXnLGsWsFZ7R1Kka1UucRTBcxom4BnKN5Mx5BSVanZBz3uJBLRAGhMNsOZKlrMLmOaHFpIIDhqOa1J8tSfLJwkETEjVUq3asccpc6KeyC2QXDieOiwr4mu2o8NZLBAByE7pJsbxwWFXEYgsdDdWkCGEGcriDy0bbmpalrB+Ortc1sCSHZQWxmjtIJvs/CzqfKWhXe8MeJcA9zbAgEQYkeMXQYnEFzRka2xklriAdq0i0CG3MTKnwlR1VjKnwAkkNG9sQJ+qkSe6vSq1iKRqZgc+0GtMRlvNtx8vFT4YOcHAuqDLUkFwgkcPBWMPXbUYHtmDMSI0JHSyrYntWQWEuu5xBbNtQ237LWYuYsUawfmgHZcW3GpGsct3kocWx4a5zHOkuaYAmACA4AeElVauNxDWvIpgkE5QGOP81ja+guOO5T1318ry0wA9oADCTlluY631Og3JbpeUqOtiqzS6bMH5i3QS0AjiSC7wjrFRxdWqchsXUs0NsQcrCDM2u53QedrNUe6rTMtGXZeGkRI4nUzOisNrNNR1MTma1rja0OkC/HZNlM0zflUbWql8EFtPJrlObS50sZ3LDCuqE0M3aghgzkgwTBEEaTN55DirmIzgOeySQwwzcTqFXfVqDK9oc8mm+2VzQXCC2WnT81z/AOEMWGVAw06RLnOLScx4NiST5hSPZJacxGUzA32Ig8rz5BU6WJqktBEAzfs3bV7W/L5r32ear6dM1ZY9pGYR8WzvJ11B8RCu/C78IxVrtaBdxzukln9WyLbiJvuVet7SqhryCJbb4Zh0OOXW9wLra4eu2o0ubMBzm3EXaS0+UgqtjHVabZpw7M+dppIaIsIbJ1GvNSyxLLPlhXfVZ2mQEy8EEgkBpaNNfzDTmvHufNUHtLtaRDXQHXmMsGNF6MVXLqgDIhzQ0lh0LiHeNr2XrzWzPbmvnZlOQxltmvN99pREgqGlSNaqXnLSBczUy0EmANXGY8greo4KqK5ZSNeqSAKQc5kfCQCXQNZvEcla1HBajc6UX1KrKjGNBcwNhziNdl154yG9VkDXhlwTkLnbMS7ZhuttSoq1evTcGtaXtay5yEkkDjMa/RKeIrnI4t3PBbkNyCMlzdsidVnWNeMxOIkDsy4OIGYtyxcSS3z6NJVs1BSLGkucajyAYmJDnX4AAR0UGGrV35MwaJnMcjtBlgQYg3PHRRnGVQBlY5xzmZpuGzmEeFj4W8klxZc92wqMzAQSIINuRmPNUW1q7nPGXKMzQ0lu7MQ7xsAfPyU9JrjnbmcIqSCZu2xgE6jUclNRrteXhs7Dspkb4Btx1+qva9qtV9YZzNg4AQyTlgS6N95H/pQ/xNcgipRcABJLDBJtAEXHxa/0lWcWarJdT2i4ixbIaADw4kBVm4zEb6cWE/dut8En+rV5gaZVKzVqmTTp9o97nZae1IiYEkxxVljpAMESJg6jxVLD1qziM7coIj4SCDlBmSeJIhWKdUBzaRJc8MzExu0knif7FajcVy6rTqUqYzPYAA55EzrJJ42HXoomuRSzESWlz9mIOzs621crbmEuacxAAMjjMfSP3VJuJrhtPM2XPDSYYdkktzA3MQCdeCnTN9kbMViYH3eabTly5TDbxvAJPk3rNhWPdnlzw3OC2ZBi0jav/bgoqeJxJy5mDcXbB/8ArsL2+J/yrKjiMQ4CWtaS+DsO2RlJMzE3AEgxdSJFyjXD88A7Li241IiY4i8eRWTGQ5xkmYsd1osoqlQUpc9ziHvaGiJjNDQBym/mVYW3QXGfaL8a/wDQ36FdmuM+0X41/wChv0Kzy6cPX/l2aIi07iIiAiIgIiICIiAiIgIiICIiCOs1xgsdBEmCLOsQAfMg+S17PaNZ5bFEsaTfO10/lO7SQ7yghbRFLEsaxuLrOvGUB4BmmfhIOoncYuFi7FV2g7AdtGHFhsJqRMa/C24/m67VFMv2njftVaarzUEhgEBpymdGmZOupGm5TMrtc97AdpkZraTpfyUiQrFiDEF7Q97dqG2bE3k3tc+HJVv4iqHSNtpH8hF8rjI5WAjmtgiWFii6tUBYHQS5riQGOiYsCbqNuKrQx0QIeCOzNyPhi9gbwtkimJjVNx9cZQ6nfPFqboiWjjbUnhbkrWGqVKgM7Ja/c0gEWMCdeE28FbRMMv2jo12vzZTOVxabbxr46qvjKr6TXPBkF29pIYMvAXMkfurgCxewOEOAI4ESrVqi7FVsrnBrYGUAZSdQ0l2twJPTVY/xla5LBEDRjjeGGd0jad8q2SKZftMv21Bx1c5SGEEAnLkdfZN53Cd2tlewznuDXuIFnAtAMG4g3uLA9VZRJCS/aLDYhtWmyowyx7Q5pIiQbixVWtiKlN9Ng280k7JmM7RFrCA7U/yq+vIvO9WxbGup42oWNLmlpztBAY7QgFw8p10shxNcjQNgtM9mTskkERO6AZ5rZIplTL9oKtUUg59RxylzQ0RpmytAtrLj+6krNJa4NdlJBAdEweMLOEWmlHE1nse+MxBa0t2SROYh2nLKTdRDH1SLU9rs88QbbojWZv4c1s14GiSYEnUrOVnL9qmHrVXlshoES45Te5AiYjQHf/dSsqhhp0nvzVC0mY1ywHHl8Q6qdIVkWRg9pJaQ6ADJEfEIIjqQfJavDY6vkpyySYzOcxwvDZEbjc30totuiWJY1lTF1mMcYzuD3CBTOgkgWO8RBUBx+Ibmljtmw2Cc3xXMaXYdP5m8VukU8b9p437a6rjKwzAU4ykXLSRtXBtrAseandW7Om6tVdDRTDnNAJyxJcRvOotG5WkIVxqR4bi1lr8RiqtNwY1hqQzXKbkNcZkW1AEc1sUSwsa+liqpdTBA2pkhjucEzECw4/3WFLEV4pE7RyjOMhFy4A+BEk8LLZopl+0y/bW0cVXcKbnANl8OAY42LZvOl7T4eCy/i33A7wjMabiAIkW/aVsETKZftBUqilLqjiQ57Q0RpmytAtzvPPkp0hFpoXGfaL8a/wDQ36FdmuM+0X41/wChv0Kzy6cPX/l2aIi07iIiAiIgIiICIiAiIgIiICIiChjcU9lRrWxtZIEa/eAPjwaSeWqio+1MzKbnZWE1MjhmBGk2do7UXH7Gy2iINRU9rvazM6m0WzXcYiJAmPistjQqlxqAxsvyiCeAN5AvfdO66zqUmvjM0OgyJE3WaDXV8Y4trZSGup6AXdA3kEaH6ftjU9qkPeAwEDQ5tBLBmdazdsnwYfLZog1+Fxr3V3McBlgFrx8J2Wkhp36k33aTeNgiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgLjPtF+Nf8Aob9CuzXGfaL8a/8AQ36FZ5dOHr/y7NVK7njPlJmRpeBl3DxVtYds3NkzDNE5ZvHgtO1Vm1KgLpB0sItNo/usyXhxDcxgbxYm1wdLXVlETFVj3FonMMrNqBcn/n1CU3VMzJBy3kx4677WVkuA1I49NUaQQCLgoYiquIe2C6LzAkaeCxovdDdbk6tMgRaVYRFxUaXne747GN0AmZHj1XuIfUy7MzmIs3p/7VkOEkcNV494aC4mABJKJiu5x27us4RaOFhx3qbEEhhiZ3QJKzc8ASTAsL87BeOeBqYtPkEqxVLqkkbUGYMf1AfSeqlYXZ4Mx4WiNZ4ypmuBAIMg3BXqz4/qiIi0NdjalUV2CnnjZsG7J2tvM6LbMkXCr0/aOJgTQJLrSGOblJDbkG8AuI8Gk7luHOA1t/uvHVGjUjUDzOg/cINd21YtDnhwhzHbDHDZJhwIvMf8ChxHtDEtbULaRJB2funH+e1rn4W7QttdNyvCRx0Qairi6/35yuGVhyNFJxvmMXHxEgA20lSVsbXa5xDdidk9m6QJpiSJv8brW+FbCrWaxrnucA1upXlOqyqwOBDmu0ka+R+iCLCV31MNTqQ0vexroktEkAniQssQ6r2Dy0AVcpyhpzX3RIEqXtG3Ei2onRBVblD5GUgEHx0QaytjKzYFJr3tyEgvpuknbmdIiG2IvmsvKWPxHaMY5gkkTFNwkEtkzMNgF2uuVbBuMpESHiJjznL9VI17S4gEZm68RNwg1jcRXb2bGtJGd4c57XmweMoBAOrT8RtZeHFYlrQIDndo8EupuAABOQbM6iNrTzW2m8L1BQwFaq+rV7QEABsDIWgHM+QCfitluLaLGriK2eo1gPxAAupOygZSTwBuNx3rYogpY+o/+Fc5mdtTJLQ1skOiwiDvsq9HEVjiXkh/Y5JAyH+VpG6c05xGvJbVFWbx27rU1q1f+JMdoKPZzssmLG4sdqd37K1gqr3YVjnA9pk2g5pBzAXkROvAeCuIhOOXdV8BVe+kHPBDrg7JboSJAN4VhEUaEREBERAREQEREBERAREQEREBERAREQEREBERAXGfaL8a/wDQ36FdmuM+0X41/wChv0Kzy6cPX/l2ao1MG4veW1AAXB0RvGWJvpsfury1Fb2bVNarUbkbmMghxDnCKYLSQNkbBuJ1Ctmu+S9pR7LMy54cS0t3jUEWg6XlZUcGW1KRzszMaZGUSRfQbtRcRMdK/wDAYqMvbANI0zukHKWgB2sCxnxKldga0DK8Zg2swOLiS0PdLDJFyMrRB68Z4w8ItYjCh72P2ZaCLibGND5fuqjPZYa5kPENIhtxBhmkHXZJ/wBXXD+BxMsh4aGkn/Nc6ATpcbduMQvcNgKzCw7M9rnd98427MM1LdoyJulkpeEq1j8D2xacwGUGLTcxB/ZQn2W6HfeRJvA1G0HTf4iHa8gqr8FiWMYA9zzaYqP+KGAunhZ1jbaW8TxlS8J21+I9nueX7TQ1zg6IN4EQfr4gKzWol1IsBvFieI0lTorhka6r7Nc95JqSwuDgwiwu0nrtdRwvLQwZY5plsNZkNrm8jp/dXEU8YnjGvoezy19N5cDkaG7xoCLX3yLcukmKwrqlRpBLW5TmI3n8vQklXEV8YeMa1ns1wyw9oAIJAaYgFhte3wH5ip8bhHVSMryyxDrfEDEj69VbRPGHjGtb7OeA7baSXtf8MXaZJgbzopTgY7QNyjtHh1hB3T46GPFXUU8YeMR06cPe620RoL2EXWvxHskufUqMqkOeIiNL3v4fVbREvGWZVxqsN7OrNFXO9rs0ZWyYFoMnmI6LKp7KzilLspYZIbcHzPgP3WzRScJOPivL/rtQo4N4ruqEsyu3AXHnvVd/sdzab206zySzKA92yLyCLWiB+626Jx4SdLtaTD+yqwa7O5mbagNOyZdmgy3Qm5hWqmBqtYG0agEul2bgABlFtLb1sUWkUsBh6optFd7XVBaW6b4ub6EdFcAgL1FQREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAXGfaL8a/8AQ36FdmuM+0X41/6G/QrPLpw9f+XW9s7un9W+pO2d3T+rfUuV94+C7rEfKz1KP3hYLusR8jPUtOzru2d3T+rfUnbO7p/VvqXI+8LBd1iPkZ6k94WC7rEfIz1IOu7Z3dP6t9Sds7un9W+pcj7wsF3WI+RnqT3hYLusR8jPUg67tnd0/q31J2zu6f1b6lyPvCwXdYj5GepPeFgu6xHyM9SDru2d3T+rfUnbO7p/VvqXI+8LBd1iPkZ6k94WC7rEfIz1IOu7Z3dP6t9Sds7un9W+pcj7wsF3WI+RnqT3hYLusR8jPUg67tnd0/q31J2zu6f1b6lyPvCwXdYj5GepPeFgu6xHyM9SDru2d3T+rfUnbO7p/VvqXI+8LBd1iPkZ6k94WC7rEfIz1IOu7Z3dP6t9Sds7un9W+pcj7wsF3WI+RnqT3hYLusR8jPUg67tnd0/q31J2zu6f1b6lyPvCwXdYj5GepPeFgu6xHyM9SDru2d3T+rfUnbO7p/VvqXI+8LBd1iPkZ6k94WC7rEfIz1IOu7Z3dP6t9Sds7un9W+pcj7wsF3WI+RnqT3hYLusR8jPUg67tnd0/q31J2zu6f1b6lyPvCwXdYj5GepPeFgu6xHyM9SDru2d3T+rfUnbO7p/VvqXI+8LBd1iPkZ6k94WC7rEfIz1IOu7Z3dP6t9Sds7un9W+pcj7wsF3WI+RnqT3hYLusR8jPUg67tnd0/q31J2zu6f1b6lyPvCwXdYj5GepPeFgu6xHyM9SDru2d3T+rfUnbO7p/VvqXI+8LBd1iPkZ6k94WC7rEfIz1IOu7Z3dP6t9Sds7un9W+pcj7wsF3WI+RnqT3hYLusR8jPUg67tnd0/q31J2zu6f1b6lyPvCwXdYj5GepPeFgu6xHyM9SDru2d3T+rfUnbO7p/VvqXI+8LBd1iPkZ6k94WC7rEfIz1IOu7Z3dP6t9Sds7un9W+pcj7wsF3WI+RnqT3hYLusR8jPUg67tnd0/q31J2zu6f1b6lyPvCwXdYj5GepPeFgu6xHyM9SDru2d3T+rfUnbO7p/VvqXI+8LBd1iPkZ6k94WC7rEfIz1IOu7Z3dP6t9Sds7un9W+pcj7wsF3WI+RnqT3hYLusR8jPUg67tnd0/q31J2zu6f1b6lxvvEwub/IrZeMNnpP8AdSe8LBd1iPkZ6kHXds7un9W+pO2d3T+rfUuQ94eDn/Jrx+lv0zL33hYLusR8jPUg67tnd0/q31J2zu6f1b6lyPvCwXdV/kZ6k94WC7rEfIz1IOu7Z3dP6t9Sds7un9W+pciP8QsHvpV/lb6li7/EPB7qNc+LWj/uQdh2zu6f1b6k7Z3dP6t9S5Bv+IeD30a48GtP/cjv8Q8Huo1z4taP+5B1/bO7p/VvqXI+33E4x5ILdltjHA8F6P8AEPBd1iPkZ6lo/av2rw9fEOqtZVDS0C4E281nl7xy9bjbx9nHoiLTsIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiD//2Q==\n", + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# | echo: false\n", + "from IPython.display import YouTubeVideo\n", + "YouTubeVideo('HGsG0jVFREY', width=560, height=315)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + }, + "vscode": { + "interpreter": { + "hash": "0a92af74ccf65e106ae96852a45a9b0a5e11a3c414a16fc8bb2d134868e55bfd" + } + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/nbs/index.ipynb b/nbs/index.ipynb index 05afd17..6c641a3 100644 --- a/nbs/index.ipynb +++ b/nbs/index.ipynb @@ -17,13 +17,6 @@ "Simply call - " ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": 1, @@ -33,8 +26,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 304 ms, sys: 65.3 ms, total: 369 ms\n", - "Wall time: 469 ms\n" + "CPU times: user 263 ms, sys: 53.9 ms, total: 317 ms\n", + "Wall time: 407 ms\n" ] } ], @@ -56,6 +49,72 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, + "outputs": [], + "source": [ + "import ast\n", + "\n", + "os.environ[\n", + " \"AD_MAX_ITEMS\"\n", + "] = ( # os is already imported by torch_snippets, along with many other useful libraries\n", + " \"1000\" # Set the maximum number of items to display in the AD object\n", + ")\n", + "\n", + "\n", + "@tryy # This is a decorator that catches exceptions\n", + "def extract_all_list(file_path):\n", + " file = readfile(file_path, silent=True) # Read the file\n", + " tree = ast.parse(file, filename=file_path)\n", + "\n", + " for node in tree.body:\n", + " if isinstance(node, ast.Assign):\n", + " for target in node.targets:\n", + " if isinstance(target, ast.Name) and target.id == \"__all__\":\n", + " if isinstance(node.value, ast.List):\n", + " all_list = [\n", + " elt.value\n", + " for elt in node.value.elts\n", + " if isinstance(elt, ast.Constant)\n", + " ]\n", + " return all_list\n", + " return None\n", + "\n", + "\n", + "def print_all_lists_in_directory(directory):\n", + " dir = P(directory) # Create a pathlib.Path object\n", + " for f in dir.ls(): # Iterate over all files in the directory\n", + " if f.extn == \"py\" and f.stem not in [\n", + " \"__init__\",\n", + " \"_nbdev\",\n", + " ]: # If it's a Python file and not __init__.py\n", + " all_list = extract_all_list(f)\n", + " if all_list is not None and len(all_list) > 0:\n", + " h2(f.stem) # Print the name of the file as a heading in jupyter\n", + " print(\n", + " AD({\"items\": all_list})\n", + " ) # AD is an intelligent dictionary that can display itself nicely" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/yeshwanth/Code/Personal/torch_snippets/nbs\n" + ] + } + ], + "source": [ + "print(P().resolve())" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, "outputs": [ { "data": { @@ -457,26 +516,28 @@ " 0 - console (🏷️ str)\n", " 1 - reset_logger_width (🏷️ str)\n", " 2 - logger (🏷️ str)\n", - " 3 - Debug (🏷️ str)\n", - " 4 - Info (🏷️ str)\n", - " 5 - Warn (🏷️ str)\n", - " 6 - Excep (🏷️ str)\n", - " 7 - warn_mode (🏷️ str)\n", - " 8 - info_mode (🏷️ str)\n", - " 9 - debug_mode (🏷️ str)\n", - " 10 - excep_mode (🏷️ str)\n", - " 11 - in_warn_mode (🏷️ str)\n", - " 12 - in_info_mode (🏷️ str)\n", - " 13 - in_debug_mode (🏷️ str)\n", - " 14 - in_excep_mode (🏷️ str)\n", - " 15 - frames (🏷️ str)\n", - " 16 - get_console (🏷️ str)\n", - " 17 - reset_logger (🏷️ str)\n", - " 18 - enter_exit (🏷️ str)\n", - " 19 - get_logger_level (🏷️ str)\n", - " 20 - logger_mode (🏷️ str)\n", - " 21 - in_logger_mode (🏷️ str)\n", - " 22 - notify_waiting (🏷️ str)\n", + " 3 - Trace (🏷️ str)\n", + " 4 - Debug (🏷️ str)\n", + " 5 - Info (🏷️ str)\n", + " 6 - Warn (🏷️ str)\n", + " 7 - Excep (🏷️ str)\n", + " 8 - warn_mode (🏷️ str)\n", + " 9 - info_mode (🏷️ str)\n", + " 10 - debug_mode (🏷️ str)\n", + " 11 - trace_mode (🏷️ str)\n", + " 12 - excep_mode (🏷️ str)\n", + " 13 - in_warn_mode (🏷️ str)\n", + " 14 - in_info_mode (🏷️ str)\n", + " 15 - in_debug_mode (🏷️ str)\n", + " 16 - in_trace_mode (🏷️ str)\n", + " 17 - in_excep_mode (🏷️ str)\n", + " 18 - frames (🏷️ str)\n", + " 19 - get_console (🏷️ str)\n", + " 20 - reset_logger (🏷️ str)\n", + " 21 - get_logger_level (🏷️ str)\n", + " 22 - logger_mode (🏷️ str)\n", + " 23 - in_logger_mode (🏷️ str)\n", + " 24 - notify_waiting (🏷️ str)\n", "\n", "```\n", "\n" @@ -896,58 +957,22 @@ } ], "source": [ - "import ast\n", - "\n", - "os.environ[\n", - " \"AD_MAX_ITEMS\"\n", - "] = ( # os is already imported by torch_snippets, along with many other useful libraries\n", - " \"1000\" # Set the maximum number of items to display in the AD object\n", - ")\n", - "\n", - "\n", - "@tryy # This is a decorator that catches exceptions\n", - "def extract_all_list(file_path):\n", - " file = readfile(file_path, silent=True) # Read the file\n", - " tree = ast.parse(file, filename=file_path)\n", - "\n", - " for node in tree.body:\n", - " if isinstance(node, ast.Assign):\n", - " for target in node.targets:\n", - " if isinstance(target, ast.Name) and target.id == \"__all__\":\n", - " if isinstance(node.value, ast.List):\n", - " all_list = [\n", - " elt.value\n", - " for elt in node.value.elts\n", - " if isinstance(elt, ast.Constant)\n", - " ]\n", - " return all_list\n", - " return None\n", - "\n", - "\n", - "def print_all_lists_in_directory(directory):\n", - " dir = P(directory) # Create a pathlib.Path object\n", - " for f in dir.ls(): # Iterate over all files in the directory\n", - " if f.extn == \"py\" and f.stem not in [\n", - " \"__init__\",\n", - " \"_nbdev\",\n", - " ]: # If it's a Python file and not __init__.py\n", - " all_list = extract_all_list(f)\n", - " if all_list is not None and len(all_list) > 0:\n", - " h2(f.stem) # Print the name of the file as a heading in jupyter\n", - " print(\n", - " AD({\"items\": all_list})\n", - " ) # AD is an intelligent dictionary that can display itself nicely\n", - "\n", - "\n", "# Specify the directory containing the Python files\n", "directory_path = \"../torch_snippets\"\n", "print_all_lists_in_directory(directory_path)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/nbs/logging.ipynb b/nbs/logging.ipynb index af3b64b..2cd6648 100644 --- a/nbs/logging.ipynb +++ b/nbs/logging.ipynb @@ -894,7 +894,7 @@ " show(im, sz=3)\n", " print(im.mean())\n", "\n", - "do('../assets/Preamble.png')" + "do('assets/Preamble.png')" ] }, { @@ -924,7 +924,7 @@ " # show(im, sz=3) # line is commented, but will need to be re-uncommented any time it needs debugging\n", " print(im.mean())\n", "\n", - "do('../assets/Preamble.png')" + "do('assets/Preamble.png')" ] }, { @@ -955,7 +955,7 @@ " show(im, sz=3)\n", " print(im.mean())\n", "\n", - "do('../assets/Preamble.png')" + "do('assets/Preamble.png')" ] }, { @@ -990,7 +990,7 @@ ], "source": [ "with debug_mode():\n", - " do('../assets/Preamble.png')" + " do('assets/Preamble.png')" ] }, { diff --git a/scripts.ipynb b/scripts.ipynb index f9c6aa5..3e80d04 100644 --- a/scripts.ipynb +++ b/scripts.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 29, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -15,19 +15,19 @@ "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/load_defaults.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/decorators.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/inspector.py\u001b[0m\n", - "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/misc.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/imgaug_loader.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/ipython.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/pdf_loader.py\u001b[0m\n", - "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/adapters.py\u001b[0m\n", + "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/misc.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/registry.py\u001b[0m\n", + "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/adapters.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/interactive_show.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/logger.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/trainer/config.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/sklegos.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/trainer/capsule.py\u001b[0m\n", - "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/bb_utils.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/charts.py\u001b[0m\n", + "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/bb_utils.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/markup.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/paths.py\u001b[0m\n", "\u001b[1mreformatted /Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/_modidx.py\u001b[0m\n", @@ -36,121 +36,121 @@ "\u001b[34m\u001b[1m20 files \u001b[0m\u001b[1mreformatted\u001b[0m, \u001b[34m22 files \u001b[0mleft unchanged.\n", "Obtaining file:///Users/yeshwanth/Code/Personal/torch_snippets\n", " Preparing metadata (setup.py) ... \u001b[?25ldone\n", - "\u001b[?25hRequirement already satisfied: fastcore in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (1.6.3)\n", - "Requirement already satisfied: matplotlib in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (3.9.1)\n", - "Requirement already satisfied: Pillow in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (10.4.0)\n", - "Requirement already satisfied: altair in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (5.3.0)\n", - "Requirement already satisfied: dill in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (0.3.8)\n", - "Requirement already satisfied: ipython in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (8.26.0)\n", - "Requirement already satisfied: loguru in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (0.7.2)\n", - "Requirement already satisfied: numpy in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (2.0.1)\n", - "Requirement already satisfied: pandas in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (2.2.2)\n", - "Requirement already satisfied: tqdm in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (4.66.4)\n", - "Requirement already satisfied: rich in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (13.7.1)\n", - "Requirement already satisfied: PyYAML in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (6.0.1)\n", - "Requirement already satisfied: catalogue in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (2.0.10)\n", - "Requirement already satisfied: confection in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (0.1.5)\n", - "Requirement already satisfied: pydantic in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (2.8.2)\n", - "Requirement already satisfied: typing in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (3.7.4.3)\n", - "Requirement already satisfied: srsly in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (2.4.8)\n", - "Requirement already satisfied: typing_extensions in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (4.12.2)\n", - "Requirement already satisfied: wasabi in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (1.1.3)\n", - "Requirement already satisfied: jsonlines in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (4.0.0)\n", - "Requirement already satisfied: imgaug>=0.4.0 in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (0.4.0)\n", - "Requirement already satisfied: xmltodict in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (0.13.0)\n", - "Requirement already satisfied: fuzzywuzzy in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (0.18.0)\n", - "Requirement already satisfied: scikit-learn in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (1.5.1)\n", - "Requirement already satisfied: nltk in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (3.8.1)\n", - "Requirement already satisfied: python-Levenshtein in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (0.25.1)\n", - "Requirement already satisfied: pre-commit in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (3.7.1)\n", - "Requirement already satisfied: pymupdf in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (1.24.9)\n", - "Requirement already satisfied: nbconvert in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (7.16.4)\n", - "Requirement already satisfied: nbformat in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (5.10.4)\n", - "Requirement already satisfied: icecream in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (2.1.3)\n", - "Requirement already satisfied: mergedeep in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (1.3.4)\n", - "Requirement already satisfied: typer in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.6.0) (0.12.4)\n", - "Requirement already satisfied: six in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.6.0) (1.16.0)\n", - "Requirement already satisfied: scipy in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.6.0) (1.14.0)\n", - "Requirement already satisfied: scikit-image>=0.14.2 in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.6.0) (0.24.0)\n", - "Requirement already satisfied: opencv-python in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.6.0) (4.10.0.84)\n", - "Requirement already satisfied: imageio in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.6.0) (2.34.2)\n", - "Requirement already satisfied: Shapely in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.6.0) (2.0.5)\n", - "Requirement already satisfied: jinja2 in /opt/miniconda3/lib/python3.12/site-packages (from altair->torch_snippets==0.6.0) (3.1.4)\n", - "Requirement already satisfied: jsonschema>=3.0 in /opt/miniconda3/lib/python3.12/site-packages (from altair->torch_snippets==0.6.0) (4.23.0)\n", - "Requirement already satisfied: packaging in /opt/miniconda3/lib/python3.12/site-packages (from altair->torch_snippets==0.6.0) (23.2)\n", - "Requirement already satisfied: toolz in /opt/miniconda3/lib/python3.12/site-packages (from altair->torch_snippets==0.6.0) (0.12.1)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/miniconda3/lib/python3.12/site-packages (from pandas->torch_snippets==0.6.0) (2.9.0.post0)\n", - "Requirement already satisfied: pytz>=2020.1 in /opt/miniconda3/lib/python3.12/site-packages (from pandas->torch_snippets==0.6.0) (2024.1)\n", - "Requirement already satisfied: tzdata>=2022.7 in /opt/miniconda3/lib/python3.12/site-packages (from pandas->torch_snippets==0.6.0) (2024.1)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /opt/miniconda3/lib/python3.12/site-packages (from pydantic->torch_snippets==0.6.0) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.20.1 in /opt/miniconda3/lib/python3.12/site-packages (from pydantic->torch_snippets==0.6.0) (2.20.1)\n", - "Requirement already satisfied: colorama>=0.3.9 in /opt/miniconda3/lib/python3.12/site-packages (from icecream->torch_snippets==0.6.0) (0.4.6)\n", - "Requirement already satisfied: pygments>=2.2.0 in /opt/miniconda3/lib/python3.12/site-packages (from icecream->torch_snippets==0.6.0) (2.18.0)\n", - "Requirement already satisfied: executing>=0.3.1 in /opt/miniconda3/lib/python3.12/site-packages (from icecream->torch_snippets==0.6.0) (2.0.1)\n", - "Requirement already satisfied: asttokens>=2.0.1 in /opt/miniconda3/lib/python3.12/site-packages (from icecream->torch_snippets==0.6.0) (2.4.1)\n", - "Requirement already satisfied: decorator in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.6.0) (5.1.1)\n", - "Requirement already satisfied: jedi>=0.16 in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.6.0) (0.19.1)\n", - "Requirement already satisfied: matplotlib-inline in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.6.0) (0.1.7)\n", - "Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.6.0) (3.0.47)\n", - "Requirement already satisfied: stack-data in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.6.0) (0.6.3)\n", - "Requirement already satisfied: traitlets>=5.13.0 in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.6.0) (5.14.3)\n", - "Requirement already satisfied: pexpect>4.3 in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.6.0) (4.9.0)\n", - "Requirement already satisfied: attrs>=19.2.0 in /opt/miniconda3/lib/python3.12/site-packages (from jsonlines->torch_snippets==0.6.0) (23.2.0)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /opt/miniconda3/lib/python3.12/site-packages (from matplotlib->torch_snippets==0.6.0) (1.2.1)\n", - "Requirement already satisfied: cycler>=0.10 in /opt/miniconda3/lib/python3.12/site-packages (from matplotlib->torch_snippets==0.6.0) (0.12.1)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /opt/miniconda3/lib/python3.12/site-packages (from matplotlib->torch_snippets==0.6.0) (4.53.1)\n", - "Requirement already satisfied: kiwisolver>=1.3.1 in /opt/miniconda3/lib/python3.12/site-packages (from matplotlib->torch_snippets==0.6.0) (1.4.5)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /opt/miniconda3/lib/python3.12/site-packages (from matplotlib->torch_snippets==0.6.0) (3.1.2)\n", - "Requirement already satisfied: beautifulsoup4 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.6.0) (4.12.3)\n", - "Requirement already satisfied: bleach!=5.0.0 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.6.0) (6.1.0)\n", - "Requirement already satisfied: defusedxml in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.6.0) (0.7.1)\n", - "Requirement already satisfied: jupyter-core>=4.7 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.6.0) (5.7.2)\n", - "Requirement already satisfied: jupyterlab-pygments in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.6.0) (0.3.0)\n", - "Requirement already satisfied: markupsafe>=2.0 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.6.0) (2.1.5)\n", - "Requirement already satisfied: mistune<4,>=2.0.3 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.6.0) (3.0.2)\n", - "Requirement already satisfied: nbclient>=0.5.0 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.6.0) (0.10.0)\n", - "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.6.0) (1.5.1)\n", - "Requirement already satisfied: tinycss2 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.6.0) (1.3.0)\n", - "Requirement already satisfied: fastjsonschema>=2.15 in /opt/miniconda3/lib/python3.12/site-packages (from nbformat->torch_snippets==0.6.0) (2.20.0)\n", - "Requirement already satisfied: click in /opt/miniconda3/lib/python3.12/site-packages (from nltk->torch_snippets==0.6.0) (8.1.7)\n", - "Requirement already satisfied: joblib in /opt/miniconda3/lib/python3.12/site-packages (from nltk->torch_snippets==0.6.0) (1.4.2)\n", - "Requirement already satisfied: regex>=2021.8.3 in /opt/miniconda3/lib/python3.12/site-packages (from nltk->torch_snippets==0.6.0) (2024.7.24)\n", - "Requirement already satisfied: cfgv>=2.0.0 in /opt/miniconda3/lib/python3.12/site-packages (from pre-commit->torch_snippets==0.6.0) (3.4.0)\n", - "Requirement already satisfied: identify>=1.0.0 in /opt/miniconda3/lib/python3.12/site-packages (from pre-commit->torch_snippets==0.6.0) (2.6.0)\n", - "Requirement already satisfied: nodeenv>=0.11.1 in /opt/miniconda3/lib/python3.12/site-packages (from pre-commit->torch_snippets==0.6.0) (1.9.1)\n", - "Requirement already satisfied: virtualenv>=20.10.0 in /opt/miniconda3/lib/python3.12/site-packages (from pre-commit->torch_snippets==0.6.0) (20.26.3)\n", - "Requirement already satisfied: PyMuPDFb==1.24.9 in /opt/miniconda3/lib/python3.12/site-packages (from pymupdf->torch_snippets==0.6.0) (1.24.9)\n", - "Requirement already satisfied: Levenshtein==0.25.1 in /opt/miniconda3/lib/python3.12/site-packages (from python-Levenshtein->torch_snippets==0.6.0) (0.25.1)\n", - "Requirement already satisfied: rapidfuzz<4.0.0,>=3.8.0 in /opt/miniconda3/lib/python3.12/site-packages (from Levenshtein==0.25.1->python-Levenshtein->torch_snippets==0.6.0) (3.9.4)\n", - "Requirement already satisfied: markdown-it-py>=2.2.0 in /opt/miniconda3/lib/python3.12/site-packages (from rich->torch_snippets==0.6.0) (3.0.0)\n", - "Requirement already satisfied: threadpoolctl>=3.1.0 in /opt/miniconda3/lib/python3.12/site-packages (from scikit-learn->torch_snippets==0.6.0) (3.5.0)\n", - "Requirement already satisfied: shellingham>=1.3.0 in /opt/miniconda3/lib/python3.12/site-packages (from typer->torch_snippets==0.6.0) (1.5.4)\n", - "Requirement already satisfied: webencodings in /opt/miniconda3/lib/python3.12/site-packages (from bleach!=5.0.0->nbconvert->torch_snippets==0.6.0) (0.5.1)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /opt/miniconda3/lib/python3.12/site-packages (from jedi>=0.16->ipython->torch_snippets==0.6.0) (0.8.4)\n", - "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /opt/miniconda3/lib/python3.12/site-packages (from jsonschema>=3.0->altair->torch_snippets==0.6.0) (2023.12.1)\n", - "Requirement already satisfied: referencing>=0.28.4 in /opt/miniconda3/lib/python3.12/site-packages (from jsonschema>=3.0->altair->torch_snippets==0.6.0) (0.35.1)\n", - "Requirement already satisfied: rpds-py>=0.7.1 in /opt/miniconda3/lib/python3.12/site-packages (from jsonschema>=3.0->altair->torch_snippets==0.6.0) (0.19.0)\n", - "Requirement already satisfied: platformdirs>=2.5 in /opt/miniconda3/lib/python3.12/site-packages (from jupyter-core>=4.7->nbconvert->torch_snippets==0.6.0) (3.10.0)\n", - "Requirement already satisfied: mdurl~=0.1 in /opt/miniconda3/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich->torch_snippets==0.6.0) (0.1.2)\n", - "Requirement already satisfied: jupyter-client>=6.1.12 in /opt/miniconda3/lib/python3.12/site-packages (from nbclient>=0.5.0->nbconvert->torch_snippets==0.6.0) (8.6.2)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /opt/miniconda3/lib/python3.12/site-packages (from pexpect>4.3->ipython->torch_snippets==0.6.0) (0.7.0)\n", - "Requirement already satisfied: wcwidth in /opt/miniconda3/lib/python3.12/site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython->torch_snippets==0.6.0) (0.2.13)\n", - "Requirement already satisfied: networkx>=2.8 in /opt/miniconda3/lib/python3.12/site-packages (from scikit-image>=0.14.2->imgaug>=0.4.0->torch_snippets==0.6.0) (3.3)\n", - "Requirement already satisfied: tifffile>=2022.8.12 in /opt/miniconda3/lib/python3.12/site-packages (from scikit-image>=0.14.2->imgaug>=0.4.0->torch_snippets==0.6.0) (2024.7.24)\n", - "Requirement already satisfied: lazy-loader>=0.4 in /opt/miniconda3/lib/python3.12/site-packages (from scikit-image>=0.14.2->imgaug>=0.4.0->torch_snippets==0.6.0) (0.4)\n", - "Requirement already satisfied: distlib<1,>=0.3.7 in /opt/miniconda3/lib/python3.12/site-packages (from virtualenv>=20.10.0->pre-commit->torch_snippets==0.6.0) (0.3.8)\n", - "Requirement already satisfied: filelock<4,>=3.12.2 in /opt/miniconda3/lib/python3.12/site-packages (from virtualenv>=20.10.0->pre-commit->torch_snippets==0.6.0) (3.15.4)\n", - "Requirement already satisfied: soupsieve>1.2 in /opt/miniconda3/lib/python3.12/site-packages (from beautifulsoup4->nbconvert->torch_snippets==0.6.0) (2.5)\n", - "Requirement already satisfied: pure-eval in /opt/miniconda3/lib/python3.12/site-packages (from stack-data->ipython->torch_snippets==0.6.0) (0.2.3)\n", - "Requirement already satisfied: pyzmq>=23.0 in /opt/miniconda3/lib/python3.12/site-packages (from jupyter-client>=6.1.12->nbclient>=0.5.0->nbconvert->torch_snippets==0.6.0) (26.0.3)\n", - "Requirement already satisfied: tornado>=6.2 in /opt/miniconda3/lib/python3.12/site-packages (from jupyter-client>=6.1.12->nbclient>=0.5.0->nbconvert->torch_snippets==0.6.0) (6.4.1)\n", + "\u001b[?25hRequirement already satisfied: fastcore in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (1.6.3)\n", + "Requirement already satisfied: matplotlib in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (3.9.1)\n", + "Requirement already satisfied: Pillow in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (10.4.0)\n", + "Requirement already satisfied: altair in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (5.3.0)\n", + "Requirement already satisfied: dill in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (0.3.8)\n", + "Requirement already satisfied: ipython in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (8.26.0)\n", + "Requirement already satisfied: loguru in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (0.7.2)\n", + "Requirement already satisfied: numpy in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (2.0.1)\n", + "Requirement already satisfied: pandas in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (2.2.2)\n", + "Requirement already satisfied: tqdm in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (4.66.4)\n", + "Requirement already satisfied: rich in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (13.7.1)\n", + "Requirement already satisfied: PyYAML in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (6.0.1)\n", + "Requirement already satisfied: catalogue in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (2.0.10)\n", + "Requirement already satisfied: confection in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (0.1.5)\n", + "Requirement already satisfied: pydantic in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (2.8.2)\n", + "Requirement already satisfied: typing in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (3.7.4.3)\n", + "Requirement already satisfied: srsly in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (2.4.8)\n", + "Requirement already satisfied: typing_extensions in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (4.12.2)\n", + "Requirement already satisfied: wasabi in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (1.1.3)\n", + "Requirement already satisfied: jsonlines in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (4.0.0)\n", + "Requirement already satisfied: imgaug>=0.4.0 in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (0.4.0)\n", + "Requirement already satisfied: xmltodict in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (0.13.0)\n", + "Requirement already satisfied: fuzzywuzzy in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (0.18.0)\n", + "Requirement already satisfied: scikit-learn in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (1.5.1)\n", + "Requirement already satisfied: nltk in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (3.8.1)\n", + "Requirement already satisfied: python-Levenshtein in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (0.25.1)\n", + "Requirement already satisfied: pre-commit in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (3.7.1)\n", + "Requirement already satisfied: pymupdf in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (1.24.9)\n", + "Requirement already satisfied: nbconvert in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (7.16.4)\n", + "Requirement already satisfied: nbformat in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (5.10.4)\n", + "Requirement already satisfied: icecream in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (2.1.3)\n", + "Requirement already satisfied: mergedeep in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (1.3.4)\n", + "Requirement already satisfied: typer in /opt/miniconda3/lib/python3.12/site-packages (from torch_snippets==0.540) (0.12.4)\n", + "Requirement already satisfied: six in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.540) (1.16.0)\n", + "Requirement already satisfied: scipy in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.540) (1.14.0)\n", + "Requirement already satisfied: scikit-image>=0.14.2 in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.540) (0.24.0)\n", + "Requirement already satisfied: opencv-python in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.540) (4.10.0.84)\n", + "Requirement already satisfied: imageio in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.540) (2.34.2)\n", + "Requirement already satisfied: Shapely in /opt/miniconda3/lib/python3.12/site-packages (from imgaug>=0.4.0->torch_snippets==0.540) (2.0.5)\n", + "Requirement already satisfied: jinja2 in /opt/miniconda3/lib/python3.12/site-packages (from altair->torch_snippets==0.540) (3.1.4)\n", + "Requirement already satisfied: jsonschema>=3.0 in /opt/miniconda3/lib/python3.12/site-packages (from altair->torch_snippets==0.540) (4.23.0)\n", + "Requirement already satisfied: packaging in /opt/miniconda3/lib/python3.12/site-packages (from altair->torch_snippets==0.540) (23.2)\n", + "Requirement already satisfied: toolz in /opt/miniconda3/lib/python3.12/site-packages (from altair->torch_snippets==0.540) (0.12.1)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/miniconda3/lib/python3.12/site-packages (from pandas->torch_snippets==0.540) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /opt/miniconda3/lib/python3.12/site-packages (from pandas->torch_snippets==0.540) (2024.1)\n", + "Requirement already satisfied: tzdata>=2022.7 in /opt/miniconda3/lib/python3.12/site-packages (from pandas->torch_snippets==0.540) (2024.1)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in /opt/miniconda3/lib/python3.12/site-packages (from pydantic->torch_snippets==0.540) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.20.1 in /opt/miniconda3/lib/python3.12/site-packages (from pydantic->torch_snippets==0.540) (2.20.1)\n", + "Requirement already satisfied: colorama>=0.3.9 in /opt/miniconda3/lib/python3.12/site-packages (from icecream->torch_snippets==0.540) (0.4.6)\n", + "Requirement already satisfied: pygments>=2.2.0 in /opt/miniconda3/lib/python3.12/site-packages (from icecream->torch_snippets==0.540) (2.18.0)\n", + "Requirement already satisfied: executing>=0.3.1 in /opt/miniconda3/lib/python3.12/site-packages (from icecream->torch_snippets==0.540) (2.0.1)\n", + "Requirement already satisfied: asttokens>=2.0.1 in /opt/miniconda3/lib/python3.12/site-packages (from icecream->torch_snippets==0.540) (2.4.1)\n", + "Requirement already satisfied: decorator in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.540) (5.1.1)\n", + "Requirement already satisfied: jedi>=0.16 in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.540) (0.19.1)\n", + "Requirement already satisfied: matplotlib-inline in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.540) (0.1.7)\n", + "Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.540) (3.0.47)\n", + "Requirement already satisfied: stack-data in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.540) (0.6.3)\n", + "Requirement already satisfied: traitlets>=5.13.0 in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.540) (5.14.3)\n", + "Requirement already satisfied: pexpect>4.3 in /opt/miniconda3/lib/python3.12/site-packages (from ipython->torch_snippets==0.540) (4.9.0)\n", + "Requirement already satisfied: attrs>=19.2.0 in /opt/miniconda3/lib/python3.12/site-packages (from jsonlines->torch_snippets==0.540) (23.2.0)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /opt/miniconda3/lib/python3.12/site-packages (from matplotlib->torch_snippets==0.540) (1.2.1)\n", + "Requirement already satisfied: cycler>=0.10 in /opt/miniconda3/lib/python3.12/site-packages (from matplotlib->torch_snippets==0.540) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /opt/miniconda3/lib/python3.12/site-packages (from matplotlib->torch_snippets==0.540) (4.53.1)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /opt/miniconda3/lib/python3.12/site-packages (from matplotlib->torch_snippets==0.540) (1.4.5)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /opt/miniconda3/lib/python3.12/site-packages (from matplotlib->torch_snippets==0.540) (3.1.2)\n", + "Requirement already satisfied: beautifulsoup4 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.540) (4.12.3)\n", + "Requirement already satisfied: bleach!=5.0.0 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.540) (6.1.0)\n", + "Requirement already satisfied: defusedxml in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.540) (0.7.1)\n", + "Requirement already satisfied: jupyter-core>=4.7 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.540) (5.7.2)\n", + "Requirement already satisfied: jupyterlab-pygments in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.540) (0.3.0)\n", + "Requirement already satisfied: markupsafe>=2.0 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.540) (2.1.5)\n", + "Requirement already satisfied: mistune<4,>=2.0.3 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.540) (3.0.2)\n", + "Requirement already satisfied: nbclient>=0.5.0 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.540) (0.10.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.540) (1.5.1)\n", + "Requirement already satisfied: tinycss2 in /opt/miniconda3/lib/python3.12/site-packages (from nbconvert->torch_snippets==0.540) (1.3.0)\n", + "Requirement already satisfied: fastjsonschema>=2.15 in /opt/miniconda3/lib/python3.12/site-packages (from nbformat->torch_snippets==0.540) (2.20.0)\n", + "Requirement already satisfied: click in /opt/miniconda3/lib/python3.12/site-packages (from nltk->torch_snippets==0.540) (8.1.7)\n", + "Requirement already satisfied: joblib in /opt/miniconda3/lib/python3.12/site-packages (from nltk->torch_snippets==0.540) (1.4.2)\n", + "Requirement already satisfied: regex>=2021.8.3 in /opt/miniconda3/lib/python3.12/site-packages (from nltk->torch_snippets==0.540) (2024.7.24)\n", + "Requirement already satisfied: cfgv>=2.0.0 in /opt/miniconda3/lib/python3.12/site-packages (from pre-commit->torch_snippets==0.540) (3.4.0)\n", + "Requirement already satisfied: identify>=1.0.0 in /opt/miniconda3/lib/python3.12/site-packages (from pre-commit->torch_snippets==0.540) (2.6.0)\n", + "Requirement already satisfied: nodeenv>=0.11.1 in /opt/miniconda3/lib/python3.12/site-packages (from pre-commit->torch_snippets==0.540) (1.9.1)\n", + "Requirement already satisfied: virtualenv>=20.10.0 in /opt/miniconda3/lib/python3.12/site-packages (from pre-commit->torch_snippets==0.540) (20.26.3)\n", + "Requirement already satisfied: PyMuPDFb==1.24.9 in /opt/miniconda3/lib/python3.12/site-packages (from pymupdf->torch_snippets==0.540) (1.24.9)\n", + "Requirement already satisfied: Levenshtein==0.25.1 in /opt/miniconda3/lib/python3.12/site-packages (from python-Levenshtein->torch_snippets==0.540) (0.25.1)\n", + "Requirement already satisfied: rapidfuzz<4.0.0,>=3.8.0 in /opt/miniconda3/lib/python3.12/site-packages (from Levenshtein==0.25.1->python-Levenshtein->torch_snippets==0.540) (3.9.4)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in /opt/miniconda3/lib/python3.12/site-packages (from rich->torch_snippets==0.540) (3.0.0)\n", + "Requirement already satisfied: threadpoolctl>=3.1.0 in /opt/miniconda3/lib/python3.12/site-packages (from scikit-learn->torch_snippets==0.540) (3.5.0)\n", + "Requirement already satisfied: shellingham>=1.3.0 in /opt/miniconda3/lib/python3.12/site-packages (from typer->torch_snippets==0.540) (1.5.4)\n", + "Requirement already satisfied: webencodings in /opt/miniconda3/lib/python3.12/site-packages (from bleach!=5.0.0->nbconvert->torch_snippets==0.540) (0.5.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /opt/miniconda3/lib/python3.12/site-packages (from jedi>=0.16->ipython->torch_snippets==0.540) (0.8.4)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /opt/miniconda3/lib/python3.12/site-packages (from jsonschema>=3.0->altair->torch_snippets==0.540) (2023.12.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in /opt/miniconda3/lib/python3.12/site-packages (from jsonschema>=3.0->altair->torch_snippets==0.540) (0.35.1)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /opt/miniconda3/lib/python3.12/site-packages (from jsonschema>=3.0->altair->torch_snippets==0.540) (0.19.0)\n", + "Requirement already satisfied: platformdirs>=2.5 in /opt/miniconda3/lib/python3.12/site-packages (from jupyter-core>=4.7->nbconvert->torch_snippets==0.540) (3.10.0)\n", + "Requirement already satisfied: mdurl~=0.1 in /opt/miniconda3/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich->torch_snippets==0.540) (0.1.2)\n", + "Requirement already satisfied: jupyter-client>=6.1.12 in /opt/miniconda3/lib/python3.12/site-packages (from nbclient>=0.5.0->nbconvert->torch_snippets==0.540) (8.6.2)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /opt/miniconda3/lib/python3.12/site-packages (from pexpect>4.3->ipython->torch_snippets==0.540) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /opt/miniconda3/lib/python3.12/site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython->torch_snippets==0.540) (0.2.13)\n", + "Requirement already satisfied: networkx>=2.8 in /opt/miniconda3/lib/python3.12/site-packages (from scikit-image>=0.14.2->imgaug>=0.4.0->torch_snippets==0.540) (3.3)\n", + "Requirement already satisfied: tifffile>=2022.8.12 in /opt/miniconda3/lib/python3.12/site-packages (from scikit-image>=0.14.2->imgaug>=0.4.0->torch_snippets==0.540) (2024.7.24)\n", + "Requirement already satisfied: lazy-loader>=0.4 in /opt/miniconda3/lib/python3.12/site-packages (from scikit-image>=0.14.2->imgaug>=0.4.0->torch_snippets==0.540) (0.4)\n", + "Requirement already satisfied: distlib<1,>=0.3.7 in /opt/miniconda3/lib/python3.12/site-packages (from virtualenv>=20.10.0->pre-commit->torch_snippets==0.540) (0.3.8)\n", + "Requirement already satisfied: filelock<4,>=3.12.2 in /opt/miniconda3/lib/python3.12/site-packages (from virtualenv>=20.10.0->pre-commit->torch_snippets==0.540) (3.15.4)\n", + "Requirement already satisfied: soupsieve>1.2 in /opt/miniconda3/lib/python3.12/site-packages (from beautifulsoup4->nbconvert->torch_snippets==0.540) (2.5)\n", + "Requirement already satisfied: pure-eval in /opt/miniconda3/lib/python3.12/site-packages (from stack-data->ipython->torch_snippets==0.540) (0.2.3)\n", + "Requirement already satisfied: pyzmq>=23.0 in /opt/miniconda3/lib/python3.12/site-packages (from jupyter-client>=6.1.12->nbclient>=0.5.0->nbconvert->torch_snippets==0.540) (26.0.3)\n", + "Requirement already satisfied: tornado>=6.2 in /opt/miniconda3/lib/python3.12/site-packages (from jupyter-client>=6.1.12->nbclient>=0.5.0->nbconvert->torch_snippets==0.540) (6.4.1)\n", "Installing collected packages: torch_snippets\n", " Attempting uninstall: torch_snippets\n", - " Found existing installation: torch_snippets 0.6.0\n", - " Uninstalling torch_snippets-0.6.0:\n", - " Successfully uninstalled torch_snippets-0.6.0\n", + " Found existing installation: torch_snippets 0.539\n", + " Uninstalling torch_snippets-0.539:\n", + " Successfully uninstalled torch_snippets-0.539\n", " Running setup.py develop for torch_snippets\n", - "Successfully installed torch_snippets-0.6.0\n", + "Successfully installed torch_snippets-0.540\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -164,17 +164,17 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
[08/24/24 10:45:12] INFO     loaded 26 lines                                                                                                        4135304039.py::3\" target=\"_blank\"><module>:3\n",
+       "
[08/24/24 12:50:22] INFO     loaded 26 lines                                                                                                        4135304039.py::3\" target=\"_blank\"><module>:3\n",
        "
\n" ], "text/plain": [ - "\u001b[2;36m[08/24/24 10:45:12]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m loaded \u001b[1;36m26\u001b[0m lines \u001b]8;id=273388;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_28891/4135304039.py:3\u001b\\\u001b[2m4135304039.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=265057;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_28891/4135304039.py:3#:3\u001b\\\u001b[2m:3\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[2;36m[08/24/24 12:50:22]\u001b[0m\u001b[2;36m \u001b[0m\u001b[2;33mINFO \u001b[0m loaded \u001b[1;36m26\u001b[0m lines \u001b]8;id=282456;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_28891/4135304039.py:3\u001b\\\u001b[2m4135304039.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=204178;file:///var/folders/1_/71dqv9vx2750gmyz77q_f45w0000gn/T/ipykernel_28891/4135304039.py:3#:3\u001b\\\u001b[2m:3\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -183,10 +183,10 @@ { "data": { "text/plain": [ - "'0.6.0'" + "'0.540'" ] }, - "execution_count": 16, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -200,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -239,72 +239,72 @@ "adding license file 'LICENSE.txt'\n", "writing manifest file 'torch_snippets.egg-info/SOURCES.txt'\n", "running check\n", - "creating torch_snippets-0.6.0\n", - "creating torch_snippets-0.6.0/torch_snippets\n", - "creating torch_snippets-0.6.0/torch_snippets.egg-info\n", - "creating torch_snippets-0.6.0/torch_snippets/thinc_parser\n", - "creating torch_snippets-0.6.0/torch_snippets/trainer\n", - "copying files to torch_snippets-0.6.0...\n", - "copying LICENSE -> torch_snippets-0.6.0\n", - "copying LICENSE.txt -> torch_snippets-0.6.0\n", - "copying MANIFEST.in -> torch_snippets-0.6.0\n", - "copying README.md -> torch_snippets-0.6.0\n", - "copying settings.ini -> torch_snippets-0.6.0\n", - "copying setup.cfg -> torch_snippets-0.6.0\n", - "copying setup.py -> torch_snippets-0.6.0\n", - "copying torch_snippets/__init__.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/__module_timing__.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/_modidx.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/_nbdev.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/adapters.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/bb_utils.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/bokeh_loader.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/charts.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/cli.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/dates.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/decorators.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/fastcores.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/icecream.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/imgaug_loader.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/inspector.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/interactive_show.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/ipython.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/load_defaults.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/loader.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/logger.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/markup.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/markup2.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/misc.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/paths.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/pdf_loader.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/registry.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/s3_loader.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/scp.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/sklegos.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/text_utils.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/tmp.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/torch_loader.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/video.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets/zen.py -> torch_snippets-0.6.0/torch_snippets\n", - "copying torch_snippets.egg-info/PKG-INFO -> torch_snippets-0.6.0/torch_snippets.egg-info\n", - "copying torch_snippets.egg-info/SOURCES.txt -> torch_snippets-0.6.0/torch_snippets.egg-info\n", - "copying torch_snippets.egg-info/dependency_links.txt -> torch_snippets-0.6.0/torch_snippets.egg-info\n", - "copying torch_snippets.egg-info/entry_points.txt -> torch_snippets-0.6.0/torch_snippets.egg-info\n", - "copying torch_snippets.egg-info/not-zip-safe -> torch_snippets-0.6.0/torch_snippets.egg-info\n", - "copying torch_snippets.egg-info/requires.txt -> torch_snippets-0.6.0/torch_snippets.egg-info\n", - "copying torch_snippets.egg-info/top_level.txt -> torch_snippets-0.6.0/torch_snippets.egg-info\n", - "copying torch_snippets/thinc_parser/__init__.py -> torch_snippets-0.6.0/torch_snippets/thinc_parser\n", - "copying torch_snippets/thinc_parser/parser.py -> torch_snippets-0.6.0/torch_snippets/thinc_parser\n", - "copying torch_snippets/trainer/__init__.py -> torch_snippets-0.6.0/torch_snippets/trainer\n", - "copying torch_snippets/trainer/capsule.py -> torch_snippets-0.6.0/torch_snippets/trainer\n", - "copying torch_snippets/trainer/config.py -> torch_snippets-0.6.0/torch_snippets/trainer\n", - "copying torch_snippets/trainer/hooks.py -> torch_snippets-0.6.0/torch_snippets/trainer\n", - "copying torch_snippets/trainer/neural_graph.py -> torch_snippets-0.6.0/torch_snippets/trainer\n", - "copying torch_snippets.egg-info/SOURCES.txt -> torch_snippets-0.6.0/torch_snippets.egg-info\n", - "Writing torch_snippets-0.6.0/setup.cfg\n", + "creating torch_snippets-0.540\n", + "creating torch_snippets-0.540/torch_snippets\n", + "creating torch_snippets-0.540/torch_snippets.egg-info\n", + "creating torch_snippets-0.540/torch_snippets/thinc_parser\n", + "creating torch_snippets-0.540/torch_snippets/trainer\n", + "copying files to torch_snippets-0.540...\n", + "copying LICENSE -> torch_snippets-0.540\n", + "copying LICENSE.txt -> torch_snippets-0.540\n", + "copying MANIFEST.in -> torch_snippets-0.540\n", + "copying README.md -> torch_snippets-0.540\n", + "copying settings.ini -> torch_snippets-0.540\n", + "copying setup.cfg -> torch_snippets-0.540\n", + "copying setup.py -> torch_snippets-0.540\n", + "copying torch_snippets/__init__.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/__module_timing__.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/_modidx.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/_nbdev.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/adapters.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/bb_utils.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/bokeh_loader.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/charts.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/cli.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/dates.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/decorators.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/fastcores.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/icecream.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/imgaug_loader.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/inspector.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/interactive_show.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/ipython.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/load_defaults.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/loader.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/logger.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/markup.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/markup2.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/misc.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/paths.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/pdf_loader.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/registry.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/s3_loader.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/scp.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/sklegos.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/text_utils.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/tmp.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/torch_loader.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/video.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets/zen.py -> torch_snippets-0.540/torch_snippets\n", + "copying torch_snippets.egg-info/PKG-INFO -> torch_snippets-0.540/torch_snippets.egg-info\n", + "copying torch_snippets.egg-info/SOURCES.txt -> torch_snippets-0.540/torch_snippets.egg-info\n", + "copying torch_snippets.egg-info/dependency_links.txt -> torch_snippets-0.540/torch_snippets.egg-info\n", + "copying torch_snippets.egg-info/entry_points.txt -> torch_snippets-0.540/torch_snippets.egg-info\n", + "copying torch_snippets.egg-info/not-zip-safe -> torch_snippets-0.540/torch_snippets.egg-info\n", + "copying torch_snippets.egg-info/requires.txt -> torch_snippets-0.540/torch_snippets.egg-info\n", + "copying torch_snippets.egg-info/top_level.txt -> torch_snippets-0.540/torch_snippets.egg-info\n", + "copying torch_snippets/thinc_parser/__init__.py -> torch_snippets-0.540/torch_snippets/thinc_parser\n", + "copying torch_snippets/thinc_parser/parser.py -> torch_snippets-0.540/torch_snippets/thinc_parser\n", + "copying torch_snippets/trainer/__init__.py -> torch_snippets-0.540/torch_snippets/trainer\n", + "copying torch_snippets/trainer/capsule.py -> torch_snippets-0.540/torch_snippets/trainer\n", + "copying torch_snippets/trainer/config.py -> torch_snippets-0.540/torch_snippets/trainer\n", + "copying torch_snippets/trainer/hooks.py -> torch_snippets-0.540/torch_snippets/trainer\n", + "copying torch_snippets/trainer/neural_graph.py -> torch_snippets-0.540/torch_snippets/trainer\n", + "copying torch_snippets.egg-info/SOURCES.txt -> torch_snippets-0.540/torch_snippets.egg-info\n", + "Writing torch_snippets-0.540/setup.cfg\n", "creating dist\n", "Creating tar archive\n", - "removing 'torch_snippets-0.6.0' (and everything under it)\n", + "removing 'torch_snippets-0.540' (and everything under it)\n", "running bdist_wheel\n", "running build\n", "running build_py\n", @@ -417,10 +417,10 @@ "copying build/lib/torch_snippets/adapters.py -> build/bdist.macosx-11.1-arm64/wheel/torch_snippets\n", "copying build/lib/torch_snippets/decorators.py -> build/bdist.macosx-11.1-arm64/wheel/torch_snippets\n", "running install_egg_info\n", - "Copying torch_snippets.egg-info to build/bdist.macosx-11.1-arm64/wheel/torch_snippets-0.6.0-py3.12.egg-info\n", + "Copying torch_snippets.egg-info to build/bdist.macosx-11.1-arm64/wheel/torch_snippets-0.540-py3.12.egg-info\n", "running install_scripts\n", - "creating build/bdist.macosx-11.1-arm64/wheel/torch_snippets-0.6.0.dist-info/WHEEL\n", - "creating 'dist/torch_snippets-0.6.0-py3-none-any.whl' and adding 'build/bdist.macosx-11.1-arm64/wheel' to it\n", + "creating build/bdist.macosx-11.1-arm64/wheel/torch_snippets-0.540.dist-info/WHEEL\n", + "creating 'dist/torch_snippets-0.540-py3-none-any.whl' and adding 'build/bdist.macosx-11.1-arm64/wheel' to it\n", "adding 'torch_snippets/__init__.py'\n", "adding 'torch_snippets/__module_timing__.py'\n", "adding 'torch_snippets/_modidx.py'\n", @@ -462,22 +462,22 @@ "adding 'torch_snippets/trainer/config.py'\n", "adding 'torch_snippets/trainer/hooks.py'\n", "adding 'torch_snippets/trainer/neural_graph.py'\n", - "adding 'torch_snippets-0.6.0.dist-info/LICENSE'\n", - "adding 'torch_snippets-0.6.0.dist-info/LICENSE.txt'\n", - "adding 'torch_snippets-0.6.0.dist-info/METADATA'\n", - "adding 'torch_snippets-0.6.0.dist-info/WHEEL'\n", - "adding 'torch_snippets-0.6.0.dist-info/entry_points.txt'\n", - "adding 'torch_snippets-0.6.0.dist-info/top_level.txt'\n", - "adding 'torch_snippets-0.6.0.dist-info/RECORD'\n", + "adding 'torch_snippets-0.540.dist-info/LICENSE'\n", + "adding 'torch_snippets-0.540.dist-info/LICENSE.txt'\n", + "adding 'torch_snippets-0.540.dist-info/METADATA'\n", + "adding 'torch_snippets-0.540.dist-info/WHEEL'\n", + "adding 'torch_snippets-0.540.dist-info/entry_points.txt'\n", + "adding 'torch_snippets-0.540.dist-info/top_level.txt'\n", + "adding 'torch_snippets-0.540.dist-info/RECORD'\n", "removing build/bdist.macosx-11.1-arm64/wheel\n", "Uploading distributions to https://upload.pypi.org/legacy/\n", - "Uploading torch_snippets-0.6.0-py3-none-any.whl\n", - "\u001b[2K\u001b[35m100%\u001b[0m \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m110.9/110.9 kB\u001b[0m • \u001b[33m00:00\u001b[0m • \u001b[31m216.3 MB/s\u001b[0m\n", - "\u001b[?25hUploading torch_snippets-0.6.0.tar.gz\n", - "\u001b[2K\u001b[35m100%\u001b[0m \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m97.2/97.2 kB\u001b[0m • \u001b[33m00:00\u001b[0m • \u001b[31m150.9 MB/s\u001b[0m\n", + "Uploading torch_snippets-0.540-py3-none-any.whl\n", + "\u001b[2K\u001b[35m100%\u001b[0m \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m111.2/111.2 kB\u001b[0m • \u001b[33m00:01\u001b[0m • \u001b[31m380.4 MB/s\u001b[0m\n", + "\u001b[?25hUploading torch_snippets-0.540.tar.gz\n", + "\u001b[2K\u001b[35m100%\u001b[0m \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m97.4/97.4 kB\u001b[0m • \u001b[33m00:00\u001b[0m • \u001b[31m156.6 MB/s\u001b[0m\n", "\u001b[?25h\n", "\u001b[32mView at:\u001b[0m\n", - "https://pypi.org/project/torch-snippets/0.6.0/\n" + "https://pypi.org/project/torch-snippets/0.540/\n" ] } ], @@ -488,7 +488,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -520,6 +520,19 @@ " warn(f'Found cells containing imports and other code. See FAQ.\\n---\\n{cell.source}\\n---\\n')\n", "/opt/miniconda3/lib/python3.12/site-packages/nbdev/processors.py:222: UserWarning: Found cells containing imports and other code. See FAQ.\n", "---\n", + "try:\n", + " import torch\n", + "\n", + " d = AD(a=torch.Tensor([1, 2, 3]), b=\"hello\")\n", + " write_json(d, \"/tmp/tmp.json\")\n", + " print(\"\\n\".join(readlines(\"/tmp/tmp.json\")))\n", + "except ModuleNotFoundError:\n", + " ...\n", + "---\n", + "\n", + " warn(f'Found cells containing imports and other code. See FAQ.\\n---\\n{cell.source}\\n---\\n')\n", + "/opt/miniconda3/lib/python3.12/site-packages/nbdev/processors.py:222: UserWarning: Found cells containing imports and other code. See FAQ.\n", + "---\n", "@timeit\n", "@io\n", "def foo(a, b):\n", @@ -545,17 +558,27 @@ " warn(f'Found cells containing imports and other code. See FAQ.\\n---\\n{cell.source}\\n---\\n')\n", "/opt/miniconda3/lib/python3.12/site-packages/nbdev/processors.py:222: UserWarning: Found cells containing imports and other code. See FAQ.\n", "---\n", - "try:\n", - " import torch\n", + "# https://youtu.be/XcU-a-eksMA\n", + "from IPython.display import YouTubeVideo\n", "\n", - " d = AD(a=torch.Tensor([1, 2, 3]), b=\"hello\")\n", - " write_json(d, \"/tmp/tmp.json\")\n", - " print(\"\\n\".join(readlines(\"/tmp/tmp.json\")))\n", - "except ModuleNotFoundError:\n", - " ...\n", + "# Replace 'video_id' with the actual YouTube video ID\n", + "YouTubeVideo('XcU-a-eksMA', width=560, height=315)\n", + "---\n", + "\n", + " warn(f'Found cells containing imports and other code. See FAQ.\\n---\\n{cell.source}\\n---\\n')\n", + "/opt/miniconda3/lib/python3.12/site-packages/nbdev/processors.py:222: UserWarning: Found cells containing imports and other code. See FAQ.\n", + "---\n", + "def do(im_path):\n", + " from torch_snippets import show, read\n", + " im = read(im_path)\n", + " show(im, sz=3)\n", + " print(im.mean())\n", + "\n", + "do('../assets/Preamble.png')\n", "---\n", "\n", " warn(f'Found cells containing imports and other code. See FAQ.\\n---\\n{cell.source}\\n---\\n')\n", + "[ WARN:0@0.009] global loadsave.cpp:241 findDecoder imread_('../assets/Preamble.png'): can't open/read file: check file path/integrity\n", "/opt/miniconda3/lib/python3.12/site-packages/nbdev/processors.py:222: UserWarning: Found cells containing imports and other code. See FAQ.\n", "---\n", "import random\n", @@ -583,10 +606,9 @@ "import random\n", "\n", "random.seed(10)\n", - "errors = []\n", "\n", "\n", - "@tryy(silence_errors=True, store_errors=errors, output_to_return_on_fail=\"😔\")\n", + "@tryy(silence_errors=True)\n", "def do(a, b, c):\n", " if c < 50:\n", " return 1 / 0\n", @@ -636,7 +658,7 @@ " warn(f'Found cells containing imports and other code. See FAQ.\\n---\\n{cell.source}\\n---\\n')\n", "/opt/miniconda3/lib/python3.12/site-packages/nbdev/processors.py:222: UserWarning: Found cells containing imports and other code. See FAQ.\n", "---\n", - "from torch_snippets.inspector import inspect\n", + "from torch_snippets.markup2 import AD\n", "from torch.utils.data import TensorDataset\n", "\n", "trn_ds = TensorDataset(*[torch.Tensor(i) for i in [X_trn, y_trn]])\n", @@ -645,7 +667,67 @@ "val_ds = TensorDataset(*[torch.Tensor(i) for i in [X_val, y_val]])\n", "val_dl = DataLoader(val_ds, batch_size=32)\n", "\n", - "inspect(next(iter(val_dl)))\n", + "AD(next(iter(val_dl)))\n", + "---\n", + "\n", + " warn(f'Found cells containing imports and other code. See FAQ.\\n---\\n{cell.source}\\n---\\n')\n", + "/opt/miniconda3/lib/python3.12/site-packages/nbdev/processors.py:222: UserWarning: Found cells containing imports and other code. See FAQ.\n", + "---\n", + "from torch_snippets.trainer.capsule import Capsule, train, validate, predict\n", + "\n", + "\n", + "class IrisModel(Capsule):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.model = nn.Sequential(\n", + " nn.BatchNorm1d(4),\n", + " nn.Linear(4, 16),\n", + " nn.Dropout(0.2),\n", + " nn.BatchNorm1d(16),\n", + " nn.ReLU(inplace=True),\n", + " nn.Linear(16, 8),\n", + " nn.Dropout(0.2),\n", + " nn.BatchNorm1d(8),\n", + " nn.ReLU(inplace=True),\n", + " nn.Linear(8, 3),\n", + " )\n", + " self.loss_fn = nn.CrossEntropyLoss()\n", + " self.optimizer = optim.Adam(self.parameters())\n", + "\n", + " def forward(self, x):\n", + " return self.model(x)\n", + "\n", + " @train\n", + " def train_batch(self, batch):\n", + " x, y = batch\n", + " _y = self.forward(x)\n", + " loss = self.loss_fn(_y, y.long())\n", + " return {\"loss\": loss}\n", + "\n", + " @validate\n", + " def validate_batch(self, batch=None, dl=None):\n", + " if dl is not None:\n", + " output = []\n", + " for batch in dl:\n", + " output.extend(self.predict(batch=batch)[\"val_acc\"])\n", + " return np.mean(output)\n", + " x, y = batch\n", + " _y = self.forward(x)\n", + " loss = self.loss_fn(_y, y.long())\n", + " acc = (y == _y.max(-1)[1]).float().mean()\n", + " return {\"val_loss\": loss, \"val_acc\": acc}\n", + "\n", + " @predict\n", + " def predict(self, batch=None, dl=None):\n", + " if dl is not None:\n", + " output = []\n", + " for batch in dl:\n", + " output.extend(self.predict(batch=batch))\n", + " return output\n", + " x, y = batch\n", + " _y = self.forward(x)\n", + " o = _y.max(-1)[1].cpu().detach().numpy().tolist()\n", + " return o\n", "---\n", "\n", " warn(f'Found cells containing imports and other code. See FAQ.\\n---\\n{cell.source}\\n---\\n')\n", @@ -654,12 +736,15 @@ "Traceback (most recent call last):\n", " File \"/opt/miniconda3/lib/python3.12/site-packages/IPython/core/interactiveshell.py\", line 3577, in run_code\n", " exec(code_obj, self.user_global_ns, self.user_ns)\n", - " File \"\", line 3, in \n", - " spider(\n", - " File \"\", line 67, in spider\n", - " fig, ax = plt.subplots(figsize=(sz, sz), subplot_kw=dict(polar=True))\n", - " ^^^\n", - "NameError: name 'plt' is not defined. Did you mean: 'alt'?\n", + " File \"\", line 7, in \n", + " do('../assets/Preamble.png')\n", + " File \"\", line 3, in do\n", + " im = read(im_path)\n", + " ^^^^^^^^^^^^^\n", + " File \"/Users/yeshwanth/Code/Personal/torch_snippets/torch_snippets/loader.py\", line 233, in read\n", + " img = img[..., ::-1] # BGR to RGB\n", + " ~~~^^^^^^^^^^^\n", + "TypeError: 'NoneType' object is not subscriptable\n", "\n", "The above exception was the direct cause of the following exception:\n", "\n", @@ -692,24 +777,14 @@ " ^^^^^^^^^^\n", " File \"/opt/miniconda3/lib/python3.12/site-packages/nbdev/processors.py\", line 241, in __call__\n", " raise Exception(f\"Error{' in notebook: '+title if title else ''} in cell {cell.idx_} :\\n{cell.source}\") from self.k.exc[1]\n", - "Exception: Error in cell 15 :\n", - "import pandas as pd\n", - "\n", - "spider(\n", - " pd.DataFrame(\n", - " {\n", - " \"x\": [*\"abcde\"],\n", - " \"c1\": [10, 11, 12, 13, 14],\n", - " \"c2\": [0.1, 0.3, 0.4, 0.1, 0.9],\n", - " \"c3\": [1e5, 2e5, 3.5e5, 8e4, 5e4],\n", - " \"c4\": [9, 12, 5, 2, 0.2],\n", - " \"test\": [1, 1, 1, 1, 5],\n", - " },\n", - " index=[*\"abcde\"],\n", - " ),\n", - " title=\"Sample Spider\",\n", - " padding=1.1,\n", - ")\n", + "Exception: Error in notebook: Rich Logging and printing in cell 23 :\n", + "def do(im_path):\n", + " from torch_snippets import show, read\n", + " im = read(im_path)\n", + " show(im, sz=3)\n", + " print(im.mean())\n", + "\n", + "do('../assets/Preamble.png')\n", "\"\"\"\n", "\n", "The above exception was the direct cause of the following exception:\n", @@ -754,24 +829,14 @@ " ^^^^^^^^^^^^^^^^^^^\n", " File \"/opt/miniconda3/lib/python3.12/concurrent/futures/_base.py\", line 401, in __get_result\n", " raise self._exception\n", - "Exception: Error in cell 15 :\n", - "import pandas as pd\n", - "\n", - "spider(\n", - " pd.DataFrame(\n", - " {\n", - " \"x\": [*\"abcde\"],\n", - " \"c1\": [10, 11, 12, 13, 14],\n", - " \"c2\": [0.1, 0.3, 0.4, 0.1, 0.9],\n", - " \"c3\": [1e5, 2e5, 3.5e5, 8e4, 5e4],\n", - " \"c4\": [9, 12, 5, 2, 0.2],\n", - " \"test\": [1, 1, 1, 1, 5],\n", - " },\n", - " index=[*\"abcde\"],\n", - " ),\n", - " title=\"Sample Spider\",\n", - " padding=1.1,\n", - ")\n" + "Exception: Error in notebook: Rich Logging and printing in cell 23 :\n", + "def do(im_path):\n", + " from torch_snippets import show, read\n", + " im = read(im_path)\n", + " show(im, sz=3)\n", + " print(im.mean())\n", + "\n", + "do('../assets/Preamble.png')\n" ] } ], @@ -781,28 +846,37 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[master a2cf6d4] 0.539\n", - " 20 files changed, 1625 insertions(+), 329 deletions(-)\n", - " create mode 100644 torch_snippets.egg-info/entry_points.txt\n", - " create mode 100644 torch_snippets/cli.py\n", - " create mode 100644 torch_snippets/s3_loader.py\n", - " create mode 100644 torch_snippets/zen.py\n", - "Enumerating objects: 47, done.\n", - "Counting objects: 100% (47/47), done.\n", + "[master 72e85c2] 0.540\n", + " 98 files changed, 23423 insertions(+), 7738 deletions(-)\n", + " create mode 100644 __module_timing__.py.lprof\n", + " create mode 100644 _proc/bokeh_plotting.ipynb\n", + " create mode 100644 _proc/capsule.ipynb\n", + " create mode 100644 _proc/charts.ipynb\n", + " create mode 100644 _proc/config.ipynb\n", + " create mode 100644 _proc/interactive_show.ipynb\n", + " delete mode 100644 _proc/logging.ipynb\n", + " create mode 100644 _proc/sklegos.ipynb\n", + " create mode 100644 debug/profile_time.txt\n", + " create mode 100644 debug/profile_time_202408241027.txt\n", + " create mode 100644 docs/AttrDict.html\n", + " create mode 100644 docs/charts_files/figure-html/cell-7-output-1.png\n", + " create mode 100644 torch_snippets/__module_timing__.py\n", + "Enumerating objects: 207, done.\n", + "Counting objects: 100% (207/207), done.\n", "Delta compression using up to 12 threads\n", - "Compressing objects: 100% (25/25), done.\n", - "Writing objects: 100% (26/26), 14.37 KiB | 4.79 MiB/s, done.\n", - "Total 26 (delta 20), reused 0 (delta 0), pack-reused 0\n", - "remote: Resolving deltas: 100% (20/20), completed with 19 local objects.\u001b[K\n", + "Compressing objects: 100% (110/110), done.\n", + "Writing objects: 100% (114/114), 1.12 MiB | 4.66 MiB/s, done.\n", + "Total 114 (delta 84), reused 1 (delta 1), pack-reused 0\n", + "remote: Resolving deltas: 100% (84/84), completed with 62 local objects.\u001b[K\n", "To ssh://github.com/sizhky/torch_snippets\n", - " 7d0b19f..a2cf6d4 master -> master\n" + " a2cf6d4..72e85c2 master -> master\n" ] } ], diff --git a/testing.ipynb b/testing.ipynb index 406e729..ea11e57 100644 --- a/testing.ipynb +++ b/testing.ipynb @@ -263,7 +263,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.15" + "version": "3.12.4" } }, "nbformat": 4,