CINXE.COM

GitHub - ZacharyPatten/Towel: Throw in the towel.

<!DOCTYPE html> <html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system" data-a11y-link-underlines="true" > <head> <meta charset="utf-8"> <link rel="dns-prefetch" href="https://github.githubassets.com"> <link rel="dns-prefetch" href="https://avatars.githubusercontent.com"> <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com"> <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/"> <link rel="preconnect" href="https://github.githubassets.com" crossorigin> <link rel="preconnect" href="https://avatars.githubusercontent.com"> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-74231a1f3bbb.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-8a995f0bacd4.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-f37fb7684b1f.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-9ac301c3ebe5.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-cd826e8636dc.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-f91b0f603451.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-83beb16e0ecf.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-6e122dab64fc.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-18119e682df0.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-225433424a87.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-aaa714e5674d.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-7d4d2344e7ab.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-43ae85d4871b.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-4fce88777fa8.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-0210be90f4d3.css" /> <script type="application/json" id="client-env">{"locale":"en","featureFlags":["a11y_quote_reply_fix","copilot_immersive_issue_preview","copilot_new_references_ui","copilot_chat_repo_custom_instructions_preview","copilot_no_floating_button","copilot_topics_as_references","copilot_read_shared_conversation","copilot_duplicate_thread","copilot_buffered_streaming","dotcom_chat_client_side_skills","experimentation_azure_variant_endpoint","failbot_handle_non_errors","fgpat_form_ui_updates","geojson_azure_maps","ghost_pilot_confidence_truncation_25","ghost_pilot_confidence_truncation_40","github_models_o3_mini_streaming","hovercard_accessibility","insert_before_patch","issues_react_remove_placeholders","issues_react_blur_item_picker_on_close","marketing_pages_search_explore_provider","primer_react_css_modules_ga","react_data_router_pull_requests","remove_child_patch","sample_network_conn_type","swp_enterprise_contact_form","site_proxima_australia_update","viewscreen_sandbox","issues_react_create_milestone","issues_react_cache_fix_workaround","lifecycle_label_name_updates","copilot_task_oriented_assistive_prompts","issues_react_assignee_warning","issue_types_prevent_private_type_creation","turbo_app_id_restore"]}</script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-7e63cc235734.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover_js-9da652f58479.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_arianotify-polyfill_ariaNotify-polyfill_js-node_modules_github_mi-3abb8f-46b9f4874d95.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_failbot_failbot_ts-75968cfb5298.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/environment-f04cb2a9fc8c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_behaviors_dist_esm_index_mjs-0dbb79f97f8f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_selector-observer_dist_index_esm_js-f690fd9ae3d5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_relative-time-element_dist_index_js-62d275b7ddd9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_text-expander-element_dist_index_js-78748950cb0c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_auto-complete-element_dist_index_js-node_modules_github_catalyst_-8e9f78-a90ac05d2469.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-b5f1d7-a1760ffda83d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_markdown-toolbar-element_dist_index_js-ceef33f593fa.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_primer_view-co-c44a69-8c52cf4cd0d3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-394f8eb34f19.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-0bebfa1427c4.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_braintree_browser-detection_dist_browser-detection_js-node_modules_githu-2906d7-2a07a295af40.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-html_lit-html_js-be8cb88f481b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_morphdom_dist_morphdom-e-7c534c-a4a1922eb55f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_turbo_dist_turbo_es2017-esm_js-a03ee12d659a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-893f9f-b6294cf703b7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_color-convert_index_js-e3180fe3bcb3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_quote-selection_dist_index_js-node_modules_github_session-resume_-947061-e7a6c4a19f98.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_updatable-content_updatable-content_ts-2a55124d5c52.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_task-list_ts-app_assets_modules_github_sso_ts-ui_packages-900dde-768abe60b1f8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_sticky-scroll-into-view_ts-3e000c5d31a9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_ajax-error_ts-app_assets_modules_github_behaviors_include-87a4ae-8be71414579a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_commenting_edit_ts-app_assets_modules_github_behaviors_ht-83c235-e429cff6ceb1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-7ebb6421bf22.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_delegated-events_dist_index_js-node_modules_github_catalyst_lib_index_js-f6223d90c7ba.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-01e85cd1be94.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_virtualized-list_es_index_js-node_modules_github_template-parts_lib_index_js-94dc7a2157c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-70450e-4b93df70b903.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_ref-selector_ts-3e9d848bab5f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/codespaces-c3bcacfe317c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-3eebbd-0763620ad7bf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_decorators_js-node_modules_delegated-events_di-e161aa-9d41fb1b6c9e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_github_remote--3c9c82-b71ef90fbdc7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repositories-7a0dbaa42c57.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_github_catalyst_lib_inde-dbbea9-26cce2010167.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/code-menu-1c0aedc134b1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-e05a7c4c5398.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-6a3ef8158713.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-f1bca44e0926.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-cf2f2ab8dab4.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-62da9f-2df2f32ec596.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-9a233856b02c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-55fea94174bf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-58a0c58bfee4.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.e0c9f0687c56358ed85e.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.e0c9f0687c56358ed85e.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <title>GitHub - ZacharyPatten/Towel: Throw in the towel.</title> <meta name="route-pattern" content="/:user_id/:repository" data-turbo-transient> <meta name="route-controller" content="files" data-turbo-transient> <meta name="route-action" content="disambiguate" data-turbo-transient> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> <meta name="request-id" content="9A48:0A51:20AEC40:27922D8:67E11E33" data-pjax-transient="true"/><meta name="html-safe-nonce" content="0124a24319e3c7d9e856f050e111bf3a868374d96fc0b5f605d062dac0261c94" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5QTQ4OjBBNTE6MjBBRUM0MDoyNzkyMkQ4OjY3RTExRTMzIiwidmlzaXRvcl9pZCI6Ijg4MDUzODEzMjg4MTUwNzA3NzEiLCJyZWdpb25fZWRnZSI6InNvdXRoZWFzdGFzaWEiLCJyZWdpb25fcmVuZGVyIjoic291dGhlYXN0YXNpYSJ9" data-pjax-transient="true"/><meta name="visitor-hmac" content="07361e1fc668fc503197884f6f616446a6c74385b4d5c4c291c31fe846489691" data-pjax-transient="true"/> <meta name="hovercard-subject-tag" content="repository:170810013" data-turbo-transient> <meta name="github-keyboard-shortcuts" content="repository,copilot" data-turbo-transient="true" /> <meta name="selected-link" value="repo_source" data-turbo-transient> <link rel="assets" href="https://github.githubassets.com/"> <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I"> <meta name="octolytics-url" content="https://collector.github.com/github/collect" /> <meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;" data-turbo-transient="true" /> <meta name="user-login" content=""> <meta name="viewport" content="width=device-width"> <meta name="description" content="Throw in the towel. Contribute to ZacharyPatten/Towel development by creating an account on GitHub."> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub"> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub"> <meta property="fb:app_id" content="1401488693436528"> <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/ZacharyPatten/Towel" /> <meta name="twitter:image" content="https://repository-images.githubusercontent.com/170810013/50a51e00-88b4-11e9-99b0-7b7353684a1f" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="GitHub - ZacharyPatten/Towel: Throw in the towel." /><meta name="twitter:description" content="Throw in the towel. Contribute to ZacharyPatten/Towel development by creating an account on GitHub." /> <meta property="og:image" content="https://repository-images.githubusercontent.com/170810013/50a51e00-88b4-11e9-99b0-7b7353684a1f" /><meta property="og:image:alt" content="Throw in the towel. Contribute to ZacharyPatten/Towel development by creating an account on GitHub." /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="GitHub - ZacharyPatten/Towel: Throw in the towel." /><meta property="og:url" content="https://github.com/ZacharyPatten/Towel" /><meta property="og:description" content="Throw in the towel. Contribute to ZacharyPatten/Towel development by creating an account on GitHub." /> <meta name="hostname" content="github.com"> <meta name="expected-hostname" content="github.com"> <meta http-equiv="x-pjax-version" content="052a71b7c02165fbf2715bdbfbab05187e4b16e53a581d8594996a90b2e7e0b4" data-turbo-track="reload"> <meta http-equiv="x-pjax-csp-version" content="77190eb53eb47fc30bd2fcc17a7eefa2dfd8505869fee9299ba911be3a40a9eb" data-turbo-track="reload"> <meta http-equiv="x-pjax-css-version" content="3c046d4b918199cbb4d255cca63226853d0617dbae6529663229394aa9b0742a" data-turbo-track="reload"> <meta http-equiv="x-pjax-js-version" content="1529793745024e41638e0c5e8b0d9e42797bb9de3789d89787088aa632e6de83" data-turbo-track="reload"> <meta name="turbo-cache-control" content="no-preview" data-turbo-transient=""> <meta data-hydrostats="publish"> <meta name="go-import" content="github.com/ZacharyPatten/Towel git https://github.com/ZacharyPatten/Towel.git"> <meta name="octolytics-dimension-user_id" content="3385986" /><meta name="octolytics-dimension-user_login" content="ZacharyPatten" /><meta name="octolytics-dimension-repository_id" content="170810013" /><meta name="octolytics-dimension-repository_nwo" content="ZacharyPatten/Towel" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="170810013" /><meta name="octolytics-dimension-repository_network_root_nwo" content="ZacharyPatten/Towel" /> <link rel="canonical" href="https://github.com/ZacharyPatten/Towel" data-turbo-transient> <meta name="turbo-body-classes" content="logged-out env-production page-responsive"> <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats"> <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> <meta name="release" content="6192fb9d536c536dd945079929d35072dbad0e4f"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png"> <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon"> <meta name="theme-color" content="#1e2327"> <meta name="color-scheme" content="light dark" /> <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials"> </head> <body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div class="position-relative header-wrapper js-header-wrapper "> <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a> <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full"> <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span> </span> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ui-commands_ui-commands_ts-8c874fb594e9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-33dfb803e078.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.e0c9f0687c56358ed85e.module.css" /> <react-partial partial-name="keyboard-shortcuts-dialog" data-ssr="false" data-attempted-ssr="false" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script> <div data-target="react-partial.reactRoot"></div> </react-partial> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-94fd67-4898d1bf4b51.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/sessions-730dca81d0a2.js"></script> <header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=light data-light-theme=light data-dark-theme=dark> <h2 class="sr-only">Navigation Menu</h2> <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation"> <span class="d-none">Toggle navigation</span> </button> <div class="d-flex flex-column flex-lg-row flex-items-center px-3 px-md-4 px-lg-5 height-full position-relative z-1"> <div class="d-flex flex-justify-between flex-items-center width-full width-lg-auto"> <div class="flex-1"> <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target js-nav-padding-recalculate js-header-menu-toggle Button--link Button--medium Button d-lg-none color-fg-inherit p-1"> <span class="Button-content"> <span class="Button-label"><div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div></span> </span> </button> </div> <a class="mr-lg-3 color-fg-inherit flex-order-2 js-prevent-focus-on-mobile-nav" href="/" aria-label="Homepage" data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to go to homepage&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Logomark;ref_loc:Header&quot;}"> <svg height="32" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12 1C5.9225 1 1 5.9225 1 12C1 16.8675 4.14875 20.9787 8.52125 22.4362C9.07125 22.5325 9.2775 22.2025 9.2775 21.9137C9.2775 21.6525 9.26375 20.7862 9.26375 19.865C6.5 20.3737 5.785 19.1912 5.565 18.5725C5.44125 18.2562 4.905 17.28 4.4375 17.0187C4.0525 16.8125 3.5025 16.3037 4.42375 16.29C5.29 16.2762 5.90875 17.0875 6.115 17.4175C7.105 19.0812 8.68625 18.6137 9.31875 18.325C9.415 17.61 9.70375 17.1287 10.02 16.8537C7.5725 16.5787 5.015 15.63 5.015 11.4225C5.015 10.2262 5.44125 9.23625 6.1425 8.46625C6.0325 8.19125 5.6475 7.06375 6.2525 5.55125C6.2525 5.55125 7.17375 5.2625 9.2775 6.67875C10.1575 6.43125 11.0925 6.3075 12.0275 6.3075C12.9625 6.3075 13.8975 6.43125 14.7775 6.67875C16.8813 5.24875 17.8025 5.55125 17.8025 5.55125C18.4075 7.06375 18.0225 8.19125 17.9125 8.46625C18.6138 9.23625 19.04 10.2125 19.04 11.4225C19.04 15.6437 16.4688 16.5787 14.0213 16.8537C14.42 17.1975 14.7638 17.8575 14.7638 18.8887C14.7638 20.36 14.75 21.5425 14.75 21.9137C14.75 22.2025 14.9563 22.5462 15.5063 22.4362C19.8513 20.9787 23 16.8537 23 12C23 5.9225 18.0775 1 12 1Z"></path> </svg> </a> <div class="flex-1 flex-order-2 text-right"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2FZacharyPatten%2FTowel" class="HeaderMenu-link HeaderMenu-button d-inline-flex d-lg-none flex-order-1 f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit js-prevent-focus-on-mobile-nav" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/ZacharyPatten/Towel&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="6ff1b6c143451994792855683d263454f55c15c63f245d8c9aa55f9c6c245f7c" data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to Sign in&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Sign in;ref_loc:Header&quot;}" > Sign in </a> </div> </div> <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0"> <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0"> <nav class="HeaderMenu-nav" aria-label="Global"> <ul class="d-lg-flex list-style-none"> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Product <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_copilot&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_copilot_link_product_navbar&quot;}" href="https://github.com/features/copilot"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Write better code with AI </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;security&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;security_link_product_navbar&quot;}" href="https://github.com/features/security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Security</div> Find and fix vulnerabilities </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;actions&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;actions_link_product_navbar&quot;}" href="https://github.com/features/actions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-workflow color-fg-subtle mr-3"> <path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path> </svg> <div> <div class="color-fg-default h4">Actions</div> Automate any workflow </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;codespaces&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;codespaces_link_product_navbar&quot;}" href="https://github.com/features/codespaces"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-codespaces color-fg-subtle mr-3"> <path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> <div> <div class="color-fg-default h4">Codespaces</div> Instant dev environments </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;issues&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;issues_link_product_navbar&quot;}" href="https://github.com/features/issues"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-issue-opened color-fg-subtle mr-3"> <path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path> </svg> <div> <div class="color-fg-default h4">Issues</div> Plan and track work </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;code_review&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;code_review_link_product_navbar&quot;}" href="https://github.com/features/code-review"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-review color-fg-subtle mr-3"> <path d="M10.3 6.74a.75.75 0 0 1-.04 1.06l-2.908 2.7 2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M1.5 4.25c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v12.5a1.75 1.75 0 0 1-1.75 1.75h-9.69l-3.573 3.573A1.458 1.458 0 0 1 5 21.043V18.5H3.25a1.75 1.75 0 0 1-1.75-1.75ZM3.25 4a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 .75.75v3.19l3.72-3.72a.749.749 0 0 1 .53-.22h10a.25.25 0 0 0 .25-.25V4.25a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Review</div> Manage code changes </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;discussions&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;discussions_link_product_navbar&quot;}" href="https://github.com/features/discussions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Discussions</div> Collaborate outside of code </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;code_search&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;code_search_link_product_navbar&quot;}" href="https://github.com/features/code-search"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-square color-fg-subtle mr-3"> <path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Search</div> Find more, search less </div> </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="product-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="product-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;all_features&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;all_features_link_product_navbar&quot;}" href="https://github.com/features"> All features </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;documentation&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;documentation_link_product_navbar&quot;}" href="https://docs.github.com"> Documentation <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_skills&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_skills_link_product_navbar&quot;}" href="https://skills.github.com"> GitHub Skills <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;blog&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;blog_link_product_navbar&quot;}" href="https://github.blog"> Blog <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Solutions <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 pb-lg-3 mb-3 mb-lg-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-company-size-heading">By company size</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-company-size-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;enterprises&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;enterprises_link_solutions_navbar&quot;}" href="https://github.com/enterprise"> Enterprises </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;small_and_medium_teams&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;small_and_medium_teams_link_solutions_navbar&quot;}" href="https://github.com/team"> Small and medium teams </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;startups&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;startups_link_solutions_navbar&quot;}" href="https://github.com/enterprise/startups"> Startups </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;nonprofits&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;nonprofits_link_solutions_navbar&quot;}" href="/solutions/industry/nonprofits"> Nonprofits </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-use-case-heading">By use case</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-use-case-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;devsecops&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;devsecops_link_solutions_navbar&quot;}" href="/solutions/use-case/devsecops"> DevSecOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;devops&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;devops_link_solutions_navbar&quot;}" href="/solutions/use-case/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;ci_cd&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;ci_cd_link_solutions_navbar&quot;}" href="/solutions/use-case/ci-cd"> CI/CD </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;view_all_use_cases&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;view_all_use_cases_link_solutions_navbar&quot;}" href="/solutions/use-case"> View all use cases </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-industry-heading">By industry</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-industry-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;healthcare&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;healthcare_link_solutions_navbar&quot;}" href="/solutions/industry/healthcare"> Healthcare </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;financial_services&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;financial_services_link_solutions_navbar&quot;}" href="/solutions/industry/financial-services"> Financial services </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;manufacturing&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;manufacturing_link_solutions_navbar&quot;}" href="/solutions/industry/manufacturing"> Manufacturing </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;government&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;government_link_solutions_navbar&quot;}" href="/solutions/industry/government"> Government </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;view_all_industries&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;view_all_industries_link_solutions_navbar&quot;}" href="/solutions/industry"> View all industries </a></li> </ul> </div> </div> <div class="HeaderMenu-trailing-link rounded-bottom-2 flex-shrink-0 mt-lg-4 px-lg-4 py-4 py-lg-3 f5 text-semibold"> <a href="/solutions"> View all solutions <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-right HeaderMenu-trailing-link-icon"> <path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path> </svg> </a> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Resources <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-topics-heading">Topics</span> <ul class="list-style-none f5" aria-labelledby="resources-topics-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;ai&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;ai_link_resources_navbar&quot;}" href="/resources/articles/ai"> AI </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;devops&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;devops_link_resources_navbar&quot;}" href="/resources/articles/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;security&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;security_link_resources_navbar&quot;}" href="/resources/articles/security"> Security </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;software_development&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;software_development_link_resources_navbar&quot;}" href="/resources/articles/software-development"> Software Development </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;view_all&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;view_all_link_resources_navbar&quot;}" href="/resources/articles"> View all </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="resources-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;learning_pathways&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;learning_pathways_link_resources_navbar&quot;}" href="https://resources.github.com/learn/pathways"> Learning Pathways <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;events_amp_webinars&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;events_amp_webinars_link_resources_navbar&quot;}" href="https://resources.github.com"> Events &amp; Webinars <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;ebooks_amp_whitepapers&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;ebooks_amp_whitepapers_link_resources_navbar&quot;}" href="https://github.com/resources/whitepapers"> Ebooks &amp; Whitepapers </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;customer_stories&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;customer_stories_link_resources_navbar&quot;}" href="https://github.com/customer-stories"> Customer Stories </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;partners&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;partners_link_resources_navbar&quot;}" href="https://partner.github.com"> Partners <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;executive_insights&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;executive_insights_link_resources_navbar&quot;}" href="https://github.com/solutions/executive-insights"> Executive Insights </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Open Source <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_sponsors&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_sponsors_link_open_source_navbar&quot;}" href="/sponsors"> <div> <div class="color-fg-default h4">GitHub Sponsors</div> Fund open source developers </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;the_readme_project&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;the_readme_project_link_open_source_navbar&quot;}" href="https://github.com/readme"> <div> <div class="color-fg-default h4">The ReadME Project</div> GitHub community articles </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="open-source-repositories-heading">Repositories</span> <ul class="list-style-none f5" aria-labelledby="open-source-repositories-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;topics&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;topics_link_open_source_navbar&quot;}" href="https://github.com/topics"> Topics </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;trending&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;trending_link_open_source_navbar&quot;}" href="https://github.com/trending"> Trending </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;collections&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;collections_link_open_source_navbar&quot;}" href="https://github.com/collections"> Collections </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Enterprise <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;enterprise_platform&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;enterprise_platform_link_enterprise_navbar&quot;}" href="/enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-stack color-fg-subtle mr-3"> <path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path> </svg> <div> <div class="color-fg-default h4">Enterprise platform</div> AI-powered developer platform </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="enterprise-available-add-ons-heading">Available add-ons</span> <ul class="list-style-none f5" aria-labelledby="enterprise-available-add-ons-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;advanced_security&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;advanced_security_link_enterprise_navbar&quot;}" href="https://github.com/enterprise/advanced-security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Advanced Security</div> Enterprise-grade security features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;copilot_for_business&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;copilot_for_business_link_enterprise_navbar&quot;}" href="/features/copilot/copilot-business"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">Copilot for business</div> Enterprise-grade AI features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;premium_support&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;premium_support_link_enterprise_navbar&quot;}" href="/premium-support"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Premium Support</div> Enterprise-grade 24/7 support </div> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <a class="HeaderMenu-link no-underline px-0 px-lg-2 py-3 py-lg-2 d-block d-lg-inline-block" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;pricing&quot;,&quot;context&quot;:&quot;global&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;pricing_link_global_navbar&quot;}" href="https://github.com/pricing">Pricing</a> </li> </ul> </nav> <div class="d-flex flex-column flex-lg-row width-full flex-justify-end flex-lg-items-center text-center mt-3 mt-lg-0 text-lg-left ml-lg-3"> <qbsearch-input class="search-input" data-scope="repo:ZacharyPatten/Towel" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="q7U7omjiebDo5EmKX_nK2_xg2q12qVqL6nWiPbz__GIpR_XaeQqJPawC2xAWN4Hbl25cfhgo76E6BEEjMcae1w" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="ZacharyPatten/Towel" data-current-org="" data-current-owner="ZacharyPatten" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true"> <div class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center mr-4 rounded" data-action="click:qbsearch-input#searchInputContainerClicked" > <button type="button" class="header-search-button placeholder input-button form-control d-flex flex-1 flex-self-stretch flex-items-center no-wrap width-full py-0 pl-2 pr-0 text-left border-0 box-shadow-none" data-target="qbsearch-input.inputButton" aria-label="Search or jump to…" aria-haspopup="dialog" placeholder="Search or jump to..." data-hotkey=s,/ autocapitalize="off" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;searchbar&quot;,&quot;context&quot;:&quot;global&quot;,&quot;tag&quot;:&quot;input&quot;,&quot;label&quot;:&quot;searchbar_input_global_navbar&quot;}" data-action="click:qbsearch-input#handleExpand" > <div class="mr-2 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </div> <span class="flex-1" data-target="qbsearch-input.inputButtonText">Search or jump to...</span> <div class="d-flex" data-target="qbsearch-input.hotkeyIndicator"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" aria-hidden="true" class="mr-1"><path fill="none" stroke="#979A9C" opacity=".4" d="M3.5.5h12c1.7 0 3 1.3 3 3v13c0 1.7-1.3 3-3 3h-12c-1.7 0-3-1.3-3-3v-13c0-1.7 1.3-3 3-3z"></path><path fill="#979A9C" d="M11.8 6L8 15.1h-.9L10.8 6h1z"></path></svg> </div> </button> <input type="hidden" name="type" class="js-site-search-type-field"> <div class="Overlay--hidden " data-modal-dialog-overlay> <modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-large Overlay--height-auto"> <h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1> <div class="Overlay-body Overlay-body--paddingNone"> <div data-view-component="true"> <div class="search-suggestions position-fixed width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container" style="border-radius: 12px;" data-target="qbsearch-input.queryBuilderContainer" hidden > <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get"> <query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder"> <div class="FormControl FormControl--fullWidth"> <label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only"> Search </label> <div class="QueryBuilder-StyledInput width-fit " data-target="query-builder.styledInput" > <span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </span> <div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer"> <div aria-hidden="true" class="QueryBuilder-StyledInputContent" data-target="query-builder.styledInputContent" ></div> <div class="QueryBuilder-InputWrapper"> <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div> <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-36a80a5a-d2b0-4d31-bbd0-0f5a8040c4e2" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown focus:query-builder#inputFocus " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" /> </div> </div> <span class="sr-only" id="query-builder-test-clear">Clear</span> <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action=" click:query-builder#clear focus:query-builder#clearButtonFocus blur:query-builder#clearButtonBlur " variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual"> <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path> </svg> </button> </div> <template id="search-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </template> <template id="code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="file-code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code"> <path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path> </svg> </template> <template id="history-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history"> <path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path> </svg> </template> <template id="repo-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> </template> <template id="bookmark-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark"> <path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="plus-circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> </template> <template id="trash-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash"> <path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path> </svg> </template> <template id="team-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people"> <path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path> </svg> </template> <template id="project-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project"> <path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path> </svg> </template> <template id="pencil-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil"> <path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path> </svg> </template> <template id="copilot-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot"> <path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="copilot-error-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error"> <path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path> </svg> </template> <template id="workflow-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow"> <path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="book-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> </template> <template id="code-review-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="codespaces-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces"> <path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> </template> <template id="comment-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment"> <path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="comment-discussion-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> </template> <template id="organization-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization"> <path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="rocket-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket"> <path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </template> <template id="shield-check-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check"> <path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="heart-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart"> <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> </template> <template id="server-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="globe-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path> </svg> </template> <template id="issue-opened-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </template> <template id="device-mobile-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile"> <path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path> </svg> </template> <template id="package-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package"> <path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path> </svg> </template> <template id="credit-card-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card"> <path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path> </svg> </template> <template id="play-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </template> <template id="gift-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift"> <path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path> </svg> </template> <template id="code-square-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="device-desktop-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop"> <path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path> </svg> </template> <div class="position-relative"> <ul role="listbox" class="ActionListWrap QueryBuilder-ListWrap" aria-label="Suggestions" data-action=" combobox-commit:query-builder#comboboxCommit mousedown:query-builder#resultsMousedown " data-target="query-builder.resultsList" data-persist-list=false id="query-builder-test-results" ></ul> </div> <div class="FormControl-inlineValidation" id="validation-36a80a5a-d2b0-4d31-bbd0-0f5a8040c4e2" hidden="hidden"> <span class="FormControl-inlineValidation--visual"> <svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill"> <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path> </svg> </span> <span></span> </div> </div> <div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div> </query-builder></form> <div class="d-flex flex-row color-fg-muted px-3 text-small color-bg-default search-feedback-prompt"> <a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2">Search syntax tips</a> <div class="d-flex flex-1"></div> </div> </div> </div> </div> </modal-dialog></div> </div> <div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div> <div class="color-fg-default"> <dialog-helper> <dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="feedback-dialog-title"> Provide feedback </h1> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="feedback-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="feedback-dialog-title"> <div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="nCyeKlNQs5/oFXzTEbuK5rwSYUZhiHdzHflfQ1LC77esz8HkCXR82a8WomtZ7Qd3CkoV8mpqFvJsWk4BR0Y4QQ==" /> <p>We read every piece of feedback, and take your input very seriously.</p> <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea> <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox"> <label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label> </form></div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd"> <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn"> Submit feedback </button> </div> </dialog></dialog-helper> <custom-scopes data-target="qbsearch-input.customScopesManager"> <dialog-helper> <dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header Overlay-header--divided"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="custom-scopes-dialog-title"> Saved searches </h1> <h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="custom-scopes-dialog-title"> <div data-view-component="true" class="Overlay-body"> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="BoRvPbNZV9QILaqGG054v+EDrJefiy0/aQ3Rbh6tyWCke47A/TVtFuwUZ2cjqLl8O2KsJ92xUEet1U9s09jKNA==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> <div class="form-group"> <label for="custom_scope_name">Name</label> <auto-check src="/search/custom_scopes/check_name" required only-validate-on-blur="false"> <input type="text" name="custom_scope_name" id="custom_scope_name" data-target="custom-scopes.customScopesNameField" class="form-control" autocomplete="off" placeholder="github-ruby" required maxlength="50"> <input type="hidden" data-csrf="true" value="N2PpTyZHRMMGl1Iiuj4qlqxnjaZZND44sg30lm1XJ+RtXSHds2VO7qE846nY7vLbR0gbvgTwTLFDgZFGNUcZJg==" /> </auto-check> </div> <div class="form-group"> <label for="custom_scope_query">Query</label> <input type="text" name="custom_scope_query" id="custom_scope_query" data-target="custom-scopes.customScopesQueryField" class="form-control" autocomplete="off" placeholder="(repo:mona/a OR repo:mona/b) AND lang:python" required maxlength="500"> </div> <p class="text-small color-fg-muted"> To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>. </p> </form> </div> <div data-target="custom-scopes.manageCustomScopesForm"> <div data-target="custom-scopes.list"></div> </div> </div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn"> Create saved search </button> </div> </dialog></dialog-helper> </custom-scopes> </div> </qbsearch-input> <div class="position-relative HeaderMenu-link-wrap d-lg-inline-block"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2FZacharyPatten%2FTowel" class="HeaderMenu-link HeaderMenu-link--sign-in HeaderMenu-button flex-shrink-0 no-underline d-none d-lg-inline-flex border border-lg-0 rounded rounded-lg-0 px-2 py-1" style="margin-left: 12px;" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/ZacharyPatten/Towel&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="6ff1b6c143451994792855683d263454f55c15c63f245d8c9aa55f9c6c245f7c" data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to go to homepage&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Sign in;ref_loc:Header&quot;}" > Sign in </a> </div> <a href="/signup?ref_cta=Sign+up&amp;ref_loc=header+logged+out&amp;ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E&amp;source=header-repo&amp;source_repo=ZacharyPatten%2FTowel" class="HeaderMenu-link HeaderMenu-link--sign-up HeaderMenu-button flex-shrink-0 d-flex d-lg-inline-flex no-underline border color-border-default rounded px-2 py-1" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/ZacharyPatten/Towel&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="6ff1b6c143451994792855683d263454f55c15c63f245d8c9aa55f9c6c245f7c" data-analytics-event="{&quot;category&quot;:&quot;Sign up&quot;,&quot;action&quot;:&quot;click to sign up for account&quot;,&quot;label&quot;:&quot;ref_page:/&lt;user-name&gt;/&lt;repo-name&gt;;ref_cta:Sign up;ref_loc:header logged out&quot;}" > Sign up </a> <button type="button" class="sr-only js-header-menu-focus-trap d-block d-lg-none">Reseting focus</button> </div> </div> </div> </div> </header> <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <button id="icon-button-6c50df58-952b-4dec-9f73-e5b063bb9d05" aria-labelledby="tooltip-7ded9a4d-9489-4484-bb58-0792671410fd" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button><tool-tip id="tooltip-7ded9a4d-9489-4484-bb58-0792671410fd" for="icon-button-6c50df58-952b-4dec-9f73-e5b063bb9d05" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> </div> </div> <div id="start-of-content" class="show-on-focus"></div> <div id="js-flash-container" class="flash-container" data-turbo-replace> <template class="js-flash-template"> <div class="flash flash-full {{ className }}"> <div > <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div aria-atomic="true" role="alert" class="js-flash-alert"> <div>{{ message }}</div> </div> </div> </div> </template> </div> <div class="application-main " data-commit-hovercards-enabled data-discussion-hovercards-enabled data-issue-and-pr-hovercards-enabled data-project-hovercards-enabled > <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class=""> <main id="js-repo-pjax-container" > <div id="repository-container-header" class="pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace> <div class="d-flex flex-nowrap flex-justify-end mb-3 px-3 px-lg-5" style="gap: 1rem;"> <div class="flex-auto min-width-0 width-fit"> <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> <span class="author flex-self-stretch" itemprop="author"> <a class="url fn" rel="author" data-hovercard-type="user" data-hovercard-url="/users/ZacharyPatten/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/ZacharyPatten"> ZacharyPatten </a> </span> <span class="mx-1 flex-self-stretch color-fg-muted">/</span> <strong itemprop="name" class="mr-2 flex-self-stretch"> <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/ZacharyPatten/Towel">Towel</a> </strong> <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span> </div> </div> <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;"> <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;"> <li> <include-fragment src="/ZacharyPatten/Towel/sponsor_button"></include-fragment> </li> <li> <a href="/login?return_to=%2FZacharyPatten%2FTowel" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/ZacharyPatten/Towel&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="c75c794a4e06992cc94fff542f1ba0770ff4cbf762f8fdc50f16798805de9b5c" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-49cd7e54-4816-4541-ad28-4c383f147241" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </li> <li> <a icon="repo-forked" id="fork-button" href="/login?return_to=%2FZacharyPatten%2FTowel" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;repo details fork button&quot;,&quot;repository_id&quot;:170810013,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/ZacharyPatten/Towel&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="d416fba591c37d53e2b31e30ffd16c1df4efe3bdd1d72d1397577f1097bc7b5b" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg>Fork <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="53" data-view-component="true" class="Counter">53</span> </a> </li> <li> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2FZacharyPatten%2FTowel" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:170810013,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/ZacharyPatten/Towel&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="58f97d4f28674d3e2f302ce1677a06b04a8a9f28352ce7928e23d5670f4ca069" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> <span id="repo-stars-counter-star" aria-label="738 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="738" data-view-component="true" class="Counter js-social-count">738</span> </a></div> </li> </ul> </div> </div> <div id="responsive-meta-container" data-turbo-replace> <div class="d-block d-md-none mb-2 px-3 px-md-4 px-lg-5"> <p class="f4 mb-3 "> Throw in the towel. </p> <h3 class="sr-only">License</h3> <div class="mb-2"> <a href="/ZacharyPatten/Towel/blob/main/License.md" class="Link--muted" data-analytics-event="{&quot;category&quot;:&quot;Repository Overview&quot;,&quot;action&quot;:&quot;click&quot;,&quot;label&quot;:&quot;location:sidebar;file:license&quot;}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> MIT license </a> </div> <div class="mb-3"> <a class="Link--secondary no-underline mr-3" href="/ZacharyPatten/Towel/stargazers"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-1"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <span class="text-bold">738</span> stars </a> <a class="Link--secondary no-underline mr-3" href="/ZacharyPatten/Towel/forks"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-1"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <span class="text-bold">53</span> forks </a> <a class="Link--secondary no-underline mr-3 d-inline-block" href="/ZacharyPatten/Towel/branches"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-branch mr-1"> <path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path> </svg> <span>Branches</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/ZacharyPatten/Towel/tags"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-tag mr-1"> <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path> </svg> <span>Tags</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/ZacharyPatten/Towel/activity"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-1"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span>Activity</span> </a> </div> <div class="d-flex flex-wrap gap-2"> <div class="flex-1"> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2FZacharyPatten%2FTowel" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:170810013,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/ZacharyPatten/Towel&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="58f97d4f28674d3e2f302ce1677a06b04a8a9f28352ce7928e23d5670f4ca069" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> </a></div> </div> <div class="flex-1"> <a href="/login?return_to=%2FZacharyPatten%2FTowel" rel="nofollow" id="files-overview-watch-button" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/ZacharyPatten/Towel&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="c75c794a4e06992cc94fff542f1ba0770ff4cbf762f8fdc50f16798805de9b5c" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-f65c5de3-8052-4bd9-a27d-0baa13ce2684" for="files-overview-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </div> <span> </span> </div> </div> </div> <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 px-md-4 px-lg-5"> <ul data-view-component="true" class="UnderlineNav-body list-style-none"> <li data-view-component="true" class="d-inline-flex"> <a id="code-tab" href="/ZacharyPatten/Towel" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /ZacharyPatten/Towel" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Code&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> <span data-content="Code">Code</span> <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="issues-tab" href="/ZacharyPatten/Towel/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /ZacharyPatten/Towel/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Issues&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> <span data-content="Issues">Issues</span> <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="7" data-view-component="true" class="Counter">7</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="pull-requests-tab" href="/ZacharyPatten/Towel/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /ZacharyPatten/Towel/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Pull requests&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> <span data-content="Pull requests">Pull requests</span> <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="3" data-view-component="true" class="Counter">3</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="discussions-tab" href="/ZacharyPatten/Towel/discussions" data-tab-item="i3discussions-tab" data-selected-links="repo_discussions /ZacharyPatten/Towel/discussions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g g" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Discussions&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> <span data-content="Discussions">Discussions</span> <span id="discussions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="actions-tab" href="/ZacharyPatten/Towel/actions" data-tab-item="i4actions-tab" data-selected-links="repo_actions /ZacharyPatten/Towel/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Actions&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> <span data-content="Actions">Actions</span> <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="security-tab" href="/ZacharyPatten/Towel/security" data-tab-item="i5security-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /ZacharyPatten/Towel/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Security&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span data-content="Security">Security</span> <include-fragment src="/ZacharyPatten/Towel/security/overall-count" accept="text/fragment+html"></include-fragment> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="insights-tab" href="/ZacharyPatten/Towel/pulse" data-tab-item="i6insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /ZacharyPatten/Towel/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Insights&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> <span data-content="Insights">Insights</span> <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> </ul> <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 pr-md-4 pr-lg-5 right-0"> <action-menu data-select-variant="none" data-view-component="true"> <focus-group direction="vertical" mnemonics retain> <button id="action-menu-619e6a8e-c646-43e0-9f7d-4ee2aefaa358-button" popovertarget="action-menu-619e6a8e-c646-43e0-9f7d-4ee2aefaa358-overlay" aria-controls="action-menu-619e6a8e-c646-43e0-9f7d-4ee2aefaa358-list" aria-haspopup="true" aria-labelledby="tooltip-efb938e0-b805-4c81-9d47-875d10108e3d" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual"> <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path> </svg> </button><tool-tip id="tooltip-efb938e0-b805-4c81-9d47-875d10108e3d" for="action-menu-619e6a8e-c646-43e0-9f7d-4ee2aefaa358-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip> <anchored-position data-target="action-menu.overlay" id="action-menu-619e6a8e-c646-43e0-9f7d-4ee2aefaa358-overlay" anchor="action-menu-619e6a8e-c646-43e0-9f7d-4ee2aefaa358-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true"> <div data-view-component="true" class="Overlay Overlay--size-auto"> <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone"> <action-list> <div data-view-component="true"> <ul aria-labelledby="action-menu-619e6a8e-c646-43e0-9f7d-4ee2aefaa358-button" id="action-menu-619e6a8e-c646-43e0-9f7d-4ee2aefaa358-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap"> <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-43a2687c-e2c3-4d59-8118-01890868bcf4" href="/ZacharyPatten/Towel" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Code </span> </a> </li> <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-9bdfbc9b-b587-48a6-96c5-40f7f3df8848" href="/ZacharyPatten/Towel/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Issues </span> </a> </li> <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-07f6d54a-03ad-4102-bf53-3b2b15148c4e" href="/ZacharyPatten/Towel/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Pull requests </span> </a> </li> <li hidden="hidden" data-menu-item="i3discussions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-24f4cece-85b4-4ca6-af09-1677731ab00b" href="/ZacharyPatten/Towel/discussions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Discussions </span> </a> </li> <li hidden="hidden" data-menu-item="i4actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-72492e52-c676-4e92-be45-c900dcfa0700" href="/ZacharyPatten/Towel/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Actions </span> </a> </li> <li hidden="hidden" data-menu-item="i5security-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-1ec4ad12-6f7e-4ed0-b1d6-8d0c75892963" href="/ZacharyPatten/Towel/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Security </span> </a> </li> <li hidden="hidden" data-menu-item="i6insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-b69cef5e-1e95-4ee7-ae3c-586f80e6a5f5" href="/ZacharyPatten/Towel/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Insights </span> </a> </li> </ul> </div></action-list> </div> </div></anchored-position> </focus-group> </action-menu></div> </nav> </div> <turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class=""> <div id="repo-content-pjax-container" class="repository-content " > <h1 class='sr-only'>ZacharyPatten/Towel</h1> <div class="clearfix container-xl px-md-4 px-lg-5 px-3"> <div> <div style="max-width: 100%" data-view-component="true" class="Layout Layout--flowRow-until-md react-repos-overview-margin Layout--sidebarPosition-end Layout--sidebarPosition-flowRow-end"> <div data-view-component="true" class="Layout-main"> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_dompurify_dist_purify_es_mjs-dd1d3ea6a436.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryObserver_js-node_modules_tanstack_-defd52-843b41414e0e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_aria-live_aria-live_ts-ui_packages_promise-with-resolvers-polyfill_promise-with-r-17c672-34345cb18aac.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_paths_index_ts-e019c54eb886.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ref-selector_RefSelector_tsx-7496afc3784d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_commit-attribution_index_ts-ui_packages_commit-checks-status_index_ts-ui_packages-7094d4-15017f02e61c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_shortcuts_ts-ui_packages_code-view-shared_utilities_styles-0dc246-f8753c5db08d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_use-canonical-object_ts-ui_packages_code-view-shared_hooks-a83ec0-5ee2b562b57f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repos-overview-ca785c0ab4fa.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.e0c9f0687c56358ed85e.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repos-overview.0ee7cac3ab511a65d9f9.module.css" /> <react-partial partial-name="repos-overview" data-ssr="true" data-attempted-ssr="true" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"initialPayload":{"allShortcutsEnabled":false,"path":"/","repo":{"id":170810013,"defaultBranch":"main","name":"Towel","ownerLogin":"ZacharyPatten","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2019-02-15T06:00:53.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/3385986?v=4","public":true,"private":false,"isOrgOwned":false},"currentUser":null,"refInfo":{"name":"main","listCacheKey":"v0:1660083419.133333","canEdit":false,"refType":"branch","currentOid":"809afd70d0d6e63c2510ca703d857f7ea6de0656"},"tree":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":".vscode","path":".vscode","contentType":"directory"},{"name":"Examples","path":"Examples","contentType":"directory"},{"name":"Sources/Towel","path":"Sources/Towel","contentType":"directory","hasSimplifiedPath":true},{"name":"Tools","path":"Tools","contentType":"directory"},{"name":".editorconfig","path":".editorconfig","contentType":"file"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"Directory.Build.props","path":"Directory.Build.props","contentType":"file"},{"name":"License.md","path":"License.md","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"Towel.sln","path":"Towel.sln","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":null,"totalCount":12,"showBranchInfobar":false},"fileTree":null,"fileTreeProcessingTime":null,"foldersToFetch":[],"treeExpanded":false,"symbolsExpanded":false,"isOverview":true,"overview":{"banners":{"shouldRecommendReadme":false,"isPersonalRepo":false,"showUseActionBanner":false,"actionSlug":null,"actionId":null,"showProtectBranchBanner":false,"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_repo","releasePath":"/ZacharyPatten/Towel/releases/new?marketplace=true","showPublishActionBanner":false},"interactionLimitBanner":null,"showInvitationBanner":false,"inviterName":null,"actionsMigrationBannerInfo":{"releaseTags":[],"showImmutableActionsMigrationBanner":false,"initialMigrationStatus":null}},"codeButton":{"contactPath":"/contact","isEnterprise":false,"local":{"protocolInfo":{"httpAvailable":true,"sshAvailable":null,"httpUrl":"https://github.com/ZacharyPatten/Towel.git","showCloneWarning":null,"sshUrl":null,"sshCertificatesRequired":null,"sshCertificatesAvailable":null,"ghCliUrl":"gh repo clone ZacharyPatten/Towel","defaultProtocol":"http","newSshKeyUrl":"/settings/ssh/new","setProtocolPath":"/users/set_protocol"},"platformInfo":{"cloneUrl":"https://desktop.github.com","showVisualStudioCloneButton":false,"visualStudioCloneUrl":"https://windows.github.com","showXcodeCloneButton":false,"xcodeCloneUrl":"xcode://clone?repo=https%3A%2F%2Fgithub.com%2FZacharyPatten%2FTowel","zipballUrl":"/ZacharyPatten/Towel/archive/refs/heads/main.zip"}},"newCodespacePath":"/codespaces/new?hide_repo_select=true\u0026repo=170810013"},"popovers":{"rename":null,"renamedParentRepo":null},"commitCount":"1,285","overviewFiles":[{"displayName":"README.md","repoName":"Towel","refName":"main","path":"README.md","preferredFileType":"readme","tabName":"README","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cp align=\"center\" dir=\"auto\"\u003e\n\t\u003ca href=\"#\"\u003e\u003cimg src=\"https://github.com/ZacharyPatten/Towel/raw/main/.github/Resources/Logo.svg?raw=true\" height=\"150\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 align=\"center\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\n\tTowel\n\u003c/h1\u003e\u003ca id=\"user-content-towel\" class=\"anchor\" aria-label=\"Permalink: \n\tTowel\n\" href=\"#towel\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n\tA .NET library intended to make coding a bit more towelerable: data structures, algorithms, mathematics, metadata, extensions, console, and more. :)\n\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\"It's a tough galaxy. If you want to survive, you've gotta know... where your towel is.\" - Ford Prefect\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n\t\u003ca href=\"https://github.com/ZacharyPatten/Towel\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/eb5561bf62798dad49a5882b81f47d8653fd93d0922b5b3208d166c083ff9c99/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6769746875622d7265706f2d2532333234323932653f6c6f676f3d676974687562\" title=\"Go To Github Repo\" data-canonical-src=\"https://img.shields.io/badge/github-repo-%2324292e?logo=github\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://docs.microsoft.com/en-us/dotnet/csharp/\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/a8e40fa9b9c6a79952399160c119bb9793e1520c1e70e3593661d52fa3f3926d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c616e67756167652d432532332d253233313738363030\" title=\"Go To C# Documentation\" data-canonical-src=\"https://img.shields.io/badge/language-C%23-%23178600\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://dotnet.microsoft.com/download\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/2466bbd8ad4be1f3078f7454a4afc76da12e09b4e740a0e761e72149d8cdaadc/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f786d6c3f636f6c6f723d253233353132626434266c6162656c3d7461726765742671756572793d2532462532465461726765744672616d65776f726b253542312535442675726c3d68747470732533412532462532467261772e67697468756275736572636f6e74656e742e636f6d2532465a61636861727950617474656e253246546f77656c2532466d61696e253246536f7572636573253246546f77656c253246546f77656c2e637370726f6a266c6f676f3d2e6e6574\" title=\"Go To .NET Download\" data-canonical-src=\"https://img.shields.io/badge/dynamic/xml?color=%23512bd4\u0026amp;label=target\u0026amp;query=%2F%2FTargetFramework%5B1%5D\u0026amp;url=https%3A%2F%2Fraw.githubusercontent.com%2FZacharyPatten%2FTowel%2Fmain%2FSources%2FTowel%2FTowel.csproj\u0026amp;logo=.net\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://www.nuget.org/packages/Towel\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/bf1e657a5473e0a15faba1db813d3c67f4e866a3c91625dd92b6d9a42ddb0b6b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f546f77656c2e7376673f6c6f676f3d6e75676574\" title=\"Go To Nuget Package\" data-canonical-src=\"https://img.shields.io/nuget/v/Towel.svg?logo=nuget\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://zacharypatten.github.io/Towel/index.html\" rel=\"nofollow\"\u003e\u003cimg src=\"https://github.com/ZacharyPatten/Towel/raw/main/.github/Resources/docfx-badge.svg?raw=true\" title=\"Go To Docfx Documentation\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://github.com/ZacharyPatten/Towel/actions/workflows/Continuous%20Integration.yml\"\u003e\u003cimg src=\"https://github.com/ZacharyPatten/Towel/actions/workflows/Continuous%20Integration.yml/badge.svg\" title=\"Go To Action\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://zacharypatten.github.io/Towel/coveragereport/index.html\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/08ffcb6ef9d89240e1059ad24b47026a30fc4b19b07191cf5f7f6d9f83e36eaa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f786d6c3f636f6c6f723d79656c6c6f77266c6162656c3d636f7665726167652671756572793d253246253246636f766572616765253542312535442532462534306c696e652d726174652d70657263656e746167652675726c3d68747470732533412532462532467261772e67697468756275736572636f6e74656e742e636f6d2532465a61636861727950617474656e253246546f77656c25324667682d7061676573253246636f7665726167657265706f7274253246636f7665726167652e786d6c\" title=\"Go Test Coverage Report\" data-canonical-src=\"https://img.shields.io/badge/dynamic/xml?color=yellow\u0026amp;label=coverage\u0026amp;query=%2F%2Fcoverage%5B1%5D%2F%40line-rate-percentage\u0026amp;url=https%3A%2F%2Fraw.githubusercontent.com%2FZacharyPatten%2FTowel%2Fgh-pages%2Fcoveragereport%2Fcoverage.xml\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://discord.gg/4XbQbwF\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/9d23be90781e43160ac5e1e5ae6e03f0fcc2d60d94e1f8ac41fa2a97ff1907a6/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3535373234343932353731323932343638343f6c6f676f3d646973636f7264266c6f676f436f6c6f723d66666666666626636f6c6f723d373338394438\" title=\"Go To Discord Server\" data-canonical-src=\"https://img.shields.io/discord/557244925712924684?logo=discord\u0026amp;logoColor=ffffff\u0026amp;color=7389D8\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://github.com/ZacharyPatten/Towel/blob/main/License.md\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/44e7845c81a431dc740c9a7f76d0ea33e030e05d7a41d6164167ee435b17168f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e2e737667\" title=\"Go To License\" data-canonical-src=\"https://img.shields.io/badge/license-MIT-green.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003e\u003cstrong\u003eNote\u003c/strong\u003e This project has a goal of keeping up-to-date on modern coding practices rather than maintaining backwards compatibility such as targetting the latest non-preview version of .NET and embracing favorable breaking changes (\"Semantic Versioning\" is not being respected at this time).\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGetting Started\u003c/h2\u003e\u003ca id=\"user-content-getting-started\" class=\"anchor\" aria-label=\"Permalink: Getting Started\" href=\"#getting-started\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nRun The Included Examples \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eTowel has \u003ca href=\"https://github.com/ZacharyPatten/Towel/tree/main/Examples\"\u003eExamples\u003c/a\u003e included in this repository.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/ZacharyPatten/Towel/archive/main.zip\"\u003eDownload\u003c/a\u003e this repository and unzip the contents.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThere are no custom build processes. Towel should build with any standard .NET build process, but one of the following is recommended:\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nVisual Studio \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eInstall \u003ca href=\"https://visualstudio.microsoft.com/\" rel=\"nofollow\"\u003eVisual Studio\u003c/a\u003e if not already installed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eOpen the \u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Towel.sln\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-16.svg\" title=\"File\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003cstrong\u003e\u003ccode\u003eTowel.sln\u003c/code\u003e\u003c/strong\u003e file in Visual Studio.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cem\u003e(optional) \u003ca href=\"https://gist.github.com/ZacharyPatten/693f35653f6c21fbe6c85444792e524b\"\u003eHere are some settings you change in Visual Studio\u003c/a\u003e.\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nVisual Studio Code \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eInstall the \u003ca href=\"https://dotnet.microsoft.com/download\" rel=\"nofollow\"\u003e.NET SDK\u003c/a\u003e if not already installed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eInstall \u003ca href=\"https://visualstudio.microsoft.com/\" rel=\"nofollow\"\u003eVisual Studio Code\u003c/a\u003e if not already installed.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eOpen the \u003csub\u003e\u003ca href=\"#\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003cstrong\u003e\u003ccode\u003eroot folder\u003c/code\u003e\u003c/strong\u003e of the repository in Visual Studio Code.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eThe following files are included in the repository:\u003c/em\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e.vscode/extensions.json\u003c/code\u003e \u003csub\u003erecommends Vistual Studio Code extension dependencies\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.vscode/launch.json\u003c/code\u003e \u003csub\u003eincludes the configurations for debugging the examples\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.vscode/settings.json\u003c/code\u003e \u003csub\u003eautomatically applies settings to the workspace\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.vscode/tasks.json\u003c/code\u003e \u003csub\u003eincludes the commands to build the projects\u003c/sub\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eVisual Studio Code Extensions (will be prompted to install these when you open the folder):\u003c/em\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003ems-vscode.csharp\u003c/code\u003e \u003csub\u003eC# support\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eformulahendry.dotnet-test-explorer\u003c/code\u003e \u003cem\u003e(optional)\u003c/em\u003e \u003csub\u003eMSTest unit testing support\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eaisoftware.tt-processor\u003c/code\u003e \u003cem\u003e(optional)\u003c/em\u003e \u003csub\u003eT4 Template support\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ezbecknell.t4-support\u003c/code\u003e \u003cem\u003e(optional)\u003c/em\u003e \u003csub\u003eT4 Template syntax highlighting\u003c/sub\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nUse Towel In Your .NET Projects \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eYour project must target the same or newer version of .NET as Towel. \u003ca href=\"https://docs.microsoft.com/en-us/dotnet/standard/frameworks\" rel=\"nofollow\"\u003eSee this documentation on how to check the current target of your project\u003c/a\u003e. Towel targets the following version of .NET: \u003csub\u003e\u003csub\u003e\u003ca href=\"https://dotnet.microsoft.com/download\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/2466bbd8ad4be1f3078f7454a4afc76da12e09b4e740a0e761e72149d8cdaadc/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f786d6c3f636f6c6f723d253233353132626434266c6162656c3d7461726765742671756572793d2532462532465461726765744672616d65776f726b253542312535442675726c3d68747470732533412532462532467261772e67697468756275736572636f6e74656e742e636f6d2532465a61636861727950617474656e253246546f77656c2532466d61696e253246536f7572636573253246546f77656c253246546f77656c2e637370726f6a266c6f676f3d2e6e6574\" title=\"Go To .NET Download\" data-canonical-src=\"https://img.shields.io/badge/dynamic/xml?color=%23512bd4\u0026amp;label=target\u0026amp;query=%2F%2FTargetFramework%5B1%5D\u0026amp;url=https%3A%2F%2Fraw.githubusercontent.com%2FZacharyPatten%2FTowel%2Fmain%2FSources%2FTowel%2FTowel.csproj\u0026amp;logo=.net\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e\u003c/sub\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eTowel has a nuget package: \u003csub\u003e\u003csub\u003e\u003ca href=\"https://www.nuget.org/packages/Towel\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/bf1e657a5473e0a15faba1db813d3c67f4e866a3c91625dd92b6d9a42ddb0b6b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f546f77656c2e7376673f6c6f676f3d6e75676574\" title=\"Go To Nuget Package\" data-canonical-src=\"https://img.shields.io/nuget/v/Towel.svg?logo=nuget\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e\u003c/sub\u003e\u003cbr\u003eInstructions on how to reference the package are included on nuget.org \u003cem\u003e(click the badge)\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eIf you use Towel and would be willing to show it, here is a badge you can copy-paste into your readme: \u003csub\u003e\u003csub\u003e\u003ca href=\"#\"\u003e\u003cimg src=\"https://github.com/ZacharyPatten/Towel/raw/main/.github/Resources/UsingTowel.svg?raw=true\" title=\"Go To Towel\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e\u003c/sub\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-text-html-basic notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026lt;a href=\u0026quot;https://github.com/ZacharyPatten/Towel\u0026quot;\u0026gt;\u0026lt;img src=\u0026quot;https://github.com/ZacharyPatten/Towel/blob/main/.github/Resources/UsingTowel.svg?raw=true\u0026quot; title=\u0026quot;Go To Towel\u0026quot;\u0026gt;\u0026lt;/a\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-kos\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-ent\"\u003ea\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003ehref\u003c/span\u003e=\"\u003cspan class=\"pl-s\"\u003ehttps://github.com/ZacharyPatten/Towel\u003c/span\u003e\"\u003cspan class=\"pl-kos\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-ent\"\u003eimg\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003esrc\u003c/span\u003e=\"\u003cspan class=\"pl-s\"\u003ehttps://github.com/ZacharyPatten/Towel/blob/main/.github/Resources/UsingTowel.svg?raw=true\u003c/span\u003e\" \u003cspan class=\"pl-c1\"\u003etitle\u003c/span\u003e=\"\u003cspan class=\"pl-s\"\u003eGo To Towel\u003c/span\u003e\"\u003cspan class=\"pl-kos\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"pl-ent\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eShare your work. If you use Towel in one of your projects we want to hear about it. :)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nView Documentation \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eChange Log: \u003ca href=\"https://github.com/ZacharyPatten/Towel/releases\"\u003ehttps://github.com/ZacharyPatten/Towel/releases\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/dotnet/docfx\"\u003edocfx\u003c/a\u003e generated API documentation reference: \u003csub\u003e\u003csub\u003e\u003ca href=\"https://zacharypatten.github.io/Towel/index.html\" rel=\"nofollow\"\u003e\u003cimg src=\"https://github.com/ZacharyPatten/Towel/raw/main/.github/Resources/docfx-badge.svg?raw=true\" title=\"Go To Docfx Documentation\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coverlet-coverage/coverlet\"\u003eCoverlet\u003c/a\u003e + \u003ca href=\"https://github.com/danielpalme/ReportGenerator\"\u003eReportGenerator\u003c/a\u003e generated test coverage report: \u003csub\u003e\u003csub\u003e\u003ca href=\"https://zacharypatten.github.io/Towel/coveragereport/index.html\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/08ffcb6ef9d89240e1059ad24b47026a30fc4b19b07191cf5f7f6d9f83e36eaa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f786d6c3f636f6c6f723d79656c6c6f77266c6162656c3d636f7665726167652671756572793d253246253246636f766572616765253542312535442532462534306c696e652d726174652d70657263656e746167652675726c3d68747470732533412532462532467261772e67697468756275736572636f6e74656e742e636f6d2532465a61636861727950617474656e253246546f77656c25324667682d7061676573253246636f7665726167657265706f7274253246636f7665726167652e786d6c\" title=\"Go Test Coverage Report\" data-canonical-src=\"https://img.shields.io/badge/dynamic/xml?color=yellow\u0026amp;label=coverage\u0026amp;query=%2F%2Fcoverage%5B1%5D%2F%40line-rate-percentage\u0026amp;url=https%3A%2F%2Fraw.githubusercontent.com%2FZacharyPatten%2FTowel%2Fgh-pages%2Fcoveragereport%2Fcoverage.xml\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/dotnet/BenchmarkDotNet\"\u003eBenchmarkDotNet\u003c/a\u003e generated benchmarking: \u003ca href=\"https://zacharypatten.github.io/Towel/articles/benchmarks.html\" rel=\"nofollow\"\u003ehttps://zacharypatten.github.io/Towel/articles/benchmarks.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eRelevant Articles:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://docs.microsoft.com/en-us/archive/msdn-magazine/2019/october/csharp-accessing-xml-documentation-via-reflection\" rel=\"nofollow\"\u003eMSDN Accessing XML Documentation Via Reflection\u003c/a\u003e\u003cbr\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gist.github.com/ZacharyPatten/798ed612d692a560bdd529367b6a7dbd\"\u003eBeginner's Guide To Console Input In C#\u003c/a\u003e\u003cbr\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gist.github.com/ZacharyPatten/c9b43a2c9e8a5a5523883e77410f742d\"\u003eGenerating Unique Random Data\u003c/a\u003e\u003cbr\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gist.github.com/ZacharyPatten/8de188b2bd358ab5c3517cbb55e83632\"\u003eRandom Generation (with efficient exclusions)\u003c/a\u003e\u003cbr\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gist.github.com/ZacharyPatten/f21fc5c6835faea9be8ae4baab4e294e\"\u003eOmnitree\u003c/a\u003e\u003cbr\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gist.github.com/ZacharyPatten/8e1395a94928f2c7715cf939b0d0389c\"\u003eC# Generic Math\u003c/a\u003e\u003cbr\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFile Structure Overview \u003cem\u003e(except for \u003csub\u003e\u003ca href=\"https://github.com/ZacharyPatten/Towel/tree/gh-pages\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/git-branch-16.svg\" title=\"Branch\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003egh-pages\u003c/code\u003e)\u003c/em\u003e:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.github\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003e.github\u003c/code\u003e \u003csub\u003econtent regarding the GitHub repoistory.\u003c/sub\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.github/ISSUE_TEMPLATE\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eISSUE_TEMPLATE\u003c/code\u003e \u003csub\u003etemplates for issue submissions to the GitHub repository\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.github/Resources\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eResources\u003c/code\u003e \u003csub\u003eresources such as image files\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.github/workflows\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eworkflows\u003c/code\u003e \u003csub\u003e\u003ca href=\"https://github.com/ZacharyPatten/Towel/actions\"\u003eGitHub Actions\u003c/a\u003e workflows\u003c/sub\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.github/workflows/Continuous Integration.yml\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg\" title=\"Action\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eContinuous Integration.yml\u003c/code\u003e \u003csub\u003eworkflow for checking that code compiles and unit tests pass\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.github/workflows/Towel Deployment.yml\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg\" title=\"Action\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eTowel Deployment.yml\u003c/code\u003e \u003csub\u003eworkflow to manage \u003ca href=\"https://github.com/ZacharyPatten/Towel/releases\"\u003ereleases\u003c/a\u003e and deploy \u003ca href=\"https://www.nuget.org/packages/Towel\" rel=\"nofollow\"\u003enuget packages\u003c/a\u003e\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.github/workflows/Documentation.yml\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg\" title=\"Action\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eDocumentation.yml\u003c/code\u003e \u003csub\u003eworkflow that runs \u003ca href=\"https://github.com/dotnet/docfx\"\u003edocfx\u003c/a\u003e + \u003ca href=\"https://github.com/coverlet-coverage/coverlet\"\u003eCoverlet\u003c/a\u003e + \u003ca href=\"https://github.com/danielpalme/ReportGenerator\"\u003eReportGenerator\u003c/a\u003e to output \u003ca href=\"https://pages.github.com/\"\u003eGitHub Pages\u003c/a\u003e to \u003csub\u003e\u003ca href=\"https://github.com/ZacharyPatten/Towel/tree/gh-pages\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/git-branch-16.svg\" title=\"Branch\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003egh-pages\u003c/code\u003e\u003c/sub\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.github/pull_request_template.md\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-16.svg\" title=\"File\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003epull_request_template.md\u003c/code\u003e \u003csub\u003etemplate for when pull requests are created\u003c/sub\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.vscode\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003e.vscode\u003c/code\u003e \u003csub\u003econfirguration files for if the code is opened in \u003ca href=\"https://visualstudio.microsoft.com/\" rel=\"nofollow\"\u003eVisual Studio Code\u003c/a\u003e\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Examples\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eExamples\u003c/code\u003e \u003csub\u003eroot folder for all the example projects\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Sources\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eSources\u003c/code\u003e \u003csub\u003eroot folder for the source code of released nuget packages\u003c/sub\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Sources/Towel\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003cstrong\u003e\u003ccode\u003eTowel\u003c/code\u003e \u003csub\u003ethe root folder for all source code in the Towel nuget package\u003c/sub\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Tools\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eTools\u003c/code\u003e \u003csub\u003eroot folder for all support projects (not included in nuget packages)\u003c/sub\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Tools/docfx_project\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003edocfx_project\u003c/code\u003e \u003csub\u003eroot folder for \u003ca href=\"https://github.com/dotnet/docfx\"\u003edocfx\u003c/a\u003e project (used in \u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.github/workflows/Documentation.yml\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg\" title=\"Action\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eDocumentation.yml\u003c/code\u003e)\u003c/sub\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Tools/docfx_project/articles\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003earticles\u003c/code\u003e \u003csub\u003eroot folder for all articless of the \u003ca href=\"https://github.com/dotnet/docfx\"\u003edocfx\u003c/a\u003e generated \u003ca href=\"https://pages.github.com/\"\u003eGitHub Pages\u003c/a\u003e website\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Tools/docfx_project/apidoc\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eapidoc\u003c/code\u003e \u003csub\u003eroot folder for all api overrides of the \u003ca href=\"https://github.com/dotnet/docfx\"\u003edocfx\u003c/a\u003e generated \u003ca href=\"https://pages.github.com/\"\u003eGitHub Pages\u003c/a\u003e website\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Tools/docfx_project/docfx.json\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-16.svg\" title=\"File\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003edocfx.json\u003c/code\u003e \u003csub\u003econfiguration file that controls \u003ca href=\"https://github.com/dotnet/docfx\"\u003edocfx\u003c/a\u003e\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Tools/docfx_project/index.md\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-16.svg\" title=\"File\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eindex.md\u003c/code\u003e \u003csub\u003ehome page of the \u003ca href=\"https://github.com/dotnet/docfx\"\u003edocfx\u003c/a\u003e generated \u003ca href=\"https://pages.github.com/\"\u003eGitHub Pages\u003c/a\u003e website\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Tools/docfx_project/toc.yml\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-16.svg\" title=\"File\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003etoc.yml\u003c/code\u003e \u003csub\u003eprimary navigation for the \u003ca href=\"https://github.com/dotnet/docfx\"\u003edocfx\u003c/a\u003e generated \u003ca href=\"https://pages.github.com/\"\u003eGitHub Pages\u003c/a\u003e website\u003c/sub\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Tools/Towel_Benchmarking\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eTowel_Benchmarking\u003c/code\u003e \u003csub\u003eproject with all the benchmarking for the Towel project\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Tools/Towel_Generating\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eTowel_Generating\u003c/code\u003e \u003csub\u003eproject with code generation for the Towel Project\u003c/sub\u003e\u003c/li\u003e\n\u003cli\u003e\u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/Tools/Towel_Testing\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg\" title=\"Directory\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eTowel_Testing\u003c/code\u003e \u003csub\u003eproject with all unit tests for the Towel project (used in \u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.github/workflows/Continuous Integration.yml\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg\" title=\"Action\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eContinuous Integration.yml\u003c/code\u003e and \u003csub\u003e\u003ca href=\"/ZacharyPatten/Towel/blob/main/.github/workflows/Documentation.yml\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg\" title=\"Action\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e \u003ccode\u003eDocumentation.yml\u003c/code\u003e)\u003c/sub\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nGet Involved \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eThe easiest way to support Towel is to star the github repository.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eIf you have any questions, you can \u003ca href=\"https://github.com/ZacharyPatten/Towel/discussions/new\"\u003estart a new discussion\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eIf you notice anything in Towel that may be improved, please \u003ca href=\"https://github.com/ZacharyPatten/Towel/issues/new/choose\"\u003ecreate a new issue\u003c/a\u003e.\u003cbr\u003e\nFeature requests are welcome.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eYou can chat with the developer(s) on discord: \u003csub\u003e\u003csub\u003e\u003ca href=\"https://discord.gg/4XbQbwF\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/9d23be90781e43160ac5e1e5ae6e03f0fcc2d60d94e1f8ac41fa2a97ff1907a6/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3535373234343932353731323932343638343f6c6f676f3d646973636f7264266c6f676f436f6c6f723d66666666666626636f6c6f723d373338394438\" title=\"Go To Discord Server\" data-canonical-src=\"https://img.shields.io/discord/557244925712924684?logo=discord\u0026amp;logoColor=ffffff\u0026amp;color=7389D8\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/sub\u003e\u003c/sub\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eIf you want to contribute to Towel:\u003cbr\u003e  1. Fork this repository\u003cbr\u003e  2. Make some changes\u003cbr\u003e  3. Open a pull request\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOverview\u003c/h2\u003e\u003ca id=\"user-content-overview\" class=\"anchor\" aria-label=\"Permalink: Overview\" href=\"#overview\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nAlgorithms \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// supports System.Span\u0026lt;T\u0026gt; and any (non ref struct) int-indexed type\nIsPalindrome\u0026lt;...\u0026gt;(...);\n\n// supports System.ReadOnlySpan\u0026lt;T\u0026gt;\nIsInterleavedRecursive\u0026lt;...\u0026gt;(...);\nIsInterleavedIterative\u0026lt;...\u0026gt;(...);\n\nIsReorderOf\u0026lt;...\u0026gt;(...); // aka \u0026quot;anagrams\u0026quot;\n\n// supports System.Span\u0026lt;T\u0026gt; and any (non ref struct) int-indexed type\nSortShuffle\u0026lt;T\u0026gt;(...);\nSortBubble\u0026lt;T\u0026gt;(...);\nSortSelection\u0026lt;T\u0026gt;(...);\nSortInsertion\u0026lt;T\u0026gt;(...);\nSortQuick\u0026lt;T\u0026gt;(...);\nSortMerge\u0026lt;T\u0026gt;(...);\nSortHeap\u0026lt;T\u0026gt;(...);\nSortOddEven\u0026lt;T\u0026gt;(...);\nSortCocktail\u0026lt;T\u0026gt;(...);\nSortComb\u0026lt;T\u0026gt;(...);\nSortGnome\u0026lt;T\u0026gt;(...);\nSortShell\u0026lt;T\u0026gt;(...);\nSortBogo\u0026lt;T\u0026gt;(...);\nSortSlow\u0026lt;T\u0026gt;(...);\nSortCycle\u0026lt;T\u0026gt;(...);\nSortPancake\u0026lt;T\u0026gt;(...);\nSortStooge\u0026lt;T\u0026gt;(...);\nSortTim\u0026lt;T\u0026gt;(...);\nSortIntro\u0026lt;T\u0026gt;(...);\nSortCounting\u0026lt;T\u0026gt;(...); // uint-based (non-comparative sort)\nSortRadix\u0026lt;T\u0026gt;(...); // uint-based (non-comparative sort)\nSortPidgeonHole\u0026lt;T\u0026gt;(...); // int-based (non-comparative sort)\n\n// supports System.ReadOnlySpan\u0026lt;T\u0026gt; and any (non ref struct) int-indexed type\nSearchBinary\u0026lt;T\u0026gt;(...);\n\n// supports System.ReadOnlySpan\u0026lt;T\u0026gt; and any (non ref struct) int-indexed type\nint HammingDistanceIterative\u0026lt;...\u0026gt;(...);\nint LevenshteinDistanceRecursive\u0026lt;...\u0026gt;(...);\nint LevenshteinDistanceIterative\u0026lt;...\u0026gt;(...);\n\n// Permutations of sequences\n// supports System.Span\u0026lt;T\u0026gt; and any (non ref struct) int-indexed type\nvoid PermuteRecursive\u0026lt;...\u0026gt;(...);\nvoid PermuteIterative\u0026lt;...\u0026gt;(...);\n\n// Combinations of sequences\nvoid Combinations\u0026lt;...\u0026gt;(...);\n\n// Path Finding (Graph Search)\n// overloads for A*, Dijkstra, and Breadth-First-Search algorithms\nSearchGraph\u0026lt;...\u0026gt;(...);\n\n// Combines ranges without gaps between them\nIEnumerable\u0026lt;(T A, T B)\u0026gt; CombineRanges\u0026lt;T\u0026gt;(IEnumerable\u0026lt;(T A, T B)\u0026gt; ranges)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// supports System.Span\u0026lt;T\u0026gt; and any (non ref struct) int-indexed type\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eIsPalindrome\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// supports System.ReadOnlySpan\u0026lt;T\u0026gt;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eIsInterleavedRecursive\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eIsInterleavedIterative\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-s1\"\u003eIsReorderOf\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// aka \"anagrams\"\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// supports System.Span\u0026lt;T\u0026gt; and any (non ref struct) int-indexed type\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortShuffle\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortBubble\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortSelection\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortInsertion\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortQuick\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortMerge\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortHeap\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortOddEven\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortCocktail\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortComb\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortGnome\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortShell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortBogo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortSlow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortCycle\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortPancake\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortStooge\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortTim\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortIntro\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortCounting\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// uint-based (non-comparative sort)\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortRadix\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// uint-based (non-comparative sort)\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSortPidgeonHole\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// int-based (non-comparative sort)\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// supports System.ReadOnlySpan\u0026lt;T\u0026gt; and any (non ref struct) int-indexed type\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSearchBinary\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// supports System.ReadOnlySpan\u0026lt;T\u0026gt; and any (non ref struct) int-indexed type\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eHammingDistanceIterative\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eLevenshteinDistanceRecursive\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eLevenshteinDistanceIterative\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Permutations of sequences\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// supports System.Span\u0026lt;T\u0026gt; and any (non ref struct) int-indexed type\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ePermuteRecursive\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ePermuteIterative\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Combinations of sequences\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eCombinations\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Path Finding (Graph Search)\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// overloads for A*, Dijkstra, and Breadth-First-Search algorithms\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eSearchGraph\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Combines ranges without gaps between them\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eIEnumerable\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eA\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eB\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCombineRanges\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eIEnumerable\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eA\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eB\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eranges\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://zacharypatten.github.io/Towel/benchmarks/SortBenchmarks.html\" rel=\"nofollow\"\u003eSorting Algorithm Benchmarks\u003c/a\u003e \u003csub\u003eNote: not all permuations of the input are benchmarked, so take with a grain of salt.\u003c/sub\u003e\u003cbr\u003e\n\u003ca href=\"https://zacharypatten.github.io/Towel/benchmarks/PermuteBenchmarks.html\" rel=\"nofollow\"\u003ePermute Benchmarks\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nExtensions \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// System.Random extensions to generate more random types\n// there are overloads to specify possible ranges\nstring NextString(this Random random, int length);\nchar NextChar(this Random random);\ndecimal NextDecimal(this Random random);\nDateTime DateTime(this Random random);\nTimeSpan TimeSpan(this Random random);\nlong NextLong(this Random random);\nint[] Next(this Random random, int count, int minValue, int maxValue, Span\u0026lt;T\u0026gt; excluded); // with exclusions\nint[] NextUnique(this Random random, int count, int minValue, int maxValue); // unique values\nint[] NextUnique(this Random random, int count, int minValue, int maxValue, Span\u0026lt;T\u0026gt; excluded); // unique values with exclusions\nT Next\u0026lt;T\u0026gt;(this Random random, IEnumerable\u0026lt;(T Value, double Weight)\u0026gt; pool); // weighted values\nvoid Shuffle\u0026lt;T\u0026gt;(this Random random, T[] array); // randomize arrays\n\n// Type conversion to string definition as appears in C# source code\nstring ConvertToCSharpSourceDefinition(this Type type);\n// Example: typeof(List\u0026lt;int\u0026gt;) -\u0026gt; \u0026quot;System.Collections.Generic.List\u0026lt;int\u0026gt;\u0026quot;\n\nstring ToEnglishWords(this decimal @decimal);\n// Example: 42 -\u0026gt; \u0026quot;Forty-Two\u0026quot;\n(bool Success, decimal Value) TryParseEnglishWordsToDecimal(string words);\n// Example: \u0026quot;Forty-Two\u0026quot; -\u0026gt; 42\n\nint TryParseRomanNumeral(string @string);\n// Example: \u0026quot;XLII\u0026quot; -\u0026gt; 42\nint TryToRomanNumeral(int value);\n// Example: 42 -\u0026gt; \u0026quot;XLII\u0026quot;\n\n// Reflection Extensions To Access XML Documentation\nstring GetDocumentation(this Type type);\nstring GetDocumentation(this FieldInfo fieldInfo);\nstring GetDocumentation(this PropertyInfo propertyInfo);\nstring GetDocumentation(this EventInfo eventInfo);\nstring GetDocumentation(this ConstructorInfo constructorInfo);\nstring GetDocumentation(this MethodInfo methodInfo);\nstring GetDocumentation(this MemberInfo memberInfo);\nstring GetDocumentation(this ParameterInfo parameterInfo);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// System.Random extensions to generate more random types\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// there are overloads to specify possible ranges\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eNextString\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRandom\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elength\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003echar\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eNextChar\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRandom\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003edecimal\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eNextDecimal\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRandom\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eDateTime\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRandom\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eTimeSpan\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTimeSpan\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRandom\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003elong\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eNextLong\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRandom\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eNext\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRandom\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecount\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eminValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emaxValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSpan\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eexcluded\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// with exclusions\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eNextUnique\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRandom\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecount\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eminValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emaxValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// unique values\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eNextUnique\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRandom\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecount\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eminValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emaxValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSpan\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eexcluded\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// unique values with exclusions\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eNext\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRandom\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eIEnumerable\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eWeight\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003epool\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// weighted values\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eShuffle\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRandom\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003earray\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// randomize arrays\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Type conversion to string definition as appears in C# source code\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eConvertToCSharpSourceDefinition\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eType\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etype\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Example: typeof(List\u0026lt;int\u0026gt;) -\u0026gt; \"System.Collections.Generic.List\u0026lt;int\u0026gt;\"\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eToEnglishWords\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003edecimal\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003e@decimal\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Example: 42 -\u0026gt; \"Forty-Two\"\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSuccess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003edecimal\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTryParseEnglishWordsToDecimal\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ewords\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Example: \"Forty-Two\" -\u0026gt; 42\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTryParseRomanNumeral\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003e@string\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Example: \"XLII\" -\u0026gt; 42\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTryToRomanNumeral\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evalue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Example: 42 -\u0026gt; \"XLII\"\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Reflection Extensions To Access XML Documentation\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eGetDocumentation\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eType\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etype\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eGetDocumentation\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eFieldInfo\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003efieldInfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eGetDocumentation\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ePropertyInfo\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003epropertyInfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eGetDocumentation\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eEventInfo\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eeventInfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eGetDocumentation\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eConstructorInfo\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003econstructorInfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eGetDocumentation\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eMethodInfo\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emethodInfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eGetDocumentation\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eMemberInfo\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ememberInfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eGetDocumentation\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003ethis\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eParameterInfo\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eparameterInfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://zacharypatten.github.io/Towel/benchmarks/WeightedRandomBenchmarks.html\" rel=\"nofollow\"\u003eWeighted Random Benchmarks\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://zacharypatten.github.io/Towel/benchmarks/RandomWithExclusionsBenchmarks.html\" rel=\"nofollow\"\u003eRandom With Exclusions Benchmarks\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://zacharypatten.github.io/Towel/benchmarks/ToEnglishWordsBenchmarks.html\" rel=\"nofollow\"\u003edecimal To English Words Benchmarks\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nData Structures \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nHeap \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// A heap is a binary tree that is sorted vertically using comparison methods. This is different\n// from AVL Trees or Red-Black Trees that keep their contents stored horizontally. The rule\n// of a heap is that no parent can be less than either of its children. A Heap using \u0026quot;sifting up\u0026quot;\n// and \u0026quot;sifting down\u0026quot; algorithms to move values vertically through the tree to keep items sorted.\n\nIHeap\u0026lt;T\u0026gt; heap = HeapArray.New\u0026lt;T\u0026gt;();\n\n// Visualization:\n//\n// Binary Tree\n//\n// -7\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// -4 1\n// / \\ / \\ \n// / \\ / \\ \n// / \\ / \\ \n// -1 3 6 4\n// / \\ / \\ / \\ / \\ \n// 30 10 17 51 45 22 19 7\n//\n// Flattened into an Array\n//\n// Root = 1\n// Left Child = 2 * Index\n// Right Child = 2* Index + 1\n// __________________________________________________________________________\n// |0 |-7 |-4 |1 |-1 |3 |6 |4 |30 |10 |17 |51 |45 |22 |19 |7 |0 |0 |0 ...\n// ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\n// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// A heap is a binary tree that is sorted vertically using comparison methods. This is different\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// from AVL Trees or Red-Black Trees that keep their contents stored horizontally. The rule\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// of a heap is that no parent can be less than either of its children. A Heap using \"sifting up\"\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// and \"sifting down\" algorithms to move values vertically through the tree to keep items sorted.\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eIHeap\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eheap\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eHeapArray\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eNew\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Visualization:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Binary Tree\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -7\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -4 1\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\ \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\ \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\ \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -1 3 6 4\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\ / \\ / \\ \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 30 10 17 51 45 22 19 7\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Flattened into an Array\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Root = 1\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Left Child = 2 * Index\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Right Child = 2* Index + 1\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// __________________________________________________________________________\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// |0 |-7 |-4 |1 |-1 |3 |6 |4 |30 |10 |17 |51 |45 |22 |19 |7 |0 |0 |0 ...\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nAVL Tree \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// An AVL tree is a binary tree that is sorted using comparison methods and automatically balances\n// itself by tracking the heights of nodes and performing one of four specific algorithms: rotate\n// right, rotate left, double rotate right, or double rotate left. Any parent in an AVL Tree must\n// be greater than its left child but less than its right child (if the children exist). An AVL\n// tree is sorted in the same manor as a Red-Black Tree, but uses different algorithms to maintain\n// the balance of the tree.\n\nIAvlTree\u0026lt;T\u0026gt; avlTree = AvlTreeLinked.New\u0026lt;T\u0026gt;();\n\n// Visualization:\n//\n// Binary Tree\n//\n// Depth 0 ------------------\u0026gt; 7\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// Depth 1 ---------\u0026gt; 1 22\n// / \\ / \\\n// / \\ / \\\n// / \\ / \\\n// Depth 2 ----\u0026gt; -4 4 17 45\n// / \\ / \\ / \\ / \\\n// Depth 3 ---\u0026gt; -7 -1 3 6 10 19 30 51\n//\n// Flattened into an Array\n//\n// Root = 1\n// Left Child = 2 * Index\n// Right Child = 2* Index + 1\n// __________________________________________________________________________\n// |0 |7 |1 |22 |-4 |4 |17 |45 |-7 |-1 |3 |6 |10 |19 |30 |51 |0 |0 |0 ...\n// ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\n// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// An AVL tree is a binary tree that is sorted using comparison methods and automatically balances\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// itself by tracking the heights of nodes and performing one of four specific algorithms: rotate\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// right, rotate left, double rotate right, or double rotate left. Any parent in an AVL Tree must\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// be greater than its left child but less than its right child (if the children exist). An AVL\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// tree is sorted in the same manor as a Red-Black Tree, but uses different algorithms to maintain\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// the balance of the tree.\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eIAvlTree\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eavlTree\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eAvlTreeLinked\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eNew\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Visualization:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Binary Tree\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Depth 0 ------------------\u0026gt; 7\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Depth 1 ---------\u0026gt; 1 22\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Depth 2 ----\u0026gt; -4 4 17 45\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\ / \\ / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Depth 3 ---\u0026gt; -7 -1 3 6 10 19 30 51\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Flattened into an Array\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Root = 1\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Left Child = 2 * Index\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Right Child = 2* Index + 1\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// __________________________________________________________________________\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// |0 |7 |1 |22 |-4 |4 |17 |45 |-7 |-1 |3 |6 |10 |19 |30 |51 |0 |0 |0 ...\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nRed Black Tree \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// A Red-Black treeis a binary tree that is sorted using comparison methods and automatically \n// balances itself. Any parent in an Red-Black Tree must be greater than its left child but less\n// than its right child (if the children exist). A Red-Black tree is sorted in the same manor as\n// an AVL Tree, but uses different algorithms to maintain the balance of the tree.\n\nIRedBlackTree\u0026lt;T\u0026gt; redBlackTree = RedBlackTreeLinked.New\u0026lt;T\u0026gt;();\n\n// Visualization:\n//\n// Binary Tree\n//\n// Color Black ----------------\u0026gt; 7\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// / \\\n// Color Red ---------\u0026gt; 1 22\n// / \\ / \\\n// / \\ / \\\n// / \\ / \\\n// Color Black ---\u0026gt; -4 4 17 45\n// / \\ / \\ / \\ / \\\n// Color Red ---\u0026gt; -7 -1 3 6 10 19 30 51\n//\n// Flattened into an Array\n//\n// Root = 1\n// Left Child = 2 * Index\n// Right Child = 2* Index + 1\n// __________________________________________________________________________\n// |0 |7 |1 |22 |-4 |4 |17 |45 |-7 |-1 |3 |6 |10 |19 |30 |51 |0 |0 |0 ...\n// ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\n// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// A Red-Black treeis a binary tree that is sorted using comparison methods and automatically \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// balances itself. Any parent in an Red-Black Tree must be greater than its left child but less\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// than its right child (if the children exist). A Red-Black tree is sorted in the same manor as\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// an AVL Tree, but uses different algorithms to maintain the balance of the tree.\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eIRedBlackTree\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eredBlackTree\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eRedBlackTreeLinked\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eNew\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Visualization:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Binary Tree\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Color Black ----------------\u0026gt; 7\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Color Red ---------\u0026gt; 1 22\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Color Black ---\u0026gt; -4 4 17 45\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\ / \\ / \\ / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Color Red ---\u0026gt; -7 -1 3 6 10 19 30 51\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Flattened into an Array\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Root = 1\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Left Child = 2 * Index\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Right Child = 2* Index + 1\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// __________________________________________________________________________\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// |0 |7 |1 |22 |-4 |4 |17 |45 |-7 |-1 |3 |6 |10 |19 |30 |51 |0 |0 |0 ...\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nOmnitree \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// An Omnitree is a Spacial Partitioning Tree (SPT) that works on an arbitrary number of dimensions.\n// It stores items sorted along multiple dimensions by dividing spaces into sub-spaces. A 3D\n// version of an SPT is often called an \u0026quot;Octree\u0026quot; and a 2D version of an SPT is often called a\n// \u0026quot;Quadtree.\u0026quot; There are two versions of the Omnitree: Points and Bounds. The Points version stores\n// vectors while the Bounds version stores spaces with a minimum and maximum vector.\n\nIOmnitreePoints\u0026lt;T, A1, A2, A3...\u0026gt; omnitreePoints =\n new OmnitreePointsLinked\u0026lt;T, A1, A2, A3...\u0026gt;(\n (T value, out A1 a1, out A2 a2, out A3 a3...) =\u0026gt; { ... });\n \nIOmnitreeBounds\u0026lt;T, A1, A2, A3...\u0026gt; omnitreeBounds =\n new OmnitreeBoundsLinked\u0026lt;T, A1, A2, A3...\u0026gt;(\n (T value,\n out A1 min1, out A1 max1,\n out A2 min2, out A2 max2,\n out A3 min3, out A3 max3...) =\u0026gt; { ... });\n\n// The maximum number of children any node can have is 2 ^ N where N is the number\n// of dimensions of the tree.\n//\n// -------------------------------\n// | Dimensions | Max # Children |\n// |============|================|\n// | 1 | 2 ^ 1 = 2 |\n// | 2 | 2 ^ 2 = 4 |\n// | 3 | 2 ^ 3 = 8 |\n// | 4 | 2 ^ 4 = 16 |\n// | ... | ... |\n// -------------------------------\n//\n// Visualizations\n//\n// 1 Dimensional:\n//\n// -1D |-----------|-----------| +1D Children Indexes:\n// -1D: 0\n// \u0026lt;--- 0 ---\u0026gt; \u0026lt;--- 1 ---\u0026gt; +1D: 1\n//\n// 2 Dimensional:\n// _____________________\n// | | | +2D\n// | | | ^\n// | 2 | 3 | | Children Indexes:\n// | | | | -2D -1D: 0\n// |----------|----------| | -2D +1D: 1\n// | | | | +2D -1D: 2\n// | | | | +2D +1D: 3\n// | 0 | 1 | |\n// | | | v\n// |__________|__________| -2D\n//\n// -1D \u0026lt;-----------\u0026gt; +1D \n//\n// 3 Dimensional:\n//\n// +3D _____________________\n// 7 / / /|\n// / / 6 / 7 / |\n// / /---------/----------/ | Children Indexes:\n// / / 2 / 3 /| | -3D -2D -1D: 0\n// L /_________/__________/ | | -3D -2D +1D: 1\n// -3D | | | | /| +2D -3D +2D -1D: 2\n// | | | |/ | ^ -3D +2D +1D: 3\n// | 2 | 3 | / | | +3D -2D -1D: 4\n// | | |/| | \u0026lt;-- 5 | +3D -2D +1D: 5\n// |----------|----------| | | | +3D +2D -1D: 6\n// | | | | / | +3D +2D +1D: 7\n// | | | | / |\n// | 0 | 1 | |/ |\n// | | | / v\n// |__________|__________|/ -2D\n// \n// ^\n// |\n// 4 (behind 0)\n//\n// -1D \u0026lt;-----------\u0026gt; +1D\n//\n// 4 Dimensional:\n//\n// +1D +2D +3D +4D Children Indexes:\n// ^ ^ ^ ^\n// | | | | -4D -3D -2D -1D: 0 +4D -3D -2D -1D: 8\n// | | | | -4D -3D -2D +1D: 1 +4D -3D -2D +1D: 9\n// | | | | -4D -3D +2D -1D: 2 +4D -3D +2D -1D: 10\n// | | | | -4D -3D +2D +1D: 3 +4D -3D +2D +1D: 11\n// | | | | -4D +3D -2D -1D: 4 +4D +3D -2D -1D: 12\n// --- --- --- --- -4D +3D -2D +1D: 5 +4D +3D -2D +1D: 13\n// | | | | -4D +3D +2D -1D: 6 +4D +3D +2D -1D: 14\n// | | | | -4D +3D +2D +1D: 7 +4D +3D +2D +1D: 15\n// | | | |\n// | | | |\n// | | | |\n// v v v v\n// -1D -2D -3D -4D\n//\n// With a value that is in the (+1D, -2D, -3D, +4D)[Index 9] child:\n//\n// +1D +2D +3D +4D\n// ^ ^ ^ ^\n// | | | |\n// | | | |\n// O--- | | ---O\n// | \\ | | / |\n// | \\ | | / |\n// --- \\ --- --- / ---\n// | \\ | | / |\n// | \\ | | / |\n// | ---O-----------O--- |\n// | | | |\n// | | | |\n// v v v v\n// -1D -2D -3D -4D\n\n// By default, the omnitree will sort items along each axis and use the median algorithm to determine\n// the point of divisions. However, you can override the subdivision algorithm. For numerical values,\n// the mean algorithm can be used (and is much faster than median). If you know the data set will be\n// relatively evenly distributed within a sub-space, you can even set the subdivision algorithm to\n// calculate the subdivision from parent spaces rather than looking at the current contents of the\n// space.\n\n// The depth of the omnitree is bounded by \u0026quot;ln(count)\u0026quot; the natural log of the current count. When adding\n// and item to the tree, if the number of items in the respective child is greater than ln(count) and \n// the depth bounding has not been reached, then the child will be subdivided. The goal is to achieve \n// Ω(ln(count)) runtime complexity when looking up values.\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// An Omnitree is a Spacial Partitioning Tree (SPT) that works on an arbitrary number of dimensions.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// It stores items sorted along multiple dimensions by dividing spaces into sub-spaces. A 3D\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// version of an SPT is often called an \"Octree\" and a 2D version of an SPT is often called a\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// \"Quadtree.\" There are two versions of the Omnitree: Points and Bounds. The Points version stores\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// vectors while the Bounds version stores spaces with a minimum and maximum vector.\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eIOmnitreePoints\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e..\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eomnitreePoints\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eOmnitreePointsLinked\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e..\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evalue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA1\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA2\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA3\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea3\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e ..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003e\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \n\u003cspan class=\"pl-smi\"\u003eIOmnitreeBounds\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e..\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eomnitreeBounds\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eOmnitreeBoundsLinked\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e..\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evalue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA1\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emin1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA1\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emax1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA2\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emin2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA2\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emax2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA3\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emin3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eA3\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emax3\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e ..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003e\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// The maximum number of children any node can have is 2 ^ N where N is the number\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// of dimensions of the tree.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -------------------------------\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | Dimensions | Max # Children |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// |============|================|\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | 1 | 2 ^ 1 = 2 |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | 2 | 2 ^ 2 = 4 |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | 3 | 2 ^ 3 = 8 |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | 4 | 2 ^ 4 = 16 |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | ... | ... |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -------------------------------\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Visualizations\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 1 Dimensional:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -1D |-----------|-----------| +1D Children Indexes:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -1D: 0\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// \u0026lt;--- 0 ---\u0026gt; \u0026lt;--- 1 ---\u0026gt; +1D: 1\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 2 Dimensional:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// _____________________\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | +2D\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | ^\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | 2 | 3 | | Children Indexes:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | -2D -1D: 0\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// |----------|----------| | -2D +1D: 1\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | +2D -1D: 2\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | +2D +1D: 3\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | 0 | 1 | |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | v\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// |__________|__________| -2D\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -1D \u0026lt;-----------\u0026gt; +1D \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 3 Dimensional:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// +3D _____________________\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 7 / / /|\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / / 6 / 7 / |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / /---------/----------/ | Children Indexes:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / / 2 / 3 /| | -3D -2D -1D: 0\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// L /_________/__________/ | | -3D -2D +1D: 1\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -3D | | | | /| +2D -3D +2D -1D: 2\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | |/ | ^ -3D +2D +1D: 3\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | 2 | 3 | / | | +3D -2D -1D: 4\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | |/| | \u0026lt;-- 5 | +3D -2D +1D: 5\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// |----------|----------| | | | +3D +2D -1D: 6\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | / | +3D +2D +1D: 7\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | / |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | 0 | 1 | |/ |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | / v\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// |__________|__________|/ -2D\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// ^\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 4 (behind 0)\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -1D \u0026lt;-----------\u0026gt; +1D\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 4 Dimensional:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// +1D +2D +3D +4D Children Indexes:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// ^ ^ ^ ^\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | -4D -3D -2D -1D: 0 +4D -3D -2D -1D: 8\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | -4D -3D -2D +1D: 1 +4D -3D -2D +1D: 9\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | -4D -3D +2D -1D: 2 +4D -3D +2D -1D: 10\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | -4D -3D +2D +1D: 3 +4D -3D +2D +1D: 11\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | -4D +3D -2D -1D: 4 +4D +3D -2D -1D: 12\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// --- --- --- --- -4D +3D -2D +1D: 5 +4D +3D -2D +1D: 13\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | -4D +3D +2D -1D: 6 +4D +3D +2D -1D: 14\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | | -4D +3D +2D +1D: 7 +4D +3D +2D +1D: 15\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// v v v v\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -1D -2D -3D -4D\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// With a value that is in the (+1D, -2D, -3D, +4D)[Index 9] child:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// +1D +2D +3D +4D\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// ^ ^ ^ ^\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// O--- | | ---O\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | \\ | | / |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | \\ | | / |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// --- \\ --- --- / ---\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | \\ | | / |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | \\ | | / |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | ---O-----------O--- |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | | | |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// v v v v\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// -1D -2D -3D -4D\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// By default, the omnitree will sort items along each axis and use the median algorithm to determine\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// the point of divisions. However, you can override the subdivision algorithm. For numerical values,\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// the mean algorithm can be used (and is much faster than median). If you know the data set will be\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// relatively evenly distributed within a sub-space, you can even set the subdivision algorithm to\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// calculate the subdivision from parent spaces rather than looking at the current contents of the\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// space.\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// The depth of the omnitree is bounded by \"ln(count)\" the natural log of the current count. When adding\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// and item to the tree, if the number of items in the respective child is greater than ln(count) and \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// the depth bounding has not been reached, then the child will be subdivided. The goal is to achieve \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Ω(ln(count)) runtime complexity when looking up values.\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nB-Tree \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// a B-tree is a self-balancing tree data structure that maintains \n// sorted data and allows searches, sequential access, insertions, \n// and deletions in logarithmic time. The B-tree generalizes the \n// binary search tree, allowing for nodes with more than two children.\n\n// There are two ways to Add and Remove elements in a B-Tree\n// 1) Pre-emptive: Search the tree from top to bottom (for place to add/ \n// \t\t\tnode to delete) and perform fixing of the B-Tree (Splitting\n//\t\t\tor Merging) in a single pass\n// 2) Non Pre-emptive: Add/Remove the required node and go up the tree to \n// \t\t\tfix the tree as needed\n//\n// Pre-emptive methods are optimal, especially if the Maximum Degree of\n// a node is set to an even number. This implementation of B-Tree \n// uses Pre-emptive modes of Add/Removal methods and therefore the \n// value of Maximum Degree is mandated to be even\n\n// This implementation is taken from Thomas H. Cormen's book \u0026quot;Introduction \n// to Algorithms, 3rd edition\u0026quot;, Chapter 18: B-Trees\n\nBTree\u0026lt;int\u0026gt; tree = new BTree\u0026lt;int\u0026gt;(4); \n\ntree.Add(20);\ntree.Add(10);\ntree.Add(30);\ntree.Add(50);\ntree.Add(40);\ntree.Add(5);\ntree.Add(15);\n// \n// [20]\n// / \\\n// / \\\n// [5, 10, 15] [30, 40, 50]\n// \n// All elements added in the BTree, where each node can have a maximum\n// of 4 children (and therefore, a maximum of 3 elements)\n\nbool r1 = tree.TryRemove(50).Success; // r1 = true\nbool r2 = tree.TryRemove(50).Success; // r2 = false, 50 is no longer in the tree\n\n// \n// [20]\n// / \\\n// / \\\n// [5, 10, 15] [30, 40]\n\nint[] array = tree.ToArray(); // array = [5, 10, 15, 20, 30, 40]\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// a B-tree is a self-balancing tree data structure that maintains \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// sorted data and allows searches, sequential access, insertions, \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// and deletions in logarithmic time. The B-tree generalizes the \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// binary search tree, allowing for nodes with more than two children.\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// There are two ways to Add and Remove elements in a B-Tree\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 1) Pre-emptive: Search the tree from top to bottom (for place to add/ \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// \t\t\tnode to delete) and perform fixing of the B-Tree (Splitting\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\t\t\tor Merging) in a single pass\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 2) Non Pre-emptive: Add/Remove the required node and go up the tree to \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// \t\t\tfix the tree as needed\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Pre-emptive methods are optimal, especially if the Maximum Degree of\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// a node is set to an even number. This implementation of B-Tree \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// uses Pre-emptive modes of Add/Removal methods and therefore the \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// value of Maximum Degree is mandated to be even\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// This implementation is taken from Thomas H. Cormen's book \"Introduction \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// to Algorithms, 3rd edition\", Chapter 18: B-Trees\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eBTree\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etree\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eBTree\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e4\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \n\n\u003cspan class=\"pl-s1\"\u003etree\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e20\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003etree\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e10\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003etree\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e30\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003etree\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e50\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003etree\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e40\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003etree\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e5\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003etree\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e15\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// [20]\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// [5, 10, 15] [30, 40, 50]\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// All elements added in the BTree, where each node can have a maximum\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// of 4 children (and therefore, a maximum of 3 elements)\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003er1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etree\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eTryRemove\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e50\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eSuccess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// r1 = true\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003er2\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etree\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eTryRemove\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e50\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eSuccess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// r2 = false, 50 is no longer in the tree\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// [20]\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// / \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// [5, 10, 15] [30, 40]\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003earray\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etree\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eToArray\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// array = [5, 10, 15, 20, 30, 40]\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nTree \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"ITree\u0026lt;T\u0026gt; treeMap = TreeMap.New\u0026lt;T\u0026gt;(...);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-smi\"\u003eITree\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etreeMap\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eTreeMap\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eNew\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nGraph \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// A graph is a data structure that contains nodes and edges. They are useful\n// when you need to model real world scenarios. They also are generally used\n// for particular algorithms such as path finding. The GraphSetOmnitree is a\n// graph that stores nodes in a hashed set and the edges in a 2D omnitree (aka\n// quadtree).\n\nIGraph\u0026lt;int\u0026gt; graph = GraphSetOmnitree.New\u0026lt;int\u0026gt;();\n// add nodes\ngraph.Add(0);\ngraph.Add(1);\ngraph.Add(2);\ngraph.Add(3);\n// add edges\ngraph.Add(0, 1);\ngraph.Add(1, 2);\ngraph.Add(2, 3);\ngraph.Add(0, 3);\n// visualization\n//\n// 0 --------\u0026gt; 1\n// | |\n// | |\n// | |\n// v v\n// 3 \u0026lt;-------- 2\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// A graph is a data structure that contains nodes and edges. They are useful\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// when you need to model real world scenarios. They also are generally used\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// for particular algorithms such as path finding. The GraphSetOmnitree is a\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// graph that stores nodes in a hashed set and the edges in a 2D omnitree (aka\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// quadtree).\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eIGraph\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003egraph\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eGraphSetOmnitree\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eNew\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// add nodes\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003egraph\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003egraph\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003egraph\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003egraph\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// add edges\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003egraph\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003egraph\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003egraph\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003egraph\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// visualization\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 0 --------\u0026gt; 1\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// | |\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// v v\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 3 \u0026lt;-------- 2\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nSkipList \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// A skip list is a probabilistic data structure that stores data \n// similar to a Linked List, but has additional layers which allow\n// the list to perform basic operations (add/search/delete) in \n// O(log n) average complexity\n\nSkipList\u0026lt;int, SFunc\u0026lt;int, int, CompareResult\u0026gt;\u0026gt;? list = SkipList.New\u0026lt;int\u0026gt;(5); // create a list with 5 levels\nlist.Add(60);\nlist.Add(20);\nlist.Add(30);\nlist.Add(40);\nlist.Add(20);\nlist.Add(90);\nlist.Add(80);\n// #--------------------\u0026gt;| |---------------------------------\u0026gt;NULL\n// #--------------------\u0026gt;| |---------------------------\u0026gt;| |-\u0026gt;NULL\n// # -------------------\u0026gt;| |-------------------\u0026gt;| |---\u0026gt;| |-\u0026gt;NULL\n// # -----------\u0026gt;| |---\u0026gt;| |---\u0026gt;| |-----------\u0026gt;| |---\u0026gt;| |-\u0026gt;NULL\n// # ---\u0026gt;|20|---\u0026gt;|20|---\u0026gt;|30|---\u0026gt;|40|---\u0026gt;|60|---\u0026gt;|80|---\u0026gt;|90|-\u0026gt;NULL\n// \n// PS: SkipList nodes are assigned levels randomly, so this is one of the possible configurations obtainable\nbool result;\nresult = list.Contains(40); //result = true\nresult = list.Remove(40).Suceess; // result = true\nresult = list.Contains(40); //result = false\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// A skip list is a probabilistic data structure that stores data \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// similar to a Linked List, but has additional layers which allow\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// the list to perform basic operations (add/search/delete) in \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// O(log n) average complexity\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eSkipList\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSFunc\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCompareResult\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elist\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSkipList\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eNew\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e5\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// create a list with 5 levels\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003elist\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e60\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003elist\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e20\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003elist\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e30\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003elist\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e40\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003elist\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e20\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003elist\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e90\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003elist\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e80\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// #--------------------\u0026gt;| |---------------------------------\u0026gt;NULL\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// #--------------------\u0026gt;| |---------------------------\u0026gt;| |-\u0026gt;NULL\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// # -------------------\u0026gt;| |-------------------\u0026gt;| |---\u0026gt;| |-\u0026gt;NULL\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// # -----------\u0026gt;| |---\u0026gt;| |---\u0026gt;| |-----------\u0026gt;| |---\u0026gt;| |-\u0026gt;NULL\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// # ---\u0026gt;|20|---\u0026gt;|20|---\u0026gt;|30|---\u0026gt;|40|---\u0026gt;|60|---\u0026gt;|80|---\u0026gt;|90|-\u0026gt;NULL\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// PS: SkipList nodes are assigned levels randomly, so this is one of the possible configurations obtainable\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eresult\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eresult\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elist\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eContains\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e40\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e//result = true\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eresult\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elist\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eRemove\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e40\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eSuceess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// result = true\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eresult\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elist\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eContains\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e40\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e//result = false\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nTrie \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// A trie is a tree that stores values in a way that partial keys may be shared\n// amongst values to reduce redundant memory usage. They are generally used with\n// large data sets such as storing all the words in the English language. For\n// example, the words \u0026quot;farm\u0026quot; and \u0026quot;fart\u0026quot; both have the letters \u0026quot;far\u0026quot; in common.\n// A trie takes advantage of that and only stores the necessary letters for\n// those words ['f'-\u0026gt;'a'-\u0026gt;'r'-\u0026gt;('t'||'m')]. A trie is not limited to string\n// values though. Any key type that can be broken into pieces (and shared),\n// could be used in a trie.\n//\n// There are two versions. One that only stores the values of the trie (ITrie\u0026lt;T\u0026gt;)\n// and one that stores the values of the trie plus an additional generic value\n// on the leaves (ITrie\u0026lt;T, D\u0026gt;).\n\nITrie\u0026lt;T\u0026gt; trie = TrieLinkedHashLinked.New\u0026lt;T\u0026gt;();\n\nITrie\u0026lt;T, D\u0026gt; trie = TrieLinkedHashLinked.New\u0026lt;T, D\u0026gt;();\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// A trie is a tree that stores values in a way that partial keys may be shared\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// amongst values to reduce redundant memory usage. They are generally used with\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// large data sets such as storing all the words in the English language. For\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// example, the words \"farm\" and \"fart\" both have the letters \"far\" in common.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// A trie takes advantage of that and only stores the necessary letters for\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// those words ['f'-\u0026gt;'a'-\u0026gt;'r'-\u0026gt;('t'||'m')]. A trie is not limited to string\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// values though. Any key type that can be broken into pieces (and shared),\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// could be used in a trie.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// There are two versions. One that only stores the values of the trie (ITrie\u0026lt;T\u0026gt;)\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// and one that stores the values of the trie plus an additional generic value\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// on the leaves (ITrie\u0026lt;T, D\u0026gt;).\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eITrie\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etrie\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eTrieLinkedHashLinked\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eNew\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eITrie\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eD\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etrie\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eTrieLinkedHashLinked\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eNew\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eD\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nGeneric Mathematics \u0026amp; Logic \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nHow It Works \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"public static T Addition\u0026lt;T\u0026gt;(T a, T b)\n{\n\treturn AdditionImplementation\u0026lt;T\u0026gt;.Function(a, b);\n}\n\ninternal static class AdditionImplementation\u0026lt;T\u0026gt;\n{\n\tinternal static Func\u0026lt;T, T, T\u0026gt; Function = (T a, T b) =\u0026gt;\n\t{\n\t\tvar A = Expression.Parameter(typeof(T));\n\t\tvar B = Expression.Parameter(typeof(T));\n\t\tvar BODY = Expression.Add(A, B);\n\t\tFunction = Expression.Lambda\u0026lt;Func\u0026lt;T, T, T\u0026gt;\u0026gt;(BODY, A, B).Compile();\n\t\treturn Function(a, b);\n\t};\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003estatic\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eAddition\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\t\u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eAdditionImplementation\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eFunction\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003einternal\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003estatic\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eclass\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eAdditionImplementation\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\t\u003cspan class=\"pl-k\"\u003einternal\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003estatic\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eFunc\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eFunction\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u0026gt;\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\t\t\u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eA\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eExpression\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eParameter\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003etypeof\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\t\t\u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eB\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eExpression\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eParameter\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003etypeof\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\t\t\u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eBODY\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eExpression\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAdd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eA\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eB\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\t\t\u003cspan class=\"pl-s1\"\u003eFunction\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eExpression\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eLambda\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eFunc\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eBODY\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eA\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eB\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eCompile\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\t\t\u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eFunction\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can break type safe-ness using generic types and runtime compilation, and you can store the runtime compilation in a delegate so the only overhead is the invocation of the delegate.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Logic Fundamentals\nbool Equate\u0026lt;T\u0026gt;(T a , T b);\nbool LessThan\u0026lt;T\u0026gt;(T a, T b);\nbool GreaterThan\u0026lt;T\u0026gt;(T a, T b);\nCompareResult Compare\u0026lt;T\u0026gt;(T a, T b);\n\n// Mathematics Fundamentals\nT Negation\u0026lt;T\u0026gt;(T a);\nT Addition\u0026lt;T\u0026gt;(T a, T b);\nT Subtraction\u0026lt;T\u0026gt;(T a, T b);\nT Multiplication\u0026lt;T\u0026gt;(T a, T b);\nT Division\u0026lt;T\u0026gt;(T a, T b);\nT Remainder\u0026lt;T\u0026gt;(T a, T b);\n\n// More Logic\nbool IsPrime\u0026lt;T\u0026gt;(T a);\nbool IsEven\u0026lt;T\u0026gt;(T a);\nbool IsOdd\u0026lt;T\u0026gt;(T a);\nT Minimum\u0026lt;T\u0026gt;(T a, T b);\nT Maximum\u0026lt;T\u0026gt;(T a, T b);\nT Clamp\u0026lt;T\u0026gt;(T value, T floor, T ceiling);\nT AbsoluteValue\u0026lt;T\u0026gt;(T a);\nbool EqualityLeniency\u0026lt;T\u0026gt;(T a, T b, T leniency);\n\n// More Numerics\nvoid FactorPrimes\u0026lt;T\u0026gt;(T a, ...);\nT Factorial\u0026lt;T\u0026gt;(T a);\nT LinearInterpolation\u0026lt;T\u0026gt;(T x, T x0, T x1, T y0, T y1);\nT LeastCommonMultiple\u0026lt;T\u0026gt;(T a, T b, params T[] c);\nT GreatestCommonFactor\u0026lt;T\u0026gt;(T a, T b, params T[] c);\nLinearRegression2D\u0026lt;T\u0026gt;(..., out T slope, out T y_intercept);\n\n// Statistics\nT Mean\u0026lt;T\u0026gt;(T a, params T[] b);\nT Median\u0026lt;T\u0026gt;(params T[] values);\nHeap\u0026lt;Link\u0026lt;T, int\u0026gt;\u0026gt; Mode\u0026lt;T\u0026gt;(T a, params T[] b);\nvoid Range\u0026lt;T\u0026gt;(out T minimum, out T maximum, ...);\nT[] Quantiles\u0026lt;T\u0026gt;(int quantiles, ...);\nT GeometricMean\u0026lt;T\u0026gt;(...);\nT Variance\u0026lt;T\u0026gt;(...);\nT StandardDeviation\u0026lt;T\u0026gt;(...);\nT MeanDeviation\u0026lt;T\u0026gt;(...);\n\n// Vectors\nVector\u0026lt;T\u0026gt; V1 = new Vector\u0026lt;T\u0026gt;(params T[] vector);\nVector\u0026lt;T\u0026gt; V2 = new Vector\u0026lt;T\u0026gt;(params T[] vector);\nVector\u0026lt;T\u0026gt; V3;\nT scalar;\nV3 = -V1; // Negate\nV3 = V1 + V2; // Add\nV3 = V1 - V2; // Subtract\nV3 = V1 * scalar; // Multiply\nV3 = V1 / scalar; // Divide\nscalar = V1.DotProduct(V2); // Dot Product\nV3 = V1.CrossProduct(V2); // Cross Product\nV1.Magnitude; // Magnitude\nV3 = V1.Normalize(); // Normalize\nbool equal = V1 == V2; // Equal\n\n// Matrices\nMatrix\u0026lt;T\u0026gt; M1 = new Matrix\u0026lt;T\u0026gt;(int rows, int columns);\nMatrix\u0026lt;T\u0026gt; M2 = new Matrix\u0026lt;T\u0026gt;(int rows, int columns);\nMatrix\u0026lt;T\u0026gt; M3;\nVector\u0026lt;T\u0026gt; V2 = new Vector\u0026lt;T\u0026gt;(params T[] vector);\nVector\u0026lt;T\u0026gt; V3;\nT scalar;\nM3 = -M1; // Negate\nM3 = M1 + M2; // Add\nM3 = M1 - M2; // Subtract\nM3 = M1 * M2; // Multiply\nV3 = M1 * V2; // Multiply (vector)\nM3 = M1 * scalar; // Multiply (scalar)\nM3 = M1 / scalar; // Divide\nM3 = M1 ^ 3; // Power\nscalar = M1.Determinent(); // Determinent\nM3 = M1.Minor(int row, int column); // Minor\nM3 = M1.Echelon(); // Echelon Form (REF)\nM3 = M1.ReducedEchelon(); // Reduced Echelon Form (RREF)\nM3 = M1.Inverse(); // Inverse\nM1.DecomposeLowerUpper(ref M2, ref M3); // Lower Upper Decomposition\nbool equal = M1 == M2; // Equal\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// Logic Fundamentals\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eEquate\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eLessThan\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eGreaterThan\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eCompareResult\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eCompare\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Mathematics Fundamentals\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eNegation\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eAddition\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSubtraction\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eMultiplication\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eDivision\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eRemainder\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// More Logic\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eIsPrime\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eIsEven\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eIsOdd\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eMinimum\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eMaximum\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eClamp\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evalue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003efloor\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eceiling\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eAbsoluteValue\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eEqualityLeniency\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eleniency\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// More Numerics\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eFactorPrimes\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e ..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eFactorial\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eLinearInterpolation\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ex\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ex0\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ex1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ey0\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ey1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eLeastCommonMultiple\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eparams\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ec\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eGreatestCommonFactor\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eparams\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ec\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eLinearRegression2D\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslope\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ey_intercept\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Statistics\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eMean\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eparams\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eMedian\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003eparams\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evalues\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eHeap\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eLink\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eMode\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eparams\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eRange\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eminimum\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emaximum\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e ..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eQuantiles\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003equantiles\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e ..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eGeometricMean\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eVariance\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eStandardDeviation\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eMeanDeviation\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Vectors\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003eparams\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evector\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV2\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003eparams\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evector\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003escalar\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eV3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eV1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Negate\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eV3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Add\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eV3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Subtract\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eV3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003escalar\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Multiply\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eV3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003escalar\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Divide\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003escalar\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eDotProduct\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eV2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Dot Product\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eV3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eCrossProduct\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eV2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Cross Product\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eV1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eMagnitude\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Magnitude\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eV3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eNormalize\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Normalize\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eequal\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Equal\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Matrices\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eMatrix\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eMatrix\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erows\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecolumns\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eMatrix\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM2\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eMatrix\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erows\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecolumns\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eMatrix\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV2\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003eparams\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evector\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003escalar\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Negate\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Add\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Subtract\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Multiply\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eV3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eV2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Multiply (vector)\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003escalar\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Multiply (scalar)\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003escalar\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Divide\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e^\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Power\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003escalar\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eDeterminent\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Determinent\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eMinor\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecolumn\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Minor\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eEchelon\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Echelon Form (REF)\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eReducedEchelon\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Reduced Echelon Form (RREF)\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eInverse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Inverse\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eDecomposeLowerUpper\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003eref\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eref\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM3\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Lower Upper Decomposition\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eequal\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eM2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// Equal\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nSymbolic Mathematics \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Parsing From Linq Expression\nExpression\u0026lt;Func\u0026lt;double, double\u0026gt;\u0026gt; exp1 = (x) =\u0026gt; 2 * (x / 7);\nSymbolics.Expression symExp1 = Symbolics.Parse(exp1);\n\n// Parsing From String\nSymbolics.Expression symExp2 = Symbolics.Parse(\u0026quot;2 * ([x] / 7)\u0026quot;);\n\n// Mathematical Simplification\nSymbolics.Expression simplified = symExp1.Simplify();\n\n// Variable Substitution\nsymExp1.Substitute(\u0026quot;x\u0026quot;, 5);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// Parsing From Linq Expression\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eExpression\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eFunc\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eexp1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ex\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ex\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e7\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eSymbolics\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eExpression\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esymExp1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSymbolics\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eParse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eexp1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Parsing From String\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eSymbolics\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eExpression\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esymExp2\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSymbolics\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eParse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"2 * ([x] / 7)\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Mathematical Simplification\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eSymbolics\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eExpression\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esimplified\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esymExp1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eSimplify\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Variable Substitution\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003esymExp1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eSubstitute\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"x\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e5\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nMeasurement Mathematics \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nSupported Measurements \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eHere are the currently supported measurement types:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Acceleration: Length/Time/Time\n// AngularAcceleration: Angle/Time/Time\n// Angle: Angle\n// AngularSpeed: Angle/Time\n// Area: Length*Length\n// AreaDensity: Mass/Length/Length\n// Density: Mass/Length/Length/Length\n// ElectricCharge: ElectricCharge\n// ElectricCurrent: ElectricCharge/Time\n// Energy: Mass*Length*Length/Time/Time\n// Force: Mass*Length/Time/Time\n// Length: Length\n// LinearDensity: Mass/Length\n// LinearMass: Mass*Length\n// LinearMassFlow: Mass*Length/Time\n// Mass: Mass\n// MassRate: Mass/Time\n// Power: Mass*Length*Length/Time/Time/Time\n// Pressure: Mass/Length/Time/Time\n// Speed: Length/Time\n// Tempurature: Tempurature\n// Time: Time\n// TimeArea: Time*Time\n// Volume: Length*Length*Length\n// VolumeRate: Length*Length*Length/Time\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// Acceleration: Length/Time/Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// AngularAcceleration: Angle/Time/Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Angle: Angle\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// AngularSpeed: Angle/Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Area: Length*Length\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// AreaDensity: Mass/Length/Length\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Density: Mass/Length/Length/Length\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// ElectricCharge: ElectricCharge\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// ElectricCurrent: ElectricCharge/Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Energy: Mass*Length*Length/Time/Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Force: Mass*Length/Time/Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Length: Length\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// LinearDensity: Mass/Length\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// LinearMass: Mass*Length\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// LinearMassFlow: Mass*Length/Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Mass: Mass\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// MassRate: Mass/Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Power: Mass*Length*Length/Time/Time/Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Pressure: Mass/Length/Time/Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Speed: Length/Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Tempurature: Tempurature\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Time: Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// TimeArea: Time*Time\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Volume: Length*Length*Length\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// VolumeRate: Length*Length*Length/Time\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe measurement types are generated in the \u003cem\u003eTowel/Measurements/MeasurementTypes.tt\u003c/em\u003e T4 text template file. The unit (enum) definitions are in the \u003cem\u003eTowel/Measurements/MeasurementUnitDefinitions.cs\u003c/em\u003e file. Both measurment types and unit definitions can be easily added. If you think a measurement type or unit type should be added, please \u003ca href=\"https://github.com/ZacharyPatten/Towel/issues/new/choose\"\u003esubmit an enhancement issue\u003c/a\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Towel has measurement types to help write scientific code: Acceleration\u0026lt;T\u0026gt;, Angle\u0026lt;T\u0026gt;, Area\u0026lt;T\u0026gt;, \n// Density\u0026lt;T\u0026gt;, Length\u0026lt;T\u0026gt;, Mass\u0026lt;T\u0026gt;, Speed\u0026lt;T\u0026gt;, Time\u0026lt;T\u0026gt;, Volume\u0026lt;T\u0026gt;, etc.\n\n// Automatic Unit Conversion\n// When you perform mathematical operations on measurements, any necessary unit conversions will\n// be automatically performed by the relative measurement type (in this case \u0026quot;Angle\u0026lt;T\u0026gt;\u0026quot;).\nAngle\u0026lt;double\u0026gt; angle1 = (90d, Degrees);\nAngle\u0026lt;double\u0026gt; angle2 = (.5d, Turns);\nAngle\u0026lt;double\u0026gt; result1 = angle1 + angle2; // 270° \n\n// Type Safeness\n// The type safe-ness of the measurement types prevents the miss-use of the measurements. You cannot\n// add \u0026quot;Length\u0026lt;T\u0026gt;\u0026quot; to \u0026quot;Angle\u0026lt;T\u0026gt;\u0026quot; because that is mathematically invalid (no operator exists).\nLength\u0026lt;double\u0026gt; length1 = (2d, Yards);\nobject result2 = angle1 + length1; // WILL NOT COMPILE!!!\n\n// Simplify The Syntax Even Further\n// You can use alias to remove the generic type if you want to simplify the syntax even further.\nusing Speedf = Towel.Measurements.Speed\u0026lt;float\u0026gt;; // at top of file\nSpeedf speed1 = (5, Meters / Seconds);\n\n// Vector + Measurements\n// You can use the measurement types inside Towel Vectors.\nVector\u0026lt;Speed\u0026lt;float\u0026gt;\u0026gt; velocity1 = new Vector\u0026lt;Speed\u0026lt;float\u0026gt;\u0026gt;(\n\t(1f, Meters / Seconds),\n\t(2f, Meters / Seconds),\n\t(3f, Meters / Seconds));\nVector\u0026lt;Speedf\u0026gt; velocity2 = new Vector\u0026lt;Speedf\u0026gt;(\n\t(1f, Centimeters / Seconds),\n\t(2f, Centimeters / Seconds),\n\t(3f, Centimeters / Seconds));\nVector\u0026lt;Speed\u0026lt;float\u0026gt;\u0026gt; velocity3 = velocity1 + velocity2;\n\n// Manual Unit Conversions\n// 1. Index Operator On Measurement Type\ndouble angle1_inRadians = angle1[Radians];\nfloat speed1_inMilesPerHour = speed1[Miles / Hours];\n// 2. Static Conversion Methods\ndouble angle3 = Angle\u0026lt;double\u0026gt;.Convert(7d,\n\tRadians, // from\n\tDegrees); // to\ndouble speed2 = Speed\u0026lt;double\u0026gt;.Convert(8d,\n\tMeters / Seconds, // from\n\tMiles / Hours); // to\ndouble force1 = Force\u0026lt;double\u0026gt;.Convert(9d,\n\tKilograms * Meters / Seconds / Seconds, // from\n\tGrams * Miles / Hours / Hours); // to\ndouble angle4 = Measurement.Convert(10d,\n\tRadians, // from\n\tDegrees); // to\n// The unit conversion on the Measurement class\n// is still compile-time-safe.\n\n// Measurement Parsing\nSpeed\u0026lt;float\u0026gt;.TryParse(\u0026quot;20.5 Meters / Seconds\u0026quot;,\n\tout Speed\u0026lt;float\u0026gt; parsedSpeed);\nForce\u0026lt;decimal\u0026gt;.TryParse(\u0026quot;.1234 Kilograms * Meters / Seconds / Seconds\u0026quot;,\n\tout Force\u0026lt;decimal\u0026gt; parsedForce);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// Towel has measurement types to help write scientific code: Acceleration\u0026lt;T\u0026gt;, Angle\u0026lt;T\u0026gt;, Area\u0026lt;T\u0026gt;, \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Density\u0026lt;T\u0026gt;, Length\u0026lt;T\u0026gt;, Mass\u0026lt;T\u0026gt;, Speed\u0026lt;T\u0026gt;, Time\u0026lt;T\u0026gt;, Volume\u0026lt;T\u0026gt;, etc.\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Automatic Unit Conversion\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// When you perform mathematical operations on measurements, any necessary unit conversions will\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// be automatically performed by the relative measurement type (in this case \"Angle\u0026lt;T\u0026gt;\").\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eAngle\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eangle1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e90d\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eDegrees\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eAngle\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eangle2\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e.5d\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eTurns\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eAngle\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eresult1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eangle1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eangle2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// 270° \u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Type Safeness\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// The type safe-ness of the measurement types prevents the miss-use of the measurements. You cannot\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// add \"Length\u0026lt;T\u0026gt;\" to \"Angle\u0026lt;T\u0026gt;\" because that is mathematically invalid (no operator exists).\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eLength\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elength1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e2d\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eYards\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eobject\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eresult2\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eangle1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elength1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// WILL NOT COMPILE!!!\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Simplify The Syntax Even Further\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// You can use alias to remove the generic type if you want to simplify the syntax even further.\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eusing\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSpeedf\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eTowel\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eMeasurements\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eSpeed\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003efloat\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// at top of file\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSpeedf\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003espeed1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e5\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eMeters\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSeconds\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Vector + Measurements\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// You can use the measurement types inside Towel Vectors.\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eSpeed\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003efloat\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evelocity1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eSpeed\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003efloat\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e1f\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eMeters\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSeconds\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e2f\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eMeters\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSeconds\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e3f\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eMeters\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSeconds\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eSpeedf\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evelocity2\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eSpeedf\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e1f\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eCentimeters\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSeconds\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e2f\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eCentimeters\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSeconds\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e3f\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eCentimeters\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSeconds\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eVector\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eSpeed\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003efloat\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evelocity3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evelocity1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evelocity2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Manual Unit Conversions\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 1. Index Operator On Measurement Type\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eangle1_inRadians\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eangle1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eRadians\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003efloat\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003espeed1_inMilesPerHour\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003espeed1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eMiles\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eHours\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// 2. Static Conversion Methods\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eangle3\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eAngle\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eConvert\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e7d\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\t\u003cspan class=\"pl-s1\"\u003eRadians\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// from\u003c/span\u003e\n\t\u003cspan class=\"pl-s1\"\u003eDegrees\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// to\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003espeed2\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSpeed\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eConvert\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e8d\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\t\u003cspan class=\"pl-s1\"\u003eMeters\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSeconds\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// from\u003c/span\u003e\n\t\u003cspan class=\"pl-s1\"\u003eMiles\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eHours\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// to\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eforce1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eForce\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eConvert\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e9d\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\t\u003cspan class=\"pl-s1\"\u003eKilograms\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eMeters\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSeconds\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSeconds\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// from\u003c/span\u003e\n\t\u003cspan class=\"pl-s1\"\u003eGrams\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eMiles\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eHours\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e/\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eHours\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// to\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003edouble\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eangle4\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eMeasurement\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eConvert\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e10d\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\t\u003cspan class=\"pl-s1\"\u003eRadians\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// from\u003c/span\u003e\n\t\u003cspan class=\"pl-s1\"\u003eDegrees\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// to\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// The unit conversion on the Measurement class\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// is still compile-time-safe.\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// Measurement Parsing\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSpeed\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003efloat\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eTryParse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"20.5 Meters / Seconds\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\t\u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSpeed\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003efloat\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eparsedSpeed\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eForce\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003edecimal\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eTryParse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\".1234 Kilograms * Meters / Seconds / Seconds\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\t\u003cspan class=\"pl-k\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eForce\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003edecimal\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eparsedForce\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nConsole Helpers \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Just some helper methods for console applications...\n\n// wait for keypress to continue an intercept input\nConsoleHelper.PromptPressToContinue(...);\n// generic method for retrieving validated console input\nConsoleHelper.GetInput\u0026lt;T\u0026gt;(...);\n// animated ellipsis character to show processing\nConsoleHelper.AnimatedEllipsis(...);\n// render progress bar in console\nConsoleHelper.ProgressBar(...);\n// Console.ReadLine() with hidden input characters\nConsoleHelper.HiddenReadLine();\n// easily manage int-based console menus\nConsoleHelper.IntMenu(...);\n// preventing console input\nConsoleHelper.FlushInputBuffer();\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// Just some helper methods for console applications...\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// wait for keypress to continue an intercept input\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsoleHelper\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ePromptPressToContinue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// generic method for retrieving validated console input\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsoleHelper\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eGetInput\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// animated ellipsis character to show processing\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsoleHelper\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAnimatedEllipsis\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// render progress bar in console\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsoleHelper\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eProgressBar\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Console.ReadLine() with hidden input characters\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsoleHelper\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eHiddenReadLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// easily manage int-based console menus\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsoleHelper\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eIntMenu\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e..\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// preventing console input\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsoleHelper\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eFlushInputBuffer\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nTagAttribute \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// With TagAttribute's you can make value-based attributes so\n// you don't always have to make your own custom attribute types.\n// Just \u0026quot;tag\u0026quot; a code member with constant values.\n\nusing System;\nusing Towel;\n\nvar (Found, Value) = typeof(MyClass).GetTag(\u0026quot;My Tag\u0026quot;);\nConsole.WriteLine(\u0026quot;My Tag...\u0026quot;);\nConsole.WriteLine(\u0026quot;Found: \u0026quot; + Found);\nConsole.WriteLine(\u0026quot;Value: \u0026quot; + Value);\n\n[Tag(\u0026quot;My Tag\u0026quot;, \u0026quot;hello world\u0026quot;)]\npublic class MyClass { }\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// With TagAttribute's you can make value-based attributes so\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// you don't always have to make your own custom attribute types.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// Just \"tag\" a code member with constant values.\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003eusing\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eusing\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eTowel\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eFound\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003etypeof\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eMyClass\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eGetTag\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"My Tag\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsole\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eWriteLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"My Tag...\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsole\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eWriteLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"Found: \"\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eFound\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsole\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eWriteLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"Value: \"\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eTag\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"My Tag\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"hello world\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eclass\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eMyClass\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nSLazy\u0026lt;T\u0026gt; + ValueLazy\u0026lt;T\u0026gt; \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// SLazy\u0026lt;T\u0026gt; is a faster Lazy\u0026lt;T\u0026gt; when using the default\n// LazyThreadSafetyMode.ExecutionAndPublication setting.\n\nSLazy\u0026lt;string\u0026gt; slazy = new(() =\u0026gt; \u0026quot;hello world\u0026quot;);\nConsole.WriteLine(slazy.IsValueCreated); // False\nConsole.WriteLine(slazy.Value); // hello world\nConsole.WriteLine(slazy.IsValueCreated); // True\n\n// ValueLazy\u0026lt;T\u0026gt; is even faster than SLazy\u0026lt;T\u0026gt; but it \n// is unsafe as it will potentially call the factory\n// delegate multiple times if the struct is copied.\n// So please use ValueLazy\u0026lt;T\u0026gt; with caution.\n\n// There are various types for supporting no multithread lock,\n// no exception caching, and publication only locks.\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// SLazy\u0026lt;T\u0026gt; is a faster Lazy\u0026lt;T\u0026gt; when using the default\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// LazyThreadSafetyMode.ExecutionAndPublication setting.\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eSLazy\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslazy\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"hello world\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsole\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eWriteLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eslazy\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eIsValueCreated\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// False\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsole\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eWriteLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eslazy\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// hello world\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003eConsole\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eWriteLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eslazy\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eIsValueCreated\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e// True\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// ValueLazy\u0026lt;T\u0026gt; is even faster than SLazy\u0026lt;T\u0026gt; but it \u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// is unsafe as it will potentially call the factory\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// delegate multiple times if the struct is copied.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// So please use ValueLazy\u0026lt;T\u0026gt; with caution.\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// There are various types for supporting no multithread lock,\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// no exception caching, and publication only locks.\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://zacharypatten.github.io/Towel/benchmarks/LazyInitializationBenchmarks.html\" rel=\"nofollow\"\u003eInitialization Benchmarks\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://zacharypatten.github.io/Towel/benchmarks/LazyCachingBenchmarks.html\" rel=\"nofollow\"\u003eCaching Benchmarks\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://zacharypatten.github.io/Towel/benchmarks/LazyConstructionBenchmarks.html\" rel=\"nofollow\"\u003eConstruction Benchmarks\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nSpanBuilder\u0026lt;T\u0026gt; + SStringBuilder \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// SpanBuilder\u0026lt;char\u0026gt; is a small helper for initializing\n// stack allocated spans.\nSpanBuilder\u0026lt;char\u0026gt; span = stackalloc char[10];\nspan.AppendLine(\u0026quot;ab\u0026quot;);\n\n// SStringBuilder is a small helper for initializing strings.\n// It will append to the span until the capacity is reached\n// and then it will revert to a StringBuilder if necessary\n// rather than throwing like SpanBuilder\u0026lt;T\u0026gt; does.\nSStringBuilder\u0026lt;char\u0026gt; span = stackalloc char[10];\nspan.AppendLine(\u0026quot;abcdefghijklmnopqrstuvwxyz\u0026quot;);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// SpanBuilder\u0026lt;char\u0026gt; is a small helper for initializing\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// stack allocated spans.\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSpanBuilder\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003echar\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003espan\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003estackalloc\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003echar\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e10\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003espan\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAppendLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"ab\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// SStringBuilder is a small helper for initializing strings.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// It will append to the span until the capacity is reached\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// and then it will revert to a StringBuilder if necessary\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// rather than throwing like SpanBuilder\u0026lt;T\u0026gt; does.\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eSStringBuilder\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003echar\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003espan\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003estackalloc\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003echar\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e10\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003espan\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eAppendLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"abcdefghijklmnopqrstuvwxyz\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\nCommand Line Parser \u003csub\u003e[Expand]\u003c/sub\u003e\n\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\n\u003c/p\u003e\u003cblockquote\u003e\n\u003cdiv class=\"highlight highlight-source-cs notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Just put the [Command] attribute on any method you want to call\n// from the command line, and call the \u0026quot;HandleArguments\u0026quot; method.\n\nusing System;\nusing static Towel.CommandLine;\n\npublic static class Program\n{\n\tpublic static void Main(string[] args)\n\t{\n\t\tHandleArguments(args);\n\t}\n\n\t[Command]\n\tpublic static void A(int a)\n\t{\n\t\tConsole.WriteLine(nameof(A) + \u0026quot; called\u0026quot;);\n\t\tConsole.WriteLine(nameof(a) + \u0026quot;: \u0026quot; + a);\n\t}\n}\n\n// output:\n// dotnet run A --a 7\n// A called\n// a: 7\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// Just put the [Command] attribute on any method you want to call\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// from the command line, and call the \"HandleArguments\" method.\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003eusing\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eusing\u003c/span\u003e \u003cspan class=\"pl-k\"\u003estatic\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eTowel\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eCommandLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003estatic\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eclass\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eProgram\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\t\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003estatic\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eMain\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003estring\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eargs\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\t\t\u003cspan class=\"pl-s1\"\u003eHandleArguments\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eargs\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\t\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eCommand\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\n\t\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003estatic\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eA\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\t\t\u003cspan class=\"pl-s1\"\u003eConsole\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eWriteLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003enameof\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eA\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\" called\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\t\t\u003cspan class=\"pl-s1\"\u003eConsole\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eWriteLine\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003enameof\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\": \"\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\t\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e// output:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// dotnet run A --a 7\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// A called\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e// a: 7\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003c/article\u003e","loaded":true,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":[{"level":1,"text":"\n\tTowel\n","anchor":"towel","htmlText":"\n\tTowel\n"},{"level":2,"text":"Getting Started","anchor":"getting-started","htmlText":"Getting Started"},{"level":2,"text":"Overview","anchor":"overview","htmlText":"Overview"}],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FZacharyPatten%2FTowel"}},{"displayName":"License.md","repoName":"Towel","refName":"main","path":"License.md","preferredFileType":"license","tabName":"MIT","richText":null,"loaded":false,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":null,"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FZacharyPatten%2FTowel"}}],"overviewFilesProcessingTime":0}},"appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-7d7eb7c71814.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-96e76d5fdb2c.js","githubDevUrl":null,"enabled_features":{"copilot_workspace":null,"code_nav_ui_events":false,"overview_shared_code_dropdown_button":false,"react_blob_overlay":false,"accessible_code_button":true,"github_models_repo_integration":false}}}}</script> <div data-target="react-partial.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.iVEunk{margin-top:16px;margin-bottom:16px;}/*!sc*/ .jzuOtQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .bGojzy{margin-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;row-gap:16px;}/*!sc*/ .iNSVHo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-bottom:16px;padding-top:8px;}/*!sc*/ .bVgnfw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:8px;}/*!sc*/ @media screen and (max-width:320px){.bVgnfw{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .CEgMp{position:relative;}/*!sc*/ @media screen and (max-width:380px){.CEgMp .ref-selector-button-text-container{max-width:80px;}}/*!sc*/ @media screen and (max-width:320px){.CEgMp{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.CEgMp .overview-ref-selector{width:100%;}.CEgMp .overview-ref-selector > span{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;}.CEgMp .overview-ref-selector > span > span[data-component="text"]{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .gMOVLe[data-size="medium"]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;}/*!sc*/ .gMOVLe[data-size="medium"] svg{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gMOVLe[data-size="medium"] > span{width:inherit;}/*!sc*/ .gUkoLg{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .bZBlpz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;}/*!sc*/ .lhTYNA{margin-right:4px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ffLUq{font-size:14px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}/*!sc*/ .bmcJak{min-width:0;}/*!sc*/ .fLXEGX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1079px){.fLXEGX{display:none;}}/*!sc*/ .lmSMZJ[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));padding-left:4px;padding-right:4px;}/*!sc*/ .lmSMZJ[data-size="medium"] span[data-component="leadingVisual"]{margin-right:4px !important;}/*!sc*/ .dqfxud{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1080px){.dqfxud{display:none;}}/*!sc*/ @media screen and (max-width:543px){.dqfxud{display:none;}}/*!sc*/ .fGwBZA[data-size="medium"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .jxTzTd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:8px;gap:8px;}/*!sc*/ .gqqBXN{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:8px;}/*!sc*/ @media screen and (max-width:543px){.gqqBXN{display:none;}}/*!sc*/ .dzXgxt{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1011px){.dzXgxt{display:none;}}/*!sc*/ .iWFGlI{margin-left:8px;margin-right:8px;margin:0;}/*!sc*/ .vcvyP{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .YUPas{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1012px){.YUPas{display:none;}}/*!sc*/ .izFOf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:544px){.izFOf{display:none;}}/*!sc*/ .vIPPs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:16px;}/*!sc*/ .fdROMU{width:100%;border-collapse:separate;border-spacing:0;border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;table-layout:fixed;overflow:unset;}/*!sc*/ .jGKpsv{height:0px;line-height:0px;}/*!sc*/ .jGKpsv tr{height:0px;font-size:0px;}/*!sc*/ .jdgHnn{padding:16px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;text-align:left;height:40px;}/*!sc*/ .jdgHnn th{padding-left:16px;background-color:var(--bgColor-muted,var(--color-canvas-subtle,#f6f8fa));}/*!sc*/ .bQivRW{width:100%;border-top-left-radius:6px;}/*!sc*/ @media screen and (min-width:544px){.bQivRW{display:none;}}/*!sc*/ .ldkMIO{width:40%;border-top-left-radius:6px;}/*!sc*/ @media screen and (max-width:543px){.ldkMIO{display:none;}}/*!sc*/ .jMbWeI{text-align:right;padding-right:16px;width:136px;border-top-right-radius:6px;}/*!sc*/ .gpqjiB{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;height:40px;}/*!sc*/ .dzCJzi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;min-width:273px;padding:8px;}/*!sc*/ @media screen and (min-width:544px){.dzCJzi{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}/*!sc*/ .eNCcrz{text-align:center;vertical-align:center;height:40px;border-top:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));}/*!sc*/ .bHTcCe{border-top:1px solid var(--borderColor-default,var(--color-border-default));cursor:pointer;}/*!sc*/ .csrIcr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;gap:16px;}/*!sc*/ .bUQNHB{border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/ @media screen and (max-width:543px){.bUQNHB{margin-left:-16px;margin-right:-16px;max-width:calc(100% + 32px);}}/*!sc*/ @media screen and (min-width:544px){.bUQNHB{max-width:100%;}}/*!sc*/ .jPdcfu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-bottom:1px solid;border-bottom-color:var(--borderColor-default,var(--color-border-default,#d0d7de));-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:8px;position:-webkit-sticky;position:sticky;top:0;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));z-index:1;border-top-left-radius:6px;border-top-right-radius:6px;}/*!sc*/ .iphEWz{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;border-bottom:none;max-width:100%;padding-left:8px;padding-right:8px;}/*!sc*/ .hUCRAk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .cwoBXV[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-subtle,#6e7781));padding-left:8px;padding-right:8px;}/*!sc*/ .QkQOb{padding:32px;overflow:auto;}/*!sc*/ data-styled.g1[id="Box-sc-g0xbh4-0"]{content:"iVEunk,jzuOtQ,bGojzy,iNSVHo,bVgnfw,CEgMp,gMOVLe,gUkoLg,bZBlpz,lhTYNA,ffLUq,bmcJak,fLXEGX,lmSMZJ,dqfxud,fGwBZA,jxTzTd,gqqBXN,dzXgxt,iWFGlI,vcvyP,YUPas,izFOf,vIPPs,fdROMU,jGKpsv,jdgHnn,bQivRW,ldkMIO,jMbWeI,gpqjiB,dzCJzi,eNCcrz,bHTcCe,csrIcr,bUQNHB,jPdcfu,iphEWz,hUCRAk,cwoBXV,QkQOb,"}/*!sc*/ .brGdpi{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;-webkit-clip:rect(0,0,0,0);clip:rect(0,0,0,0);white-space:nowrap;border-width:0;}/*!sc*/ data-styled.g6[id="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0"]{content:"brGdpi,"}/*!sc*/ .hWlpPn{position:relative;display:inline-block;}/*!sc*/ .hWlpPn::after{position:absolute;z-index:1000000;display:none;padding:0.5em 0.75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-font-smoothing:subpixel-antialiased;color:var(--tooltip-fgColor,var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff)));text-align:center;-webkit-text-decoration:none;text-decoration:none;text-shadow:none;text-transform:none;-webkit-letter-spacing:normal;-moz-letter-spacing:normal;-ms-letter-spacing:normal;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:var(--tooltip-bgColor,var(--bgColor-emphasis,var(--color-neutral-emphasis-plus,#24292f)));border-radius:6px;opacity:0;}/*!sc*/ @-webkit-keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ @keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ .hWlpPn:hover::after,.hWlpPn:active::after,.hWlpPn:focus::after,.hWlpPn:focus-within::after{display:inline-block;-webkit-text-decoration:none;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-no-delay:hover::after,.hWlpPn.tooltipped-no-delay:active::after,.hWlpPn.tooltipped-no-delay:focus::after,.hWlpPn.tooltipped-no-delay:focus-within::after{-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-multiline:hover::after,.hWlpPn.tooltipped-multiline:active::after,.hWlpPn.tooltipped-multiline:focus::after,.hWlpPn.tooltipped-multiline:focus-within::after{display:table-cell;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-se::after,.hWlpPn.tooltipped-sw::after{top:100%;right:50%;margin-top:6px;}/*!sc*/ .hWlpPn.tooltipped-se::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-sw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-n::after,.hWlpPn.tooltipped-ne::after,.hWlpPn.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px;}/*!sc*/ .hWlpPn.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-nw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-n::after{-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);}/*!sc*/ .hWlpPn.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate;}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-s::after,.hWlpPn.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-w::after,.hWlpPn.tooltipped-multiline.tooltipped-e::after{right:100%;}/*!sc*/ .hWlpPn.tooltipped-align-right-2::after{right:0;margin-right:0;}/*!sc*/ .hWlpPn.tooltipped-align-left-2::after{left:0;margin-left:0;}/*!sc*/ data-styled.g17[id="Tooltip__TooltipBase-sc-17tf59c-0"]{content:"hWlpPn,"}/*!sc*/ .liVpTx{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;max-width:125px;}/*!sc*/ data-styled.g19[id="Truncate__StyledTruncate-sc-23o1d2-0"]{content:"liVpTx,"}/*!sc*/ </style> <!-- --> <!-- --> <div class="Box-sc-g0xbh4-0 iVEunk"><div class="Box-sc-g0xbh4-0 jzuOtQ"><div class="Box-sc-g0xbh4-0 bGojzy"></div></div><div class="Box-sc-g0xbh4-0 iNSVHo"><div class="Box-sc-g0xbh4-0 bVgnfw"><div class="Box-sc-g0xbh4-0 CEgMp"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="main branch" data-testid="anchor-button" class="Box-sc-g0xbh4-0 gMOVLe prc-Button-ButtonBase-c50BI overview-ref-selector width-full" data-loading="false" data-size="medium" data-variant="default" aria-describedby="branch-picker-repos-header-ref-selector-loading-announcement" id="branch-picker-repos-header-ref-selector"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x"><div class="Box-sc-g0xbh4-0 bZBlpz"><div class="Box-sc-g0xbh4-0 lhTYNA"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"><span class="Box-sc-g0xbh4-0 bmcJak prc-Text-Text-0ima0"> <!-- -->main</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="Box-sc-g0xbh4-0 fLXEGX"><a style="--button-color:fg.muted" type="button" href="/ZacharyPatten/Towel/branches" class="Box-sc-g0xbh4-0 lmSMZJ prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rclab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Branches</span></span></a><a style="--button-color:fg.muted" type="button" href="/ZacharyPatten/Towel/tags" class="Box-sc-g0xbh4-0 lmSMZJ prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rklab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Tags</span></span></a></div><div class="Box-sc-g0xbh4-0 dqfxud"><a style="--button-color:fg.muted" type="button" aria-label="Go to Branches page" href="/ZacharyPatten/Towel/branches" class="Box-sc-g0xbh4-0 fGwBZA prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":Relab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></a><a style="--button-color:fg.muted" type="button" aria-label="Go to Tags page" href="/ZacharyPatten/Towel/tags" class="Box-sc-g0xbh4-0 fGwBZA prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":Rmlab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></a></div></div><div class="Box-sc-g0xbh4-0 jxTzTd"><div class="Box-sc-g0xbh4-0 gqqBXN"><div class="Box-sc-g0xbh4-0 dzXgxt"><!--$--><div class="Box-sc-g0xbh4-0 iWFGlI"><span class="Box-sc-g0xbh4-0 vcvyP TextInput-wrapper prc-components-TextInputWrapper-i1ofR prc-components-TextInputBaseWrapper-ueK9q" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id=":R2j5ab:" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellcheck="false" placeholder="Go to file" aria-describedby=":R2j5ab: :R2j5abH1:" data-component="input" class="prc-components-Input-Ic-y8" value=""/><span class="TextInput-icon" id=":R2j5abH1:" aria-hidden="true"></span></span></div><!--/$--></div><div class="Box-sc-g0xbh4-0 YUPas"><button type="button" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-describedby=":Rr5ab:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x">Go to file</span></span></button></div><div class="react-directory-add-file-icon"></div><div class="react-directory-remove-file-icon"></div></div><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="primary" aria-describedby=":R55ab:-loading-announcement" id=":R55ab:"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-code hide-sm" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Code</span><span data-component="trailingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="Box-sc-g0xbh4-0 izFOf"><button data-component="IconButton" type="button" aria-label="Open more actions menu" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-c50BI prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-describedby=":R75ab:-loading-announcement" id=":R75ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button></div></div></div><div class="Box-sc-g0xbh4-0 vIPPs"><div data-hpc="true"><button hidden="" data-testid="focus-next-element-button" data-hotkey="j"></button><button hidden="" data-testid="focus-previous-element-button" data-hotkey="k"></button><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading" id="folders-and-files">Folders and files</h2><table aria-labelledby="folders-and-files" class="Box-sc-g0xbh4-0 fdROMU"><thead class="Box-sc-g0xbh4-0 jGKpsv"><tr class="Box-sc-g0xbh4-0 jdgHnn"><th colSpan="2" class="Box-sc-g0xbh4-0 bQivRW"><span class="text-bold">Name</span></th><th colSpan="1" class="Box-sc-g0xbh4-0 ldkMIO"><span class="text-bold">Name</span></th><th class="hide-sm"><div title="Last commit message" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit message</span></div></th><th colSpan="1" class="Box-sc-g0xbh4-0 jMbWeI"><div title="Last commit date" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit date</span></div></th></tr></thead><tbody><tr class="Box-sc-g0xbh4-0 gpqjiB"><td colSpan="3" class="bgColor-muted p-1 rounded-top-2"><div class="Box-sc-g0xbh4-0 dzCJzi"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">History</h2><a href="/ZacharyPatten/Towel/commits/main/" class="prc-Button-ButtonBase-c50BI d-none d-lg-flex LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby=":Raqj8pab:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x"><span class="fgColor-default">1,285 Commits</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><span role="tooltip" aria-label="1,285 Commits" id="history-icon-button-tooltip" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-n"><a href="/ZacharyPatten/Towel/commits/main/" class="prc-Button-ButtonBase-c50BI LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby=":R1iqj8pab:-loading-announcement history-icon-button-tooltip"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a></span></div></div></div></div></td></tr><tr class="react-directory-row undefined" id="folder-row-0"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".github" aria-label=".github, (Directory)" class="Link--primary" href="/ZacharyPatten/Towel/tree/main/.github">.github</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".github" aria-label=".github, (Directory)" class="Link--primary" href="/ZacharyPatten/Towel/tree/main/.github">.github</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-1"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".vscode" aria-label=".vscode, (Directory)" class="Link--primary" href="/ZacharyPatten/Towel/tree/main/.vscode">.vscode</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".vscode" aria-label=".vscode, (Directory)" class="Link--primary" href="/ZacharyPatten/Towel/tree/main/.vscode">.vscode</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-2"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Examples" aria-label="Examples, (Directory)" class="Link--primary" href="/ZacharyPatten/Towel/tree/main/Examples">Examples</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Examples" aria-label="Examples, (Directory)" class="Link--primary" href="/ZacharyPatten/Towel/tree/main/Examples">Examples</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-3"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="Sources/Towel, (Directory)" class="Link--primary" href="/ZacharyPatten/Towel/tree/main/Sources/Towel"><span class="react-directory-default-color" data-testid="path-name-segment">Sources/</span><span class="" data-testid="path-name-segment">Towel</span></a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="Sources/Towel, (Directory)" class="Link--primary" href="/ZacharyPatten/Towel/tree/main/Sources/Towel"><span class="react-directory-default-color" data-testid="path-name-segment">Sources/</span><span class="" data-testid="path-name-segment">Towel</span></a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-4"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Tools" aria-label="Tools, (Directory)" class="Link--primary" href="/ZacharyPatten/Towel/tree/main/Tools">Tools</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Tools" aria-label="Tools, (Directory)" class="Link--primary" href="/ZacharyPatten/Towel/tree/main/Tools">Tools</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-5"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".editorconfig" aria-label=".editorconfig, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/.editorconfig">.editorconfig</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".editorconfig" aria-label=".editorconfig, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/.editorconfig">.editorconfig</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-6"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitattributes" aria-label=".gitattributes, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/.gitattributes">.gitattributes</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitattributes" aria-label=".gitattributes, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/.gitattributes">.gitattributes</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-7"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-8"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Directory.Build.props" aria-label="Directory.Build.props, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/Directory.Build.props">Directory.Build.props</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Directory.Build.props" aria-label="Directory.Build.props, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/Directory.Build.props">Directory.Build.props</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-9"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="License.md" aria-label="License.md, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/License.md">License.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="License.md" aria-label="License.md, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/License.md">License.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-10"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-11"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Towel.sln" aria-label="Towel.sln, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/Towel.sln">Towel.sln</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Towel.sln" aria-label="Towel.sln, (File)" class="Link--primary" href="/ZacharyPatten/Towel/blob/main/Towel.sln">Towel.sln</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="Box-sc-g0xbh4-0 eNCcrz show-for-mobile" data-testid="view-all-files-row"><td colSpan="3" class="Box-sc-g0xbh4-0 bHTcCe"><div><button class="prc-Link-Link-85e08">View all files</button></div></td></tr></tbody></table></div><div class="Box-sc-g0xbh4-0 csrIcr"><div class="Box-sc-g0xbh4-0 bUQNHB"><div itemscope="" itemType="https://schema.org/abstract" class="Box-sc-g0xbh4-0 jPdcfu"><h2 class="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0 brGdpi">Repository files navigation</h2><nav class="Box-sc-g0xbh4-0 iphEWz prc-components-UnderlineWrapper-oOh5J" aria-label="Repository files"><ul class="prc-components-UnderlineItemList-b23Hf" role="list"><li class="Box-sc-g0xbh4-0 hUCRAk"><a class="prc-components-UnderlineItem-lJsg-" href="#" aria-current="page"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-book" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path></svg></span><span data-component="text" data-content="README">README</span></a></li><li class="Box-sc-g0xbh4-0 hUCRAk"><a class="prc-components-UnderlineItem-lJsg-" href="#"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-law" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path></svg></span><span data-component="text" data-content="MIT license">MIT license</span></a></li></ul></nav><button style="--button-color:fg.subtle" type="button" aria-label="Outline" aria-haspopup="true" aria-expanded="false" tabindex="0" class="Box-sc-g0xbh4-0 cwoBXV prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rr9ab:-loading-announcement" id=":Rr9ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button></div><div class="Box-sc-g0xbh4-0 QkQOb js-snippet-clipboard-copy-unpositioned undefined" data-hpc="true"><article class="markdown-body entry-content container-lg" itemprop="text"><p align="center" dir="auto"> <a href="#"><img src="https://github.com/ZacharyPatten/Towel/raw/main/.github/Resources/Logo.svg?raw=true" height="150" style="max-width: 100%;"></a> </p> <div class="markdown-heading" dir="auto"><h1 align="center" tabindex="-1" class="heading-element" dir="auto"> Towel </h1><a id="user-content-towel" class="anchor" aria-label="Permalink: Towel " href="#towel"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p align="center" dir="auto"> A .NET library intended to make coding a bit more towelerable: data structures, algorithms, mathematics, metadata, extensions, console, and more. :) </p> <blockquote> <p dir="auto">"It's a tough galaxy. If you want to survive, you've gotta know... where your towel is." - Ford Prefect</p> </blockquote> <p align="center" dir="auto"> <a href="https://github.com/ZacharyPatten/Towel"><img src="https://camo.githubusercontent.com/eb5561bf62798dad49a5882b81f47d8653fd93d0922b5b3208d166c083ff9c99/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6769746875622d7265706f2d2532333234323932653f6c6f676f3d676974687562" title="Go To Github Repo" data-canonical-src="https://img.shields.io/badge/github-repo-%2324292e?logo=github" style="max-width: 100%;"></a> <a href="https://docs.microsoft.com/en-us/dotnet/csharp/" rel="nofollow"><img src="https://camo.githubusercontent.com/a8e40fa9b9c6a79952399160c119bb9793e1520c1e70e3593661d52fa3f3926d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c616e67756167652d432532332d253233313738363030" title="Go To C# Documentation" data-canonical-src="https://img.shields.io/badge/language-C%23-%23178600" style="max-width: 100%;"></a> <a href="https://dotnet.microsoft.com/download" rel="nofollow"><img src="https://camo.githubusercontent.com/2466bbd8ad4be1f3078f7454a4afc76da12e09b4e740a0e761e72149d8cdaadc/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f786d6c3f636f6c6f723d253233353132626434266c6162656c3d7461726765742671756572793d2532462532465461726765744672616d65776f726b253542312535442675726c3d68747470732533412532462532467261772e67697468756275736572636f6e74656e742e636f6d2532465a61636861727950617474656e253246546f77656c2532466d61696e253246536f7572636573253246546f77656c253246546f77656c2e637370726f6a266c6f676f3d2e6e6574" title="Go To .NET Download" data-canonical-src="https://img.shields.io/badge/dynamic/xml?color=%23512bd4&amp;label=target&amp;query=%2F%2FTargetFramework%5B1%5D&amp;url=https%3A%2F%2Fraw.githubusercontent.com%2FZacharyPatten%2FTowel%2Fmain%2FSources%2FTowel%2FTowel.csproj&amp;logo=.net" style="max-width: 100%;"></a> <a href="https://www.nuget.org/packages/Towel" rel="nofollow"><img src="https://camo.githubusercontent.com/bf1e657a5473e0a15faba1db813d3c67f4e866a3c91625dd92b6d9a42ddb0b6b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f546f77656c2e7376673f6c6f676f3d6e75676574" title="Go To Nuget Package" data-canonical-src="https://img.shields.io/nuget/v/Towel.svg?logo=nuget" style="max-width: 100%;"></a> <a href="https://zacharypatten.github.io/Towel/index.html" rel="nofollow"><img src="https://github.com/ZacharyPatten/Towel/raw/main/.github/Resources/docfx-badge.svg?raw=true" title="Go To Docfx Documentation" style="max-width: 100%;"></a> <a href="https://github.com/ZacharyPatten/Towel/actions/workflows/Continuous%20Integration.yml"><img src="https://github.com/ZacharyPatten/Towel/actions/workflows/Continuous%20Integration.yml/badge.svg" title="Go To Action" style="max-width: 100%;"></a> <a href="https://zacharypatten.github.io/Towel/coveragereport/index.html" rel="nofollow"><img src="https://camo.githubusercontent.com/08ffcb6ef9d89240e1059ad24b47026a30fc4b19b07191cf5f7f6d9f83e36eaa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f786d6c3f636f6c6f723d79656c6c6f77266c6162656c3d636f7665726167652671756572793d253246253246636f766572616765253542312535442532462534306c696e652d726174652d70657263656e746167652675726c3d68747470732533412532462532467261772e67697468756275736572636f6e74656e742e636f6d2532465a61636861727950617474656e253246546f77656c25324667682d7061676573253246636f7665726167657265706f7274253246636f7665726167652e786d6c" title="Go Test Coverage Report" data-canonical-src="https://img.shields.io/badge/dynamic/xml?color=yellow&amp;label=coverage&amp;query=%2F%2Fcoverage%5B1%5D%2F%40line-rate-percentage&amp;url=https%3A%2F%2Fraw.githubusercontent.com%2FZacharyPatten%2FTowel%2Fgh-pages%2Fcoveragereport%2Fcoverage.xml" style="max-width: 100%;"></a> <a href="https://discord.gg/4XbQbwF" rel="nofollow"><img src="https://camo.githubusercontent.com/9d23be90781e43160ac5e1e5ae6e03f0fcc2d60d94e1f8ac41fa2a97ff1907a6/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3535373234343932353731323932343638343f6c6f676f3d646973636f7264266c6f676f436f6c6f723d66666666666626636f6c6f723d373338394438" title="Go To Discord Server" data-canonical-src="https://img.shields.io/discord/557244925712924684?logo=discord&amp;logoColor=ffffff&amp;color=7389D8" style="max-width: 100%;"></a> <a href="https://github.com/ZacharyPatten/Towel/blob/main/License.md"><img src="https://camo.githubusercontent.com/44e7845c81a431dc740c9a7f76d0ea33e030e05d7a41d6164167ee435b17168f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e2e737667" title="Go To License" data-canonical-src="https://img.shields.io/badge/license-MIT-green.svg" style="max-width: 100%;"></a> </p> <blockquote> <p dir="auto"><em><strong>Note</strong> This project has a goal of keeping up-to-date on modern coding practices rather than maintaining backwards compatibility such as targetting the latest non-preview version of .NET and embracing favorable breaking changes ("Semantic Versioning" is not being respected at this time).</em></p> </blockquote> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Getting Started</h2><a id="user-content-getting-started" class="anchor" aria-label="Permalink: Getting Started" href="#getting-started"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <details> <summary> Run The Included Examples <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <p dir="auto">Towel has <a href="https://github.com/ZacharyPatten/Towel/tree/main/Examples">Examples</a> included in this repository.</p> <p dir="auto"><a href="https://github.com/ZacharyPatten/Towel/archive/main.zip">Download</a> this repository and unzip the contents.</p> <p dir="auto">There are no custom build processes. Towel should build with any standard .NET build process, but one of the following is recommended:</p> <details> <summary> Visual Studio <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <ol dir="auto"> <li> <p dir="auto">Install <a href="https://visualstudio.microsoft.com/" rel="nofollow">Visual Studio</a> if not already installed.</p> </li> <li> <p dir="auto">Open the <sub><a href="/ZacharyPatten/Towel/blob/main/Towel.sln"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-16.svg" title="File" style="max-width: 100%;"></a></sub> <strong><code>Towel.sln</code></strong> file in Visual Studio.</p> </li> </ol> <ul dir="auto"> <li><em>(optional) <a href="https://gist.github.com/ZacharyPatten/693f35653f6c21fbe6c85444792e524b">Here are some settings you change in Visual Studio</a>.</em></li> </ul> </blockquote> <p dir="auto"></p> </details> <details> <summary> Visual Studio Code <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <ol dir="auto"> <li> <p dir="auto">Install the <a href="https://dotnet.microsoft.com/download" rel="nofollow">.NET SDK</a> if not already installed.</p> </li> <li> <p dir="auto">Install <a href="https://visualstudio.microsoft.com/" rel="nofollow">Visual Studio Code</a> if not already installed.</p> </li> <li> <p dir="auto">Open the <sub><a href="#"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <strong><code>root folder</code></strong> of the repository in Visual Studio Code.</p> </li> </ol> <p dir="auto"><em>The following files are included in the repository:</em></p> <ul dir="auto"> <li><code>.vscode/extensions.json</code> <sub>recommends Vistual Studio Code extension dependencies</sub></li> <li><code>.vscode/launch.json</code> <sub>includes the configurations for debugging the examples</sub></li> <li><code>.vscode/settings.json</code> <sub>automatically applies settings to the workspace</sub></li> <li><code>.vscode/tasks.json</code> <sub>includes the commands to build the projects</sub></li> </ul> <p dir="auto"><em>Visual Studio Code Extensions (will be prompted to install these when you open the folder):</em></p> <ul dir="auto"> <li><code>ms-vscode.csharp</code> <sub>C# support</sub></li> <li><code>formulahendry.dotnet-test-explorer</code> <em>(optional)</em> <sub>MSTest unit testing support</sub></li> <li><code>aisoftware.tt-processor</code> <em>(optional)</em> <sub>T4 Template support</sub></li> <li><code>zbecknell.t4-support</code> <em>(optional)</em> <sub>T4 Template syntax highlighting</sub></li> </ul> </blockquote> <p dir="auto"></p> </details> </blockquote> <p dir="auto"></p> </details> <details> <summary> Use Towel In Your .NET Projects <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <ul dir="auto"> <li> <p dir="auto">Your project must target the same or newer version of .NET as Towel. <a href="https://docs.microsoft.com/en-us/dotnet/standard/frameworks" rel="nofollow">See this documentation on how to check the current target of your project</a>. Towel targets the following version of .NET: <sub><sub><a href="https://dotnet.microsoft.com/download" rel="nofollow"><img src="https://camo.githubusercontent.com/2466bbd8ad4be1f3078f7454a4afc76da12e09b4e740a0e761e72149d8cdaadc/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f786d6c3f636f6c6f723d253233353132626434266c6162656c3d7461726765742671756572793d2532462532465461726765744672616d65776f726b253542312535442675726c3d68747470732533412532462532467261772e67697468756275736572636f6e74656e742e636f6d2532465a61636861727950617474656e253246546f77656c2532466d61696e253246536f7572636573253246546f77656c253246546f77656c2e637370726f6a266c6f676f3d2e6e6574" title="Go To .NET Download" data-canonical-src="https://img.shields.io/badge/dynamic/xml?color=%23512bd4&amp;label=target&amp;query=%2F%2FTargetFramework%5B1%5D&amp;url=https%3A%2F%2Fraw.githubusercontent.com%2FZacharyPatten%2FTowel%2Fmain%2FSources%2FTowel%2FTowel.csproj&amp;logo=.net" style="max-width: 100%;"></a></sub></sub></p> </li> <li> <p dir="auto">Towel has a nuget package: <sub><sub><a href="https://www.nuget.org/packages/Towel" rel="nofollow"><img src="https://camo.githubusercontent.com/bf1e657a5473e0a15faba1db813d3c67f4e866a3c91625dd92b6d9a42ddb0b6b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f546f77656c2e7376673f6c6f676f3d6e75676574" title="Go To Nuget Package" data-canonical-src="https://img.shields.io/nuget/v/Towel.svg?logo=nuget" style="max-width: 100%;"></a></sub></sub><br>Instructions on how to reference the package are included on nuget.org <em>(click the badge)</em>.</p> </li> <li> <p dir="auto">If you use Towel and would be willing to show it, here is a badge you can copy-paste into your readme: <sub><sub><a href="#"><img src="https://github.com/ZacharyPatten/Towel/raw/main/.github/Resources/UsingTowel.svg?raw=true" title="Go To Towel" style="max-width: 100%;"></a></sub></sub></p> <div class="highlight highlight-text-html-basic notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="&lt;a href=&quot;https://github.com/ZacharyPatten/Towel&quot;&gt;&lt;img src=&quot;https://github.com/ZacharyPatten/Towel/blob/main/.github/Resources/UsingTowel.svg?raw=true&quot; title=&quot;Go To Towel&quot;&gt;&lt;/a&gt;"><pre><span class="pl-kos">&lt;</span><span class="pl-ent">a</span> <span class="pl-c1">href</span>="<span class="pl-s">https://github.com/ZacharyPatten/Towel</span>"<span class="pl-kos">&gt;</span><span class="pl-kos">&lt;</span><span class="pl-ent">img</span> <span class="pl-c1">src</span>="<span class="pl-s">https://github.com/ZacharyPatten/Towel/blob/main/.github/Resources/UsingTowel.svg?raw=true</span>" <span class="pl-c1">title</span>="<span class="pl-s">Go To Towel</span>"<span class="pl-kos">&gt;</span><span class="pl-kos">&lt;/</span><span class="pl-ent">a</span><span class="pl-kos">&gt;</span></pre></div> </li> <li> <p dir="auto">Share your work. If you use Towel in one of your projects we want to hear about it. :)</p> </li> </ul> </blockquote> <p dir="auto"></p> </details> <details> <summary> View Documentation <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <ul dir="auto"> <li>Change Log: <a href="https://github.com/ZacharyPatten/Towel/releases">https://github.com/ZacharyPatten/Towel/releases</a></li> <li><a href="https://github.com/dotnet/docfx">docfx</a> generated API documentation reference: <sub><sub><a href="https://zacharypatten.github.io/Towel/index.html" rel="nofollow"><img src="https://github.com/ZacharyPatten/Towel/raw/main/.github/Resources/docfx-badge.svg?raw=true" title="Go To Docfx Documentation" style="max-width: 100%;"></a></sub></sub></li> <li><a href="https://github.com/coverlet-coverage/coverlet">Coverlet</a> + <a href="https://github.com/danielpalme/ReportGenerator">ReportGenerator</a> generated test coverage report: <sub><sub><a href="https://zacharypatten.github.io/Towel/coveragereport/index.html" rel="nofollow"><img src="https://camo.githubusercontent.com/08ffcb6ef9d89240e1059ad24b47026a30fc4b19b07191cf5f7f6d9f83e36eaa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f786d6c3f636f6c6f723d79656c6c6f77266c6162656c3d636f7665726167652671756572793d253246253246636f766572616765253542312535442532462534306c696e652d726174652d70657263656e746167652675726c3d68747470732533412532462532467261772e67697468756275736572636f6e74656e742e636f6d2532465a61636861727950617474656e253246546f77656c25324667682d7061676573253246636f7665726167657265706f7274253246636f7665726167652e786d6c" title="Go Test Coverage Report" data-canonical-src="https://img.shields.io/badge/dynamic/xml?color=yellow&amp;label=coverage&amp;query=%2F%2Fcoverage%5B1%5D%2F%40line-rate-percentage&amp;url=https%3A%2F%2Fraw.githubusercontent.com%2FZacharyPatten%2FTowel%2Fgh-pages%2Fcoveragereport%2Fcoverage.xml" style="max-width: 100%;"></a></sub></sub></li> <li><a href="https://github.com/dotnet/BenchmarkDotNet">BenchmarkDotNet</a> generated benchmarking: <a href="https://zacharypatten.github.io/Towel/articles/benchmarks.html" rel="nofollow">https://zacharypatten.github.io/Towel/articles/benchmarks.html</a></li> </ul> <p dir="auto">Relevant Articles:</p> <ul dir="auto"> <li><a href="https://docs.microsoft.com/en-us/archive/msdn-magazine/2019/october/csharp-accessing-xml-documentation-via-reflection" rel="nofollow">MSDN Accessing XML Documentation Via Reflection</a><br></li> <li><a href="https://gist.github.com/ZacharyPatten/798ed612d692a560bdd529367b6a7dbd">Beginner's Guide To Console Input In C#</a><br></li> <li><a href="https://gist.github.com/ZacharyPatten/c9b43a2c9e8a5a5523883e77410f742d">Generating Unique Random Data</a><br></li> <li><a href="https://gist.github.com/ZacharyPatten/8de188b2bd358ab5c3517cbb55e83632">Random Generation (with efficient exclusions)</a><br></li> <li><a href="https://gist.github.com/ZacharyPatten/f21fc5c6835faea9be8ae4baab4e294e">Omnitree</a><br></li> <li><a href="https://gist.github.com/ZacharyPatten/8e1395a94928f2c7715cf939b0d0389c">C# Generic Math</a><br></li> </ul> <p dir="auto">File Structure Overview <em>(except for <sub><a href="https://github.com/ZacharyPatten/Towel/tree/gh-pages"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/git-branch-16.svg" title="Branch" style="max-width: 100%;"></a></sub> <code>gh-pages</code>)</em>:</p> <ul dir="auto"> <li><sub><a href="/ZacharyPatten/Towel/blob/main/.github"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>.github</code> <sub>content regarding the GitHub repoistory.</sub> <ul dir="auto"> <li><sub><a href="/ZacharyPatten/Towel/blob/main/.github/ISSUE_TEMPLATE"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>ISSUE_TEMPLATE</code> <sub>templates for issue submissions to the GitHub repository</sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/.github/Resources"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>Resources</code> <sub>resources such as image files</sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/.github/workflows"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>workflows</code> <sub><a href="https://github.com/ZacharyPatten/Towel/actions">GitHub Actions</a> workflows</sub> <ul dir="auto"> <li><sub><a href="/ZacharyPatten/Towel/blob/main/.github/workflows/Continuous Integration.yml"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg" title="Action" style="max-width: 100%;"></a></sub> <code>Continuous Integration.yml</code> <sub>workflow for checking that code compiles and unit tests pass</sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/.github/workflows/Towel Deployment.yml"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg" title="Action" style="max-width: 100%;"></a></sub> <code>Towel Deployment.yml</code> <sub>workflow to manage <a href="https://github.com/ZacharyPatten/Towel/releases">releases</a> and deploy <a href="https://www.nuget.org/packages/Towel" rel="nofollow">nuget packages</a></sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/.github/workflows/Documentation.yml"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg" title="Action" style="max-width: 100%;"></a></sub> <code>Documentation.yml</code> <sub>workflow that runs <a href="https://github.com/dotnet/docfx">docfx</a> + <a href="https://github.com/coverlet-coverage/coverlet">Coverlet</a> + <a href="https://github.com/danielpalme/ReportGenerator">ReportGenerator</a> to output <a href="https://pages.github.com/">GitHub Pages</a> to <sub><a href="https://github.com/ZacharyPatten/Towel/tree/gh-pages"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/git-branch-16.svg" title="Branch" style="max-width: 100%;"></a></sub> <code>gh-pages</code></sub></li> </ul> </li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/.github/pull_request_template.md"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-16.svg" title="File" style="max-width: 100%;"></a></sub> <code>pull_request_template.md</code> <sub>template for when pull requests are created</sub></li> </ul> </li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/.vscode"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>.vscode</code> <sub>confirguration files for if the code is opened in <a href="https://visualstudio.microsoft.com/" rel="nofollow">Visual Studio Code</a></sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Examples"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>Examples</code> <sub>root folder for all the example projects</sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Sources"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>Sources</code> <sub>root folder for the source code of released nuget packages</sub> <ul dir="auto"> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Sources/Towel"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <strong><code>Towel</code> <sub>the root folder for all source code in the Towel nuget package</sub></strong></li> </ul> </li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Tools"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>Tools</code> <sub>root folder for all support projects (not included in nuget packages)</sub> <ul dir="auto"> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Tools/docfx_project"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>docfx_project</code> <sub>root folder for <a href="https://github.com/dotnet/docfx">docfx</a> project (used in <sub><a href="/ZacharyPatten/Towel/blob/main/.github/workflows/Documentation.yml"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg" title="Action" style="max-width: 100%;"></a></sub> <code>Documentation.yml</code>)</sub> <ul dir="auto"> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Tools/docfx_project/articles"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>articles</code> <sub>root folder for all articless of the <a href="https://github.com/dotnet/docfx">docfx</a> generated <a href="https://pages.github.com/">GitHub Pages</a> website</sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Tools/docfx_project/apidoc"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>apidoc</code> <sub>root folder for all api overrides of the <a href="https://github.com/dotnet/docfx">docfx</a> generated <a href="https://pages.github.com/">GitHub Pages</a> website</sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Tools/docfx_project/docfx.json"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-16.svg" title="File" style="max-width: 100%;"></a></sub> <code>docfx.json</code> <sub>configuration file that controls <a href="https://github.com/dotnet/docfx">docfx</a></sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Tools/docfx_project/index.md"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-16.svg" title="File" style="max-width: 100%;"></a></sub> <code>index.md</code> <sub>home page of the <a href="https://github.com/dotnet/docfx">docfx</a> generated <a href="https://pages.github.com/">GitHub Pages</a> website</sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Tools/docfx_project/toc.yml"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-16.svg" title="File" style="max-width: 100%;"></a></sub> <code>toc.yml</code> <sub>primary navigation for the <a href="https://github.com/dotnet/docfx">docfx</a> generated <a href="https://pages.github.com/">GitHub Pages</a> website</sub></li> </ul> </li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Tools/Towel_Benchmarking"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>Towel_Benchmarking</code> <sub>project with all the benchmarking for the Towel project</sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Tools/Towel_Generating"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>Towel_Generating</code> <sub>project with code generation for the Towel Project</sub></li> <li><sub><a href="/ZacharyPatten/Towel/blob/main/Tools/Towel_Testing"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/file-directory-16.svg" title="Directory" style="max-width: 100%;"></a></sub> <code>Towel_Testing</code> <sub>project with all unit tests for the Towel project (used in <sub><a href="/ZacharyPatten/Towel/blob/main/.github/workflows/Continuous Integration.yml"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg" title="Action" style="max-width: 100%;"></a></sub> <code>Continuous Integration.yml</code> and <sub><a href="/ZacharyPatten/Towel/blob/main/.github/workflows/Documentation.yml"><img src="https://raw.githubusercontent.com/ZacharyPatten/Towel/main/.github/Resources/play-16.svg" title="Action" style="max-width: 100%;"></a></sub> <code>Documentation.yml</code>)</sub></li> </ul> </li> </ul> </blockquote> <p dir="auto"></p> </details> <details> <summary> Get Involved <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <ul dir="auto"> <li> <p dir="auto">The easiest way to support Towel is to star the github repository.</p> </li> <li> <p dir="auto">If you have any questions, you can <a href="https://github.com/ZacharyPatten/Towel/discussions/new">start a new discussion</a>.</p> </li> <li> <p dir="auto">If you notice anything in Towel that may be improved, please <a href="https://github.com/ZacharyPatten/Towel/issues/new/choose">create a new issue</a>.<br> Feature requests are welcome.</p> </li> <li> <p dir="auto">You can chat with the developer(s) on discord: <sub><sub><a href="https://discord.gg/4XbQbwF" rel="nofollow"><img src="https://camo.githubusercontent.com/9d23be90781e43160ac5e1e5ae6e03f0fcc2d60d94e1f8ac41fa2a97ff1907a6/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3535373234343932353731323932343638343f6c6f676f3d646973636f7264266c6f676f436f6c6f723d66666666666626636f6c6f723d373338394438" title="Go To Discord Server" data-canonical-src="https://img.shields.io/discord/557244925712924684?logo=discord&amp;logoColor=ffffff&amp;color=7389D8" style="max-width: 100%;"></a></sub></sub></p> </li> <li> <p dir="auto">If you want to contribute to Towel:<br>  1. Fork this repository<br>  2. Make some changes<br>  3. Open a pull request</p> </li> </ul> </blockquote> <p dir="auto"></p> </details> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Overview</h2><a id="user-content-overview" class="anchor" aria-label="Permalink: Overview" href="#overview"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <details> <summary> Algorithms <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// supports System.Span&lt;T&gt; and any (non ref struct) int-indexed type IsPalindrome&lt;...&gt;(...); // supports System.ReadOnlySpan&lt;T&gt; IsInterleavedRecursive&lt;...&gt;(...); IsInterleavedIterative&lt;...&gt;(...); IsReorderOf&lt;...&gt;(...); // aka &quot;anagrams&quot; // supports System.Span&lt;T&gt; and any (non ref struct) int-indexed type SortShuffle&lt;T&gt;(...); SortBubble&lt;T&gt;(...); SortSelection&lt;T&gt;(...); SortInsertion&lt;T&gt;(...); SortQuick&lt;T&gt;(...); SortMerge&lt;T&gt;(...); SortHeap&lt;T&gt;(...); SortOddEven&lt;T&gt;(...); SortCocktail&lt;T&gt;(...); SortComb&lt;T&gt;(...); SortGnome&lt;T&gt;(...); SortShell&lt;T&gt;(...); SortBogo&lt;T&gt;(...); SortSlow&lt;T&gt;(...); SortCycle&lt;T&gt;(...); SortPancake&lt;T&gt;(...); SortStooge&lt;T&gt;(...); SortTim&lt;T&gt;(...); SortIntro&lt;T&gt;(...); SortCounting&lt;T&gt;(...); // uint-based (non-comparative sort) SortRadix&lt;T&gt;(...); // uint-based (non-comparative sort) SortPidgeonHole&lt;T&gt;(...); // int-based (non-comparative sort) // supports System.ReadOnlySpan&lt;T&gt; and any (non ref struct) int-indexed type SearchBinary&lt;T&gt;(...); // supports System.ReadOnlySpan&lt;T&gt; and any (non ref struct) int-indexed type int HammingDistanceIterative&lt;...&gt;(...); int LevenshteinDistanceRecursive&lt;...&gt;(...); int LevenshteinDistanceIterative&lt;...&gt;(...); // Permutations of sequences // supports System.Span&lt;T&gt; and any (non ref struct) int-indexed type void PermuteRecursive&lt;...&gt;(...); void PermuteIterative&lt;...&gt;(...); // Combinations of sequences void Combinations&lt;...&gt;(...); // Path Finding (Graph Search) // overloads for A*, Dijkstra, and Breadth-First-Search algorithms SearchGraph&lt;...&gt;(...); // Combines ranges without gaps between them IEnumerable&lt;(T A, T B)&gt; CombineRanges&lt;T&gt;(IEnumerable&lt;(T A, T B)&gt; ranges)"><pre><span class="pl-c">// supports System.Span&lt;T&gt; and any (non ref struct) int-indexed type</span> <span class="pl-s1">IsPalindrome</span><span class="pl-c1">&lt;</span>..<span class="pl-kos">.</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// supports System.ReadOnlySpan&lt;T&gt;</span> <span class="pl-s1">IsInterleavedRecursive</span><span class="pl-c1">&lt;</span>..<span class="pl-kos">.</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">IsInterleavedIterative</span><span class="pl-c1">&lt;</span>..<span class="pl-kos">.</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">IsReorderOf</span><span class="pl-c1">&lt;</span>..<span class="pl-kos">.</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// aka "anagrams"</span> <span class="pl-c">// supports System.Span&lt;T&gt; and any (non ref struct) int-indexed type</span> <span class="pl-smi">SortShuffle</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortBubble</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortSelection</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortInsertion</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortQuick</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortMerge</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortHeap</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortOddEven</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortCocktail</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortComb</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortGnome</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortShell</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortBogo</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortSlow</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortCycle</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortPancake</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortStooge</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortTim</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortIntro</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">SortCounting</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// uint-based (non-comparative sort)</span> <span class="pl-smi">SortRadix</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// uint-based (non-comparative sort)</span> <span class="pl-smi">SortPidgeonHole</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// int-based (non-comparative sort)</span> <span class="pl-c">// supports System.ReadOnlySpan&lt;T&gt; and any (non ref struct) int-indexed type</span> <span class="pl-smi">SearchBinary</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// supports System.ReadOnlySpan&lt;T&gt; and any (non ref struct) int-indexed type</span> <span class="pl-smi">int</span> <span class="pl-s1">HammingDistanceIterative</span><span class="pl-kos"></span><span class="pl-c1">&lt;</span>..<span class="pl-kos">.</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">int</span> <span class="pl-s1">LevenshteinDistanceRecursive</span><span class="pl-c1">&lt;</span>..<span class="pl-kos">.</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">int</span> <span class="pl-s1">LevenshteinDistanceIterative</span><span class="pl-c1">&lt;</span>..<span class="pl-kos">.</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Permutations of sequences</span> <span class="pl-c">// supports System.Span&lt;T&gt; and any (non ref struct) int-indexed type</span> <span class="pl-smi">void</span> <span class="pl-s1">PermuteRecursive</span><span class="pl-c1">&lt;</span>..<span class="pl-kos">.</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">void</span> <span class="pl-s1">PermuteIterative</span><span class="pl-c1">&lt;</span>..<span class="pl-kos">.</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Combinations of sequences</span> <span class="pl-smi">void</span> <span class="pl-s1">Combinations</span><span class="pl-c1">&lt;</span>..<span class="pl-kos">.</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Path Finding (Graph Search)</span> <span class="pl-c">// overloads for A*, Dijkstra, and Breadth-First-Search algorithms</span> <span class="pl-s1">SearchGraph</span><span class="pl-c1">&lt;</span>..<span class="pl-kos">.</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Combines ranges without gaps between them</span> <span class="pl-s1">IEnumerable</span><span class="pl-c1">&lt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">A</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">B</span><span class="pl-kos">)</span><span class="pl-c1">&gt;</span> <span class="pl-smi">CombineRanges</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-s1">IEnumerable</span><span class="pl-c1">&lt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">A</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">B</span><span class="pl-kos">)</span><span class="pl-c1">&gt;</span> <span class="pl-s1">ranges</span><span class="pl-kos">)</span></pre></div> <blockquote> <p dir="auto"><a href="https://zacharypatten.github.io/Towel/benchmarks/SortBenchmarks.html" rel="nofollow">Sorting Algorithm Benchmarks</a> <sub>Note: not all permuations of the input are benchmarked, so take with a grain of salt.</sub><br> <a href="https://zacharypatten.github.io/Towel/benchmarks/PermuteBenchmarks.html" rel="nofollow">Permute Benchmarks</a></p> </blockquote> </blockquote> <p dir="auto"></p> </details> <details> <summary> Extensions <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// System.Random extensions to generate more random types // there are overloads to specify possible ranges string NextString(this Random random, int length); char NextChar(this Random random); decimal NextDecimal(this Random random); DateTime DateTime(this Random random); TimeSpan TimeSpan(this Random random); long NextLong(this Random random); int[] Next(this Random random, int count, int minValue, int maxValue, Span&lt;T&gt; excluded); // with exclusions int[] NextUnique(this Random random, int count, int minValue, int maxValue); // unique values int[] NextUnique(this Random random, int count, int minValue, int maxValue, Span&lt;T&gt; excluded); // unique values with exclusions T Next&lt;T&gt;(this Random random, IEnumerable&lt;(T Value, double Weight)&gt; pool); // weighted values void Shuffle&lt;T&gt;(this Random random, T[] array); // randomize arrays // Type conversion to string definition as appears in C# source code string ConvertToCSharpSourceDefinition(this Type type); // Example: typeof(List&lt;int&gt;) -&gt; &quot;System.Collections.Generic.List&lt;int&gt;&quot; string ToEnglishWords(this decimal @decimal); // Example: 42 -&gt; &quot;Forty-Two&quot; (bool Success, decimal Value) TryParseEnglishWordsToDecimal(string words); // Example: &quot;Forty-Two&quot; -&gt; 42 int TryParseRomanNumeral(string @string); // Example: &quot;XLII&quot; -&gt; 42 int TryToRomanNumeral(int value); // Example: 42 -&gt; &quot;XLII&quot; // Reflection Extensions To Access XML Documentation string GetDocumentation(this Type type); string GetDocumentation(this FieldInfo fieldInfo); string GetDocumentation(this PropertyInfo propertyInfo); string GetDocumentation(this EventInfo eventInfo); string GetDocumentation(this ConstructorInfo constructorInfo); string GetDocumentation(this MethodInfo methodInfo); string GetDocumentation(this MemberInfo memberInfo); string GetDocumentation(this ParameterInfo parameterInfo);"><pre><span class="pl-c">// System.Random extensions to generate more random types</span> <span class="pl-c">// there are overloads to specify possible ranges</span> <span class="pl-smi">string</span> <span class="pl-en">NextString</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Random</span> <span class="pl-s1">random</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">length</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">char</span> <span class="pl-en">NextChar</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Random</span> <span class="pl-s1">random</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">decimal</span> <span class="pl-en">NextDecimal</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Random</span> <span class="pl-s1">random</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">DateTime</span> <span class="pl-en">DateTime</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Random</span> <span class="pl-s1">random</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">TimeSpan</span> <span class="pl-en">TimeSpan</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Random</span> <span class="pl-s1">random</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">long</span> <span class="pl-en">NextLong</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Random</span> <span class="pl-s1">random</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">int</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-en">Next</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Random</span> <span class="pl-s1">random</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">count</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">minValue</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">maxValue</span><span class="pl-kos">,</span> <span class="pl-smi">Span</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">excluded</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// with exclusions</span> <span class="pl-smi">int</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-en">NextUnique</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Random</span> <span class="pl-s1">random</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">count</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">minValue</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">maxValue</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// unique values</span> <span class="pl-smi">int</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-en">NextUnique</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Random</span> <span class="pl-s1">random</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">count</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">minValue</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">maxValue</span><span class="pl-kos">,</span> <span class="pl-smi">Span</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">excluded</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// unique values with exclusions</span> <span class="pl-smi">T</span> <span class="pl-en">Next</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Random</span> <span class="pl-s1">random</span><span class="pl-kos">,</span> <span class="pl-smi">IEnumerable</span><span class="pl-c1">&lt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">Value</span><span class="pl-kos">,</span> <span class="pl-smi">double</span> <span class="pl-s1">Weight</span><span class="pl-kos">)</span><span class="pl-c1">&gt;</span> <span class="pl-s1">pool</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// weighted values</span> <span class="pl-smi">void</span> <span class="pl-en">Shuffle</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Random</span> <span class="pl-s1">random</span><span class="pl-kos">,</span> <span class="pl-smi">T</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">array</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// randomize arrays</span> <span class="pl-c">// Type conversion to string definition as appears in C# source code</span> <span class="pl-smi">string</span> <span class="pl-en">ConvertToCSharpSourceDefinition</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Type</span> <span class="pl-s1">type</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Example: typeof(List&lt;int&gt;) -&gt; "System.Collections.Generic.List&lt;int&gt;"</span> <span class="pl-smi">string</span> <span class="pl-en">ToEnglishWords</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">decimal</span> <span class="pl-s1">@decimal</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Example: 42 -&gt; "Forty-Two"</span> <span class="pl-kos">(</span><span class="pl-smi">bool</span> <span class="pl-s1">Success</span><span class="pl-kos">,</span> <span class="pl-smi">decimal</span> <span class="pl-s1">Value</span><span class="pl-kos">)</span> <span class="pl-en">TryParseEnglishWordsToDecimal</span><span class="pl-kos">(</span><span class="pl-smi">string</span> <span class="pl-s1">words</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Example: "Forty-Two" -&gt; 42</span> <span class="pl-smi">int</span> <span class="pl-en">TryParseRomanNumeral</span><span class="pl-kos">(</span><span class="pl-smi">string</span> <span class="pl-s1">@string</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Example: "XLII" -&gt; 42</span> <span class="pl-smi">int</span> <span class="pl-en">TryToRomanNumeral</span><span class="pl-kos">(</span><span class="pl-smi">int</span> <span class="pl-s1">value</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Example: 42 -&gt; "XLII"</span> <span class="pl-c">// Reflection Extensions To Access XML Documentation</span> <span class="pl-smi">string</span> <span class="pl-en">GetDocumentation</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">Type</span> <span class="pl-s1">type</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">string</span> <span class="pl-en">GetDocumentation</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">FieldInfo</span> <span class="pl-s1">fieldInfo</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">string</span> <span class="pl-en">GetDocumentation</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">PropertyInfo</span> <span class="pl-s1">propertyInfo</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">string</span> <span class="pl-en">GetDocumentation</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">EventInfo</span> <span class="pl-s1">eventInfo</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">string</span> <span class="pl-en">GetDocumentation</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">ConstructorInfo</span> <span class="pl-s1">constructorInfo</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">string</span> <span class="pl-en">GetDocumentation</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">MethodInfo</span> <span class="pl-s1">methodInfo</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">string</span> <span class="pl-en">GetDocumentation</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">MemberInfo</span> <span class="pl-s1">memberInfo</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">string</span> <span class="pl-en">GetDocumentation</span><span class="pl-kos">(</span><span class="pl-k">this</span> <span class="pl-smi">ParameterInfo</span> <span class="pl-s1">parameterInfo</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> <blockquote> <p dir="auto"><a href="https://zacharypatten.github.io/Towel/benchmarks/WeightedRandomBenchmarks.html" rel="nofollow">Weighted Random Benchmarks</a><br> <a href="https://zacharypatten.github.io/Towel/benchmarks/RandomWithExclusionsBenchmarks.html" rel="nofollow">Random With Exclusions Benchmarks</a><br> <a href="https://zacharypatten.github.io/Towel/benchmarks/ToEnglishWordsBenchmarks.html" rel="nofollow">decimal To English Words Benchmarks</a></p> </blockquote> </blockquote> <p dir="auto"></p> </details> <details> <summary> Data Structures <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <details> <summary> Heap <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// A heap is a binary tree that is sorted vertically using comparison methods. This is different // from AVL Trees or Red-Black Trees that keep their contents stored horizontally. The rule // of a heap is that no parent can be less than either of its children. A Heap using &quot;sifting up&quot; // and &quot;sifting down&quot; algorithms to move values vertically through the tree to keep items sorted. IHeap&lt;T&gt; heap = HeapArray.New&lt;T&gt;(); // Visualization: // // Binary Tree // // -7 // / \ // / \ // / \ // / \ // / \ // / \ // / \ // / \ // -4 1 // / \ / \ // / \ / \ // / \ / \ // -1 3 6 4 // / \ / \ / \ / \ // 30 10 17 51 45 22 19 7 // // Flattened into an Array // // Root = 1 // Left Child = 2 * Index // Right Child = 2* Index + 1 // __________________________________________________________________________ // |0 |-7 |-4 |1 |-1 |3 |6 |4 |30 |10 |17 |51 |45 |22 |19 |7 |0 |0 |0 ... // ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18"><pre><span class="pl-c">// A heap is a binary tree that is sorted vertically using comparison methods. This is different</span> <span class="pl-c">// from AVL Trees or Red-Black Trees that keep their contents stored horizontally. The rule</span> <span class="pl-c">// of a heap is that no parent can be less than either of its children. A Heap using "sifting up"</span> <span class="pl-c">// and "sifting down" algorithms to move values vertically through the tree to keep items sorted.</span> <span class="pl-smi">IHeap</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">heap</span> <span class="pl-c1">=</span> <span class="pl-s1">HeapArray</span><span class="pl-kos">.</span><span class="pl-smi">New</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Visualization:</span> <span class="pl-c">//</span> <span class="pl-c">// Binary Tree</span> <span class="pl-c">//</span> <span class="pl-c">// -7</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// -4 1</span> <span class="pl-c">// / \ / \ </span> <span class="pl-c">// / \ / \ </span> <span class="pl-c">// / \ / \ </span> <span class="pl-c">// -1 3 6 4</span> <span class="pl-c">// / \ / \ / \ / \ </span> <span class="pl-c">// 30 10 17 51 45 22 19 7</span> <span class="pl-c">//</span> <span class="pl-c">// Flattened into an Array</span> <span class="pl-c">//</span> <span class="pl-c">// Root = 1</span> <span class="pl-c">// Left Child = 2 * Index</span> <span class="pl-c">// Right Child = 2* Index + 1</span> <span class="pl-c">// __________________________________________________________________________</span> <span class="pl-c">// |0 |-7 |-4 |1 |-1 |3 |6 |4 |30 |10 |17 |51 |45 |22 |19 |7 |0 |0 |0 ...</span> <span class="pl-c">// ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾</span> <span class="pl-c">// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> AVL Tree <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// An AVL tree is a binary tree that is sorted using comparison methods and automatically balances // itself by tracking the heights of nodes and performing one of four specific algorithms: rotate // right, rotate left, double rotate right, or double rotate left. Any parent in an AVL Tree must // be greater than its left child but less than its right child (if the children exist). An AVL // tree is sorted in the same manor as a Red-Black Tree, but uses different algorithms to maintain // the balance of the tree. IAvlTree&lt;T&gt; avlTree = AvlTreeLinked.New&lt;T&gt;(); // Visualization: // // Binary Tree // // Depth 0 ------------------&gt; 7 // / \ // / \ // / \ // / \ // / \ // / \ // / \ // / \ // Depth 1 ---------&gt; 1 22 // / \ / \ // / \ / \ // / \ / \ // Depth 2 ----&gt; -4 4 17 45 // / \ / \ / \ / \ // Depth 3 ---&gt; -7 -1 3 6 10 19 30 51 // // Flattened into an Array // // Root = 1 // Left Child = 2 * Index // Right Child = 2* Index + 1 // __________________________________________________________________________ // |0 |7 |1 |22 |-4 |4 |17 |45 |-7 |-1 |3 |6 |10 |19 |30 |51 |0 |0 |0 ... // ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18"><pre><span class="pl-c">// An AVL tree is a binary tree that is sorted using comparison methods and automatically balances</span> <span class="pl-c">// itself by tracking the heights of nodes and performing one of four specific algorithms: rotate</span> <span class="pl-c">// right, rotate left, double rotate right, or double rotate left. Any parent in an AVL Tree must</span> <span class="pl-c">// be greater than its left child but less than its right child (if the children exist). An AVL</span> <span class="pl-c">// tree is sorted in the same manor as a Red-Black Tree, but uses different algorithms to maintain</span> <span class="pl-c">// the balance of the tree.</span> <span class="pl-smi">IAvlTree</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">avlTree</span> <span class="pl-c1">=</span> <span class="pl-s1">AvlTreeLinked</span><span class="pl-kos">.</span><span class="pl-smi">New</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Visualization:</span> <span class="pl-c">//</span> <span class="pl-c">// Binary Tree</span> <span class="pl-c">//</span> <span class="pl-c">// Depth 0 ------------------&gt; 7</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// Depth 1 ---------&gt; 1 22</span> <span class="pl-c">// / \ / \</span> <span class="pl-c">// / \ / \</span> <span class="pl-c">// / \ / \</span> <span class="pl-c">// Depth 2 ----&gt; -4 4 17 45</span> <span class="pl-c">// / \ / \ / \ / \</span> <span class="pl-c">// Depth 3 ---&gt; -7 -1 3 6 10 19 30 51</span> <span class="pl-c">//</span> <span class="pl-c">// Flattened into an Array</span> <span class="pl-c">//</span> <span class="pl-c">// Root = 1</span> <span class="pl-c">// Left Child = 2 * Index</span> <span class="pl-c">// Right Child = 2* Index + 1</span> <span class="pl-c">// __________________________________________________________________________</span> <span class="pl-c">// |0 |7 |1 |22 |-4 |4 |17 |45 |-7 |-1 |3 |6 |10 |19 |30 |51 |0 |0 |0 ...</span> <span class="pl-c">// ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾</span> <span class="pl-c">// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> Red Black Tree <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// A Red-Black treeis a binary tree that is sorted using comparison methods and automatically // balances itself. Any parent in an Red-Black Tree must be greater than its left child but less // than its right child (if the children exist). A Red-Black tree is sorted in the same manor as // an AVL Tree, but uses different algorithms to maintain the balance of the tree. IRedBlackTree&lt;T&gt; redBlackTree = RedBlackTreeLinked.New&lt;T&gt;(); // Visualization: // // Binary Tree // // Color Black ----------------&gt; 7 // / \ // / \ // / \ // / \ // / \ // / \ // / \ // / \ // Color Red ---------&gt; 1 22 // / \ / \ // / \ / \ // / \ / \ // Color Black ---&gt; -4 4 17 45 // / \ / \ / \ / \ // Color Red ---&gt; -7 -1 3 6 10 19 30 51 // // Flattened into an Array // // Root = 1 // Left Child = 2 * Index // Right Child = 2* Index + 1 // __________________________________________________________________________ // |0 |7 |1 |22 |-4 |4 |17 |45 |-7 |-1 |3 |6 |10 |19 |30 |51 |0 |0 |0 ... // ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18"><pre><span class="pl-c">// A Red-Black treeis a binary tree that is sorted using comparison methods and automatically </span> <span class="pl-c">// balances itself. Any parent in an Red-Black Tree must be greater than its left child but less</span> <span class="pl-c">// than its right child (if the children exist). A Red-Black tree is sorted in the same manor as</span> <span class="pl-c">// an AVL Tree, but uses different algorithms to maintain the balance of the tree.</span> <span class="pl-smi">IRedBlackTree</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">redBlackTree</span> <span class="pl-c1">=</span> <span class="pl-s1">RedBlackTreeLinked</span><span class="pl-kos">.</span><span class="pl-smi">New</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Visualization:</span> <span class="pl-c">//</span> <span class="pl-c">// Binary Tree</span> <span class="pl-c">//</span> <span class="pl-c">// Color Black ----------------&gt; 7</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// Color Red ---------&gt; 1 22</span> <span class="pl-c">// / \ / \</span> <span class="pl-c">// / \ / \</span> <span class="pl-c">// / \ / \</span> <span class="pl-c">// Color Black ---&gt; -4 4 17 45</span> <span class="pl-c">// / \ / \ / \ / \</span> <span class="pl-c">// Color Red ---&gt; -7 -1 3 6 10 19 30 51</span> <span class="pl-c">//</span> <span class="pl-c">// Flattened into an Array</span> <span class="pl-c">//</span> <span class="pl-c">// Root = 1</span> <span class="pl-c">// Left Child = 2 * Index</span> <span class="pl-c">// Right Child = 2* Index + 1</span> <span class="pl-c">// __________________________________________________________________________</span> <span class="pl-c">// |0 |7 |1 |22 |-4 |4 |17 |45 |-7 |-1 |3 |6 |10 |19 |30 |51 |0 |0 |0 ...</span> <span class="pl-c">// ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾</span> <span class="pl-c">// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> Omnitree <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// An Omnitree is a Spacial Partitioning Tree (SPT) that works on an arbitrary number of dimensions. // It stores items sorted along multiple dimensions by dividing spaces into sub-spaces. A 3D // version of an SPT is often called an &quot;Octree&quot; and a 2D version of an SPT is often called a // &quot;Quadtree.&quot; There are two versions of the Omnitree: Points and Bounds. The Points version stores // vectors while the Bounds version stores spaces with a minimum and maximum vector. IOmnitreePoints&lt;T, A1, A2, A3...&gt; omnitreePoints = new OmnitreePointsLinked&lt;T, A1, A2, A3...&gt;( (T value, out A1 a1, out A2 a2, out A3 a3...) =&gt; { ... }); IOmnitreeBounds&lt;T, A1, A2, A3...&gt; omnitreeBounds = new OmnitreeBoundsLinked&lt;T, A1, A2, A3...&gt;( (T value, out A1 min1, out A1 max1, out A2 min2, out A2 max2, out A3 min3, out A3 max3...) =&gt; { ... }); // The maximum number of children any node can have is 2 ^ N where N is the number // of dimensions of the tree. // // ------------------------------- // | Dimensions | Max # Children | // |============|================| // | 1 | 2 ^ 1 = 2 | // | 2 | 2 ^ 2 = 4 | // | 3 | 2 ^ 3 = 8 | // | 4 | 2 ^ 4 = 16 | // | ... | ... | // ------------------------------- // // Visualizations // // 1 Dimensional: // // -1D |-----------|-----------| +1D Children Indexes: // -1D: 0 // &lt;--- 0 ---&gt; &lt;--- 1 ---&gt; +1D: 1 // // 2 Dimensional: // _____________________ // | | | +2D // | | | ^ // | 2 | 3 | | Children Indexes: // | | | | -2D -1D: 0 // |----------|----------| | -2D +1D: 1 // | | | | +2D -1D: 2 // | | | | +2D +1D: 3 // | 0 | 1 | | // | | | v // |__________|__________| -2D // // -1D &lt;-----------&gt; +1D // // 3 Dimensional: // // +3D _____________________ // 7 / / /| // / / 6 / 7 / | // / /---------/----------/ | Children Indexes: // / / 2 / 3 /| | -3D -2D -1D: 0 // L /_________/__________/ | | -3D -2D +1D: 1 // -3D | | | | /| +2D -3D +2D -1D: 2 // | | | |/ | ^ -3D +2D +1D: 3 // | 2 | 3 | / | | +3D -2D -1D: 4 // | | |/| | &lt;-- 5 | +3D -2D +1D: 5 // |----------|----------| | | | +3D +2D -1D: 6 // | | | | / | +3D +2D +1D: 7 // | | | | / | // | 0 | 1 | |/ | // | | | / v // |__________|__________|/ -2D // // ^ // | // 4 (behind 0) // // -1D &lt;-----------&gt; +1D // // 4 Dimensional: // // +1D +2D +3D +4D Children Indexes: // ^ ^ ^ ^ // | | | | -4D -3D -2D -1D: 0 +4D -3D -2D -1D: 8 // | | | | -4D -3D -2D +1D: 1 +4D -3D -2D +1D: 9 // | | | | -4D -3D +2D -1D: 2 +4D -3D +2D -1D: 10 // | | | | -4D -3D +2D +1D: 3 +4D -3D +2D +1D: 11 // | | | | -4D +3D -2D -1D: 4 +4D +3D -2D -1D: 12 // --- --- --- --- -4D +3D -2D +1D: 5 +4D +3D -2D +1D: 13 // | | | | -4D +3D +2D -1D: 6 +4D +3D +2D -1D: 14 // | | | | -4D +3D +2D +1D: 7 +4D +3D +2D +1D: 15 // | | | | // | | | | // | | | | // v v v v // -1D -2D -3D -4D // // With a value that is in the (+1D, -2D, -3D, +4D)[Index 9] child: // // +1D +2D +3D +4D // ^ ^ ^ ^ // | | | | // | | | | // O--- | | ---O // | \ | | / | // | \ | | / | // --- \ --- --- / --- // | \ | | / | // | \ | | / | // | ---O-----------O--- | // | | | | // | | | | // v v v v // -1D -2D -3D -4D // By default, the omnitree will sort items along each axis and use the median algorithm to determine // the point of divisions. However, you can override the subdivision algorithm. For numerical values, // the mean algorithm can be used (and is much faster than median). If you know the data set will be // relatively evenly distributed within a sub-space, you can even set the subdivision algorithm to // calculate the subdivision from parent spaces rather than looking at the current contents of the // space. // The depth of the omnitree is bounded by &quot;ln(count)&quot; the natural log of the current count. When adding // and item to the tree, if the number of items in the respective child is greater than ln(count) and // the depth bounding has not been reached, then the child will be subdivided. The goal is to achieve // Ω(ln(count)) runtime complexity when looking up values."><pre><span class="pl-c">// An Omnitree is a Spacial Partitioning Tree (SPT) that works on an arbitrary number of dimensions.</span> <span class="pl-c">// It stores items sorted along multiple dimensions by dividing spaces into sub-spaces. A 3D</span> <span class="pl-c">// version of an SPT is often called an "Octree" and a 2D version of an SPT is often called a</span> <span class="pl-c">// "Quadtree." There are two versions of the Omnitree: Points and Bounds. The Points version stores</span> <span class="pl-c">// vectors while the Bounds version stores spaces with a minimum and maximum vector.</span> <span class="pl-smi">IOmnitreePoints</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-kos">,</span> <span class="pl-smi">A1</span><span class="pl-kos">,</span> <span class="pl-smi">A2</span><span class="pl-kos">,</span> <span class="pl-smi">A3</span><span class="pl-kos">.</span>..<span class="pl-c1">&gt;</span> <span class="pl-s1">omnitreePoints</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">OmnitreePointsLinked</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-kos">,</span> <span class="pl-smi">A1</span><span class="pl-kos">,</span> <span class="pl-smi">A2</span><span class="pl-kos">,</span> <span class="pl-smi">A3</span><span class="pl-kos">.</span>..<span class="pl-c1">&gt;</span><span class="pl-kos">(</span> <span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">value</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">A1</span> <span class="pl-s1">a1</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">A2</span> <span class="pl-s1">a2</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">A3</span> <span class="pl-s1">a3</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-kos">{</span> ..<span class="pl-kos">.</span><span class="pl-s1"></span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos"></span><span class="pl-kos">;</span> <span class="pl-smi">IOmnitreeBounds</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-kos">,</span> <span class="pl-smi">A1</span><span class="pl-kos">,</span> <span class="pl-smi">A2</span><span class="pl-kos">,</span> <span class="pl-smi">A3</span><span class="pl-kos">.</span>..<span class="pl-c1">&gt;</span> <span class="pl-s1">omnitreeBounds</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">OmnitreeBoundsLinked</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-kos">,</span> <span class="pl-smi">A1</span><span class="pl-kos">,</span> <span class="pl-smi">A2</span><span class="pl-kos">,</span> <span class="pl-smi">A3</span><span class="pl-kos">.</span>..<span class="pl-c1">&gt;</span><span class="pl-kos">(</span> <span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">value</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">A1</span> <span class="pl-s1">min1</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">A1</span> <span class="pl-s1">max1</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">A2</span> <span class="pl-s1">min2</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">A2</span> <span class="pl-s1">max2</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">A3</span> <span class="pl-s1">min3</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">A3</span> <span class="pl-s1">max3</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-kos">{</span> ..<span class="pl-kos">.</span><span class="pl-s1"></span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos"></span><span class="pl-kos">;</span> <span class="pl-c">// The maximum number of children any node can have is 2 ^ N where N is the number</span> <span class="pl-c">// of dimensions of the tree.</span> <span class="pl-c">//</span> <span class="pl-c">// -------------------------------</span> <span class="pl-c">// | Dimensions | Max # Children |</span> <span class="pl-c">// |============|================|</span> <span class="pl-c">// | 1 | 2 ^ 1 = 2 |</span> <span class="pl-c">// | 2 | 2 ^ 2 = 4 |</span> <span class="pl-c">// | 3 | 2 ^ 3 = 8 |</span> <span class="pl-c">// | 4 | 2 ^ 4 = 16 |</span> <span class="pl-c">// | ... | ... |</span> <span class="pl-c">// -------------------------------</span> <span class="pl-c">//</span> <span class="pl-c">// Visualizations</span> <span class="pl-c">//</span> <span class="pl-c">// 1 Dimensional:</span> <span class="pl-c">//</span> <span class="pl-c">// -1D |-----------|-----------| +1D Children Indexes:</span> <span class="pl-c">// -1D: 0</span> <span class="pl-c">// &lt;--- 0 ---&gt; &lt;--- 1 ---&gt; +1D: 1</span> <span class="pl-c">//</span> <span class="pl-c">// 2 Dimensional:</span> <span class="pl-c">// _____________________</span> <span class="pl-c">// | | | +2D</span> <span class="pl-c">// | | | ^</span> <span class="pl-c">// | 2 | 3 | | Children Indexes:</span> <span class="pl-c">// | | | | -2D -1D: 0</span> <span class="pl-c">// |----------|----------| | -2D +1D: 1</span> <span class="pl-c">// | | | | +2D -1D: 2</span> <span class="pl-c">// | | | | +2D +1D: 3</span> <span class="pl-c">// | 0 | 1 | |</span> <span class="pl-c">// | | | v</span> <span class="pl-c">// |__________|__________| -2D</span> <span class="pl-c">//</span> <span class="pl-c">// -1D &lt;-----------&gt; +1D </span> <span class="pl-c">//</span> <span class="pl-c">// 3 Dimensional:</span> <span class="pl-c">//</span> <span class="pl-c">// +3D _____________________</span> <span class="pl-c">// 7 / / /|</span> <span class="pl-c">// / / 6 / 7 / |</span> <span class="pl-c">// / /---------/----------/ | Children Indexes:</span> <span class="pl-c">// / / 2 / 3 /| | -3D -2D -1D: 0</span> <span class="pl-c">// L /_________/__________/ | | -3D -2D +1D: 1</span> <span class="pl-c">// -3D | | | | /| +2D -3D +2D -1D: 2</span> <span class="pl-c">// | | | |/ | ^ -3D +2D +1D: 3</span> <span class="pl-c">// | 2 | 3 | / | | +3D -2D -1D: 4</span> <span class="pl-c">// | | |/| | &lt;-- 5 | +3D -2D +1D: 5</span> <span class="pl-c">// |----------|----------| | | | +3D +2D -1D: 6</span> <span class="pl-c">// | | | | / | +3D +2D +1D: 7</span> <span class="pl-c">// | | | | / |</span> <span class="pl-c">// | 0 | 1 | |/ |</span> <span class="pl-c">// | | | / v</span> <span class="pl-c">// |__________|__________|/ -2D</span> <span class="pl-c">// </span> <span class="pl-c">// ^</span> <span class="pl-c">// |</span> <span class="pl-c">// 4 (behind 0)</span> <span class="pl-c">//</span> <span class="pl-c">// -1D &lt;-----------&gt; +1D</span> <span class="pl-c">//</span> <span class="pl-c">// 4 Dimensional:</span> <span class="pl-c">//</span> <span class="pl-c">// +1D +2D +3D +4D Children Indexes:</span> <span class="pl-c">// ^ ^ ^ ^</span> <span class="pl-c">// | | | | -4D -3D -2D -1D: 0 +4D -3D -2D -1D: 8</span> <span class="pl-c">// | | | | -4D -3D -2D +1D: 1 +4D -3D -2D +1D: 9</span> <span class="pl-c">// | | | | -4D -3D +2D -1D: 2 +4D -3D +2D -1D: 10</span> <span class="pl-c">// | | | | -4D -3D +2D +1D: 3 +4D -3D +2D +1D: 11</span> <span class="pl-c">// | | | | -4D +3D -2D -1D: 4 +4D +3D -2D -1D: 12</span> <span class="pl-c">// --- --- --- --- -4D +3D -2D +1D: 5 +4D +3D -2D +1D: 13</span> <span class="pl-c">// | | | | -4D +3D +2D -1D: 6 +4D +3D +2D -1D: 14</span> <span class="pl-c">// | | | | -4D +3D +2D +1D: 7 +4D +3D +2D +1D: 15</span> <span class="pl-c">// | | | |</span> <span class="pl-c">// | | | |</span> <span class="pl-c">// | | | |</span> <span class="pl-c">// v v v v</span> <span class="pl-c">// -1D -2D -3D -4D</span> <span class="pl-c">//</span> <span class="pl-c">// With a value that is in the (+1D, -2D, -3D, +4D)[Index 9] child:</span> <span class="pl-c">//</span> <span class="pl-c">// +1D +2D +3D +4D</span> <span class="pl-c">// ^ ^ ^ ^</span> <span class="pl-c">// | | | |</span> <span class="pl-c">// | | | |</span> <span class="pl-c">// O--- | | ---O</span> <span class="pl-c">// | \ | | / |</span> <span class="pl-c">// | \ | | / |</span> <span class="pl-c">// --- \ --- --- / ---</span> <span class="pl-c">// | \ | | / |</span> <span class="pl-c">// | \ | | / |</span> <span class="pl-c">// | ---O-----------O--- |</span> <span class="pl-c">// | | | |</span> <span class="pl-c">// | | | |</span> <span class="pl-c">// v v v v</span> <span class="pl-c">// -1D -2D -3D -4D</span> <span class="pl-c">// By default, the omnitree will sort items along each axis and use the median algorithm to determine</span> <span class="pl-c">// the point of divisions. However, you can override the subdivision algorithm. For numerical values,</span> <span class="pl-c">// the mean algorithm can be used (and is much faster than median). If you know the data set will be</span> <span class="pl-c">// relatively evenly distributed within a sub-space, you can even set the subdivision algorithm to</span> <span class="pl-c">// calculate the subdivision from parent spaces rather than looking at the current contents of the</span> <span class="pl-c">// space.</span> <span class="pl-c">// The depth of the omnitree is bounded by "ln(count)" the natural log of the current count. When adding</span> <span class="pl-c">// and item to the tree, if the number of items in the respective child is greater than ln(count) and </span> <span class="pl-c">// the depth bounding has not been reached, then the child will be subdivided. The goal is to achieve </span> <span class="pl-c">// Ω(ln(count)) runtime complexity when looking up values.</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> B-Tree <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// a B-tree is a self-balancing tree data structure that maintains // sorted data and allows searches, sequential access, insertions, // and deletions in logarithmic time. The B-tree generalizes the // binary search tree, allowing for nodes with more than two children. // There are two ways to Add and Remove elements in a B-Tree // 1) Pre-emptive: Search the tree from top to bottom (for place to add/ // node to delete) and perform fixing of the B-Tree (Splitting // or Merging) in a single pass // 2) Non Pre-emptive: Add/Remove the required node and go up the tree to // fix the tree as needed // // Pre-emptive methods are optimal, especially if the Maximum Degree of // a node is set to an even number. This implementation of B-Tree // uses Pre-emptive modes of Add/Removal methods and therefore the // value of Maximum Degree is mandated to be even // This implementation is taken from Thomas H. Cormen's book &quot;Introduction // to Algorithms, 3rd edition&quot;, Chapter 18: B-Trees BTree&lt;int&gt; tree = new BTree&lt;int&gt;(4); tree.Add(20); tree.Add(10); tree.Add(30); tree.Add(50); tree.Add(40); tree.Add(5); tree.Add(15); // // [20] // / \ // / \ // [5, 10, 15] [30, 40, 50] // // All elements added in the BTree, where each node can have a maximum // of 4 children (and therefore, a maximum of 3 elements) bool r1 = tree.TryRemove(50).Success; // r1 = true bool r2 = tree.TryRemove(50).Success; // r2 = false, 50 is no longer in the tree // // [20] // / \ // / \ // [5, 10, 15] [30, 40] int[] array = tree.ToArray(); // array = [5, 10, 15, 20, 30, 40]"><pre><span class="pl-c">// a B-tree is a self-balancing tree data structure that maintains </span> <span class="pl-c">// sorted data and allows searches, sequential access, insertions, </span> <span class="pl-c">// and deletions in logarithmic time. The B-tree generalizes the </span> <span class="pl-c">// binary search tree, allowing for nodes with more than two children.</span> <span class="pl-c">// There are two ways to Add and Remove elements in a B-Tree</span> <span class="pl-c">// 1) Pre-emptive: Search the tree from top to bottom (for place to add/ </span> <span class="pl-c">// node to delete) and perform fixing of the B-Tree (Splitting</span> <span class="pl-c">// or Merging) in a single pass</span> <span class="pl-c">// 2) Non Pre-emptive: Add/Remove the required node and go up the tree to </span> <span class="pl-c">// fix the tree as needed</span> <span class="pl-c">//</span> <span class="pl-c">// Pre-emptive methods are optimal, especially if the Maximum Degree of</span> <span class="pl-c">// a node is set to an even number. This implementation of B-Tree </span> <span class="pl-c">// uses Pre-emptive modes of Add/Removal methods and therefore the </span> <span class="pl-c">// value of Maximum Degree is mandated to be even</span> <span class="pl-c">// This implementation is taken from Thomas H. Cormen's book "Introduction </span> <span class="pl-c">// to Algorithms, 3rd edition", Chapter 18: B-Trees</span> <span class="pl-smi">BTree</span><span class="pl-c1">&lt;</span><span class="pl-smi">int</span><span class="pl-c1">&gt;</span> <span class="pl-s1">tree</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">BTree</span><span class="pl-c1">&lt;</span><span class="pl-smi">int</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-c1">4</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">tree</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">20</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">tree</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">10</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">tree</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">30</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">tree</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">50</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">tree</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">40</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">tree</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">5</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">tree</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">15</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// </span> <span class="pl-c">// [20]</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// [5, 10, 15] [30, 40, 50]</span> <span class="pl-c">// </span> <span class="pl-c">// All elements added in the BTree, where each node can have a maximum</span> <span class="pl-c">// of 4 children (and therefore, a maximum of 3 elements)</span> <span class="pl-smi">bool</span> <span class="pl-s1">r1</span> <span class="pl-c1">=</span> <span class="pl-s1">tree</span><span class="pl-kos">.</span><span class="pl-en">TryRemove</span><span class="pl-kos">(</span><span class="pl-c1">50</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-s1">Success</span><span class="pl-kos">;</span> <span class="pl-c">// r1 = true</span> <span class="pl-smi">bool</span> <span class="pl-s1">r2</span> <span class="pl-c1">=</span> <span class="pl-s1">tree</span><span class="pl-kos">.</span><span class="pl-en">TryRemove</span><span class="pl-kos">(</span><span class="pl-c1">50</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-s1">Success</span><span class="pl-kos">;</span> <span class="pl-c">// r2 = false, 50 is no longer in the tree</span> <span class="pl-c">// </span> <span class="pl-c">// [20]</span> <span class="pl-c">// / \</span> <span class="pl-c">// / \</span> <span class="pl-c">// [5, 10, 15] [30, 40]</span> <span class="pl-smi">int</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">array</span> <span class="pl-c1">=</span> <span class="pl-s1">tree</span><span class="pl-kos">.</span><span class="pl-en">ToArray</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// array = [5, 10, 15, 20, 30, 40]</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> Tree <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="ITree&lt;T&gt; treeMap = TreeMap.New&lt;T&gt;(...);"><pre><span class="pl-smi">ITree</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">treeMap</span> <span class="pl-c1">=</span> <span class="pl-s1">TreeMap</span><span class="pl-kos">.</span><span class="pl-smi">New</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> Graph <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// A graph is a data structure that contains nodes and edges. They are useful // when you need to model real world scenarios. They also are generally used // for particular algorithms such as path finding. The GraphSetOmnitree is a // graph that stores nodes in a hashed set and the edges in a 2D omnitree (aka // quadtree). IGraph&lt;int&gt; graph = GraphSetOmnitree.New&lt;int&gt;(); // add nodes graph.Add(0); graph.Add(1); graph.Add(2); graph.Add(3); // add edges graph.Add(0, 1); graph.Add(1, 2); graph.Add(2, 3); graph.Add(0, 3); // visualization // // 0 --------&gt; 1 // | | // | | // | | // v v // 3 &lt;-------- 2"><pre><span class="pl-c">// A graph is a data structure that contains nodes and edges. They are useful</span> <span class="pl-c">// when you need to model real world scenarios. They also are generally used</span> <span class="pl-c">// for particular algorithms such as path finding. The GraphSetOmnitree is a</span> <span class="pl-c">// graph that stores nodes in a hashed set and the edges in a 2D omnitree (aka</span> <span class="pl-c">// quadtree).</span> <span class="pl-smi">IGraph</span><span class="pl-c1">&lt;</span><span class="pl-smi">int</span><span class="pl-c1">&gt;</span> <span class="pl-s1">graph</span> <span class="pl-c1">=</span> <span class="pl-s1">GraphSetOmnitree</span><span class="pl-kos">.</span><span class="pl-smi">New</span><span class="pl-c1">&lt;</span><span class="pl-smi">int</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// add nodes</span> <span class="pl-s1">graph</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">0</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">graph</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">graph</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">2</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">graph</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">3</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// add edges</span> <span class="pl-s1">graph</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">0</span><span class="pl-kos">,</span> <span class="pl-c1">1</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">graph</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">graph</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">2</span><span class="pl-kos">,</span> <span class="pl-c1">3</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">graph</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">0</span><span class="pl-kos">,</span> <span class="pl-c1">3</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// visualization</span> <span class="pl-c">//</span> <span class="pl-c">// 0 --------&gt; 1</span> <span class="pl-c">// | |</span> <span class="pl-c">// | |</span> <span class="pl-c">// | |</span> <span class="pl-c">// v v</span> <span class="pl-c">// 3 &lt;-------- 2</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> SkipList <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// A skip list is a probabilistic data structure that stores data // similar to a Linked List, but has additional layers which allow // the list to perform basic operations (add/search/delete) in // O(log n) average complexity SkipList&lt;int, SFunc&lt;int, int, CompareResult&gt;&gt;? list = SkipList.New&lt;int&gt;(5); // create a list with 5 levels list.Add(60); list.Add(20); list.Add(30); list.Add(40); list.Add(20); list.Add(90); list.Add(80); // #--------------------&gt;| |---------------------------------&gt;NULL // #--------------------&gt;| |---------------------------&gt;| |-&gt;NULL // # -------------------&gt;| |-------------------&gt;| |---&gt;| |-&gt;NULL // # -----------&gt;| |---&gt;| |---&gt;| |-----------&gt;| |---&gt;| |-&gt;NULL // # ---&gt;|20|---&gt;|20|---&gt;|30|---&gt;|40|---&gt;|60|---&gt;|80|---&gt;|90|-&gt;NULL // // PS: SkipList nodes are assigned levels randomly, so this is one of the possible configurations obtainable bool result; result = list.Contains(40); //result = true result = list.Remove(40).Suceess; // result = true result = list.Contains(40); //result = false"><pre><span class="pl-c">// A skip list is a probabilistic data structure that stores data </span> <span class="pl-c">// similar to a Linked List, but has additional layers which allow</span> <span class="pl-c">// the list to perform basic operations (add/search/delete) in </span> <span class="pl-c">// O(log n) average complexity</span> <span class="pl-smi">SkipList</span><span class="pl-c1">&lt;</span><span class="pl-smi">int</span><span class="pl-kos">,</span> <span class="pl-smi">SFunc</span><span class="pl-c1">&lt;</span><span class="pl-smi">int</span><span class="pl-kos">,</span> <span class="pl-smi">int</span><span class="pl-kos">,</span> <span class="pl-smi">CompareResult</span><span class="pl-c1">&gt;</span><span class="pl-c1">&gt;</span><span class="pl-c1">?</span> <span class="pl-s1">list</span> <span class="pl-c1">=</span> <span class="pl-s1">SkipList</span><span class="pl-kos">.</span><span class="pl-smi">New</span><span class="pl-c1">&lt;</span><span class="pl-smi">int</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-c1">5</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// create a list with 5 levels</span> <span class="pl-s1">list</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">60</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">list</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">20</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">list</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">30</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">list</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">40</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">list</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">20</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">list</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">90</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">list</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-c1">80</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// #--------------------&gt;| |---------------------------------&gt;NULL</span> <span class="pl-c">// #--------------------&gt;| |---------------------------&gt;| |-&gt;NULL</span> <span class="pl-c">// # -------------------&gt;| |-------------------&gt;| |---&gt;| |-&gt;NULL</span> <span class="pl-c">// # -----------&gt;| |---&gt;| |---&gt;| |-----------&gt;| |---&gt;| |-&gt;NULL</span> <span class="pl-c">// # ---&gt;|20|---&gt;|20|---&gt;|30|---&gt;|40|---&gt;|60|---&gt;|80|---&gt;|90|-&gt;NULL</span> <span class="pl-c">// </span> <span class="pl-c">// PS: SkipList nodes are assigned levels randomly, so this is one of the possible configurations obtainable</span> <span class="pl-smi">bool</span> <span class="pl-s1">result</span><span class="pl-kos">;</span> <span class="pl-s1">result</span> <span class="pl-c1">=</span> <span class="pl-s1">list</span><span class="pl-kos">.</span><span class="pl-en">Contains</span><span class="pl-kos">(</span><span class="pl-c1">40</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">//result = true</span> <span class="pl-s1">result</span> <span class="pl-c1">=</span> <span class="pl-s1">list</span><span class="pl-kos">.</span><span class="pl-en">Remove</span><span class="pl-kos">(</span><span class="pl-c1">40</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-s1">Suceess</span><span class="pl-kos">;</span> <span class="pl-c">// result = true</span> <span class="pl-s1">result</span> <span class="pl-c1">=</span> <span class="pl-s1">list</span><span class="pl-kos">.</span><span class="pl-en">Contains</span><span class="pl-kos">(</span><span class="pl-c1">40</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">//result = false</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> Trie <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// A trie is a tree that stores values in a way that partial keys may be shared // amongst values to reduce redundant memory usage. They are generally used with // large data sets such as storing all the words in the English language. For // example, the words &quot;farm&quot; and &quot;fart&quot; both have the letters &quot;far&quot; in common. // A trie takes advantage of that and only stores the necessary letters for // those words ['f'-&gt;'a'-&gt;'r'-&gt;('t'||'m')]. A trie is not limited to string // values though. Any key type that can be broken into pieces (and shared), // could be used in a trie. // // There are two versions. One that only stores the values of the trie (ITrie&lt;T&gt;) // and one that stores the values of the trie plus an additional generic value // on the leaves (ITrie&lt;T, D&gt;). ITrie&lt;T&gt; trie = TrieLinkedHashLinked.New&lt;T&gt;(); ITrie&lt;T, D&gt; trie = TrieLinkedHashLinked.New&lt;T, D&gt;();"><pre><span class="pl-c">// A trie is a tree that stores values in a way that partial keys may be shared</span> <span class="pl-c">// amongst values to reduce redundant memory usage. They are generally used with</span> <span class="pl-c">// large data sets such as storing all the words in the English language. For</span> <span class="pl-c">// example, the words "farm" and "fart" both have the letters "far" in common.</span> <span class="pl-c">// A trie takes advantage of that and only stores the necessary letters for</span> <span class="pl-c">// those words ['f'-&gt;'a'-&gt;'r'-&gt;('t'||'m')]. A trie is not limited to string</span> <span class="pl-c">// values though. Any key type that can be broken into pieces (and shared),</span> <span class="pl-c">// could be used in a trie.</span> <span class="pl-c">//</span> <span class="pl-c">// There are two versions. One that only stores the values of the trie (ITrie&lt;T&gt;)</span> <span class="pl-c">// and one that stores the values of the trie plus an additional generic value</span> <span class="pl-c">// on the leaves (ITrie&lt;T, D&gt;).</span> <span class="pl-smi">ITrie</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">trie</span> <span class="pl-c1">=</span> <span class="pl-s1">TrieLinkedHashLinked</span><span class="pl-kos">.</span><span class="pl-smi">New</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">ITrie</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-kos">,</span> <span class="pl-smi">D</span><span class="pl-c1">&gt;</span> <span class="pl-s1">trie</span> <span class="pl-c1">=</span> <span class="pl-s1">TrieLinkedHashLinked</span><span class="pl-kos">.</span><span class="pl-smi">New</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-kos">,</span> <span class="pl-smi">D</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> </blockquote> <p dir="auto"></p> </details> </blockquote> <p dir="auto"></p> </details> <details> <summary> Generic Mathematics &amp; Logic <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <details> <summary> How It Works <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="public static T Addition&lt;T&gt;(T a, T b) { return AdditionImplementation&lt;T&gt;.Function(a, b); } internal static class AdditionImplementation&lt;T&gt; { internal static Func&lt;T, T, T&gt; Function = (T a, T b) =&gt; { var A = Expression.Parameter(typeof(T)); var B = Expression.Parameter(typeof(T)); var BODY = Expression.Add(A, B); Function = Expression.Lambda&lt;Func&lt;T, T, T&gt;&gt;(BODY, A, B).Compile(); return Function(a, b); }; }"><pre><span class="pl-k">public</span> <span class="pl-k"><span class="pl-k">static</span></span> <span class="pl-smi">T</span> <span class="pl-en">Addition</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-k">return</span> <span class="pl-smi">AdditionImplementation</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">.</span><span class="pl-en">Function</span><span class="pl-kos">(</span><span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-kos">}</span> <span class="pl-k">internal</span> <span class="pl-k"><span class="pl-k">static</span></span> <span class="pl-k">class</span> <span class="pl-smi">AdditionImplementation</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span> <span class="pl-kos">{</span> <span class="pl-k">internal</span> <span class="pl-k"><span class="pl-k">static</span></span> <span class="pl-smi">Func</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-kos">,</span> <span class="pl-smi">T</span><span class="pl-kos">,</span> <span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">Function</span> <span class="pl-c1">=</span> <span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-kos">{</span> <span class="pl-k">var</span> <span class="pl-s1">A</span> <span class="pl-c1">=</span> <span class="pl-s1">Expression</span><span class="pl-kos">.</span><span class="pl-en">Parameter</span><span class="pl-kos">(</span><span class="pl-k">typeof</span><span class="pl-kos">(</span><span class="pl-smi">T</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-k">var</span> <span class="pl-s1">B</span> <span class="pl-c1">=</span> <span class="pl-s1">Expression</span><span class="pl-kos">.</span><span class="pl-en">Parameter</span><span class="pl-kos">(</span><span class="pl-k">typeof</span><span class="pl-kos">(</span><span class="pl-smi">T</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-k">var</span> <span class="pl-s1">BODY</span> <span class="pl-c1">=</span> <span class="pl-s1">Expression</span><span class="pl-kos">.</span><span class="pl-en">Add</span><span class="pl-kos">(</span><span class="pl-s1">A</span><span class="pl-kos">,</span> <span class="pl-s1">B</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">Function</span> <span class="pl-c1">=</span> <span class="pl-s1">Expression</span><span class="pl-kos">.</span><span class="pl-smi">Lambda</span><span class="pl-c1">&lt;</span><span class="pl-smi">Func</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-kos">,</span> <span class="pl-smi">T</span><span class="pl-kos">,</span> <span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-s1">BODY</span><span class="pl-kos">,</span> <span class="pl-s1">A</span><span class="pl-kos">,</span> <span class="pl-s1">B</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">Compile</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-k">return</span> <span class="pl-s1">Function</span><span class="pl-kos">(</span><span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">You can break type safe-ness using generic types and runtime compilation, and you can store the runtime compilation in a delegate so the only overhead is the invocation of the delegate.</p> </blockquote> <p dir="auto"></p> </details> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Logic Fundamentals bool Equate&lt;T&gt;(T a , T b); bool LessThan&lt;T&gt;(T a, T b); bool GreaterThan&lt;T&gt;(T a, T b); CompareResult Compare&lt;T&gt;(T a, T b); // Mathematics Fundamentals T Negation&lt;T&gt;(T a); T Addition&lt;T&gt;(T a, T b); T Subtraction&lt;T&gt;(T a, T b); T Multiplication&lt;T&gt;(T a, T b); T Division&lt;T&gt;(T a, T b); T Remainder&lt;T&gt;(T a, T b); // More Logic bool IsPrime&lt;T&gt;(T a); bool IsEven&lt;T&gt;(T a); bool IsOdd&lt;T&gt;(T a); T Minimum&lt;T&gt;(T a, T b); T Maximum&lt;T&gt;(T a, T b); T Clamp&lt;T&gt;(T value, T floor, T ceiling); T AbsoluteValue&lt;T&gt;(T a); bool EqualityLeniency&lt;T&gt;(T a, T b, T leniency); // More Numerics void FactorPrimes&lt;T&gt;(T a, ...); T Factorial&lt;T&gt;(T a); T LinearInterpolation&lt;T&gt;(T x, T x0, T x1, T y0, T y1); T LeastCommonMultiple&lt;T&gt;(T a, T b, params T[] c); T GreatestCommonFactor&lt;T&gt;(T a, T b, params T[] c); LinearRegression2D&lt;T&gt;(..., out T slope, out T y_intercept); // Statistics T Mean&lt;T&gt;(T a, params T[] b); T Median&lt;T&gt;(params T[] values); Heap&lt;Link&lt;T, int&gt;&gt; Mode&lt;T&gt;(T a, params T[] b); void Range&lt;T&gt;(out T minimum, out T maximum, ...); T[] Quantiles&lt;T&gt;(int quantiles, ...); T GeometricMean&lt;T&gt;(...); T Variance&lt;T&gt;(...); T StandardDeviation&lt;T&gt;(...); T MeanDeviation&lt;T&gt;(...); // Vectors Vector&lt;T&gt; V1 = new Vector&lt;T&gt;(params T[] vector); Vector&lt;T&gt; V2 = new Vector&lt;T&gt;(params T[] vector); Vector&lt;T&gt; V3; T scalar; V3 = -V1; // Negate V3 = V1 + V2; // Add V3 = V1 - V2; // Subtract V3 = V1 * scalar; // Multiply V3 = V1 / scalar; // Divide scalar = V1.DotProduct(V2); // Dot Product V3 = V1.CrossProduct(V2); // Cross Product V1.Magnitude; // Magnitude V3 = V1.Normalize(); // Normalize bool equal = V1 == V2; // Equal // Matrices Matrix&lt;T&gt; M1 = new Matrix&lt;T&gt;(int rows, int columns); Matrix&lt;T&gt; M2 = new Matrix&lt;T&gt;(int rows, int columns); Matrix&lt;T&gt; M3; Vector&lt;T&gt; V2 = new Vector&lt;T&gt;(params T[] vector); Vector&lt;T&gt; V3; T scalar; M3 = -M1; // Negate M3 = M1 + M2; // Add M3 = M1 - M2; // Subtract M3 = M1 * M2; // Multiply V3 = M1 * V2; // Multiply (vector) M3 = M1 * scalar; // Multiply (scalar) M3 = M1 / scalar; // Divide M3 = M1 ^ 3; // Power scalar = M1.Determinent(); // Determinent M3 = M1.Minor(int row, int column); // Minor M3 = M1.Echelon(); // Echelon Form (REF) M3 = M1.ReducedEchelon(); // Reduced Echelon Form (RREF) M3 = M1.Inverse(); // Inverse M1.DecomposeLowerUpper(ref M2, ref M3); // Lower Upper Decomposition bool equal = M1 == M2; // Equal"><pre><span class="pl-c">// Logic Fundamentals</span> <span class="pl-smi">bool</span> <span class="pl-en">Equate</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span> <span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">bool</span> <span class="pl-en">LessThan</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">bool</span> <span class="pl-en">GreaterThan</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">CompareResult</span> <span class="pl-en">Compare</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Mathematics Fundamentals</span> <span class="pl-smi">T</span> <span class="pl-en">Negation</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">Addition</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">Subtraction</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">Multiplication</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">Division</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">Remainder</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// More Logic</span> <span class="pl-smi">bool</span> <span class="pl-en">IsPrime</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">bool</span> <span class="pl-en">IsEven</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">bool</span> <span class="pl-en">IsOdd</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">Minimum</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">Maximum</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">Clamp</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">value</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">floor</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">ceiling</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">AbsoluteValue</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">bool</span> <span class="pl-en">EqualityLeniency</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">leniency</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// More Numerics</span> <span class="pl-smi">void</span> <span class="pl-en">FactorPrimes</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> ..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">Factorial</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">LinearInterpolation</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">x</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">x0</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">x1</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">y0</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">y1</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">LeastCommonMultiple</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">,</span> <span class="pl-k">params</span> <span class="pl-smi">T</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">c</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">GreatestCommonFactor</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-smi">T</span> <span class="pl-s1">b</span><span class="pl-kos">,</span> <span class="pl-k">params</span> <span class="pl-smi">T</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">c</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">LinearRegression2D</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">T</span> <span class="pl-s1">slope</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">T</span> <span class="pl-s1">y_intercept</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Statistics</span> <span class="pl-smi">T</span> <span class="pl-en">Mean</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-k">params</span> <span class="pl-smi">T</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">Median</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-k">params</span> <span class="pl-smi">T</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">values</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">Heap</span><span class="pl-c1">&lt;</span><span class="pl-smi">Link</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-kos">,</span> <span class="pl-smi">int</span><span class="pl-c1">&gt;</span><span class="pl-c1">&gt;</span> <span class="pl-en">Mode</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">T</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-k">params</span> <span class="pl-smi">T</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">void</span> <span class="pl-en">Range</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-k">out</span> <span class="pl-smi">T</span> <span class="pl-s1">minimum</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">T</span> <span class="pl-s1">maximum</span><span class="pl-kos">,</span> ..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-en">Quantiles</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">int</span> <span class="pl-s1">quantiles</span><span class="pl-kos">,</span> ..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">GeometricMean</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">Variance</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">StandardDeviation</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-en">MeanDeviation</span><span class="pl-c1">&lt;</span><span class="pl-c1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Vectors</span> <span class="pl-smi">Vector</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">V1</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">Vector</span><span class="pl-c1">&lt;</span><span class="pl-s1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-k">params</span> <span class="pl-smi">T</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">vector</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">Vector</span><span class="pl-c1">&lt;</span><span class="pl-s1">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">V2</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">Vector</span><span class="pl-c1">&lt;</span><span class="pl-s1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-k">params</span> <span class="pl-smi">T</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">vector</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">Vector</span><span class="pl-c1">&lt;</span><span class="pl-s1">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">V3</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-s1">scalar</span><span class="pl-kos">;</span> <span class="pl-s1">V3</span> <span class="pl-c1">=</span> <span class="pl-c1">-</span><span class="pl-s1">V1</span><span class="pl-kos">;</span> <span class="pl-c">// Negate</span> <span class="pl-s1">V3</span> <span class="pl-c1">=</span> <span class="pl-s1">V1</span> <span class="pl-c1">+</span> <span class="pl-s1">V2</span><span class="pl-kos">;</span> <span class="pl-c">// Add</span> <span class="pl-s1">V3</span> <span class="pl-c1">=</span> <span class="pl-s1">V1</span> <span class="pl-c1">-</span> <span class="pl-s1">V2</span><span class="pl-kos">;</span> <span class="pl-c">// Subtract</span> <span class="pl-s1">V3</span> <span class="pl-c1">=</span> <span class="pl-s1">V1</span> <span class="pl-c1">*</span> <span class="pl-s1">scalar</span><span class="pl-kos">;</span> <span class="pl-c">// Multiply</span> <span class="pl-s1">V3</span> <span class="pl-c1">=</span> <span class="pl-s1">V1</span> <span class="pl-c1">/</span> <span class="pl-s1">scalar</span><span class="pl-kos">;</span> <span class="pl-c">// Divide</span> <span class="pl-s1">scalar</span> <span class="pl-c1">=</span> <span class="pl-s1">V1</span><span class="pl-kos">.</span><span class="pl-en">DotProduct</span><span class="pl-kos">(</span><span class="pl-s1">V2</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Dot Product</span> <span class="pl-s1">V3</span> <span class="pl-c1">=</span> <span class="pl-s1">V1</span><span class="pl-kos">.</span><span class="pl-en">CrossProduct</span><span class="pl-kos">(</span><span class="pl-s1">V2</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Cross Product</span> <span class="pl-s1">V1</span><span class="pl-kos">.</span><span class="pl-s1">Magnitude</span><span class="pl-c1"></span><span class="pl-kos">;</span> <span class="pl-c">// Magnitude</span> <span class="pl-s1">V3</span> <span class="pl-c1">=</span> <span class="pl-s1">V1</span><span class="pl-kos">.</span><span class="pl-en">Normalize</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Normalize</span> <span class="pl-smi">bool</span> <span class="pl-s1">equal</span> <span class="pl-c1">=</span> <span class="pl-s1">V1</span> <span class="pl-c1">==</span> <span class="pl-s1">V2</span><span class="pl-kos">;</span> <span class="pl-c">// Equal</span> <span class="pl-c">// Matrices</span> <span class="pl-smi">Matrix</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">M1</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">Matrix</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">int</span> <span class="pl-s1">rows</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">columns</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">Matrix</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">M2</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">Matrix</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-smi">int</span> <span class="pl-s1">rows</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">columns</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">Matrix</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">M3</span><span class="pl-kos">;</span> <span class="pl-smi">Vector</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">V2</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">Vector</span><span class="pl-c1">&lt;</span><span class="pl-s1">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span><span class="pl-k">params</span> <span class="pl-smi">T</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">vector</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">Vector</span><span class="pl-c1">&lt;</span><span class="pl-s1">T</span><span class="pl-c1">&gt;</span> <span class="pl-s1">V3</span><span class="pl-kos">;</span> <span class="pl-smi">T</span> <span class="pl-s1">scalar</span><span class="pl-kos">;</span> <span class="pl-s1">M3</span> <span class="pl-c1">=</span> <span class="pl-c1">-</span><span class="pl-s1">M1</span><span class="pl-kos">;</span> <span class="pl-c">// Negate</span> <span class="pl-s1">M3</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span> <span class="pl-c1">+</span> <span class="pl-s1">M2</span><span class="pl-kos">;</span> <span class="pl-c">// Add</span> <span class="pl-s1">M3</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span> <span class="pl-c1">-</span> <span class="pl-s1">M2</span><span class="pl-kos">;</span> <span class="pl-c">// Subtract</span> <span class="pl-s1">M3</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span> <span class="pl-c1">*</span> <span class="pl-s1">M2</span><span class="pl-kos">;</span> <span class="pl-c">// Multiply</span> <span class="pl-s1">V3</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span> <span class="pl-c1">*</span> <span class="pl-s1">V2</span><span class="pl-kos">;</span> <span class="pl-c">// Multiply (vector)</span> <span class="pl-s1">M3</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span> <span class="pl-c1">*</span> <span class="pl-s1">scalar</span><span class="pl-kos">;</span> <span class="pl-c">// Multiply (scalar)</span> <span class="pl-s1">M3</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span> <span class="pl-c1">/</span> <span class="pl-s1">scalar</span><span class="pl-kos">;</span> <span class="pl-c">// Divide</span> <span class="pl-s1">M3</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span> <span class="pl-c1">^</span> <span class="pl-c1">3</span><span class="pl-kos">;</span> <span class="pl-c">// Power</span> <span class="pl-s1">scalar</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span><span class="pl-kos">.</span><span class="pl-en">Determinent</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Determinent</span> <span class="pl-s1">M3</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span><span class="pl-kos">.</span><span class="pl-en">Minor</span><span class="pl-kos">(</span><span class="pl-smi">int</span> <span class="pl-s1">row</span><span class="pl-kos">,</span> <span class="pl-smi">int</span> <span class="pl-s1">column</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Minor</span> <span class="pl-s1">M3</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span><span class="pl-kos">.</span><span class="pl-en">Echelon</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Echelon Form (REF)</span> <span class="pl-s1">M3</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span><span class="pl-kos">.</span><span class="pl-en">ReducedEchelon</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Reduced Echelon Form (RREF)</span> <span class="pl-s1">M3</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span><span class="pl-kos">.</span><span class="pl-en">Inverse</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Inverse</span> <span class="pl-s1">M1</span><span class="pl-kos">.</span><span class="pl-en">DecomposeLowerUpper</span><span class="pl-kos">(</span><span class="pl-k">ref</span> <span class="pl-s1">M2</span><span class="pl-kos">,</span> <span class="pl-k">ref</span> <span class="pl-s1">M3</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Lower Upper Decomposition</span> <span class="pl-smi">bool</span> <span class="pl-s1">equal</span> <span class="pl-c1">=</span> <span class="pl-s1">M1</span> <span class="pl-c1">==</span> <span class="pl-s1">M2</span><span class="pl-kos">;</span> <span class="pl-c">// Equal</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> Symbolic Mathematics <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Parsing From Linq Expression Expression&lt;Func&lt;double, double&gt;&gt; exp1 = (x) =&gt; 2 * (x / 7); Symbolics.Expression symExp1 = Symbolics.Parse(exp1); // Parsing From String Symbolics.Expression symExp2 = Symbolics.Parse(&quot;2 * ([x] / 7)&quot;); // Mathematical Simplification Symbolics.Expression simplified = symExp1.Simplify(); // Variable Substitution symExp1.Substitute(&quot;x&quot;, 5);"><pre><span class="pl-c">// Parsing From Linq Expression</span> <span class="pl-smi">Expression</span><span class="pl-c1">&lt;</span><span class="pl-smi">Func</span><span class="pl-c1">&lt;</span><span class="pl-smi">double</span><span class="pl-kos">,</span> <span class="pl-smi">double</span><span class="pl-c1">&gt;</span><span class="pl-c1">&gt;</span> <span class="pl-s1">exp1</span> <span class="pl-c1">=</span> <span class="pl-kos">(</span><span class="pl-s1">x</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-c1">2</span> <span class="pl-c1">*</span> <span class="pl-kos">(</span><span class="pl-s1">x</span> <span class="pl-c1">/</span> <span class="pl-c1">7</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">Symbolics</span><span class="pl-kos">.</span><span class="pl-s1">Expression</span> <span class="pl-s1">symExp1</span> <span class="pl-c1">=</span> <span class="pl-s1">Symbolics</span><span class="pl-kos">.</span><span class="pl-en">Parse</span><span class="pl-kos">(</span><span class="pl-s1">exp1</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Parsing From String</span> <span class="pl-s1">Symbolics</span><span class="pl-kos">.</span><span class="pl-s1">Expression</span> <span class="pl-s1">symExp2</span> <span class="pl-c1">=</span> <span class="pl-s1">Symbolics</span><span class="pl-kos">.</span><span class="pl-en">Parse</span><span class="pl-kos">(</span><span class="pl-s">"2 * ([x] / 7)"</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Mathematical Simplification</span> <span class="pl-s1">Symbolics</span><span class="pl-kos">.</span><span class="pl-s1">Expression</span> <span class="pl-s1">simplified</span> <span class="pl-c1">=</span> <span class="pl-s1">symExp1</span><span class="pl-kos">.</span><span class="pl-en">Simplify</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Variable Substitution</span> <span class="pl-s1">symExp1</span><span class="pl-kos">.</span><span class="pl-en">Substitute</span><span class="pl-kos">(</span><span class="pl-s">"x"</span><span class="pl-kos">,</span> <span class="pl-c1">5</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> Measurement Mathematics <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <details> <summary> Supported Measurements <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <p dir="auto">Here are the currently supported measurement types:</p> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Acceleration: Length/Time/Time // AngularAcceleration: Angle/Time/Time // Angle: Angle // AngularSpeed: Angle/Time // Area: Length*Length // AreaDensity: Mass/Length/Length // Density: Mass/Length/Length/Length // ElectricCharge: ElectricCharge // ElectricCurrent: ElectricCharge/Time // Energy: Mass*Length*Length/Time/Time // Force: Mass*Length/Time/Time // Length: Length // LinearDensity: Mass/Length // LinearMass: Mass*Length // LinearMassFlow: Mass*Length/Time // Mass: Mass // MassRate: Mass/Time // Power: Mass*Length*Length/Time/Time/Time // Pressure: Mass/Length/Time/Time // Speed: Length/Time // Tempurature: Tempurature // Time: Time // TimeArea: Time*Time // Volume: Length*Length*Length // VolumeRate: Length*Length*Length/Time"><pre><span class="pl-c">// Acceleration: Length/Time/Time</span> <span class="pl-c">// AngularAcceleration: Angle/Time/Time</span> <span class="pl-c">// Angle: Angle</span> <span class="pl-c">// AngularSpeed: Angle/Time</span> <span class="pl-c">// Area: Length*Length</span> <span class="pl-c">// AreaDensity: Mass/Length/Length</span> <span class="pl-c">// Density: Mass/Length/Length/Length</span> <span class="pl-c">// ElectricCharge: ElectricCharge</span> <span class="pl-c">// ElectricCurrent: ElectricCharge/Time</span> <span class="pl-c">// Energy: Mass*Length*Length/Time/Time</span> <span class="pl-c">// Force: Mass*Length/Time/Time</span> <span class="pl-c">// Length: Length</span> <span class="pl-c">// LinearDensity: Mass/Length</span> <span class="pl-c">// LinearMass: Mass*Length</span> <span class="pl-c">// LinearMassFlow: Mass*Length/Time</span> <span class="pl-c">// Mass: Mass</span> <span class="pl-c">// MassRate: Mass/Time</span> <span class="pl-c">// Power: Mass*Length*Length/Time/Time/Time</span> <span class="pl-c">// Pressure: Mass/Length/Time/Time</span> <span class="pl-c">// Speed: Length/Time</span> <span class="pl-c">// Tempurature: Tempurature</span> <span class="pl-c">// Time: Time</span> <span class="pl-c">// TimeArea: Time*Time</span> <span class="pl-c">// Volume: Length*Length*Length</span> <span class="pl-c">// VolumeRate: Length*Length*Length/Time</span></pre></div> <p dir="auto">The measurement types are generated in the <em>Towel/Measurements/MeasurementTypes.tt</em> T4 text template file. The unit (enum) definitions are in the <em>Towel/Measurements/MeasurementUnitDefinitions.cs</em> file. Both measurment types and unit definitions can be easily added. If you think a measurement type or unit type should be added, please <a href="https://github.com/ZacharyPatten/Towel/issues/new/choose">submit an enhancement issue</a>.</p> </blockquote> <p dir="auto"></p> </details> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Towel has measurement types to help write scientific code: Acceleration&lt;T&gt;, Angle&lt;T&gt;, Area&lt;T&gt;, // Density&lt;T&gt;, Length&lt;T&gt;, Mass&lt;T&gt;, Speed&lt;T&gt;, Time&lt;T&gt;, Volume&lt;T&gt;, etc. // Automatic Unit Conversion // When you perform mathematical operations on measurements, any necessary unit conversions will // be automatically performed by the relative measurement type (in this case &quot;Angle&lt;T&gt;&quot;). Angle&lt;double&gt; angle1 = (90d, Degrees); Angle&lt;double&gt; angle2 = (.5d, Turns); Angle&lt;double&gt; result1 = angle1 + angle2; // 270° // Type Safeness // The type safe-ness of the measurement types prevents the miss-use of the measurements. You cannot // add &quot;Length&lt;T&gt;&quot; to &quot;Angle&lt;T&gt;&quot; because that is mathematically invalid (no operator exists). Length&lt;double&gt; length1 = (2d, Yards); object result2 = angle1 + length1; // WILL NOT COMPILE!!! // Simplify The Syntax Even Further // You can use alias to remove the generic type if you want to simplify the syntax even further. using Speedf = Towel.Measurements.Speed&lt;float&gt;; // at top of file Speedf speed1 = (5, Meters / Seconds); // Vector + Measurements // You can use the measurement types inside Towel Vectors. Vector&lt;Speed&lt;float&gt;&gt; velocity1 = new Vector&lt;Speed&lt;float&gt;&gt;( (1f, Meters / Seconds), (2f, Meters / Seconds), (3f, Meters / Seconds)); Vector&lt;Speedf&gt; velocity2 = new Vector&lt;Speedf&gt;( (1f, Centimeters / Seconds), (2f, Centimeters / Seconds), (3f, Centimeters / Seconds)); Vector&lt;Speed&lt;float&gt;&gt; velocity3 = velocity1 + velocity2; // Manual Unit Conversions // 1. Index Operator On Measurement Type double angle1_inRadians = angle1[Radians]; float speed1_inMilesPerHour = speed1[Miles / Hours]; // 2. Static Conversion Methods double angle3 = Angle&lt;double&gt;.Convert(7d, Radians, // from Degrees); // to double speed2 = Speed&lt;double&gt;.Convert(8d, Meters / Seconds, // from Miles / Hours); // to double force1 = Force&lt;double&gt;.Convert(9d, Kilograms * Meters / Seconds / Seconds, // from Grams * Miles / Hours / Hours); // to double angle4 = Measurement.Convert(10d, Radians, // from Degrees); // to // The unit conversion on the Measurement class // is still compile-time-safe. // Measurement Parsing Speed&lt;float&gt;.TryParse(&quot;20.5 Meters / Seconds&quot;, out Speed&lt;float&gt; parsedSpeed); Force&lt;decimal&gt;.TryParse(&quot;.1234 Kilograms * Meters / Seconds / Seconds&quot;, out Force&lt;decimal&gt; parsedForce);"><pre><span class="pl-c">// Towel has measurement types to help write scientific code: Acceleration&lt;T&gt;, Angle&lt;T&gt;, Area&lt;T&gt;, </span> <span class="pl-c">// Density&lt;T&gt;, Length&lt;T&gt;, Mass&lt;T&gt;, Speed&lt;T&gt;, Time&lt;T&gt;, Volume&lt;T&gt;, etc.</span> <span class="pl-c">// Automatic Unit Conversion</span> <span class="pl-c">// When you perform mathematical operations on measurements, any necessary unit conversions will</span> <span class="pl-c">// be automatically performed by the relative measurement type (in this case "Angle&lt;T&gt;").</span> <span class="pl-smi">Angle</span><span class="pl-c1">&lt;</span><span class="pl-smi">double</span><span class="pl-c1">&gt;</span> <span class="pl-s1">angle1</span> <span class="pl-c1">=</span> <span class="pl-kos">(</span><span class="pl-c1">90d</span><span class="pl-kos">,</span> <span class="pl-s1">Degrees</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">Angle</span><span class="pl-c1">&lt;</span><span class="pl-smi">double</span><span class="pl-c1">&gt;</span> <span class="pl-s1">angle2</span> <span class="pl-c1">=</span> <span class="pl-kos">(</span><span class="pl-c1">.5d</span><span class="pl-kos">,</span> <span class="pl-s1">Turns</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">Angle</span><span class="pl-c1">&lt;</span><span class="pl-smi">double</span><span class="pl-c1">&gt;</span> <span class="pl-s1">result1</span> <span class="pl-c1">=</span> <span class="pl-s1">angle1</span> <span class="pl-c1">+</span> <span class="pl-s1">angle2</span><span class="pl-kos">;</span> <span class="pl-c">// 270° </span> <span class="pl-c">// Type Safeness</span> <span class="pl-c">// The type safe-ness of the measurement types prevents the miss-use of the measurements. You cannot</span> <span class="pl-c">// add "Length&lt;T&gt;" to "Angle&lt;T&gt;" because that is mathematically invalid (no operator exists).</span> <span class="pl-smi">Length</span><span class="pl-c1">&lt;</span><span class="pl-smi">double</span><span class="pl-c1">&gt;</span> <span class="pl-s1">length1</span> <span class="pl-c1">=</span> <span class="pl-kos">(</span><span class="pl-c1">2d</span><span class="pl-kos">,</span> <span class="pl-s1">Yards</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">object</span> <span class="pl-s1">result2</span> <span class="pl-c1">=</span> <span class="pl-s1">angle1</span> <span class="pl-c1">+</span> <span class="pl-s1">length1</span><span class="pl-kos">;</span> <span class="pl-c">// WILL NOT COMPILE!!!</span> <span class="pl-c">// Simplify The Syntax Even Further</span> <span class="pl-c">// You can use alias to remove the generic type if you want to simplify the syntax even further.</span> <span class="pl-k">using</span> <span class="pl-s1">Speedf</span> <span class="pl-c1">=</span> <span class="pl-s1">Towel</span><span class="pl-kos">.</span><span class="pl-s1">Measurements</span><span class="pl-kos">.</span><span class="pl-smi">Speed</span><span class="pl-c1">&lt;</span><span class="pl-smi">float</span><span class="pl-c1">&gt;</span><span class="pl-kos">;</span> <span class="pl-c">// at top of file</span> <span class="pl-smi">Speedf</span> <span class="pl-s1">speed1</span> <span class="pl-c1">=</span> <span class="pl-kos">(</span><span class="pl-c1">5</span><span class="pl-kos">,</span> <span class="pl-s1">Meters</span> <span class="pl-c1">/</span> <span class="pl-s1">Seconds</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Vector + Measurements</span> <span class="pl-c">// You can use the measurement types inside Towel Vectors.</span> <span class="pl-smi">Vector</span><span class="pl-c1">&lt;</span><span class="pl-smi">Speed</span><span class="pl-c1">&lt;</span><span class="pl-smi">float</span><span class="pl-c1">&gt;</span><span class="pl-c1">&gt;</span> <span class="pl-s1">velocity1</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">Vector</span><span class="pl-c1">&lt;</span><span class="pl-smi">Speed</span><span class="pl-c1">&lt;</span><span class="pl-smi">float</span><span class="pl-c1">&gt;</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span> <span class="pl-kos">(</span><span class="pl-c1">1f</span><span class="pl-kos">,</span> <span class="pl-s1">Meters</span> <span class="pl-c1">/</span> <span class="pl-s1">Seconds</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-c1">2f</span><span class="pl-kos">,</span> <span class="pl-s1">Meters</span> <span class="pl-c1">/</span> <span class="pl-s1">Seconds</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-c1">3f</span><span class="pl-kos">,</span> <span class="pl-s1">Meters</span> <span class="pl-c1">/</span> <span class="pl-s1">Seconds</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">Vector</span><span class="pl-c1">&lt;</span><span class="pl-smi">Speedf</span><span class="pl-c1">&gt;</span> <span class="pl-s1">velocity2</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">Vector</span><span class="pl-c1">&lt;</span><span class="pl-smi">Speedf</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span> <span class="pl-kos">(</span><span class="pl-c1">1f</span><span class="pl-kos">,</span> <span class="pl-s1">Centimeters</span> <span class="pl-c1">/</span> <span class="pl-s1">Seconds</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-c1">2f</span><span class="pl-kos">,</span> <span class="pl-s1">Centimeters</span> <span class="pl-c1">/</span> <span class="pl-s1">Seconds</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-c1">3f</span><span class="pl-kos">,</span> <span class="pl-s1">Centimeters</span> <span class="pl-c1">/</span> <span class="pl-s1">Seconds</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">Vector</span><span class="pl-c1">&lt;</span><span class="pl-smi">Speed</span><span class="pl-c1">&lt;</span><span class="pl-smi">float</span><span class="pl-c1">&gt;</span><span class="pl-c1">&gt;</span> <span class="pl-s1">velocity3</span> <span class="pl-c1">=</span> <span class="pl-s1">velocity1</span> <span class="pl-c1">+</span> <span class="pl-s1">velocity2</span><span class="pl-kos">;</span> <span class="pl-c">// Manual Unit Conversions</span> <span class="pl-c">// 1. Index Operator On Measurement Type</span> <span class="pl-smi">double</span> <span class="pl-s1">angle1_inRadians</span> <span class="pl-c1">=</span> <span class="pl-s1">angle1</span><span class="pl-kos">[</span><span class="pl-s1">Radians</span><span class="pl-kos">]</span><span class="pl-kos">;</span> <span class="pl-smi">float</span> <span class="pl-s1">speed1_inMilesPerHour</span> <span class="pl-c1">=</span> <span class="pl-s1">speed1</span><span class="pl-kos">[</span><span class="pl-s1">Miles</span> <span class="pl-c1">/</span> <span class="pl-s1">Hours</span><span class="pl-kos">]</span><span class="pl-kos">;</span> <span class="pl-c">// 2. Static Conversion Methods</span> <span class="pl-smi">double</span> <span class="pl-s1">angle3</span> <span class="pl-c1">=</span> <span class="pl-smi">Angle</span><span class="pl-c1">&lt;</span><span class="pl-smi">double</span><span class="pl-c1">&gt;</span><span class="pl-kos">.</span><span class="pl-en">Convert</span><span class="pl-kos">(</span><span class="pl-c1">7d</span><span class="pl-kos">,</span> <span class="pl-s1">Radians</span><span class="pl-kos">,</span> <span class="pl-c">// from</span> <span class="pl-s1">Degrees</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// to</span> <span class="pl-smi">double</span> <span class="pl-s1">speed2</span> <span class="pl-c1">=</span> <span class="pl-smi">Speed</span><span class="pl-c1">&lt;</span><span class="pl-smi">double</span><span class="pl-c1">&gt;</span><span class="pl-kos">.</span><span class="pl-en">Convert</span><span class="pl-kos">(</span><span class="pl-c1">8d</span><span class="pl-kos">,</span> <span class="pl-s1">Meters</span> <span class="pl-c1">/</span> <span class="pl-s1">Seconds</span><span class="pl-kos">,</span> <span class="pl-c">// from</span> <span class="pl-s1">Miles</span> <span class="pl-c1">/</span> <span class="pl-s1">Hours</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// to</span> <span class="pl-smi">double</span> <span class="pl-s1">force1</span> <span class="pl-c1">=</span> <span class="pl-smi">Force</span><span class="pl-c1">&lt;</span><span class="pl-smi">double</span><span class="pl-c1">&gt;</span><span class="pl-kos">.</span><span class="pl-en">Convert</span><span class="pl-kos">(</span><span class="pl-c1">9d</span><span class="pl-kos">,</span> <span class="pl-s1">Kilograms</span> <span class="pl-c1">*</span> <span class="pl-s1">Meters</span> <span class="pl-c1">/</span> <span class="pl-s1">Seconds</span> <span class="pl-c1">/</span> <span class="pl-s1">Seconds</span><span class="pl-kos">,</span> <span class="pl-c">// from</span> <span class="pl-s1">Grams</span> <span class="pl-c1">*</span> <span class="pl-s1">Miles</span> <span class="pl-c1">/</span> <span class="pl-s1">Hours</span> <span class="pl-c1">/</span> <span class="pl-s1">Hours</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// to</span> <span class="pl-smi">double</span> <span class="pl-s1">angle4</span> <span class="pl-c1">=</span> <span class="pl-s1">Measurement</span><span class="pl-kos">.</span><span class="pl-en">Convert</span><span class="pl-kos">(</span><span class="pl-c1">10d</span><span class="pl-kos">,</span> <span class="pl-s1">Radians</span><span class="pl-kos">,</span> <span class="pl-c">// from</span> <span class="pl-s1">Degrees</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// to</span> <span class="pl-c">// The unit conversion on the Measurement class</span> <span class="pl-c">// is still compile-time-safe.</span> <span class="pl-c">// Measurement Parsing</span> <span class="pl-smi">Speed</span><span class="pl-c1">&lt;</span><span class="pl-smi">float</span><span class="pl-c1">&gt;</span><span class="pl-kos">.</span><span class="pl-en">TryParse</span><span class="pl-kos">(</span><span class="pl-s">"20.5 Meters / Seconds"</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">Speed</span><span class="pl-c1">&lt;</span><span class="pl-smi">float</span><span class="pl-c1">&gt;</span> <span class="pl-s1">parsedSpeed</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-smi">Force</span><span class="pl-c1">&lt;</span><span class="pl-smi">decimal</span><span class="pl-c1">&gt;</span><span class="pl-kos">.</span><span class="pl-en">TryParse</span><span class="pl-kos">(</span><span class="pl-s">".1234 Kilograms * Meters / Seconds / Seconds"</span><span class="pl-kos">,</span> <span class="pl-k">out</span> <span class="pl-smi">Force</span><span class="pl-c1">&lt;</span><span class="pl-smi">decimal</span><span class="pl-c1">&gt;</span> <span class="pl-s1">parsedForce</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> Console Helpers <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Just some helper methods for console applications... // wait for keypress to continue an intercept input ConsoleHelper.PromptPressToContinue(...); // generic method for retrieving validated console input ConsoleHelper.GetInput&lt;T&gt;(...); // animated ellipsis character to show processing ConsoleHelper.AnimatedEllipsis(...); // render progress bar in console ConsoleHelper.ProgressBar(...); // Console.ReadLine() with hidden input characters ConsoleHelper.HiddenReadLine(); // easily manage int-based console menus ConsoleHelper.IntMenu(...); // preventing console input ConsoleHelper.FlushInputBuffer();"><pre><span class="pl-c">// Just some helper methods for console applications...</span> <span class="pl-c">// wait for keypress to continue an intercept input</span> <span class="pl-s1">ConsoleHelper</span><span class="pl-kos">.</span><span class="pl-en">PromptPressToContinue</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// generic method for retrieving validated console input</span> <span class="pl-s1">ConsoleHelper</span><span class="pl-kos">.</span><span class="pl-smi">GetInput</span><span class="pl-c1">&lt;</span><span class="pl-smi">T</span><span class="pl-c1">&gt;</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// animated ellipsis character to show processing</span> <span class="pl-s1">ConsoleHelper</span><span class="pl-kos">.</span><span class="pl-en">AnimatedEllipsis</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// render progress bar in console</span> <span class="pl-s1">ConsoleHelper</span><span class="pl-kos">.</span><span class="pl-en">ProgressBar</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Console.ReadLine() with hidden input characters</span> <span class="pl-s1">ConsoleHelper</span><span class="pl-kos">.</span><span class="pl-en">HiddenReadLine</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// easily manage int-based console menus</span> <span class="pl-s1">ConsoleHelper</span><span class="pl-kos">.</span><span class="pl-en">IntMenu</span><span class="pl-kos">(</span>..<span class="pl-kos">.</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// preventing console input</span> <span class="pl-s1">ConsoleHelper</span><span class="pl-kos">.</span><span class="pl-en">FlushInputBuffer</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> TagAttribute <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// With TagAttribute's you can make value-based attributes so // you don't always have to make your own custom attribute types. // Just &quot;tag&quot; a code member with constant values. using System; using Towel; var (Found, Value) = typeof(MyClass).GetTag(&quot;My Tag&quot;); Console.WriteLine(&quot;My Tag...&quot;); Console.WriteLine(&quot;Found: &quot; + Found); Console.WriteLine(&quot;Value: &quot; + Value); [Tag(&quot;My Tag&quot;, &quot;hello world&quot;)] public class MyClass { }"><pre><span class="pl-c">// With TagAttribute's you can make value-based attributes so</span> <span class="pl-c">// you don't always have to make your own custom attribute types.</span> <span class="pl-c">// Just "tag" a code member with constant values.</span> <span class="pl-k">using</span> <span class="pl-s1">System</span><span class="pl-kos">;</span> <span class="pl-k">using</span> <span class="pl-s1">Towel</span><span class="pl-kos">;</span> <span class="pl-k">var</span> <span class="pl-kos">(</span><span class="pl-s1">Found</span><span class="pl-kos">,</span> <span class="pl-s1">Value</span><span class="pl-kos">)</span> <span class="pl-c1">=</span> <span class="pl-k">typeof</span><span class="pl-kos">(</span><span class="pl-smi">MyClass</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">GetTag</span><span class="pl-kos">(</span><span class="pl-s">"My Tag"</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">Console</span><span class="pl-kos">.</span><span class="pl-en">WriteLine</span><span class="pl-kos">(</span><span class="pl-s">"My Tag..."</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">Console</span><span class="pl-kos">.</span><span class="pl-en">WriteLine</span><span class="pl-kos">(</span><span class="pl-s">"Found: "</span> <span class="pl-c1">+</span> <span class="pl-s1">Found</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">Console</span><span class="pl-kos">.</span><span class="pl-en">WriteLine</span><span class="pl-kos">(</span><span class="pl-s">"Value: "</span> <span class="pl-c1">+</span> <span class="pl-s1">Value</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-kos">[</span><span class="pl-c1">Tag</span><span class="pl-kos">(</span><span class="pl-s">"My Tag"</span><span class="pl-kos">,</span> <span class="pl-s">"hello world"</span><span class="pl-kos">)</span><span class="pl-kos">]</span> <span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-smi">MyClass</span> <span class="pl-kos">{</span> <span class="pl-kos">}</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> SLazy&lt;T&gt; + ValueLazy&lt;T&gt; <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// SLazy&lt;T&gt; is a faster Lazy&lt;T&gt; when using the default // LazyThreadSafetyMode.ExecutionAndPublication setting. SLazy&lt;string&gt; slazy = new(() =&gt; &quot;hello world&quot;); Console.WriteLine(slazy.IsValueCreated); // False Console.WriteLine(slazy.Value); // hello world Console.WriteLine(slazy.IsValueCreated); // True // ValueLazy&lt;T&gt; is even faster than SLazy&lt;T&gt; but it // is unsafe as it will potentially call the factory // delegate multiple times if the struct is copied. // So please use ValueLazy&lt;T&gt; with caution. // There are various types for supporting no multithread lock, // no exception caching, and publication only locks."><pre><span class="pl-c">// SLazy&lt;T&gt; is a faster Lazy&lt;T&gt; when using the default</span> <span class="pl-c">// LazyThreadSafetyMode.ExecutionAndPublication setting.</span> <span class="pl-smi">SLazy</span><span class="pl-c1">&lt;</span><span class="pl-smi">string</span><span class="pl-c1">&gt;</span> <span class="pl-s1">slazy</span> <span class="pl-c1">=</span> <span class="pl-k">new</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-s">"hello world"</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">Console</span><span class="pl-kos">.</span><span class="pl-en">WriteLine</span><span class="pl-kos">(</span><span class="pl-s1">slazy</span><span class="pl-kos">.</span><span class="pl-s1">IsValueCreated</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// False</span> <span class="pl-s1">Console</span><span class="pl-kos">.</span><span class="pl-en">WriteLine</span><span class="pl-kos">(</span><span class="pl-s1">slazy</span><span class="pl-kos">.</span><span class="pl-s1">Value</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// hello world</span> <span class="pl-s1">Console</span><span class="pl-kos">.</span><span class="pl-en">WriteLine</span><span class="pl-kos">(</span><span class="pl-s1">slazy</span><span class="pl-kos">.</span><span class="pl-s1">IsValueCreated</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// True</span> <span class="pl-c">// ValueLazy&lt;T&gt; is even faster than SLazy&lt;T&gt; but it </span> <span class="pl-c">// is unsafe as it will potentially call the factory</span> <span class="pl-c">// delegate multiple times if the struct is copied.</span> <span class="pl-c">// So please use ValueLazy&lt;T&gt; with caution.</span> <span class="pl-c">// There are various types for supporting no multithread lock,</span> <span class="pl-c">// no exception caching, and publication only locks.</span></pre></div> <blockquote> <p dir="auto"><a href="https://zacharypatten.github.io/Towel/benchmarks/LazyInitializationBenchmarks.html" rel="nofollow">Initialization Benchmarks</a><br> <a href="https://zacharypatten.github.io/Towel/benchmarks/LazyCachingBenchmarks.html" rel="nofollow">Caching Benchmarks</a><br> <a href="https://zacharypatten.github.io/Towel/benchmarks/LazyConstructionBenchmarks.html" rel="nofollow">Construction Benchmarks</a></p> </blockquote> </blockquote> <p dir="auto"></p> </details> <details> <summary> SpanBuilder&lt;T&gt; + SStringBuilder <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// SpanBuilder&lt;char&gt; is a small helper for initializing // stack allocated spans. SpanBuilder&lt;char&gt; span = stackalloc char[10]; span.AppendLine(&quot;ab&quot;); // SStringBuilder is a small helper for initializing strings. // It will append to the span until the capacity is reached // and then it will revert to a StringBuilder if necessary // rather than throwing like SpanBuilder&lt;T&gt; does. SStringBuilder&lt;char&gt; span = stackalloc char[10]; span.AppendLine(&quot;abcdefghijklmnopqrstuvwxyz&quot;);"><pre><span class="pl-c">// SpanBuilder&lt;char&gt; is a small helper for initializing</span> <span class="pl-c">// stack allocated spans.</span> <span class="pl-smi">SpanBuilder</span><span class="pl-c1">&lt;</span><span class="pl-smi">char</span><span class="pl-c1">&gt;</span> <span class="pl-s1">span</span> <span class="pl-c1">=</span> <span class="pl-k">stackalloc</span> <span class="pl-smi">char</span><span class="pl-kos">[</span><span class="pl-c1">10</span><span class="pl-kos">]</span><span class="pl-kos">;</span> <span class="pl-s1">span</span><span class="pl-kos">.</span><span class="pl-en">AppendLine</span><span class="pl-kos">(</span><span class="pl-s">"ab"</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// SStringBuilder is a small helper for initializing strings.</span> <span class="pl-c">// It will append to the span until the capacity is reached</span> <span class="pl-c">// and then it will revert to a StringBuilder if necessary</span> <span class="pl-c">// rather than throwing like SpanBuilder&lt;T&gt; does.</span> <span class="pl-smi">SStringBuilder</span><span class="pl-c1">&lt;</span><span class="pl-smi">char</span><span class="pl-c1">&gt;</span> <span class="pl-s1">span</span> <span class="pl-c1">=</span> <span class="pl-k">stackalloc</span> <span class="pl-smi">char</span><span class="pl-kos">[</span><span class="pl-c1">10</span><span class="pl-kos">]</span><span class="pl-kos">;</span> <span class="pl-s1">span</span><span class="pl-kos">.</span><span class="pl-en">AppendLine</span><span class="pl-kos">(</span><span class="pl-s">"abcdefghijklmnopqrstuvwxyz"</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> </blockquote> <p dir="auto"></p> </details> <details> <summary> Command Line Parser <sub>[Expand]</sub> </summary> <p dir="auto"> </p><blockquote> <div class="highlight highlight-source-cs notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Just put the [Command] attribute on any method you want to call // from the command line, and call the &quot;HandleArguments&quot; method. using System; using static Towel.CommandLine; public static class Program { public static void Main(string[] args) { HandleArguments(args); } [Command] public static void A(int a) { Console.WriteLine(nameof(A) + &quot; called&quot;); Console.WriteLine(nameof(a) + &quot;: &quot; + a); } } // output: // dotnet run A --a 7 // A called // a: 7"><pre><span class="pl-c">// Just put the [Command] attribute on any method you want to call</span> <span class="pl-c">// from the command line, and call the "HandleArguments" method.</span> <span class="pl-k">using</span> <span class="pl-s1">System</span><span class="pl-kos">;</span> <span class="pl-k">using</span> <span class="pl-k">static</span> <span class="pl-s1">Towel</span><span class="pl-kos">.</span><span class="pl-s1">CommandLine</span><span class="pl-kos">;</span> <span class="pl-k">public</span> <span class="pl-k"><span class="pl-k">static</span></span> <span class="pl-k">class</span> <span class="pl-smi">Program</span> <span class="pl-kos">{</span> <span class="pl-k">public</span> <span class="pl-k"><span class="pl-k">static</span></span> <span class="pl-smi">void</span> <span class="pl-en">Main</span><span class="pl-kos">(</span><span class="pl-smi">string</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">args</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-s1">HandleArguments</span><span class="pl-kos">(</span><span class="pl-s1">args</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-kos">}</span> <span class="pl-kos">[</span><span class="pl-c1">Command</span><span class="pl-kos">]</span> <span class="pl-k">public</span> <span class="pl-k"><span class="pl-k">static</span></span> <span class="pl-smi">void</span> <span class="pl-en">A</span><span class="pl-kos">(</span><span class="pl-smi">int</span> <span class="pl-s1">a</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-s1">Console</span><span class="pl-kos">.</span><span class="pl-en">WriteLine</span><span class="pl-kos">(</span><span class="pl-s1">nameof</span><span class="pl-kos">(</span><span class="pl-s1">A</span><span class="pl-kos">)</span> <span class="pl-c1">+</span> <span class="pl-s">" called"</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">Console</span><span class="pl-kos">.</span><span class="pl-en">WriteLine</span><span class="pl-kos">(</span><span class="pl-s1">nameof</span><span class="pl-kos">(</span><span class="pl-s1">a</span><span class="pl-kos">)</span> <span class="pl-c1">+</span> <span class="pl-s">": "</span> <span class="pl-c1">+</span> <span class="pl-s1">a</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-c">// output:</span> <span class="pl-c">// dotnet run A --a 7</span> <span class="pl-c">// A called</span> <span class="pl-c">// a: 7</span></pre></div> </blockquote> <p dir="auto"></p> </details> </article></div></div></div></div></div> <!-- --> <!-- --> <script type="application/json" id="__PRIMER_DATA_:R0:__">{"resolvedServerColorMode":"day"}</script></div> </react-partial> <input type="hidden" data-csrf="true" value="/IuXZLPefReQ+yokzcfFgQXs06OEbJSF7CivJbauUumeodIiXeQ8fJ/kpp4fL/PnvrGLiuDd/Mol/UUSbfEkHg==" /> </div> <div data-view-component="true" class="Layout-sidebar"> <div class="BorderGrid about-margin" data-pjax> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <div class="hide-sm hide-md"> <h2 class="mb-3 h4">About</h2> <p class="f4 my-3"> Throw in the towel. </p> <h3 class="sr-only">Topics</h3> <div class="my-3"> <div class="f6"> <a href="/topics/console" title="Topic: console" data-view-component="true" class="topic-tag topic-tag-link"> console </a> <a href="/topics/sorting" title="Topic: sorting" data-view-component="true" class="topic-tag topic-tag-link"> sorting </a> <a href="/topics/library" title="Topic: library" data-view-component="true" class="topic-tag topic-tag-link"> library </a> <a href="/topics/algorithm" title="Topic: algorithm" data-view-component="true" class="topic-tag topic-tag-link"> algorithm </a> <a href="/topics/framework" title="Topic: framework" data-view-component="true" class="topic-tag topic-tag-link"> framework </a> <a href="/topics/functional" title="Topic: functional" data-view-component="true" class="topic-tag topic-tag-link"> functional </a> <a href="/topics/csharp" title="Topic: csharp" data-view-component="true" class="topic-tag topic-tag-link"> csharp </a> <a href="/topics/avl-tree" title="Topic: avl-tree" data-view-component="true" class="topic-tag topic-tag-link"> avl-tree </a> <a href="/topics/command-line" title="Topic: command-line" data-view-component="true" class="topic-tag topic-tag-link"> command-line </a> <a href="/topics/dotnet" title="Topic: dotnet" data-view-component="true" class="topic-tag topic-tag-link"> dotnet </a> <a href="/topics/xml" title="Topic: xml" data-view-component="true" class="topic-tag topic-tag-link"> xml </a> <a href="/topics/extensions" title="Topic: extensions" data-view-component="true" class="topic-tag topic-tag-link"> extensions </a> <a href="/topics/random" title="Topic: random" data-view-component="true" class="topic-tag topic-tag-link"> random </a> <a href="/topics/mathematics" title="Topic: mathematics" data-view-component="true" class="topic-tag topic-tag-link"> mathematics </a> <a href="/topics/data-structures" title="Topic: data-structures" data-view-component="true" class="topic-tag topic-tag-link"> data-structures </a> <a href="/topics/measurements" title="Topic: measurements" data-view-component="true" class="topic-tag topic-tag-link"> measurements </a> <a href="/topics/red-black-trees" title="Topic: red-black-trees" data-view-component="true" class="topic-tag topic-tag-link"> red-black-trees </a> <a href="/topics/towel" title="Topic: towel" data-view-component="true" class="topic-tag topic-tag-link"> towel </a> </div> </div> <h3 class="sr-only">Resources</h3> <div class="mt-2"> <a class="Link--muted" data-analytics-event="{&quot;category&quot;:&quot;Repository Overview&quot;,&quot;action&quot;:&quot;click&quot;,&quot;label&quot;:&quot;location:sidebar;file:readme&quot;}" href="#readme-ov-file"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book mr-2"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> Readme </a> </div> <h3 class="sr-only">License</h3> <div class="mt-2"> <a href="#MIT-1-ov-file" class="Link--muted" data-analytics-event="{&quot;category&quot;:&quot;Repository Overview&quot;,&quot;action&quot;:&quot;click&quot;,&quot;label&quot;:&quot;location:sidebar;file:license&quot;}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> MIT license </a> </div> <include-fragment src="/ZacharyPatten/Towel/hovercards/citation/sidebar_partial?tree_name=main"> </include-fragment> <div class="mt-2"> <a href="/ZacharyPatten/Towel/activity" data-view-component="true" class="Link Link--muted"><svg text="gray" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-2"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span class="color-fg-muted">Activity</span></a> </div> <h3 class="sr-only">Stars</h3> <div class="mt-2"> <a href="/ZacharyPatten/Towel/stargazers" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <strong>738</strong> stars</a> </div> <h3 class="sr-only">Watchers</h3> <div class="mt-2"> <a href="/ZacharyPatten/Towel/watchers" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-eye mr-2"> <path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"></path> </svg> <strong>28</strong> watching</a> </div> <h3 class="sr-only">Forks</h3> <div class="mt-2"> <a href="/ZacharyPatten/Towel/forks" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <strong>53</strong> forks</a> </div> <div class="mt-2"> <a class="Link--muted" href="/contact/report-content?content_url=https%3A%2F%2Fgithub.com%2FZacharyPatten%2FTowel&amp;report=ZacharyPatten+%28user%29"> Report repository </a> </div> </div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame"> <a href="/ZacharyPatten/Towel/releases" data-view-component="true" class="Link--primary no-underline Link">Releases <span title="24" data-view-component="true" class="Counter">24</span></a></h2> <a class="Link--primary d-flex no-underline" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/ZacharyPatten/Towel/releases/tag/1.0.40"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-tag flex-shrink-0 mt-1 color-fg-success"> <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path> </svg> <div class="ml-2 min-width-0"> <div class="d-flex"> <span class="css-truncate css-truncate-target text-bold mr-2" style="max-width: none;">v1.0.40</span> <span title="Label: Latest" data-view-component="true" class="Label Label--success flex-shrink-0"> Latest </span> </div> <div class="text-small color-fg-muted"><relative-time datetime="2021-10-29T16:47:07Z" class="no-wrap">Oct 29, 2021</relative-time></div> </div> </a> <div data-view-component="true" class="mt-3"> <a text="small" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/ZacharyPatten/Towel/releases" data-view-component="true" class="Link">+ 23 releases</a></div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3">Sponsor this project</h2> <include-fragment src="/ZacharyPatten/Towel/sponsors_list?block_button=true&amp;current_repository=Towel" aria-busy="true" aria-label="Loading sponsorable links"> <div class="d-flex mb-3"> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> <div class="Skeleton Skeleton--text flex-1 flex-self-center f4">&nbsp;</div> </div> <button type="button" disabled="disabled" data-view-component="true" class="btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart icon-sponsor mr-1 color-fg-sponsors"> <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> Sponsor </button></include-fragment> <div class="text-small mt-3"> <a href="/sponsors">Learn more about GitHub Sponsors</a> </div> </div> </div> <div class="BorderGrid-row" hidden> <div class="BorderGrid-cell"> <include-fragment src="/ZacharyPatten/Towel/used_by_list" accept="text/fragment+html"> </include-fragment> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/ZacharyPatten/Towel/graphs/contributors" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center">Contributors <span title="5" data-view-component="true" class="Counter ml-1">5</span></a></h2> <include-fragment src="/ZacharyPatten/Towel/contributors_list?count=5&amp;current_repository=Towel&amp;items_to_show=5" aria-busy="true" aria-label="Loading contributors"> <ul class="list-style-none d-flex flex-wrap mb-n2"> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> </ul> </include-fragment> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3">Languages</h2> <div class="mb-2"> <span data-view-component="true" class="Progress"> <span style="background-color:#178600 !important;;width: 100.0%;" itemprop="keywords" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> </span></div> <ul class="list-style-none"> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/ZacharyPatten/Towel/search?l=c%23" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#178600;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">C#</span> <span>100.0%</span> </a> </li> </ul> </div> </div> </div> </div> </div></div> </div> </div> </turbo-frame> </main> </div> </div> <footer class="footer pt-8 pb-6 f6 color-fg-muted p-responsive" role="contentinfo" > <h2 class='sr-only'>Footer</h2> <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap"> <div class="d-flex flex-items-center flex-shrink-0 mx-2"> <a aria-label="Homepage" title="GitHub" class="footer-octicon mr-2" href="https://github.com"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12 1C5.9225 1 1 5.9225 1 12C1 16.8675 4.14875 20.9787 8.52125 22.4362C9.07125 22.5325 9.2775 22.2025 9.2775 21.9137C9.2775 21.6525 9.26375 20.7862 9.26375 19.865C6.5 20.3737 5.785 19.1912 5.565 18.5725C5.44125 18.2562 4.905 17.28 4.4375 17.0187C4.0525 16.8125 3.5025 16.3037 4.42375 16.29C5.29 16.2762 5.90875 17.0875 6.115 17.4175C7.105 19.0812 8.68625 18.6137 9.31875 18.325C9.415 17.61 9.70375 17.1287 10.02 16.8537C7.5725 16.5787 5.015 15.63 5.015 11.4225C5.015 10.2262 5.44125 9.23625 6.1425 8.46625C6.0325 8.19125 5.6475 7.06375 6.2525 5.55125C6.2525 5.55125 7.17375 5.2625 9.2775 6.67875C10.1575 6.43125 11.0925 6.3075 12.0275 6.3075C12.9625 6.3075 13.8975 6.43125 14.7775 6.67875C16.8813 5.24875 17.8025 5.55125 17.8025 5.55125C18.4075 7.06375 18.0225 8.19125 17.9125 8.46625C18.6138 9.23625 19.04 10.2125 19.04 11.4225C19.04 15.6437 16.4688 16.5787 14.0213 16.8537C14.42 17.1975 14.7638 17.8575 14.7638 18.8887C14.7638 20.36 14.75 21.5425 14.75 21.9137C14.75 22.2025 14.9563 22.5462 15.5063 22.4362C19.8513 20.9787 23 16.8537 23 12C23 5.9225 18.0775 1 12 1Z"></path> </svg> </a> <span> &copy; 2025 GitHub,&nbsp;Inc. </span> </div> <nav aria-label="Footer"> <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3> <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading"> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to Terms&quot;,&quot;label&quot;:&quot;text:terms&quot;}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a> </li> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to privacy&quot;,&quot;label&quot;:&quot;text:privacy&quot;}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a> </li> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to security&quot;,&quot;label&quot;:&quot;text:security&quot;}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a> </li> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to status&quot;,&quot;label&quot;:&quot;text:status&quot;}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a> </li> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to docs&quot;,&quot;label&quot;:&quot;text:docs&quot;}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a> </li> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to contact&quot;,&quot;label&quot;:&quot;text:contact&quot;}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a> </li> <li class="mx-2" > <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;cookies&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;cookies_link_subfooter_footer&quot;}" > Manage cookies </button> </cookie-consent-link> </li> <li class="mx-2"> <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;dont_share_info&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;dont_share_info_link_subfooter_footer&quot;}" > Do not share my personal information </button> </cookie-consent-link> </li> </ul> </nav> </div> </footer> <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999" data-initial-cookie-consent-allowed="" data-cookie-consent-required="false"></ghcc-consent> <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> You can’t perform that action at this time. </div> <template id="site-details-dialog"> <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open> <summary role="button" aria-label="Close dialog"></summary> <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal"> <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div class="octocat-spinner my-6 js-details-dialog-spinner"></div> </details-dialog> </details> </template> <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;"> <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;"> </div> </div> <template id="snippet-clipboard-copy-button"> <div class="zeroclipboard-container position-absolute right-0 top-0"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> <template id="snippet-clipboard-copy-button-unpositioned"> <div class="zeroclipboard-container"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> </div> <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div> <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10