Autopsy  4.18.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
Classes | Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
org.sleuthkit.autopsy.communications.FiltersPanel Class Reference

Inherits JPanel.

Classes

class  CheckBoxIconPanel
 
class  DateControlState
 
class  DeviceCheckBoxComparator
 
class  FilterPanelRefresher
 

Public Member Functions

 FiltersPanel ()
 
void addNotify ()
 
void removeNotify ()
 
void setFilters (CommunicationsFilter commFilter)
 

Private Member Functions

void checkAllAccountTypesButtonActionPerformed (java.awt.event.ActionEvent evt)
 
void checkAllDevicesButtonActionPerformed (java.awt.event.ActionEvent evt)
 
CheckBoxIconPanel createAccoutTypeCheckBoxPanel (Account.Type type, boolean initalState)
 
void endCheckBoxStateChanged (javax.swing.event.ChangeEvent evt)
 
AccountTypeFilter getAccountTypeFilter ()
 
DateRangeFilter getDateRangeFilter ()
 
DeviceFilter getDeviceFilter ()
 
DateControlState getEndControlState ()
 
CommunicationsFilter getFilter ()
 
MostRecentFilter getMostRecentFilter ()
 
DateControlState getStartControlState ()
 
void initalizeDeviceAccountType ()
 
void initComponents ()
 
void limitComboBoxActionPerformed (java.awt.event.ActionEvent evt)
 
void setAccountTypeFilter (AccountTypeFilter typeFilter)
 
void setAllAccountTypesSelected (boolean selected)
 
void setAllDevicesSelected (boolean selected)
 
void setAllSelected (Map<?, JCheckBox > map, boolean selected)
 
void setDateTimeFiltersToDefault ()
 
void setDeviceFilter (DeviceFilter deviceFilter)
 
void setEndDateControlState (DateControlState state)
 
void setMostRecentFilter (MostRecentFilter filter)
 
void setStartDateControlState (DateControlState state)
 
void startCheckBoxStateChanged (javax.swing.event.ChangeEvent evt)
 
void unCheckAllAccountTypesButtonActionPerformed (java.awt.event.ActionEvent evt)
 
void unCheckAllDevicesButtonActionPerformed (java.awt.event.ActionEvent evt)
 
boolean updateAccountTypeFilter (List< Account.Type > accountTypesInUse, boolean checkNewOnes)
 
void updateDateTimePicker (Integer start, Integer end)
 
void updateDeviceFilterPanel (Map< String, DataSource > dataSourceMap, boolean checkNewOnes)
 
void updateTimeZone ()
 
void validateFilters ()
 
boolean validateLimitValue ()
 

Private Attributes

final javax.swing.JPanel accountTypeListPane = new javax.swing.JPanel()
 
final Map< Account.Type, JCheckBox > accountTypeMap = new HashMap<>()
 
final javax.swing.JLabel accountTypeRequiredLabel = new javax.swing.JLabel()
 
final javax.swing.JLabel accountTypesLabel = new javax.swing.JLabel()
 
final javax.swing.JPanel accountTypesPane = new javax.swing.JPanel()
 
final javax.swing.JScrollPane accountTypesScrollPane = new javax.swing.JScrollPane()
 
final javax.swing.JButton applyFiltersButton = new javax.swing.JButton()
 
final javax.swing.JButton checkAllAccountTypesButton = new javax.swing.JButton()
 
final javax.swing.JButton checkAllDevicesButton = new javax.swing.JButton()
 
final javax.swing.JLabel dateRangeLabel = new javax.swing.JLabel()
 
final javax.swing.JPanel dateRangePane = new javax.swing.JPanel()
 
boolean deviceAccountTypeEnabled
 
final javax.swing.JLabel deviceRequiredLabel = new javax.swing.JLabel()
 
final javax.swing.JLabel devicesLabel = new javax.swing.JLabel()
 
final javax.swing.JPanel devicesListPane = new javax.swing.JPanel()
 
final Map< String, JCheckBox > devicesMap = new HashMap<>()
 
