#### The Cantor set

Each point in the Cantor set has a unique address, which is an infinite
sequence of 0's and 1's specifying whether it is in the left (0) half or
right (1) half each time intervals are divided in the Cantor set middle-thirds
construction. The program only understands points which end with a constant
sequence, so it is assumed that the last letter of the given address is repeated.
Thus the address of the leftmost point is 0 and then rightmost point is 1. Also,
0100=010 as Cantor set point. Infinity is a special point, and it is denoted
by inf.

Each gap in the Cantor set is the result of removing the middle third of
some interval. The address of that gap is the prefix of all the points in that
interval. So the gap in the middle of the entire left half of the Cantor set
has the address 0. There are three special gaps: the gap which goes from
the far left and wraps around behind the sphere to the far right is B. The
gap to the left of infinity is L, and the gap to right is R.

Check the checkboxes to show the gap and point labels for examples. Change
the depth of the Cantor set if they are hard to read.

#### Navigation

Click and drag to move the plot; mouse wheel to zoom. The reset button
resets the plot to the original view.

#### Rays/loops

Click "add" to add a ray. To modify the ray, edit the properties in the ray
listing and then click "redraw". Note that the endpoint of the ray can be inf,
so a ray can really be a loop. Click "comb" to comb the rays on the surface
to make then as disjoint as possible. In particular, this checks if the rays/loops
are simple and disjoint.

#### Homeomorphisms

Click "add" to add a homeomorphism. The homeomorphism is specified by
the recipe entered in the text box. The lines are executed in order top
to bottom. Each line must be one of the following operations:

- shift prefix1 prefix2
- E.g. shift 101 1010. Shifts prefix1 onto prefix2 horizontally. This is useful
to contract the Cantor set inside itself or expand a chunk. Note this is not
a homeomorphism by itself. It's intended to work only when one of prefix1 and
prefix2 is a sub-prefix of the other. It will work in other cases, but the region
through which it must drag is assumed to contain no rays. The drag recipe is
probably more useful here.
- drag prefix1 prefix2 up/down
- E.g. drag 101 010 up. Drags prefix1 onto prefix2 by going above or below the
equator. It is assumed that prefix2 is not actually there (it has been shifted
or dragged away).
- twist prefix1 prefix2 ccw/cw
- E.g. twist 101 010 ccw. Do a half Dehn twist which swaps the two prefixs
by rotating them in the given direction. Note this is a homeomorphism.
As an example, it can be implemented with drags and shifts with the recipe
(with up/down used as appropriate to get cw/ccw):

shift prefix1 prefix1+1

drag prefix2 prefix1+0 down

drag prefix1+1 prefix2 up

shift prefix1+0 prefix1

In fact, this is how the program does it.
- flip prefix1 ccw/cw
- E.g. flip 101 cw. Flip the chunk of Cantor set over, rotating in the
given direction. This is a homeomorphism.
- Juliette's homeomorphism
- shift 1 11

drag 01 10 down

drag 10 01 up

drag 01 10 down

shift 00 0
- Its inverse
- shift 0 00

drag 10 01 down

drag 01 10 up

drag 10 01 down

shift 11 1
- A homeomorphism whose fixed points on the boundary correspond to cliques with multiple rays
- twist 0000 0001 cw

twist 0001 001 ccw

twist 0100 0101 cw

twist 0101 011 ccw

twist 100 101 cw

twist 101 11 ccw

shift 0001 00011

shift 0101 01011

shift 101 1011

drag 00011 01010 down

drag 01011 1010 down

drag 1011 00010 down

shift 00010 0001

shift 01010 0101

shift 1010 101
- Its inverse
- shift 101 1010

shift 0101 01010

shift 0001 00010

drag 00010 1011 down

drag 1010 01011 down

drag 01010 00011 down

shift 1011 101

shift 01011 0101

shift 00011 0001

twist 11 101 cw

twist 101 100 ccw

twist 011 0101 cw

twist 0101 0100 ccw

twist 001 0001 cw

twist 0001 0000 ccw