GithubHelp home page GithubHelp logo

cc3d-player5's Introduction

CompuCell3D

CompuCell3D is a multiscale multicellular virtual tissue modeling and simulation environment. CompuCell3D is written in C++ and provides Python bindings for model and simulation development in Python. CompuCell3D is supported on Windows, Mac and Linux.

Installation

Binaries

Binary distributions of CompuCell3D are available for download at the CompuCell3D project page. Binaries of CompuCell3D are also available via conda,

conda install -c compucell3d -c conda-forge cc3d

Source

Instructions for building CompuCell3D from source are available at the CompuCell3D project page.

Getting Started

cc3d-player5's People

Contributors

compucell3d avatar fyffep avatar maciekswat avatar tjsego avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

cc3d-player5's Issues

Screenshots not being handled properly on multiple clicks of the camera iocon for a particular window.

Compuell3D v 4.6.0 candidate
If you click on the camera icon in a Player window you get multiple screenshot descriptions for the same window. Past behavior was that there was only one screenshot per window. I believe changes were made so that a user could save screenshots from multiple windows. For example a full width cell field and a zoomed cell field. But the changes now allow multiple screen shot descriptions for a single window.

And there is no easy way to edit the screenshots list other than clearing the list and starting over.

In the image below, notice three different screenshot descriptions for the one Cell_Field window.
image

I believe the desired behavior is that a window can have no more than one screenshot description. If a user wants, for example, multiple screenshots of the cell_field then they need to open multiple sub-windows showing the cell_field and then use the camera icon in each. In previous version of Player that did not work since the screenshot folder and files were named for what is selected in the window's drop down box and that selection is the same across all windows showing the cell_field.

A new click of the camera for a particular window should clear the previous screenshot description for that window.

Random number not getting randomized and all runs are identical

CC3D 4.3.2 (I think 4.3.1 as well)
Windows 11 (I think 10 as well)

CC3D runs are identical as if the random seed is not getting randomized by the system clock or there is an explicit seed hidden somewhere.

Basic CC3D simulation, no explicit import of random module in python, no seed specification in the xml.

Simulations that use AdhesionFlex crash if restart files are requested.

CC3D 4.1.1, windows 11
AdhesionFlex_Restart_bug.zip

Simulations that use AdhesionFlex crash Player if Restart snapshots are requested.
Attached code runs OK if Restart snapshots not requested. Crashes at the Restart MCS if snapshots are requested.

Command window log:

outputRestartFiles

cc3d_sim_output_dir= C:\Users\jsluka\CC3DWorkspace\AdhesionFlex_Restart_bug_cc3d_08_04_2023_17_59_25
list_flag= False

Traceback (most recent call last):

File "C:\CompuCell3D\Miniconda3\lib\site-packages\cc3d\CompuCellSetup\sim_runner.py", line 79, in run_cc3d_project
exec(code, globals(), locals())

File "C:\Users\jsluka\OneDrive - Indiana University\Desktop\Jims Compucell\AdhesionFlex_Restart_bug\AdhesionFlex_Restart_bug\Simulation\AdhesionFlex.py", line 6, in
CompuCellSetup.run()

File "C:\CompuCell3D\Miniconda3\lib\site-packages\cc3d\CompuCellSetup\simulation_setup.py", line 160, in run
main_loop_fcn(simulator, simthread=simthread, steppable_registry=steppable_registry)

File "C:\CompuCell3D\Miniconda3\lib\site-packages\cc3d\player5\Simulation\main_loops.py", line 77, in main_loop_player restart_manager.output_restart_files(cur_step)

File "C:\CompuCell3D\Miniconda3\lib\site-packages\cc3d\core\RestartManager.py", line 1259, in output_restart_files
self.output_adhesion_flex_plugin(restart_output_path, rst_xml_elem)

File "C:\CompuCell3D\Miniconda3\lib\site-packages\cc3d\core\RestartManager.py", line 1709, in output_adhesion_flex_plugin
pickle.dump(number_of_cells, pf)