final javax.swing.JPanel devicesPane = new javax.swing.JPanel()
 
final javax.swing.JScrollPane devicesScrollPane = new javax.swing.JScrollPane()
 
final javax.swing.JCheckBox endCheckBox = new javax.swing.JCheckBox()
 
final com.github.lgooddatepicker.components.DatePicker endDatePicker = new com.github.lgooddatepicker.components.DatePicker()
 
final javax.swing.JLabel filtersTitleLabel = new javax.swing.JLabel()
 
final PropertyChangeListener ingestJobListener
 
final PropertyChangeListener ingestListener
 
final javax.swing.JComboBox< String > limitComboBox = new javax.swing.JComboBox<>()
 
final javax.swing.JLabel limitErrorMsgLabel = new javax.swing.JLabel()
 
final javax.swing.JLabel limitHeaderLabel = new javax.swing.JLabel()
 
final javax.swing.JPanel limitPane = new javax.swing.JPanel()
 
final javax.swing.JPanel limitTitlePanel = new javax.swing.JPanel()
 
final javax.swing.JPanel mainPanel = new javax.swing.JPanel()
 
final javax.swing.JLabel mostRecentLabel = new javax.swing.JLabel()
 
boolean needsRefresh
 
final javax.swing.JLabel needsRefreshLabel = new javax.swing.JLabel()
 
Case openCase = null
 
final javax.swing.JButton refreshButton = new javax.swing.JButton()
 
final RefreshThrottler refreshThrottler
 
final javax.swing.JScrollPane scrollPane = new javax.swing.JScrollPane()
 
final javax.swing.JCheckBox startCheckBox = new javax.swing.JCheckBox()
 
final com.github.lgooddatepicker.components.DatePicker startDatePicker = new com.github.lgooddatepicker.components.DatePicker()
 
final javax.swing.JPanel topPane = new javax.swing.JPanel()
 
final javax.swing.JButton unCheckAllAccountTypesButton = new javax.swing.JButton()
 
final javax.swing.JButton unCheckAllDevicesButton = new javax.swing.JButton()
 
final ItemListener validationListener
 

Static Private Attributes

static final Set< IngestManager.IngestJobEvent > INGEST_JOB_EVENTS_OF_INTEREST = EnumSet.of(IngestManager.IngestJobEvent.COMPLETED)
 
static final Set< IngestManager.IngestModuleEvent > INGEST_MODULE_EVENTS_OF_INTEREST = EnumSet.of(DATA_ADDED)
 
static final Logger logger = Logger.getLogger(FiltersPanel.class.getName())
 
static final long serialVersionUID = 1L
 

Detailed Description

Panel that holds the Filter control widgets and triggers queries against the CommunicationsManager on user filtering changes.

Definition at line 74 of file FiltersPanel.java.

Constructor & Destructor Documentation

org.sleuthkit.autopsy.communications.FiltersPanel.FiltersPanel ( )

Member Function Documentation

void org.sleuthkit.autopsy.communications.FiltersPanel.addNotify ( )
void org.sleuthkit.autopsy.communications.FiltersPanel.checkAllAccountTypesButtonActionPerformed ( java.awt.event.ActionEvent  evt)
private

Definition at line 965 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.checkAllDevicesButtonActionPerformed ( java.awt.event.ActionEvent  evt)
private

Definition at line 973 of file FiltersPanel.java.

CheckBoxIconPanel org.sleuthkit.autopsy.communications.FiltersPanel.createAccoutTypeCheckBoxPanel ( Account.Type  type,
boolean  initalState 
)
private

Helper function to create a new instance of the CheckBoxIconPanel base on the Account.Type and initalState (check box state).

Parameters
typeAccount.Type to display on the panel
initalStateinitial check box state
Returns
instance of the CheckBoxIconPanel

Definition at line 311 of file FiltersPanel.java.

References org.sleuthkit.autopsy.communications.Utils.getIconFilePath().

