applications.collages.collageAlgebra("with locks & keys"):
{
  ntColour = const(.8),
  l = const(1/(2 * tan(36))),
  r = const(4/((1 + sqrt(5)) * (1 + sqrt(5)))),
  
  pentagram = { polygon(
    (0.309, 0.425), (0.191, 0.789), (0.5, 1.013), (0.118, 1.013), (0.0, 1.376),
    (-0.118, 1.013), (-0.5, 1.013), (-0.191, 0.789), (-0.309, 0.425), (-0.691, 0.425),
    (-0.809, 0.789), (-0.927, 0.425), (-1.309, 0.425), (-1, 0.201), (-1.118, -0.162),
    (-0.809, 0.062), (-0.5, -0.162), (-0.618, -0.526), (-1, -0.526), (-0.691, -0.75),
    (-0.809, -1.114), (-0.5, -0.889), (-0.191, -1.114), (-0.309, -0.75), (0.0, -0.526),
    (0.309, -0.75), (0.191, -1.114), (0.5, -0.889), (0.809, -1.114), (0.691, -0.75),
    (1, -0.526), (0.618, -0.526), (0.5, -0.162), (0.809, 0.062), (1.118, -0.162),
    (1, 0.201), (1.309, 0.425), (0.927, 0.425), (0.809, 0.789), (0.691, 0.425))
    },
    
  torso = { polygon(
    (0.309, 0.425), (0.191, 0.789), (0.5, 1.013), (0.118, 1.013), (0.0, 1.376),
    (-0.118, 1.013), (-0.5, 1.013), (-0.191, 0.789), (-0.309, 0.425), (-0.691, 0.425),
    (-0.809, 0.789), (-0.927, 0.425), (-1.309, 0.425), (-1.0, 0.201), (-1.118, -0.162),
    (-0.809, 0.062), (-0.5, -0.162), (-0.118, -0.162), (-0.23, -0.317), (-0.05, -0.317),
    (0.0, -0.526), (0.05, -0.317), (0.23, -0.317), (0.118, -0.162), (0.5, -0.162),
    (0.809, 0.062), (1.118, -0.162), (1.0, 0.201), (1.309, 0.425), (0.927, 0.425),
    (0.809, 0.789), (0.691, 0.425))    },
    
  rhomb = { polygon(
    (0.191, 0.363), (0.373, 0.304), (0.317, 0.476), (0.5, 0.588), (0.286, 0.571),
    (0.23, 0.742), (0.118, 0.588), (0.0, 0.951), (-0.118, 0.588), (-0.23, 0.742),
    (-0.286, 0.571), (-0.5, 0.588), (-0.317, 0.476), (-0.373, 0.304), (-0.191, 0.363),
    (-0.309, 0.0), (-0.191, -0.363), (-0.5, -0.588), (-0.118, -0.588), (0.0, -0.951),
    (0.118, -0.588), (0.5, -0.588), (0.191, -0.363), (0.309, 0.0))    },
  
  pentagon1 = { polygon(
    (-0.118, -0.688), (-0.05, -0.534), (0.05, -0.534), (0.118, -0.688), (0.5, -0.688),
    (0.618, -0.325), (0.492, -0.213), (0.523, -0.117), (0.691, -0.1), (0.809, 0.263),
    (0.5, 0.487), (0.354, 0.402), (0.273, 0.461), (0.309, 0.626), (0.0, 0.851),
    (-0.309, 0.626), (-0.273, 0.461), (-0.354, 0.402), (-0.5, 0.487), (-0.809, 0.263),
    (-0.691, -0.1), (-0.523, -0.117), (-0.492, -0.213), (-0.618, -0.325), (-0.5, -0.688)) },
  
  pentagon2 = { polygon(
    (-0.118, -0.688), (-0.05, -0.843), (0.05, -0.843), (0.118, -0.688), (0.5, -0.688),
    (0.618, -0.325), (0.309, -0.1), (0.691, -0.1), (0.809, 0.263), (0.5, 0.487),
    (0.354, 0.402), (0.273, 0.461), (0.309, 0.626), (0.0, 0.851), (-0.309, 0.626),
    (-0.273, 0.461), (-0.354, 0.402), (-0.5, 0.487), (-0.809, 0.263), (-0.691, -0.1),
    (-0.309, -0.1), (-0.618, -0.325), (-0.5, -0.688)) },
  
  pentagon3 = { polygon(
    (-0.118, -0.688), (-0.23, -0.534), (-0.05, -0.534), (0.0, -0.325), (0.05, -0.534),
    (0.23, -0.534), (0.118, -0.688), (0.5, -0.688), (0.618, -0.325), (0.786, -0.308),
    (0.817, -0.213), (0.691, -0.1), (0.809, 0.263), (0.5, 0.487), (0.191, 0.263),
    (0.309, 0.626), (0.0, 0.851), (-0.309, 0.626), (-0.191, 0.263), (-0.5, 0.487),
    (-0.809, 0.263), (-0.691, -0.1), (-0.817, -0.213), (-0.786, -0.308), (-0.618, -0.325),
    (-0.5, -0.688)) },
    
  rp1 = scale(#r) . rotate(36),
  rp2 = rotate(180) . translate(0, 2 * #l) . scale(#r),
  rp3 = use(rp2) . rotate(72),
  rp4 = use(rp2) . rotate(2 * 72),
  rp5 = use(rp2) . rotate(3 * 72),
  rp6 = use(rp2) . rotate(4 * 72),
  rp7 = translate(0, 2 * (sin(18) / sin(36) + cos(54))) . scale(#r),
  rp8 = use(rp7) . rotate(72),
  rp9 = use(rp7) . rotate(2 * 72),
  rp10 = use(rp7) . rotate(3 * 72),
  rp11 = use(rp7) . rotate(4 * 72),
  refine-pentagram = < rp1, rp2, rp3, rp4, rp5, rp6, rp7, rp8, rp9, rp10, rp11 >,
    
  refine-torso = < rp1, rp2, rp3, rp6, rp7, rp8, rp11 >,
  
  rr1 = translate(0,-sin(18) / (2 * sin(36))) . scale(#r),
  rr2 = translate(0, sin(18) / sin(36) + cos(54)) . scale(#r),
  rr3 = rotate(180) . translate(0, -(sin(18) / sin(36) + cos(54))) . scale(#r),
  refine-rhomb = < rr1, rr2, rr3 >,
    
  rp1-1 = scale(#r) . rotate(36),
  rp1-2 = translate(0,2 * #l) . scale(#r),
  rp1-3 = use(rp1-2) . rotate(72),
  rp1-4 = use(rp1-2) . rotate(2 * 72),
  rp1-5 = use(rp1-2) . rotate(3 * 72),
  rp1-6 = use(rp1-2) . rotate(4 * 72),
  refine-pentagon1 = < rp1-1, rp1-2, rp1-3, rp1-4, rp1-5, rp1-6 >,
  
  rp2-4 = rotate(-72) . use(rp1-4),
  rp2-5 = rotate(72) . use(rp1-5),
  rp2-7 = scale(#r) . translate(0,-#l),
  refine-pentagon2 = < rp1-1, rp1-2, rp1-3, rp2-4, rp2-5, rp1-6, rp2-7 >,
  
  rp3-3 = rotate(-72) . use(rp1-3),
  rp3-4 = rotate(72) . use(rp1-4),
  rp3-5 = rotate(-72) . use(rp1-5),
  rp3-6 = rotate(72) . use(rp1-6),
  rp3-7 = scale(#r) . translate(0,-#l) . rotate(72),
  rp3-8 = scale(#r) . translate(0,-#l) . rotate(-72),
  refine-pentagon3 = < rp1-1, rp1-2, rp3-3, rp3-4, rp3-5, rp3-6, rp3-7, rp3-8 >,
  
  invert = rotate(-36) . scale(1/#r),
  invert = <invert>
  
}