TypeError: write() argument must be str, not bytes

projParent= AdhesionFlex_Restart_bug.cc3d

CurrentItem= AdhesionFlex_Restart_bug.cc3d parent= None

projParent= AdhesionFlex_Restart_bug.cc3d

getFullPath=

projParent= AdhesionFlex_Restart_bug.cc3d

CurrentItem= AdhesionFlex_Restart_bug.cc3d parent= None

projParent= AdhesionFlex_Restart_bug.cc3d

getFullPath=

Player is loading numpy autmatically?

Is Player loading numpy automatically? If I add
np.random.seed(423)
to my python script it does not throw and error even though I did not load numpy.

But if I add
numpy.random.seed(423)
or
random.seed(423)
then it crashes (as expected) since those modules haven't been loaded.

This suggest that some part of Player is loading numpy.

Can't return a regular dictionary from an SBML model attached to a cell.

The snippet for "get SBML state for individual cell" inserts the code

            # returns dictionary of values
            state = cell.sbml.MODELNAME

But the "state" is not an iterable dictionary, so

            for key in state:
                print(k,state[k])

gives an error "TypeError: in method 'ExecutableModel___getitem__', argument 2 of type 'std::string const &'"

Note that

       print(state['D'])
       state['D']=42

works just like they should. You just can't iterate over the "dictionary".

As a test, try iterating over the SBML dictionary in the demo at
C:\CompuCell3D\Demos\SBMLSolverExamples\DeltaNotch\

            # returns dictionary of values
            #state = cell.sbml.MODELNAME
            state = cell.sbml.DN
            print("state['D']=",state['D'])     # this works
            
            print(state)     # does not print the dictionary
            for key in state:    # throws an error
                print(k,state[k])

scalar_field_cell_level don't render in 3D

If you assign a scalar_field_cell_level to cells, those values do not render in 3D window showing the field. Instead, the cells are rendered with whatever color is assigned to the cell. The field does render properly in 2D. In the attached image the upper left hand window is a scalar_field_cell_level in 3D that is colored wrong, and the right hand upper image is a 2D display of another scalar_field_cell_level the colors correctly.

Untitled

Frozen cells in 3D with cell borders do not render properly

CC3D 4.3.1, Windows 10
If you have frozen cells, display a windows in 3D, and have cell borders turned on the frozen cells are not displayed if they contact moving cells. In the attached images the light blue cells are frozen and start as a solid sheet of cells. The green cells are growing. If cell borders are turned on then as the frozen blue cells contact growing green cells the blue cells are no longer drawn.
1

In the second screen shot the cell borders are turned off and the cells render properly. So the cells are there, they just are not rendering properly in 3D with cell borders on.
2

Pressing Ctrl+Shift+Escape causes player crash

This issue has been reported earlier. Needs fixing
Traceback (most recent call last):
File "C:\Miniconda3\envs\c1_test\lib\site-packages\cc3d\player5\Utilities\QVTKRenderWindowInteractor.py", line 499, in keyPressEvent
if shift and len(keySym) == 1 and keySym.isalpha():
TypeError: object of type 'NoneType' has no len()
Simulator: extra destroy for boundary strategy

Add a Menu to Browse Demos

This panel should:

  • explain what each demo does with a short description
  • allow a person to open the .cc3d file of the demo without using File Explorer
  • enable searching (and index each demo by a number of key words or the code within)

When reloading simuation snapshots (dml fies) you can't change which cells are shown in 3D

CC3D 4.3.1, Windows 10
In Player, when you reload a set of vtk files via the dml file list you can not change which cells are displayed or not. Neither the check boxes in the cell list, or the settings dialogs will let you change which cell types are displayed.

Also, when loading the dml file it would be nice if player automatically stepped to the first image. As it is now, there is no visual confirmation the file is loaded and the user has to hit the step button to see anything.

Be nice to be able to color a field by the gradient.

Be nice to be able to color a field by the field's gradient.