void org.sleuthkit.autopsy.communications.FiltersPanel.endCheckBoxStateChanged ( javax.swing.event.ChangeEvent  evt)
private

Definition at line 982 of file FiltersPanel.java.

AccountTypeFilter org.sleuthkit.autopsy.communications.FiltersPanel.getAccountTypeFilter ( )
private

Get an AccountTypeFilter that matches the state of the UI widgets

Returns
an AccountTypeFilter

Definition at line 875 of file FiltersPanel.java.

DateRangeFilter org.sleuthkit.autopsy.communications.FiltersPanel.getDateRangeFilter ( )
private

Get an DateRangeFilter that matches the state of the UI widgets

Returns
an DateRangeFilter

Definition at line 889 of file FiltersPanel.java.

References org.sleuthkit.autopsy.communications.Utils.getUserPreferredZoneId().

DeviceFilter org.sleuthkit.autopsy.communications.FiltersPanel.getDeviceFilter ( )
private

Get a DeviceFilter that matches the state of the UI widgets.

Returns
a DeviceFilter

Definition at line 861 of file FiltersPanel.java.

DateControlState org.sleuthkit.autopsy.communications.FiltersPanel.getEndControlState ( )
private

Definition at line 920 of file FiltersPanel.java.

CommunicationsFilter org.sleuthkit.autopsy.communications.FiltersPanel.getFilter ( )
private

Get an instance of CommunicationsFilters base on the current panel state.

Returns
an instance of CommunicationsFilter

Definition at line 845 of file FiltersPanel.java.

MostRecentFilter org.sleuthkit.autopsy.communications.FiltersPanel.getMostRecentFilter ( )
private

Get a MostRecentFilter that based on the current state of the ui controls.

Returns
A new instance of MostRecentFilter

Definition at line 902 of file FiltersPanel.java.

DateControlState org.sleuthkit.autopsy.communications.FiltersPanel.getStartControlState ( )
private

Definition at line 916 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.initalizeDeviceAccountType ( )
private

Definition at line 268 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.initComponents ( )
private

This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The content of this method is always regenerated by the Form Editor.

Definition at line 469 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.limitComboBoxActionPerformed ( java.awt.event.ActionEvent  evt)
private

Definition at line 987 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.removeNotify ( )
void org.sleuthkit.autopsy.communications.FiltersPanel.setAccountTypeFilter ( AccountTypeFilter  typeFilter)
private

Set the state of the account type checkboxes to match the passed in filter

Parameters
typeFilterAccount Types to be selected

Definition at line 405 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.setAllAccountTypesSelected ( boolean  selected)
private

Set the selection state of all the account type check boxes

Parameters
selectedThe selection state to set the check boxes to.

Definition at line 930 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.setAllDevicesSelected ( boolean  selected)
private

Set the selection state of all the device check boxes

Parameters
selectedThe selection state to set the check boxes to.

Definition at line 940 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.setAllSelected ( Map<?, JCheckBox >  map,
boolean  selected 
)
private

Helper method that sets all the check boxes in the given map to the given selection state.

Parameters
mapA map from anything to JCheckBoxes.
selectedThe selection state to set all the check boxes to.

Definition at line 952 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.setDateTimeFiltersToDefault ( )
private

Definition at line 956 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.setDeviceFilter ( DeviceFilter  deviceFilter)
private

Sets the state of the device filter check boxes

Parameters
deviceFilterSelected devices

Definition at line 392 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.setEndDateControlState ( DateControlState  state)
private

Set up the endDatePicker and endCheckBox based on the passed in DateControlState.

Parameters
statenew control state

Definition at line 430 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.setFilters ( CommunicationsFilter  commFilter)

Given a list of subFilters, set the states of the panel controls accordingly.

Parameters
commFilterContains a list of subFilters

Definition at line 374 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.setMostRecentFilter ( MostRecentFilter  filter)
private

Sets the state of the most recent UI controls based on the current values in MostRecentFilter.

Parameters
filterThe MostRecentFilter state to be set

Definition at line 442 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.setStartDateControlState ( DateControlState  state)
private