Chemotaxis is by the field's gradient and not the field's value.

You can judge the steepness of a field's gradient if you display contour lines (like you would on a topological map). But it would be nice to be able display the gradient itself as a heat map.

Reassigning a cell's clusterId erases the cell's dictionary.

CC3D 4.4.0 (Windows 11)
Cluster_dictionary_bug.zip

Reassigning a cell to a new cluster erases the dictionary associated with the cell.

The attached sim starts with 13 cells. Each gets a dictionary assigned to it ('info').

The 13 cells are then collapsed into one cluster with
self.reassign_cluster_id(cell, cell1.clusterId)

The cells have lost there dictionaries after they are merged into the same cluster. Only the cell that was originally in the cluster keeps its dictionary.

Console output:

Before cluster reasssign
1: cell.clusterId,cell.id,cell.dict: 1 1 {'info': '1 1'}
1: cell.clusterId,cell.id,cell.dict: 2 2 {'info': '2 1'}
1: cell.clusterId,cell.id,cell.dict: 3 3 {'info': '3 1'}
1: cell.clusterId,cell.id,cell.dict: 4 4 {'info': '4 2'}
1: cell.clusterId,cell.id,cell.dict: 5 5 {'info': '5 1'}
1: cell.clusterId,cell.id,cell.dict: 6 6 {'info': '6 2'}
1: cell.clusterId,cell.id,cell.dict: 7 7 {'info': '7 2'}
1: cell.clusterId,cell.id,cell.dict: 8 8 {'info': '8 1'}
1: cell.clusterId,cell.id,cell.dict: 9 9 {'info': '9 2'}
1: cell.clusterId,cell.id,cell.dict: 10 10 {'info': '10 1'}
1: cell.clusterId,cell.id,cell.dict: 11 11 {'info': '11 1'}
1: cell.clusterId,cell.id,cell.dict: 12 12 {'info': '12 2'}
1: cell.clusterId,cell.id,cell.dict: 13 13 {'info': '13 1'}

After cluster reasssign
2: cell.clusterId,cell.id,cell.dict: 1 1 {'info': '1 1'}
2: cell.clusterId,cell.id,cell.dict: 1 2 {}
2: cell.clusterId,cell.id,cell.dict: 1 3 {}
2: cell.clusterId,cell.id,cell.dict: 1 4 {}
2: cell.clusterId,cell.id,cell.dict: 1 5 {}
2: cell.clusterId,cell.id,cell.dict: 1 6 {}
2: cell.clusterId,cell.id,cell.dict: 1 7 {}
2: cell.clusterId,cell.id,cell.dict: 1 8 {}
2: cell.clusterId,cell.id,cell.dict: 1 9 {}
2: cell.clusterId,cell.id,cell.dict: 1 10 {}
2: cell.clusterId,cell.id,cell.dict: 1 11 {}
2: cell.clusterId,cell.id,cell.dict: 1 12 {}
2: cell.clusterId,cell.id,cell.dict: 1 13 {}

Create movie crashes Player and problems with subsequent Player instances.

Windows 11, Player 4.5.0 rev 2
If you use Player's settings window to create a movie, then Player crashes with the error
`INFO: Step 470 Flips 93/10000 Energy 66.9185 Cells 55 Inventory=55

INFO: Step 480 Flips 132/10000 Energy -60.0654 Cells 55 Inventory=55

Making movie inside C:\Users\jsluka\CC3DWorkspace\FPP_visualize_bug_cc3d_03_12_2024_16_58_14
Traceback (most recent call last):
File "C:\CompuCell3D\Miniconda3\lib\site-packages\cc3d\player5\Configuration\ConfigurationDialog.py", line 204, in createMovieButtonClicked
movieCount, moviePath = makeMovie(simulationPath, frameRate, quality, enableDrawingMCS)
File "C:\CompuCell3D\Miniconda3\lib\site-packages\cc3d\core\GraphicsUtils\MovieCreator.py", line 74, in makeMovie
subprocess.run([
File "C:\CompuCell3D\Miniconda3\lib\subprocess.py", line 503, in run
with Popen(*popenargs, **kwargs) as process:
File "C:\CompuCell3D\Miniconda3\lib\subprocess.py", line 971, in init
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\CompuCell3D\Miniconda3\lib\subprocess.py", line 1456, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] The system cannot find the file specified
QThread: Destroyed while thread is still running
CLOSING LOCAL SOCKET
`