Set up the startDatePicker and startCheckBox based on the passed in DateControlState.

Parameters
statenew control state

Definition at line 418 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.startCheckBoxStateChanged ( javax.swing.event.ChangeEvent  evt)
private

Definition at line 977 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.unCheckAllAccountTypesButtonActionPerformed ( java.awt.event.ActionEvent  evt)
private

Definition at line 961 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.unCheckAllDevicesButtonActionPerformed ( java.awt.event.ActionEvent  evt)
private

Definition at line 969 of file FiltersPanel.java.

boolean org.sleuthkit.autopsy.communications.FiltersPanel.updateAccountTypeFilter ( List< Account.Type >  accountTypesInUse,
boolean  checkNewOnes 
)
private

Populate the Account Types filter widgets.

Parameters
accountTypesInUseList of accountTypes currently in use
checkNewOnes
Returns
True, if a new accountType was found

Definition at line 282 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.updateDateTimePicker ( Integer  start,
Integer  end 
)
private
void org.sleuthkit.autopsy.communications.FiltersPanel.updateDeviceFilterPanel ( Map< String, DataSource >  dataSourceMap,
boolean  checkNewOnes 
)
private

Populate the devices filter widgets.

Parameters
dataSourceMap
checkNewOnes
Returns
true if a new device was found

Definition at line 329 of file FiltersPanel.java.

void org.sleuthkit.autopsy.communications.FiltersPanel.updateTimeZone ( )
private
void org.sleuthkit.autopsy.communications.FiltersPanel.validateFilters ( )
private

Validate that filters are in a consistent state and will result in some results. Checks that at least one device and at least one account type is selected. Disables the apply and refresh button and shows warnings if the filters are not valid.

Definition at line 195 of file FiltersPanel.java.

boolean org.sleuthkit.autopsy.communications.FiltersPanel.validateLimitValue ( )
private

Definition at line 209 of file FiltersPanel.java.

Member Data Documentation

final javax.swing.JPanel org.sleuthkit.autopsy.communications.FiltersPanel.accountTypeListPane = new javax.swing.JPanel()
private

Definition at line 1034 of file FiltersPanel.java.

final Map<Account.Type, JCheckBox> org.sleuthkit.autopsy.communications.FiltersPanel.accountTypeMap = new HashMap<>()
private

Map from Account.Type to the checkbox for that account type's filter.

Definition at line 84 of file FiltersPanel.java.

final javax.swing.JLabel org.sleuthkit.autopsy.communications.FiltersPanel.accountTypeRequiredLabel = new javax.swing.JLabel()
private

Definition at line 1035 of file FiltersPanel.java.

final javax.swing.JLabel org.sleuthkit.autopsy.communications.FiltersPanel.accountTypesLabel = new javax.swing.JLabel()
private

Definition at line 1036 of file FiltersPanel.java.

final javax.swing.JPanel org.sleuthkit.autopsy.communications.FiltersPanel.accountTypesPane = new javax.swing.JPanel()
private

Definition at line 1037 of file FiltersPanel.java.

final javax.swing.JScrollPane org.sleuthkit.autopsy.communications.FiltersPanel.accountTypesScrollPane = new javax.swing.JScrollPane()
private

Definition at line 1038 of file FiltersPanel.java.

final javax.swing.JButton org.sleuthkit.autopsy.communications.FiltersPanel.applyFiltersButton = new javax.swing.JButton()
private

Definition at line 1039 of file FiltersPanel.java.

final javax.swing.JButton org.sleuthkit.autopsy.communications.FiltersPanel.checkAllAccountTypesButton = new javax.swing.JButton()
private

Definition at line 1040 of file FiltersPanel.java.

final javax.swing.JButton org.sleuthkit.autopsy.communications.FiltersPanel.checkAllDevicesButton = new javax.swing.JButton()
private

Definition at line 1041 of file FiltersPanel.java.

final javax.swing.JLabel org.sleuthkit.autopsy.communications.FiltersPanel.dateRangeLabel = new javax.swing.JLabel()
private

Definition at line 1042 of file FiltersPanel.java.

final javax.swing.JPanel org.sleuthkit.autopsy.communications.FiltersPanel.dateRangePane = new javax.swing.JPanel()
private

Definition at line 1043 of file FiltersPanel.java.

boolean org.sleuthkit.autopsy.communications.FiltersPanel.deviceAccountTypeEnabled
private

Is the device account type filter enabled or not. It should be enabled when the Table/Brows mode is active and disabled when the visualization is active. Initially false since the browse/table mode is active initially.

Definition at line 119 of file FiltersPanel.java.

final javax.swing.JLabel org.sleuthkit.autopsy.communications.FiltersPanel.deviceRequiredLabel = new javax.swing.JLabel()
private

Definition at line 1044 of file FiltersPanel.java.

final javax.swing.JLabel org.sleuthkit.autopsy.communications.FiltersPanel.devicesLabel = new javax.swing.JLabel()
private

Definition at line 1045 of file FiltersPanel.java.

final javax.swing.JPanel org.sleuthkit.autopsy.communications.FiltersPanel.devicesListPane = new javax.swing.JPanel()
private

Definition at line 1046 of file FiltersPanel.java.

final Map<String, JCheckBox> org.sleuthkit.autopsy.communications.FiltersPanel.devicesMap = new HashMap<>()
private

Map from datasource device id to the checkbox for that datasource.

Definition at line 90 of file FiltersPanel.java.

final javax.swing.JPanel org.sleuthkit.autopsy.communications.FiltersPanel.devicesPane = new javax.swing.JPanel()
private

Definition at line 1047 of file FiltersPanel.java.

final javax.swing.JScrollPane org.sleuthkit.autopsy.communications.FiltersPanel.devicesScrollPane = new javax.swing.JScrollPane()
private

Definition at line 1048 of file FiltersPanel.java.

final javax.swing.JCheckBox org.sleuthkit.autopsy.communications.FiltersPanel.endCheckBox = new javax.swing.JCheckBox()
private

Definition at line 1049 of file FiltersPanel.java.

final com.github.lgooddatepicker.components.DatePicker org.sleuthkit.autopsy.communications.FiltersPanel.endDatePicker = new com.github.lgooddatepicker.components.DatePicker()
private

Definition at line 1050 of file FiltersPanel.java.

final javax.swing.JLabel org.sleuthkit.autopsy.communications.FiltersPanel.filtersTitleLabel = new javax.swing.JLabel()
private

Definition at line 1051 of file FiltersPanel.java.

final Set<IngestManager.IngestJobEvent> org.sleuthkit.autopsy.communications.FiltersPanel.INGEST_JOB_EVENTS_OF_INTEREST = EnumSet.of(IngestManager.IngestJobEvent.COMPLETED)
staticprivate

Definition at line 78 of file FiltersPanel.java.

final Set<IngestManager.IngestModuleEvent> org.sleuthkit.autopsy.communications.FiltersPanel.INGEST_MODULE_EVENTS_OF_INTEREST = EnumSet.of(DATA_ADDED)
staticprivate

Definition at line 79 of file FiltersPanel.java.

final PropertyChangeListener org.sleuthkit.autopsy.communications.FiltersPanel.ingestJobListener
private

Definition at line 96 of file FiltersPanel.java.

final PropertyChangeListener org.sleuthkit.autopsy.communications.FiltersPanel.ingestListener
private

Listens to ingest events to enable refresh button

Definition at line 95 of file FiltersPanel.java.

final javax.swing.JComboBox<String> org.sleuthkit.autopsy.communications.FiltersPanel.limitComboBox = new javax.swing.JComboBox<>()
private

Definition at line 1052 of file FiltersPanel.java.

final javax.swing.JLabel org.sleuthkit.autopsy.communications.FiltersPanel.limitErrorMsgLabel = new javax.swing.JLabel()
private

Definition at line 1053 of file FiltersPanel.java.