If you then relaunch Player, then Player's stop button crashes Player and gives the same error message as when generating a movie.

To fix Player, you have to delete both the project's and the global _settings.sqlite files. Or edit both _settings.sqlite files setting "AutomaticMovie" to zero.

A project that produces this bug is attached.

FPP_visualize_bug.zip

Running remotely on Linux system, xterm problem

I have installed CC3D 440 on Tatooine. Everything seems to run OK except, there are no screen shots generated. If you ask for screenshots then CC3D crashes. If you do not ask for screenshots everything runs OK. (And you can get restart and VTK files OK).

The error you get is:

bad X server connection. DISPLAY=
./runScript.sh: line 7: 1130240 Aborted                 (core dumped) python -m cc3d.run_script $* --current-dir=${SCRIPT_DIR}

To fix this (with help for Luddy support) I added this to runScript.sh:

### JPS: Added the lines below to try to fix the Xterm problem that prevented CC3D screenshots from working.
######Xvfb :1 & 
export DISPLAY=:1 
echo $DISPLAY

And now this new runScript works correctly and gives screen shots.

Tatooine:
Operating System: Ubuntu 20.04.6 LTS
Kernel: Linux 5.15.0-46-generic
Architecture: x86-64

Movie Fixes

Let's have MCS=XXX in the movies display actual MCS.
Right now if I take screenshots every 100 MCS the movie player will display MCS= 3000 as MCS=30
image

I would also move the label MCS=XXX away from the corner - let's add a bit of padding.

Another fix is the default delay - right now the movie is not too smooth due to excessive delay- let's set a shorter delay between frames

Some cells do not display in 3D

CC3D 4.1.1, windows 11

Cells often do not display in 3D. This is particularly obvious when there is a dense pack of cells in 3D and a frequent cell type is not being displayed in 3D.
image
Above is a ball of cells, the red ones are most common.

Turn off display of red cells and you get (below is from a different run so not exactly the same)
image
In the above there should be a total of 25 green and blue cells. There are only 8 shown.
After 50 mcs all the red cells are deleted and now all 25 green and blue cells are visible.
image

If the cell field is not dense packed, e.g., blob init with 1 pixel between cells, then all the green and blue cells are shown (29 in this case)
image

Going back to the dense pack case, if cell borders are ON only about half the cells are shown:
image

If cell borders are turned OFF all the cells are shown
image

Minimal code to reproduce the problem is attached. The code is for dense packed, 1% of cells are green and blue types and the other 99% the hidden type. (Initially it is an even mix of the three types but the "start" converts 99% of the cells to the "ccell" type, which is hidden in player.) At MCS = 51 all the hidden types (ccell) are deleted. All the cell of the other two types then become visible.

Missing3Dcells.zip

3D models in player are unusable

Player is failing to properly render 3D models. The problem is particularly bad when

  1. the models x, y and z dimension are all different.
  2. the model is built with cells touching the boundaries of the simulation.

But even if they dims are the same and cells don't touch the boundary the render is often wrong.

Here is what you get for a cube of cells using the UniformInitializer to create a solid region of cells. The model dim's are all the same. The 2D windows show a solid region of cells. The 3D render is missing the inner cells.
Untitled2

If the model dims are all different, then the render makes different errors:
Untitled
(now the back wall is missing as well as all the interior cells)

In both cases the cell inventory count is consistent with a solid cube of cells, not with the number of cells shown in the 3D render.

If you move the cube of cells one pixel away from the wall, then the cells initially render correctly in 3D. But as the sim runs cells vanish from the 3D render even though the 2D views still show the cells and the cell inventory count does not change.
test.zip

Can't change background color or Medium color in Player 4.5.0 r2

Using the configuration panel in Player, you cannot change the background or Medium color. The settings allows you to change the colors, and then displays them in the settings window correctly, but they are not applied to the simulation.

And, when you change the window color in settings, the change color dialog comes back after clicking on the "OK" button. It then shows the changed color in the dialog and you have to hit "OK" again.

Exiting and restarting Player also does not show the correct window color, but the changed window color is shown in the configuration panel.

Player CC3D version 4.5.0 r2
Windows 11

color_bug

Can't set the State of a Tellurium model

You can retrieve the sate of a tellurium model. You can edit that state but you can't save the state back.
(possible related to #25)
Model:

model_string = '''
//Equations
J01: A -> B; k01*A;
J02: B -> A; k02*B;
//Parameters
k01 = 0.1;
k02 = 0.1;
//Initial Conditions
A = 1;
B = 0;
'''

Loaded with;
RRinst = self.add_antimony_to_cell(model_string=model_string, model_name='ts', cell=cell, step_size=0.1 )
Then;


            state = cell.sbml.ts
            print(state)

returns:
<roadrunner.ExecutableModel() { this = 000002B5850462D0 }>
But
print(dir(state))
returns:
['INTEGRATION', 'OPTIMIZE_REACTION_RATE_SELECTION', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__swig_destroy__', '__weakref__', 'applyEvents', 'getAllTimeCourseComponentIds', 'getAssignmentRuleIds', 'getBoundarySpeciesAmounts', 'getBoundarySpeciesConcentrationIds', 'getBoundarySpeciesConcentrations', 'getBoundarySpeciesId', 'getBoundarySpeciesIds', 'getBoundarySpeciesInitAmounts', 'getBoundarySpeciesInitConcentrations', 'getCompartmentId', 'getCompartmentIds', 'getCompartmentIndexForBoundarySpecies', 'getCompartmentIndexForFloatingSpecies', 'getCompartmentInitVolumes', 'getCompartmentVolumes', 'getConservedMoietyId', 'getConservedMoietyIds', 'getConservedMoietyValues', 'getCurrentStoichiometryMatrix', 'getEvent', 'getEventId', 'getEventIds', 'getEventIndex', 'getEventListener', 'getEventRoots', 'getExecutableModelDesc', 'getFlags', 'getFloatingSpeciesAmountRate', 'getFloatingSpeciesAmounts', 'getFloatingSpeciesConcentrationIds', 'getFloatingSpeciesConcentrationRates', 'getFloatingSpeciesConcentrations', 'getFloatingSpeciesId', 'getFloatingSpeciesIds', 'getFloatingSpeciesInitAmountIds', 'getFloatingSpeciesInitAmounts', 'getFloatingSpeciesInitConcentrationIds', 'getFloatingSpeciesInitConcentrations', 'getGlobalParameterId', 'getGlobalParameterIds', 'getGlobalParameterInitValues', 'getGlobalParameterValues', 'getIds', 'getInfo', 'getInitialAssignmentIds', 'getModelName', 'getNumBoundarySpecies', 'getNumCompartments', 'getNumConservedMoieties', 'getNumDepFloatingSpecies', 'getNumEvents', 'getNumFloatingSpecies', 'getNumGlobalParameters', 'getNumIndFloatingSpecies', 'getNumRateRules', 'getNumReactions', 'getRandom', 'getRandomSeed', 'getRateRuleIds', 'getRateRuleRates', 'getRateRuleSymbols', 'getReactionIds', 'getReactionRates', 'getStateVectorId', 'getStoichiometry', 'getSupportedIdTypes', 'getTime', 'getValue', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'reset', 'setBoundarySpeciesAmounts', 'setBoundarySpeciesConcentrations', 'setBoundarySpeciesInitAmounts', 'setBoundarySpeciesInitConcentrations', 'setCompartmentInitVolumes', 'setCompartmentVolumes', 'setConservedMoietyValues', 'setEventListener', 'setFlags', 'setFloatingSpeciesAmounts', 'setFloatingSpeciesConcentrations', 'setFloatingSpeciesInitAmounts', 'setFloatingSpeciesInitConcentrations', 'setGlobalParameterInitValues', 'setGlobalParameterValues', 'setIntegrationStartTime', 'setRandomSeed', 'setTime', 'setValue', 'this', 'thisown', 'values']

But the below fails
self.set_sbml_state(model_name='ts', cell=cell, state=state) # this fails
returns:
Error: A new SelectionRecord should not have this value: SelectionRecord({'index' : -1, 'p1' : 'A', 'p2' : '', 'selectionType' : UNKNOWN})
Traceback (most recent call last):
File "C:\CompuCell3D\Miniconda3\envs\cc3d\lib\site-packages\cc3d\CompuCellSetup\sim_runner.py", line 79, in run_cc3d_project
exec(code, globals(), locals())
File "C:\Users\jsluka\OneDrive - Indiana University\Desktop\Jims Compucell\Gillespie_demo\Gillespie_demo\Simulation\Gillespie_demo.py", line 6, in
CompuCellSetup.run()
File "C:\CompuCell3D\Miniconda3\envs\cc3d\lib\site-packages\cc3d\CompuCellSetup\simulation_setup.py", line 160, in run
main_loop_fcn(simulator, simthread=simthread, steppable_registry=steppable_registry)
File "C:\CompuCell3D\Miniconda3\envs\cc3d\lib\site-packages\cc3d\player5\Simulation\main_loops.py", line 39, in main_loop_player
steppable_registry.start()
File "C:\CompuCell3D\Miniconda3\envs\cc3d\lib\site-packages\cc3d\core\SteppableRegistry.py", line 123, in start
steppable.start()
File "C:\Users\jsluka\OneDrive - Indiana University\Desktop\Jims Compucell\Gillespie_demo\Gillespie_demo\Simulation\Gillespie_demoSteppables.py", line 99, in start
self.set_sbml_state(model_name='ts', cell=cell, state=state) # this fails
File "C:\CompuCell3D\Miniconda3\envs\cc3d\lib\site-packages\cc3d\core\SBMLSolverHelper.py", line 1224, in set_sbml_state
for name, value in state.items():
File "C:\CompuCell3D\Miniconda3\envs\cc3d\lib\site-packages\roadrunner\roadrunner.py", line 1898, in items
return [(k, self.getValue(k)) for k in self.keys(types)]
File "C:\CompuCell3D\Miniconda3\envs\cc3d\lib\site-packages\roadrunner\roadrunner.py", line 1898, in
return [(k, self.getValue(k)) for k in self.keys(types)]
File "C:\CompuCell3D\Miniconda3\envs\cc3d\lib\site-packages\roadrunner\roadrunner.py", line 1125, in getValue
return _roadrunner.ExecutableModel_getValue(self, id)
RuntimeError: Invalid selection '[A]'' for setting value

Ability to specify colors for cells individually

Ability to specify colors for cells individually

It would be great to be able to assign colors to individual cells that Player could then use, e.g.,
cell.color(r,g,b)

Or perhaps leverage extra cell-based vector fields to carry color information?

        self.create_vector_field_cell_level_py("RGB_Field")
        
        field = self.field.RGB_Field
        for cell in self.cell_list:
            if cell.type == 1:
                field[cell] = (100,0,255)
            else:
                field[cell] = (0,0,255)

Make Movie on New Thread

The first version of the movie maker is quite simple since it runs on the main thread. I believe this should be changed. Rather than using popups to indicate the status, I'd like to try implementing a spinning wheel to indicate when the movie maker is still loading.

Here is a mockup. It could say something like, "Generating Movie (1 of 3)..." and then "Done". If it is not complicated, clicking the "Done" text will launch the directory where the movies were made in File Explorer or Finder.

mockmoviethread

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.