final javax.swing.JLabel org.sleuthkit.autopsy.communications.FiltersPanel.limitHeaderLabel = new javax.swing.JLabel()
private

Definition at line 1054 of file FiltersPanel.java.

final javax.swing.JPanel org.sleuthkit.autopsy.communications.FiltersPanel.limitPane = new javax.swing.JPanel()
private

Definition at line 1055 of file FiltersPanel.java.

final javax.swing.JPanel org.sleuthkit.autopsy.communications.FiltersPanel.limitTitlePanel = new javax.swing.JPanel()
private

Definition at line 1056 of file FiltersPanel.java.

final Logger org.sleuthkit.autopsy.communications.FiltersPanel.logger = Logger.getLogger(FiltersPanel.class.getName())
staticprivate

Definition at line 77 of file FiltersPanel.java.

final javax.swing.JPanel org.sleuthkit.autopsy.communications.FiltersPanel.mainPanel = new javax.swing.JPanel()
private

Definition at line 1057 of file FiltersPanel.java.

final javax.swing.JLabel org.sleuthkit.autopsy.communications.FiltersPanel.mostRecentLabel = new javax.swing.JLabel()
private

Definition at line 1058 of file FiltersPanel.java.

boolean org.sleuthkit.autopsy.communications.FiltersPanel.needsRefresh
private

Flag that indicates the UI is not up-to-date with respect to the case DB and it should be refreshed (by reapplying the filters).

Definition at line 102 of file FiltersPanel.java.

final javax.swing.JLabel org.sleuthkit.autopsy.communications.FiltersPanel.needsRefreshLabel = new javax.swing.JLabel()
private

Definition at line 1059 of file FiltersPanel.java.

Case org.sleuthkit.autopsy.communications.FiltersPanel.openCase = null
private

Definition at line 121 of file FiltersPanel.java.

final javax.swing.JButton org.sleuthkit.autopsy.communications.FiltersPanel.refreshButton = new javax.swing.JButton()
private

Definition at line 1060 of file FiltersPanel.java.

final RefreshThrottler org.sleuthkit.autopsy.communications.FiltersPanel.refreshThrottler
private

Definition at line 111 of file FiltersPanel.java.

final javax.swing.JScrollPane org.sleuthkit.autopsy.communications.FiltersPanel.scrollPane = new javax.swing.JScrollPane()
private

Definition at line 1061 of file FiltersPanel.java.

final long org.sleuthkit.autopsy.communications.FiltersPanel.serialVersionUID = 1L
staticprivate

Definition at line 76 of file FiltersPanel.java.

final javax.swing.JCheckBox org.sleuthkit.autopsy.communications.FiltersPanel.startCheckBox = new javax.swing.JCheckBox()
private

Definition at line 1062 of file FiltersPanel.java.

final com.github.lgooddatepicker.components.DatePicker org.sleuthkit.autopsy.communications.FiltersPanel.startDatePicker = new com.github.lgooddatepicker.components.DatePicker()
private

Definition at line 1063 of file FiltersPanel.java.

final javax.swing.JPanel org.sleuthkit.autopsy.communications.FiltersPanel.topPane = new javax.swing.JPanel()
private

Definition at line 1064 of file FiltersPanel.java.

final javax.swing.JButton org.sleuthkit.autopsy.communications.FiltersPanel.unCheckAllAccountTypesButton = new javax.swing.JButton()
private

Definition at line 1065 of file FiltersPanel.java.

final javax.swing.JButton org.sleuthkit.autopsy.communications.FiltersPanel.unCheckAllDevicesButton = new javax.swing.JButton()
private

Definition at line 1066 of file FiltersPanel.java.

final ItemListener org.sleuthkit.autopsy.communications.FiltersPanel.validationListener
private

Listen to check box state changes and validates that at least one box is selected for device and account type ( other wise there will be no results)

Definition at line 109 of file FiltersPanel.java.


The documentation for this class was generated from the following file:

Copyright © 2012-2021 Basis Technology. Generated on: Thu Jul 8 2021
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.